infa- pomoc. - język ANSI C (Znajdz liczbę max i min operując na wskaźni...

Forum Rozmawiamy
Odpowiedz
12.06.2011 20:49
1
odpowiedz
zanonimizowany413539
15
Centurion

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");


12.06.2011 20:51
2
odpowiedz
zanonimizowany377077
45
Legend

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 :)

12.06.2011 20:54
3
odpowiedz
zanonimizowany413539
15
Centurion

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>

12.06.2011 20:59
4
odpowiedz
zanonimizowany377077
45
Legend

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.

12.06.2011 21:03
PrzemoDZ
5
odpowiedz
PrzemoDZ
144
Legend

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.

12.06.2011 21:10
6
odpowiedz
zanonimizowany413539
15
Centurion

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...

12.06.2011 21:16
PrzemoDZ
7
odpowiedz
PrzemoDZ
144
Legend

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.

12.06.2011 21:19
8
odpowiedz
zanonimizowany377077
45
Legend

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 :>

12.06.2011 21:20
9
odpowiedz
QrKo
167
Yarr!

Taka rada na przyszlosc - dla wygody wlasnej i innych wrzucaj kod na serwis typu wklej.org

12.06.2011 21:33
10
odpowiedz
zanonimizowany413539
15
Centurion

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 *'

12.06.2011 21:47
11
odpowiedz
DEXiu
151
Senator

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;

12.06.2011 22:08
12
odpowiedz
zanonimizowany413539
15
Centurion

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 ;)

Forum Forum Rozmawiamy
Odpowiedz

GRYOnline.pl:

Facebook GRYOnline.pl Instagram GRYOnline.pl X GRYOnline.pl Discord GRYOnline.pl TikTok GRYOnline.pl Podcast GRYOnline.pl WhatsApp GRYOnline.pl LinkedIn GRYOnline.pl Forum GRYOnline.pl

tvgry.pl:

YouTube tvgry.pl TikTok tvgry.pl Instagram tvgry.pl Discord tvgry.pl Facebook tvgry.pl