Znajdź liczbę max i min na tablicy 2wym, z użyciem wskaźników - pomoc.

0

Witam. Mam do zrobienia program na zaliczenie C - Znadjź liczbę max i min na tablicy 2wymiarowej, o wymiarach 4x4. Zastosuj funkcje własne i wskaźniki. Ogólnie program mam prawie napisany, zrobiony raczej tak jak ma być, i na funkcjach i na pętlach, i na wskaźnikach, tylko gdzieś mi brakuje chyba jakiejś instruckji, znaczka, innego zdeklarowania, bo przy kompilacji wychodzą errory. Na wskaźnikach się nie znam, więc trudno mi to jakoś samemu wymyśleć ;s Ogólnie, sugerowałem się tym co mieliśmy na lekcji(a było prawie to samo zadanie, tylko na tab 1wymiarowej, spisane z tablicy), ale jednak źle jest...bo jak kompiluje jeszcze raz to co i było na lekcji, to też nie chce działać, co najciekawsze w tym samym miejscu... Poniżej kod. Liczę na pomoc, z góry dzięki ;) Jest to C zwykły.

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


void znajdz(int t[4][4], int *, int *, int *);
void wczytaj(int t[4][4]);


int main(void)
{
	int t[4][4];
	int wsk;
	int max;
	int min;
	wczytaj(t);
	znajdz(t[4][4],&wsk,&max,&min);
	printf("max %d \n", max);
	printf("min %d \n", min);




}

void znajdz(int t[4][4], int *wsk, int *max, int *min)
{
	int i,j;
     *min=*wsk;
     *max=*wsk;
	  for(i=0; i<4 ;i++)
		 for(j=0; j<4 ;j++)
		 {
		  if(*(wsk+i)>*wsk)
			  max=*(wsk+i);
		 }


      for(i=0; i<4 ;i++)
		 for(j=0; j<4 ;j++)
		 {
		  if(*(wsk+i)<*wsk)
			  min=*(wsk+i);
		 }

}

void wczytaj(int t[4][4])
{
   int i,j;
    for(i=0; i<4 ;i++)
	{
	   for(j=0; j<4 ;j++)
     scanf("%d", t[4][4]);

	}
}
 
0

Nie każdemu chce się uruchamiać kompilator tylko po to, aby odczytać, jakie błędy daje kod...

0

http://imageshack.us/photo/my-images/717/bladchn.jpg/
17linijka to dla niego wczytaj(t); 18 to znajdz (); 36 to max=...; 44 to min=...;
tu jest ekran błędów w DevC++, aczkolwiek napisałem w poprzednim poście ogólnie jakie błędy występują...

0

znajdz(t[4][4],&wsk,&max,&min); Jako pierwszy argument podajesz liczbę spod indeksu 4,4 (poza zakresem) zamiast tablicę.

0

Najwygodniej jakbyś sobie z tej tablicy zrobił zmienną globalną i wtedy korzystał z niej bezpośrednio w każdej funkcji. Uprości Ci to zadanie moim zdaniem ;)

0

Juhu, zrobiłem z tej tablicy zmienną globalną, (tzn, wrzuciłęm ją z bloku głównego pod deklaracje funkcji, na górze), a także zmieniłem w wywołaniach funkcji znajdzi iwczytaj z t[4][4] na samo t, co niby pomogło, ale, właśnie ale! program sięuruchamia, mogę wpisać te 16 liczb (czyli tablica 4x4 to 16liczb, zgadza się), po czym program kończy pracę i sę zamyka. Zupełnie jakby nie wiedział co ma dalej robić, mimo, że ma napisane... wtf? Sry, że tak zawracam Wam dupę, ale z C akurat dużo nie umiem, mieliśmy tylko jedną lekcję, i w dodatku nie mogę znaleźć dobrego kompilatora zbyt ;s Na uczelni korzystaliśmy z M$ Visual Studio 6, ale tam były XP, na mojej Viscie w domu już ten program nie chodzi...korzystam z DevC++, ale nie wiem czy to dobry wybór...

0

po printfach musisz dolozyc jakies np. getch(); z biblioteki conio.h albo cos w stylu sleep zrobic, bo tak program sie wykonuje i zamyka po wykonianiu... co do tego w czym pisac, to CodeBlocks jest spoko, chociaz obecnie uzywam Visuala 2010 (mamy darmowe licencje na uczelni).

i moim zdaniem musisz poprawic scanfa przy wczytywaniu, tam nie moze byc [4][4], a raczej powinno byc [i][j] bo tak wczytujesz liczbe do jednego pola i potem ja nadpisujesz kolejna... zreszta tak jak jest powinno sie wysypac chyba, bo masz elementy 0..3 x 0..3, a podajesz ze ma wpisac wartosc do [4][4]

0

Ano, po wpisaniu [i][j] zamiast [4][4] przy uruchomieniu po wpisaniu jednej liczby program chce sie zamknac zbledem windowsowym, ze wykonal nieprawidlowa operacje bla bla bla... A co do getch, spróbuję, dzięki.

0

ty nie masz na ślepo pisać [i][j], ani [4][4], tylko masz wiedzieć co co oznacza, i być przekonanym co to zrobi…

0

To mi zajebiście dużo pomogłeś Azarien.DZIĘKI! Wiem co to robi, problem jest w tym że nie widze gdzie jest błąd(a kompilator mi tego nie wskazuje bo się uruchamia i krzaczy) i nie wiem jak go mam zniwelować, po to tu przyszedłem... A to [4][4] po prostu napisałem jakoś...nie wiem, z rozpędu. Ale i to nie jest jedyna rzecz która sprawia że program nie działa. Mój obecny kod jakby kogoś życzliwego interesowało (dodałem jeszcze wyświetlanie tablicy jako macierz):

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

void znajdz(int t[4][4], int *, int *, int *);
void wczytaj(int t[4][4]);
void wyswietl(int t[4][4]);

int t[4][4];

int main(void)
{
	
	int wsk;
	int max;
	int min;
	printf("podaj liczbe \n");
	wczytaj(t);
	wyswietl(t);
	znajdz(t,&wsk,&max,&min);
	printf("max %d \n", max);
	printf("min %d \n", min);
    getch();

}

void znajdz(int t[4][4], int *wsk, int *max, int *min)
{
	int i,j;
     *min=*wsk;
     *max=*wsk;
	  for(i=0; i<4 ;i++)
      {
		 for(j=0; j<4 ;j++)
		 {
		  if(*(wsk+i)>*wsk)
			  *max=*(wsk+i);
		 }
       }

      for(i=0; i<4 ;i++)
      {
		 for(j=0; j<4 ;j++)
		 {
		  if(*(wsk+i)<*wsk)
			  *min=*(wsk+i);
		 }
      }
}

void wczytaj(int t[4][4])
{
   int i,j;
    for(i=0; i<4 ;i++)
	{
	   for(j=0; j<4 ;j++)
     scanf("%d", t[i][j]);
	}
}

void wyswietl(int t[4][4])
{
	int i,j;
     for(i=0; i<4; i++)
     {
		 for(j=0; j<4 ;j++)
		 {
			 printf(t[i][j], " ");
			 printf("\n");
		 }
     }
}

 
0

Zdziwiłbym się jak by działało, w procedurze szukającej nie korzystasz z j, a więc nie przeszukasz całej tablicy nawet jak ustawisz na początku wsk na coś sensownego (np element zero,zero), czego patrząc na szybko też nie robisz.

0
 #include<stdio.h>
#include<conio.h>
 
void znajdz(int *, int *, int *);
void wczytaj();
void wyswietl();
 
int t[4][4];
 
int main(void)
{
 
        int wsk;
        int max;
        int min;
        wczytaj();
        wyswietl();
        znajdz(&wsk,&max,&min);
        printf("max %d \n", max);
        printf("min %d \n", min);
    getch();
 
}
 
void znajdz(int *wsk, int *max, int *min)
{
        int i,j;
     *min=*wsk;
     *max=*wsk;
          for(i=0; i<4 ;i++)
      {
                 for(j=0; j<4 ;j++)
                 {
                  if(*(wsk+i)>*wsk)
                          *max=*(wsk+i);
                 }
       }
 
      for(i=0; i<4 ;i++)
      {
                 for(j=0; j<4 ;j++)
                 {
                  if(*(wsk+i)<*wsk)
                          *min=*(wsk+i);
                 }
      }
}
 
void wczytaj()
{
   int i,j;
    for(i=0; i<4 ;i++)
        {
           for(j=0; j<4 ;j++){
                    printf("podaj liczbe \n");
                    scanf("%d", &t[i][j]);
                    }
        }
}
 
void wyswietl()
{
        int i,j;
     for(i=0; i<4; i++)
     {           printf("\n");  
                 for(j=0; j<4 ;j++)
                 {
                         printf("%d",t[i][j], " ");
                         //printf("\n");
                 }
     }
     printf("\n");
}

jeszcze musisz sobie poprawic to szukanie maxa.
algorytmicznie to wyglada tak,ze bierzesz sobie ustawiasz max na element 0,0 i potem jedziesz po wszystkich elementach (dwa fory) i jesli ktorys jest wiekszy to bierzesz go jako aktualny max. jak skoncza sie fory to zwracasz maxa.
wyrzucilem w funkcji paramter int t, bo jak jest globalna tablica, to nie potrzeba jej przekazywac. no i w scanf nie było &t[i][[j]

0

hmm, teraz to działa niby jak powinno(prawie) jak skopiowałem to co dał dodo_90, ale:

ja chcę żeby wyświetlał mi wartości tabeli i zmiennych min/max, a nie wartości wskaźników(co robi teraz, i co mnie średnio zadowala, a nie wiem jak to zmienić.)

Problem rozwiązany, dzięki za odpowiedzi.

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