zadatak pokazivaci

1

zadatak pokazivaci

offline
  • Wolf11  Male
  • Novi MyCity građanin
  • Vuk Jankovic
  • Pridružio: 30 Jun 2011
  • Poruke: 24
  • Gde živiš: Derventa

ovako ide zadatak:
Definisati tip TACKA kojim se reprezentuje tačka u x0y koordinatnom sistemu (svaka tačka ima odgovarajuću slovnu oznaku, te dvije realne koordinate). Definisati tip TROUGAO kojim se reprezentuje trougao u x0y koordinatnom sistemu (svaki trougao čine tri tačke koje predstavljaju vrhove trougla). Napisati program koji sa standardnog ulaza učitava tri tačke, a zatim, ako je moguće, formira trougao.
Za učitavanje tačke treba definisati i koristiti funkciju čiji je prototip:
void citaj(TACKA *);
Za provjeru da li se može formirati trougao treba definisati i koristiti funkciju čiji je prototip:
int provjera(TACKA *);
Za formiranje trougla treba definisati i koristiti funkciju čiji je prototip:
TROUGAO trougao(TACKA *);

ja sam uradio ovako:
#include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct tacka {     double x,y; } TACKA; void citaj(TACKA *); int provera(TACKA *); int main() {    int i ;    TACKA *pt;    pt = (TACKA *)malloc(3 * sizeof(TACKA));    for (i=0; i<3; i++)     {         printf("Unesite koordinate %d. tacke\n", i+1);         citaj(pt+i);     }     provera(pt);     return 0; } void citaj(TACKA *pt) {     printf("x=");     scanf("%lf", &pt->x);     printf("y=");     scanf("%lf", &pt->y); } int provera(TACKA *pt) {     double a,b,c;     a=sqrt(((pt->x)-((pt+1)->x)*(pt->x)-((pt+1)->x)+((pt->y)-((pt+1)->y))*((pt->y)-((pt+1)->y))));     b=sqrt(((pt->x)-((pt+2)->x)*(pt->x)-((pt+2)->x)+((pt->y)-((pt+2)->y))*((pt->y)-((pt+2)->y))));     c=sqrt((((pt+2)->x)-((pt+1)->x)*((pt+2)->x)-((pt+1)->x)+(((pt+2)->y)-((pt+1)->y))*(((pt+2)->y)-((pt+1)->y))));     if (a+b>c && a+c>b && b+c>a)        {         printf("Moze");         return 1;        }     else         printf("Ne moze");         return 0; }
E sad u cemu je problem, ja ovde nigdje ne koristim ovu drugu strukturu trougao i ne kontam kako ova funkcija uopste formira trougao. Sve sto mi pada na pamet da se ta provjera da li se trougao moze formirati vrsi u toj funkciji ali cemu onda ovo provjera. Pocetnik sam pa nemojte zamjeriti za greske Very Happy



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milos
  • Pridružio: 05 Dec 2010
  • Poruke: 716
  • Gde živiš: Beograd

Mozda treba da se unesu koordinate tacki u torugao.Ako je:
typedef struct troguao { double x1,y1,x2,y2,x3,y3; }TROUGAO;
onda bi:
x1=pt->x; y1=pt->y; x2=pt+1->x; y2=pt+1->y; x3=pt+2->x; y3=pt+2->y;
Samo bi funkcija za formiranje trebala da ima 3 tacke kao parametar a ne 1.



offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14811
  • Gde živiš: Niš

milos97 ::Samo bi funkcija za formiranje trebala da ima 3 tacke kao parametar a ne 1.Funkcija za formiranje trougla ima pokazivač na strukturu tipa TAČKA. Dakle, to bez problema može da bude i niz od tri elementa tipa TAČKA.

offline
  • Milos
  • Pridružio: 05 Dec 2010
  • Poruke: 716
  • Gde živiš: Beograd

Upravu si, nije mi to palo na pamet.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14811
  • Gde živiš: Niš

Wolf11 ::E sad u cemu je problem, ja ovde nigdje ne koristim ovu drugu strukturu trougao i ne kontam kako ova funkcija uopste formira trougao. Sve sto mi pada na pamet da se ta provjera da li se trougao moze formirati vrsi u toj funkciji ali cemu onda ovo provjera. Pocetnik sam pa nemojte zamjeriti za greske Very HappyFormira trougao tako što uzme tri tačke, izvrši proveru da li te tri tačke mogu da formiraju trougao, i ukoliko mogu, formira se i vraća se taj trougao, dok u suprotnom može da se vrati NULL. Tako može da se shvati zadatak.

offline
  • Wolf11  Male
  • Novi MyCity građanin
  • Vuk Jankovic
  • Pridružio: 30 Jun 2011
  • Poruke: 24
  • Gde živiš: Derventa

sad sam ja napravio program u kom struktura trougao izgleda ovako:

typedef struct trougao
{
TACKA niz[3];
} TROUGAO;

main da izgleda ovako:

int main()
{
int i;
TACKA *ptac;
TROUGAO ptro;
printf("Unesite 3 tacke:");
for(i=0;i<3;i++)
{
printf("Unesite podatke o %d. tacki", i+1);
citaj(ptac+i);
}
if(provjera(ptac))
{
printf("Moze se formirati trougao");
ptro=trougao(ptac);
}
else
printf("Nije moguce formirati trougao");
return 0;
}

a funkcija trougao

TROUGAO trougao(TACKA *pt)
{
int i;
TROUGAO *niz;
for(i=0;i<3;i++);
{
niz[i]=pt+i;
}
return niz;
}

medjutim kompajler prijavljuje gresku i ne radi

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14811
  • Gde živiš: Niš

Napisano: 08 Feb 2016 18:14

Segmentation fault? Smile

Ne radi jer nisi rezervisao memoriju za tu tačku, već si samo napravio pointer koji ne gađa ništa (odnosno gađa memoriju koja je vrlo verovatno van memorijskog prostora tog procesa, pa OS ubija proces).
Podsetimo se da kod programskog jezika C deklaracija neke promenljive samo rezerviše memoriju, bez da je inicijalizuje na neku podrazumevanu vrednost. Dakle, kada ti deklarišeš neki pokazivač, to samo znači da si rezervisao mesto za njega, a da je njegova vrednost (ono na šta on zapravo pokazuje) ono što se u tom trenutku zadesilo u memoriji na lokaciji koja je rezervisana za taj pokazivač. U literaturi (ili pak u neformalnim diskusijama) takve pokazivače nazivaju "divljim pokazivačima" (dangling/wild pointers).

Dopuna: 08 Feb 2016 18:16

Inače, siguran si da kompajler prijavljuje grešku? Ili se pak greška javlja u toku izvršenja?

Sintaksno ovo izgleda dobro na prvi pogled, pa zato pitam.

offline
  • Pridružio: 15 Maj 2009
  • Poruke: 963

Ja na prvi pogled sam odmah primetio u funkciji trougao: for(i=0;i<3;i++);
Slucajno sam bacio pogled bas tu, bezveze onako Very Happy
A ne mogu sa da probam da kompajlujem da vidim ima li jos nesto.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14811
  • Gde živiš: Niš

Istina. No opet, i sa tim je kod sintaksno ispravan.

offline
  • Wolf11  Male
  • Novi MyCity građanin
  • Vuk Jankovic
  • Pridružio: 30 Jun 2011
  • Poruke: 24
  • Gde živiš: Derventa

Pa kako sam ja onda trebao da napisem taj dio koda, jer sta god sam pokusao promijeniti stalno sam dobijao neku gresku a ovo mi se nekako najvise svidjelo, manje gresaka od ovog nisam mogao.

Ako nekog zanima sta mi izbaci kompajler
prvo upozorenje mi kopajler prikazuje u mainu gdje sam definisao TROUGAO ptro, pise variable ptro set but not used

e sad u funkciji trougao u ovoj mojoj petlji kad sklonim ovo ;
znaci gdje sam napisao niz[i]=pt+i;
kompajler izbaci incopatible types when assigning to type 'TROUGAO' from type 'struct TACKA *'

pa onda ovo gdje sam napisao return niz na kraju funkcije
pise incopatible types when returning 'struct TROUGAO *' but TROUGAO was expected

i jos pise control reaches end of non-void funciton

Ko je trenutno na forumu
 

Ukupno su 810 korisnika na forumu :: 45 registrovanih, 8 sakrivenih i 757 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., antonije64, celik, cenejac111, CikaKURE, crnitrn, darkangel, debeli, deLacy, DonRumataEstorski, FOX, Georgius, Karla, Krvava Devetka, ksyyaj, Kubovac, ljuba, madza, Matija, Mi lao shu, mikrimaus, milan.vukovic, Misirac, mrav pesadinac, nesa1962, NoOneEver Dreams, nuke92, ozzy, raptorsi, robert1979, rodoljub, royst33, saputnik plavetnila, sasa87, Srle993, Stoilkovic, TheBeastOfMG, uruk, Vatreni Zmaj, VJ, vlajkox, W123, wolf431, Zoca, 79693