Poslao: 01 Feb 2016 17:56
|
offline
- Wolf11
- Novi MyCity građanin
- 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
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 01 Feb 2016 18:24
|
offline
- milos97
- Počasni građanin
- 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.
|
|
|
|
Poslao: 01 Feb 2016 18:39
|
offline
- vasa.93
- Moderator foruma
- 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.
|
|
|
|
|
Poslao: 01 Feb 2016 18:43
|
offline
- vasa.93
- Moderator foruma
- 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 Formira 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.
|
|
|
|
Poslao: 08 Feb 2016 17:47
|
offline
- Wolf11
- Novi MyCity građanin
- 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
|
|
|
|
Poslao: 08 Feb 2016 18:16
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14811
- Gde živiš: Niš
|
Napisano: 08 Feb 2016 18:14
Segmentation fault?
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.
|
|
|
|
Poslao: 08 Feb 2016 19:11
|
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
A ne mogu sa da probam da kompajlujem da vidim ima li jos nesto.
|
|
|
|
Poslao: 08 Feb 2016 19:15
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14811
- Gde živiš: Niš
|
Istina. No opet, i sa tim je kod sintaksno ispravan.
|
|
|
|
Poslao: 08 Feb 2016 19:34
|
offline
- Wolf11
- Novi MyCity građanin
- 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
|
|
|
|