infa- pomoc. - język ANSI C (Znajdz liczbę max i min operując na wskaźni...
Witam. Mam na zaliczenie do napisania program, któy znajduje liczbę maxymalną i minimalną operujac na wskaźnikach i funkcjach własnych w tablicy dwuwymiarowej - 4x4. Problem polega na tym, że...właśnie nie wiem gdzie mam problem, program ma napisany prawie cały, tylko że już na samym końcu wywala mi pozycje wskaźników, a ja chce ich wartości...
Kod programu niżej, jakby znalazł się ktoś kto zna się na rzeczy to by było bardzo miło. Z góry dzięki wielkie ;)
--------------
#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*j)<*wsk)
*min=*(wsk+i*j);
void wczytaj()
int i,j;
for(i=0; i<4 ;i++)
for(j=0; j<4 ;j++)
printf("podaj liczbe \n");
scanf("%d", &t[j]);
void wyswietl()
int i,j;
for(i=0; i<4; i++)
printf("\n");
for(j=0; j<4 ;j++)
printf("%d",t[j], " ");
//printf("\n");
printf("\n");
printf("%d",t[j], " ");
A nie printf("%d",t[ I ][j], " "); ?
Tak samo scanf("%d", &t[j]);
t[1] to cały rząd/kolumna, t[1][3] to jedna liczba.
Edycja: no tak. Golowe znaczniki :)
Zły kod wkleiłem, sry ;d
#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");
›
tam jest t [ i ] [j] gdzie podałeś tomazzi.
//E: no lol, GOL Forum nie uznaje i w nawiasach kwadratowych czy co? ciągle, 2raz już mi to usuneło... Tam gdzie są spacje przy i w nawiasach kwadratowych tych spacji nie ma, specjalnie je tutaj zrobiłem żeby była widoczna ta sekcja w ogóle <lol>
for(i=0; i<4 ;i++)
‹
for(j=0; j<4 ;j++)
‹
if(*(wsk+i)>*wsk)
*max=*(wsk+i);
›
›
Jaki jest sens takiej konstrukcji? Bo nie bardzo rozumiem.
1. kategoria- "szkoła"
2. [ i ] jest znacznikiem italic- na forum używa się BBcode.
3. to co tomazzi- nie jestem ekspertem ale wg mnie coś takiego:
if(*(wsk+i)>*wsk)
*max=*(wsk+i);
nie ma prawa działać. Jeśli się chcesz iterować po tablicy używając wskaźników, do wskaźnika pierwszego elementu dodajesz wielkość zawartości wskaźnika- w tym przypadku liczby typu integer.
to miało działać w ten sposób że jeśli dojdzie do wskaźnika liczby, i ta liczba będzie wieksza od poprzedniej, to wtedy tą liczbę przypisze zmiennej max. I potem, tą zmienną mam właśnie wyświetlić. Po tym całym argumencie. Ten fragment był na lekcji więc go prawdę mówiąc nie analizowałem...
IMO miało by to sens jeśli rozmiar elementu, w tym przypadku 4 bajty był by pomnożony przez "i".
Sam jednak używałem tej metody raptem kilka razy i na wektorze, więc nie wiem jak się to sprawdzi w macierzy.
for(i=0; i<4 ;i++)
‹
for(j=0; j<4 ;j++)
‹
if(*(wsk+i)>*wsk)
*max=*(wsk+i);
›
›
Po co jest drugi for? Nie mogę tego zrozumieć nijak.
int wsk;
int max;
int min;
wczytaj();
wyswietl();
znajdz(&wsk,&max,&min);
Przecież ten wsk jest pusty :>
Taka rada na przyszlosc - dla wygody wlasnej i innych wrzucaj kod na serwis typu wklej.org
tomazzi - no w sumie masz rację, jak operujemy na wskaźnikach to nie trzeba 2pętli (Tylko w jednej pętli mogę zrobić przy i<4*4. Mój fail. Wynikający z przyzwyczajenia do wpisywania zwykłego w tablicach..bez wskaźników byłoby raczej potrzebne, czyż nie?
Aha, i wskaźnik pusty nie jest bo jak wyświetlać max i min wyświetla, tylko lokację wskaźnika w pamięci a nie jego wartość... a z kolei jak zrobie w printfie:
printf("max %d \n", *max);
printf("min %d \n", *min);
to wtedy wywala błąd:, o taki: invalid type argument of `unary *'
Po pierwsze: taki kod:
for(i=0; i<4 ;i++)
‹
for(j=0; j<4 ;j++)
‹
if(*(wsk+i)>*wsk)
*max=*(wsk+i);
›
›
Nie szuka maksymalnego elementu, tylko ostatniego elementu w pierwszym wierszu tablicy t, który jest większy od poprzedniego (analogicznie ten drugi nie szuka minimalnego). Prawidłowo: powinieneś w warunku if porównywać z *max (albo *min) a nie *wsk.
Po drugie: Nie pamiętam dokładnie (a nie chce mi się sprawdzać), ale nawet jeśli takie dodawanie liczby do wskaźnika i późniejsze jego wyłuskanie przejdzie, to robiąc tak jak powyżej nie przeszukujesz całej tablicy 4x4, tylko jej pierwszy wiersz. Poprawnie byłoby:
blablabla
*max=*(wsk+i*4+j);
Po trzecie: wsk jest niezainicjalizowane, więc raczej trudno mówić, żeby to było poprawne. Cośtam pod nim jest, bo coś być musi, ale zapewne w funkcji znajdz() miało być najpierw:
wsk = t;
zgadza się DEXiu, tamten algorytm był do dupy, bo nie szuka tego max, a dokładniej nie zamienia poprzedniego maxa nowym maxem jeśli znajdzie większa liczbę od poprzedniego maxa.... tlyko zmaiast maxa jest wskaźnik. Dzięki wielkie, już wszystko naprawione i działa tak jak należy! Problem rozwiązany ;)