Struktury figur

edek996
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 1 mar 2011, o 14:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

Struktury figur

Post autor: edek996 »

Stwórz strukturę punktu (x,y) i przy jej użyciu stwórz struktury trójkąta, kwadratu, prostokąta, koła

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

main()
{
      struct point 
      {
             int x;
             int y;
             };
             
        struct point a;
        struct point b;
        struct point c;


        struct prostokat
{
 struct point a;
 struct point b;
};
      
         struct trojkat
      {
             struct point a,b,c;
             };
             
               system("PAUSE");
             return 0;
                    }
nie do końca rozumiem co miałbym zrobić w tym zadaniu, czy trzeba utworzyć konkretne współrzędne punktu (x,y) używając makepoint i dalej coś z nimi zrobić?

2 część zadania:
Zakładając, że odległość między dwoma punktami \(\displaystyle{ A = ( X_{A} ; Y_{A} ); B = ( X_{B} ; Y_{B} )}\)jest określona jako \(\displaystyle{ d(A, B) = \sqrt{(X_{A}-X_{B})^{2} + (Y_{A}- Y_{B})^{2} }}\) napisać funkcje liczące a)pole figury b)obwód figury
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Struktury figur

Post autor: DBoniem »

Czy może to wyglądać w następujący sposób:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159

struct point {
       int x;
       int y;
       };
       
struct trojkat {
       struct point A;
       struct point B;
       struct point C;
       };
       
struct kwadrat {
       struct point A;
       struct point B;
       struct point C;
       struct point D;
       };

struct prostokat {
       struct point A;
       struct point B;
       struct point C;
       struct point D;
       };
       
struct kolo {
       struct point A;
       struct point B;
       };

        

double odleglosc (struct point A, struct point B)       //zdefiniowanie odleglosci 
{
    double odleglosc;
    odleglosc=sqrt(pow((A.x-B.x),2)+pow((A.y-B.y),2));
     return odleglosc;
    
}

int n;
double obwod,pole,r;

main()
{
          printf("Co chcesz obliczyc 
 0 - trojkat
 1 - prostokat
 2 - kwadrat
 3 - kolo


 ");
          scanf("%d",&n);                                      //Wybor odpowiedniej figury 
          
          switch(n){
          
          case 0:
               
              printf("Wybrales trojkat 
");
              struct trojkat troj;
              printf("Podaj wspolrzedne punktu A(x,y)
");
              scanf("%d %d", &troj.A.x , &troj.A.y);
              
              printf("Podaj wspolrzedne punktu B(a,b) 
");
              scanf("%d %d", &troj.B.x, &troj.B.y);
              
              printf("Podaj wspolrzedne punktu C(c,d) 
");
              scanf("%d %d", &troj.C.x , &troj.C.y);
              
              printf("Wybrales nastepujace punkty: 
");
              printf("A(%d,%d)
",troj.A.x, troj.A.y);
              printf("B(%d,%d)
",troj.B.x, troj.B.y);
              printf("C(%d,%d)
",troj.C.x, troj.C.y);
              
              obwod= odleglosc(troj.A , troj.B) + odleglosc(troj.A , troj.C) + odleglosc(troj.B , troj.C);
              printf("Obwod trojkata wynosi: %.4f 
",obwod);
              
              //pole trojkata jako obliczenie odpowiedniego wyznacznika, fabs - wartosc bezwzgledna 
              
              pole=0.5*fabs((((troj.B.x-troj.A.x)*(troj.C.y-troj.A.y))-((troj.B.y-troj.A.y)*(troj.C.x-troj.A.x))));
              printf("Pole trojkata wynosi: %.4f 
",pole);
              
              
              break;
              
     case 1:
             
             printf("Wybrales prostokat 
");
             struct prostokat pr;
             
             printf("Podaj wspolrzedne czterech kolejnych punktow prostokata ABCD
");
             
             printf("Podaj wspolrzedne punktu A(x,y)
");
             scanf("%d %d", &pr.A.x , &pr.A.y);
             
             printf("Podaj wspolrzedne punktu B(a,b)
");
             scanf("%d %d", &pr.B.x , &pr.B.y);
     
             printf("Podaj wspolrzedne punktu C(c,d)
");
             scanf("%d %d", &pr.C.x , &pr.C.y);    
             
             printf("Podaj wspolrzedne punktu D(e,f) 
");
             scanf("%d %d", &pr.D.x , &pr.D.y);
                   
             printf("Wybrales nastepujace punkty: 
");
             printf("A(%d,%d)
",pr.A.x, pr.A.y);
             printf("B(%d,%d)
",pr.B.x, pr.B.y);
             printf("C(%d,%d)
",pr.C.x, pr.C.y);  
             printf("D(%d,%d)
",pr.D.x, pr.D.y);
             
             pole=((odleglosc(pr.A, pr.B))*(odleglosc(pr.B,pr.C)));
             printf("Pole prostokata wynosi: %.4f 
",pole);
             
             obwod=2*((odleglosc(pr.A, pr.B))+(odleglosc(pr.B,pr.C)));
             printf("Obwod prostokata wynosi: %.4f 
",obwod);
             
             break;
             
     case 2:
                  
             printf("Wybrales kwadrat

");
             struct kwadrat kwad;
             
             printf("Podaj wspolrzedne dwoch kolejnych punktow kwadratu ABCD

");
             
             printf("Podaj wspolrzedne punktu A(x,y)
");
             scanf("%d %d", &kwad.A.x , &kwad.A.y);
             
             printf("Podaj wspolrzedne punktu B(a,b)
");
             scanf("%d %d", &kwad.B.x , &kwad.B.y);
             
             printf("Wybrales nastepujace punkty: 
");
             printf("A(%d,%d)
",kwad.A.x, kwad.A.y);
             printf("B(%d,%d)
",kwad.B.x, kwad.B.y);
             
             obwod=4*(odleglosc(kwad.A , kwad.B));
             printf("Obwod kwadratu wynosi: %.4f",obwod);
             
             pole=pow((odleglosc(kwad.A, kwad.B)),2);
             printf("Pole kwadratu wynosi: %.4f",pole);
             
             
             break;
             
      case 3:
           
            printf("Wybrales kolo
");
            struct kolo kol;
            printf("Podaj wspolrzedne A(x,y) srodka kola
");
            scanf("%d %d",&kol.A.x, &kol.A.y);
            printf("Podaj wspolrzedne punktu B(a,b) lezacego na obwodzie kola
");
            scanf("%d %d",&kol.B.x, &kol.B.y);
            
            printf("Wybrales nastepujace punkty: 
");
            printf("A(%d,%d)
",kol.A.x, kol.A.y);
            printf("B(%d,%d)
",kol.B.x, kol.B.y);
             
            r=(odleglosc(kol.A, kol.B));
            
            obwod=(2*PI*r);
            printf("Obwod kola wynosi: %.4f 
",obwod);
            
            pole=PI*(pow(r,2));
            printf("Pole kola wynosiu %.4f
",pole);
             
             
           break;
           default:
                   {
                         printf("Wybrales liczbe, ktorej nie jest przypisana zadna figura 
");
                         }
                         break;
             
             
             }
             
          
          system("PAUSE");
          return 0;
          }
          
wyjaśnienie

1. stwarzam strukturę punktu, następnie za jej pomocą stwarzam struktury innych figur, czyli prostokąta, kwadratu, koła, trójkąta.
W trójkącie potrzebuje 3 punkty czyli 3 struktury punktu
W kole 2 punkty (środek i punkt na obwodzie koła)
W kwadracie wystarczą mi 2 punkty, dzięki nim mogę obliczyć obwód i koło
w prostokącie biorę 4 punkty zakładam, że wybrane współrzędne rzeczywiście dadzą prostokąt

Reszta to odpowiednie opisanie by program działał - wzory na pole obwód, korzystanie ze struktur punktu.

Teraz pytanie. Czy należało właśnie w ten sposób zrobić to zadanie, bo początkowo nie wiedziałem w ogóle jak się za to zabrać, lecz teraz kiedy zrozumiałem co nieco, napisałem kod, lecz nie jestem w 100% pewny czy tak można to zrobić.
Crizz
Użytkownik
Użytkownik
Posty: 4094
Rejestracja: 10 lut 2008, o 15:31
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 12 razy
Pomógł: 805 razy

Struktury figur

Post autor: Crizz »

DBoniem, pomysł generalnie jest OK.

Nie zastosowałeś się jednak tutaj do polecenia, które mówi wyraźnie:
edek996 pisze: Zakładając, że odległość między dwoma punktami \(\displaystyle{ A = ( X_{A} ; Y_{A} ); B = ( X_{B} ; Y_{B} )}\)jest określona jako \(\displaystyle{ d(A, B) = \sqrt{(X_{A}-X_{B})^{2} + (Y_{A}- Y_{B})^{2} }}\) napisać funkcje liczące a)pole figury b)obwód figury
Mogę sie więc na razie odnieść do programu, w którym nie ma wydzielonych tych funkcji (podejrzewam, że w zadaniu chodzi o funkcje, które przyjmują strukturę np. koło, a zwracają jego obwód - nie odpowiadają natomiast za pobieranie danych od uzytkownika; zatem tylko niewielkie fragmenty Twojego kodu powinny się znaleźć w tych funkcjach zamiast w funkcji main).

Można by zastanowić się, jak zapewnić poprawność wprowadzanych danych (to, że prostokąt nie jest w rzeczywistości przypadkowym czworokątem), jednak jako programista masz prawo przyjąć jako asercję początkową (niewątpliwie naiwne) założenie, że użytkownik nie jest idiotą.

Mam jeszcze tylko uwagę co do
DBoniem pisze:W kole 2 punkty (środek i punkt na obwodzie koła)
Naprawdę czujesz się z tym wygodnie? Nie prościej:

Kod: Zaznacz cały

struct kolo {
       struct point srodek;
       float promien;
       };
Przecież użycia typu prostego w swojej strukturze nikt Ci nie zabrania.

I może jeszcze: naprawdę nie jest dobrym pomysłem używanie intów jako współrzędnych punktów, a już tym bardziej wyników pierwiastka z niewiadomo czego (bo nie wiadomo, co poda użytkownik).
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Struktury figur

Post autor: DBoniem »

Te funkcje to mają być wzory na pola i obwody figur?

Co do koła to słusznie można inaczej zapisać jej strukturę.

A jeśli w kwadracie biorę na wejściu współrzędne tylko dwóch punktów, to w strukturze kwadratu mam napisać, że jest to struktura 2 czy 4 punktów?

W prostokącie można napisać kilka warunków o długościach poszczególnych boków, kiedy nie są równe to nie jest to prostokąt itd. ale nie wydaje mi się, żeby miało to, aż tak wielkie znaczenie, chociaż pewne warunki można dopisać.

Czy te współrzędne mogą zostać, czy jednak założeniem programu jest co innego?
Crizz
Użytkownik
Użytkownik
Posty: 4094
Rejestracja: 10 lut 2008, o 15:31
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 12 razy
Pomógł: 805 razy

Struktury figur

Post autor: Crizz »

DBoniem pisze:Te funkcje to mają być wzory na pola i obwody figur?
Tak. Generalnie maja być podobne do funkcji odleglosc, tzn. np.:

Kod: Zaznacz cały

double pole(kolo k)
{
return PI*k.promien*k.promien;
}
DBoniem pisze: A jeśli w kwadracie biorę na wejściu współrzędne tylko dwóch punktów, to w strukturze kwadratu mam napisać, że jest to struktura 2 czy 4 punktów?
No jak na razie utworzyłeś strukturę złożoną z czterech punktów, a używasz dwóch, co jest pewną niekonsekwenscją.

Jeśli jednak zdecydujesz, że kwadrat przedstawiają dwa punkty, to co to by miały być za punkty? Nie mogą to być dwa kolejne wierzchołki, bo wtedy nie wiadomo, o jaki kwadrat chodzi (po której stronie tak opisanego boku leży przeciwległy bok kwadratu). Musiałyby to być dwa przeciwległe wierzchołki, ale wtedy trzeba by skorzystać z innych wzorów na pole i obwód (nie jest to jednak takie trudne).
DBoniem pisze:Czy te współrzędne mogą zostać, czy jednak założeniem programu jest co innego?
Tzn. co masz na myśli?
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Struktury figur

Post autor: DBoniem »

Przerobiłem wszystkie pola obwody na struktury, kompiluje się, lecz wyrzuca w wynikach same zera nic nie liczy, gdzie leży błąd?

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159

struct point {
       int x;
       int y;
       };
       
struct trojkat {
       struct point A;
       struct point B;
       struct point C;
       };
       
struct kwadrat {
       struct point A;
       struct point B;
       struct point C;
       struct point D;
       };

struct prostokat {
       struct point A;
       struct point B;
       struct point C;
       struct point D;
       };
       
struct kolo {
       struct point A;
       struct point B;
       };

        

double odleglosc (struct point A, struct point B)       //zdefiniowanie odleglosci 
{
    return sqrt(pow((A.x-B.x),2)+pow((A.y-B.y),2));
     }

double obwodtroj (struct trojkat troj)
{ 
       return odleglosc(troj.A , troj.B) + odleglosc(troj.A , troj.C) + odleglosc(troj.B , troj.C);
       }

double poletroj (struct  trojkat troj)
{
       return 0.5*fabs((((troj.B.x-troj.A.x)*(troj.C.y-troj.A.y))-((troj.B.y-troj.A.y)*(troj.C.x-troj.A.x))));
       }

       
double polekwad (struct kwadrat kwad)
{
       return pow((odleglosc(kwad.A, kwad.B)),2);
       }
double obwodkwad (struct kwadrat kwad)
{
       return 4*(odleglosc(kwad.A , kwad.B));
       }
 
double polepr (struct prostokat pr)
{
       return  ((odleglosc(pr.A, pr.B))*(odleglosc(pr.B,pr.C)));
       }

double obwodpr (struct prostokat pr)
{
       return 2*((odleglosc(pr.A, pr.B))+(odleglosc(pr.B,pr.C)));
       }
                    
double polek (struct kolo k)
{ 
       return PI*(odleglosc(k.A, k.B))*(odleglosc(k.A, k.B));
       }    

double obwodk (struct kolo k)
{       
        return 2*PI*(odleglosc(k.A, k.B));
        }
        
int n;

main()
{
          printf("Co chcesz obliczyc 
 0 - trojkat
 1 - prostokat
 2 - kwadrat
 3 - kolo


 ");
          scanf("%d",&n);                                      //Wybor odpowiedniej figury 
          
          switch(n){
          
          case 0:
               
              printf("Wybrales trojkat 
");
              struct trojkat troj;
              printf("Podaj wspolrzedne punktu A(x,y)
");
              scanf("%d %d", &troj.A.x , &troj.A.y);
              
              printf("Podaj wspolrzedne punktu B(a,b) 
");
              scanf("%d %d", &troj.B.x, &troj.B.y);
              
              printf("Podaj wspolrzedne punktu C(c,d) 
");
              scanf("%d %d", &troj.C.x , &troj.C.y);
              
              printf("Wybrales nastepujace punkty: 
");
              printf("A(%d,%d)
",troj.A.x, troj.A.y);
              printf("B(%d,%d)
",troj.B.x, troj.B.y);
              printf("C(%d,%d)
",troj.C.x, troj.C.y);
              
              printf("Obwod trojkata wynosi: %.4f 
",obwodtroj);
              
              printf("Pole trojkata wynosi: %.4f 
",poletroj);
              
               break;
              
     case 1:
             
             printf("Wybrales prostokat 
");
             struct prostokat pr;
             
             printf("Podaj wspolrzedne czterech kolejnych punktow prostokata ABCD
");
             
             printf("Podaj wspolrzedne punktu A(x,y)
");
             scanf("%d %d", &pr.A.x , &pr.A.y);
             
             printf("Podaj wspolrzedne punktu B(a,b)
");
             scanf("%d %d", &pr.B.x , &pr.B.y);
     
             printf("Podaj wspolrzedne punktu C(c,d)
");
             scanf("%d %d", &pr.C.x , &pr.C.y);    
             
             printf("Podaj wspolrzedne punktu D(e,f) 
");
             scanf("%d %d", &pr.D.x , &pr.D.y);
                   
             printf("Wybrales nastepujace punkty: 
");
             printf("A(%d,%d)
",pr.A.x, pr.A.y);
             printf("B(%d,%d)
",pr.B.x, pr.B.y);
             printf("C(%d,%d)
",pr.C.x, pr.C.y);  
             printf("D(%d,%d)
",pr.D.x, pr.D.y);
             
             printf("Pole prostokata wynosi: %.4f 
",polepr);
             
             printf("Obwod prostokata wynosi: %.4f 
",obwodpr);
             
             break;
             
     case 2:
                  
             printf("Wybrales kwadrat

");
             struct kwadrat kwad;
             
             printf("Podaj wspolrzedne dwoch kolejnych punktow kwadratu ABCD

");
             
             printf("Podaj wspolrzedne punktu A(x,y)
");
             scanf("%d %d", &kwad.A.x , &kwad.A.y);
             
             printf("Podaj wspolrzedne punktu B(a,b)
");
             scanf("%d %d", &kwad.B.x , &kwad.B.y);
             
             printf("Wybrales nastepujace punkty: 
");
             printf("A(%d,%d)
",kwad.A.x, kwad.A.y);
             printf("B(%d,%d)
",kwad.B.x, kwad.B.y);
             
             printf("Obwod kwadratu wynosi: %.4f",obwodkwad);
             
             printf("Pole kwadratu wynosi: %.4f",polekwad);
             
             
             break;
             
      case 3:
           
            printf("Wybrales kolo
");
            struct kolo k;
            printf("Podaj wspolrzedne A(x,y) srodka kola
");
            scanf("%d %d",&k.A.x, &k.A.y);
            printf("Podaj wspolrzedne punktu B(a,b) lezacego na obwodzie kola
");
            scanf("%d %d",&k.B.x, &k.B.y);
            
            printf("Wybrales nastepujace punkty: 
");
            printf("A(%d,%d)
",k.A.x, k.A.y);
            printf("B(%d,%d)
",k.B.x, k.B.y);
             
            printf("Obwod kola wynosi: %.4f 
",obwodk);
            
           printf("Pole kola wynosiu %.4f
",polek);
             
             
           break;
           default:
                   {
                         printf("Wybrales liczbe, ktorej nie jest przypisana zadna figura 
");
                         }
                         break;
             
             
             }
             
          
          system("PAUSE");
          return 0;
          }
          
Czy stara wersja mojego programu będzie do przyjęcia?
Crizz
Użytkownik
Użytkownik
Posty: 4094
Rejestracja: 10 lut 2008, o 15:31
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 12 razy
Pomógł: 805 razy

Struktury figur

Post autor: Crizz »

Błąd leży np. tu:

Kod: Zaznacz cały

printf("Obwod trojkata wynosi: %.4f 
",obwodtroj);
Czym jest obwodtroj?

Jest zasadnicza różnica pomiędzy:

Kod: Zaznacz cały

obwodtroj
a

Kod: Zaznacz cały

obwodtroj(troj)
i tylko to drugie jest wywołaniem funkcji. Jak poprawisz swój program, wstawiając wszędzie wywołania funkcji, to będzie działał poprawnie.

Co do poprzedniej wersji programu, to wszystkie uwagi już znasz, sam zdecyduj.
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Struktury figur

Post autor: DBoniem »

Racja wstawienie nawiasów sprawiło, że wszystko działa już jak należy.
Czyli podsumowując wszystko jest zrobione już tak jak powinno być?(czyli zdefiniowane za pomocą struktur)
Crizz
Użytkownik
Użytkownik
Posty: 4094
Rejestracja: 10 lut 2008, o 15:31
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 12 razy
Pomógł: 805 razy

Struktury figur

Post autor: Crizz »

Moim zdaniem już może być.
ODPOWIEDZ