Wartości min i max w tablicy dwuwymiarowej

0

Witam,

poniżej przedstawiam kod programu w języku C, który pobiera dane do tablicy i wypisuje najmniejszą i największą wartość z podanych danych:

 
#include <conio.h>
#include <stdio.h>

int main() {
	int i, j, k, m, n, min, max;

printf("\n Podaj ilosc wierszy w tablicy: ");
scanf("%d", &m);
printf("\n Podaj ilosc kolumn w tablicy: ");
scanf("%d", &n);
int tab[m][n];

for(i=0; i<m; i++)
for(j=0; j<n; j++)
do {
	printf("\n Podaj element [%d][%d]: ", i, j);
	k=scanf("%d", &tab[i][j]);
	fflush(stdin); } while(k==0);

for(i=0; i<m; i++) {
	for(j=0; j<n; j++)
	printf("\n Element [%d][%d]=%d", i, j, tab[i][j]); }

	min=tab[0][0];
        max=tab[0][0];

for(i =0; i<m; i++) {
	for(j =0; j<n; j++) {
		if (min>tab[i][j]) 
			min=tab[i][j];
                if (max<tab[i][j]) 
                        max=tab[i][j]; }}
printf("\nNajwiekszy el. w tablicy to: %d\nNajmniejszy el. w tablicy to %d",max,min); 

getch();
return 0; }

        

Mam problem z modyfikacją programu. Chciałbym na operację wyszukiwania elementów min i max utworzyć funkcję, którą można by wywołać zamiast tego:

 for(i =0; i<m; i++) {
	for(j =0; j<n; j++) {
		if (min>tab[i][j]) 
			min=tab[i][j];
                if (max<tab[i][j]) 
                        max=tab[i][j]; }}
printf("\nNajwiekszy el. w tablicy to: %d\nNajmniejszy el. w tablicy to %d",max,min); 

Próbowałem utworzyć funkcję

void minmax(int tab[m][n], int m, int n) { ...

ale program albo nie działa albo wypisuje nieprawidłowe dane. Czy mógłby ktoś pomóc i zamieścić funkcję w podanym powyżej kodzie?

0
void minmax(int tab[m][n], int m, int n) { ...

Rozumiem, ze ten wielokropek powie co schrzaniles?

Zacznijmy od tego co mamy, po co Ci m i n?

0

Wielokropek wskazuje w tym wypadku raczej na moją bezsilność bo nie mam całkowicie pojęcia jak taką funkcję zadeklarować i później użyć w programie, to samo tyczy się m i n. Próbowałem z nimi i bez i nic mi nie wychodziło. Być może pokazanie jak prawidłowa deklaracja funkcji powinna wyglądać pomogłoby mi w zrozumieniu jak utworzyć funkcję, o której mowa.

1

To akurat dosc proste...
Patrzysz czego wymaga kod, ktory chcesz upchnac w funkcje.
Ten akurat wymaga tablicy oraz jej rozmiaru, czyli musisz przekazac tablice + rozmiar.
Przekazanie dwu-wymiarowej tablicy w C:

int (*tab)[STALA];
int tab[][STALA];
int** tab;

wiec wsadzasz to do funkcji:

void minmax(int (*tab)[STALA]);

Dochodzi jeszcze rozmiar:

void minmax(int (*tab)[STALA], int wiersze, int kolumny);

no i jako, ze funkcja sama w sobie powinna wg mnie cos zwracac to:

void minmax(int (*tab)[STALA], int wiersze, int kolumny, int* min, int* max);
0

Dziękuję.

Teraz jak daję prototyp funkcji przed mainem

void minmax(int (tab*)[x], int m, int n, int* min, int* max); /* x zastąpiłem zaproponowaną zmienną STALA, nie ma to większego znaczenia, ponieważ co bym tam nie wpisał to dostaję podobny komunikat, o którym mowa poniżej */
int main() {

Dostaję takie komunikaty kompilatora:
[Error] variable or field 'minmax' declared void
[Error] 'tab' was not declared in this scope
[Error] expected primary-expression before 'int'

Przy takim prototypie:

void minmax(int (*tab)[STALA], int wiersze, int kolumny, int* min, int* max);
int main() {

W K
4 23 [Error] 'STALA' was not declared in this scope
4 18 [Error] 'tab' was not declared in this scope
4 23 [Error] 'STALA' was not declared in this scope
4 31 [Error] expected primary-expression before 'int'

Również mam errory (W - wiersz, K - kolumna, w której jest błąd).

0

co to za dziwna składnia? Nie lepiej po prostuu

void minmax(int tab[4], int w, int k, int * min, int * max) 

?:P

0

W przypadku takiego prototypu:

void minmax(int tab[3][3], int w, int k, int * min, int * max); 

program rusza. Kwestia jest tylko taka, że jeśli dam te int tab[3][3]

 to wartość jest stała a w programie mogę tworzyć dowolną tablicę 3x3, 4x4, 2x4 itp... Jak zrobić prototyp uniwersalny?
0

Możesz też zrobić inaczej:D zrób sobie tablicę o wymiarze maksymalnym, np. 256 x 256 lub większą jeśli potrzeba :D potem możesz używać tylko "podtablicy" z tej tablicy o wymiarach podanych przez użytkownika :) Oczywiście musisz wtedy ograniczyć ilość możliwych do wczytania wierszy i kolumn :)

1

tak to powinno wyglądać:

#include <memory.h>
#define LICZBA_WIERSZY 10
#define LICZBA_KOLUMN 10

void minmax(int ** tab, int w, int k, int * min, int * max);

int main() {
    int i;
    int ** tab = (int **) malloc(sizeof(int*) * LICZBA_WIERSZY);
    for(i = 0; i < LICZBA_WIERSZY; i++) {
        tab[i] = (int *) malloc(sizeof(int) * LICZBA_KOLUMN);
    }
    int a,b;
    minimax(tab,LICZBA_WIERSZY, LICZBA_KOLUMN,&a,&b);
    return 0;
}

oczywiście LICZBA_KOLUMN i LICZBA_WIERSZY mogą być zmiennymi i np użytkownik może je podać

1 użytkowników online, w tym zalogowanych: 0, gości: 1