Προς το περιεχόμενο

Βοήθεια σε C


Spiroslp

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα. Θέλω όποιος ξέρει να με βοηθήσει σε ένα πρόβλημα που έχω και το παλεύω ΠΑΡΑ πολλές ώρες χωρίς να ξέρω τι έχω κάνει λάθος.

Την άσκηση δεν την έχω τελειώσει ακόμα. Ξέρω τι πρέπει να κάνω στην συνέχεια αλλά κολλάω παρακάτω.

Σκοπός είναι να φτιάξεις υποπρογράμματα για να βρίσκεις Περίμετρο, εμβαδο κ.τ.λ και μετά να τα καλέις στην Main. Το πρόβλημα που συναντάω είναι στο εμβαδό. Ο κώδικας ῀πυ εχω γράψει μέχρι στιγμής είναι αυτός:

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

char Title[20];
 float a, b, c,yp,Per,Em;

void EisagogiTimwn()
{
   printf ("Dose titlo trigonoy\n");
   scanf("%s",Title);

loop1: printf ("Dose thn pleyra a toy trigonou\n");
scanf("%f",&a);
if ((a<0) || (a==0))
{

printf("Dose timh pano apo 0\n");

goto loop1;
}

loop2: printf ("Dose thn pleyra b tou trigonoy\n");
scanf("%f",&;
if ((b<0) || (b==0))
{
   printf("Dose timh pano apo 0\n");
goto loop2;
}

loop3: printf ("Dose thn pleyra c tou trigonou\n");
scanf("%f",&c);
if ((c<0) || (c==0))
{
printf("Dose timh pano apo 0\n");
goto loop3;
}

loop4: printf ("Dose to ypsos tou trigonou\n");
scanf("%f",&yp);
if (yp<=0)
{
printf("Dose timh pano apo 0\n");
goto loop4;
}
}


int Perimetros(float a, float b, float c)
{
Per=a+b+c;
printf ("H Perimetros toy trigonoy einai %f\n",Per);
return Per;
}

int Embadon (float a, float b, float c , float yp)
{
   char x;
   printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n");
   scanf("%c",&x);
  
  if (x=='a')
  {
     Em=1/2*a*yp;
       printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em);
  }
  else if (x=='b')
 {

 Em=1/2*b*yp;
       printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em);
 }
 else if(x=='b')
 {

 Em=1/2*c*yp;
 printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em);
 }
 else
 printf("Dialekse anamesa se a, b h' c\n");
 return Em;
}




int main()
{

EisagogiTimwn();
Perimetros(a,b,c);
Embadon(a,b,c,yp);




   return 0;
}

 

Εκεί που κολλάει είναι στο εμβαδό όπου όταν το τρέχω μου βγάζει αυτό:

Screenshot2010-12-21at104918PM.png

 

Όπου όταν πάει στο Εμβαδό γράφει κανονικά το printf και πάει κατευθείαν στο τελευταίο else και μετά τελειώνει το πρόγραμμα.

Την έχω κάνει και με Switch και πάλι πάει στο default χωρίς να δώσω κάτι εγώ.

Άμα την καλέσω πρώτη στην main μου το τρέχει κανονικά. Ξέρετε τι μπορεί να φταίει; Σας ευχαριστώ πολύ.

Δημοσ.

Καλησπέρα,

πρώτα απ'όλλα γιατί χρησιμοποιείς την LOOP στο κώδικά σου,

και δεύτερον όταν γράφεις κώδικα να επιλέγεις πριν το ποστάρεις το πλαίσιο "εισαγωγή αποσπάσματος κώδικα"

 

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

char Title[20];
float a, b, c,yp,Per,Em;

void EisagogiTimwn()
{
printf ("Dose titlo trigonoy\n");
scanf("%s",Title);

loop1: printf ("Dose thn pleyra a toy trigonou\n");
scanf("%f",&a);
if ((a<0) || (a==0))
{

printf("Dose timh pano apo 0\n");

goto loop1;
}

loop2: printf ("Dose thn pleyra b tou trigonoy\n");
scanf("%f",&;
if ((b<0) || (b==0))
{
printf("Dose timh pano apo 0\n");
goto loop2;
}

loop3: printf ("Dose thn pleyra c tou trigonou\n");
scanf("%f",&c);
if ((c<0) || (c==0))
{
printf("Dose timh pano apo 0\n");
goto loop3;
}

loop4: printf ("Dose to ypsos tou trigonou\n");
scanf("%f",&yp);
if (yp<=0)
{
printf("Dose timh pano apo 0\n");
goto loop4;
}
}


int Perimetros(float a, float b, float c)
{
Per=a+b+c;
printf ("H Perimetros toy trigonoy einai %f\n",Per);
return Per;
}

int Embadon (float a, float b, float c , float yp)
{
char x;
printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n");
scanf("%c",&x);

if (x=='a')
{
Em=1/2*a*yp;
printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em);
}
else if (x=='b')
{

Em=1/2*b*yp;
printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em);
}
else if(x=='b')
{

Em=1/2*c*yp;
printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em);
}
else
printf("Dialekse anamesa se a, b h' c\n");
return Em;
}




int main()
{

EisagogiTimwn();
Perimetros(a,b,c);
Embadon(a,b,c,yp);




return 0;
}

Δημοσ.

Loop χρησιμοποιώ έτσι ώστε άμα δώσει μια τιμή που δεν θέλω να ξαναπηγαίνει με το goto πάνω και να ξαναζητάει τιμή.

Δημοσ.

>int Embadon (float a, float b, float c , float yp)
{
   char x;
   printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n");
   scanf("%c",&x);
  
  if (x=='a')
  {
     Em=1/2*a*yp;
       printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em);
  }
  else if (x=='b')
 {

 Em=1/2*b*yp;
       printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em);
 }
 else if(x=='b')
 {

 Em=1/2*c*yp;
 printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em);
 }
 else
 printf("Dialekse anamesa se a, b h' c\n");
 return Em;
}
    }; /*μήπως λείπει ; */



int main()
{

 

} /*μήπως λείπει ; */

 

 

άσχετα:

όταν ξέρουμε τις 3 πλευρές του τριγώνου, είναι γνωστό και το εμβαδόν > τύπος του Ήρωνα

ένα ισόπλευρο έχει ύψος μικρότερο απο την πλευρά του

 

 

.

Δημοσ.

δες τις αλλαγές που χρειάζονται για να δουλέψει σωστά και να μην θυμίζει ο κώδικας.....gw-basic!

 

>

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

char Title[20];
 float a, b, c,yp,Per,Em;

   void EisagogiTimwn(){
       printf ("Dose titlo trigonoy\n");
       scanf("%s",Title);getchar();
       a=0;
       while (a<0 || a==0){
           printf ("Dose thn pleyra a toy trigonou\n");
           scanf("%f",&a);getchar();
           if (a<0 || a==0)
               printf("Dose timh pano apo 0\n");
       }
       b=0;
       while (b<0 || b==0){
           printf ("Dose thn pleyra b tou trigonoy\n");
           scanf("%f",&;getchar();//b oxi B
           if (b<0 || b==0)
               printf("Dose timh pano apo 0\n");

       }
       c=0;
       while (c<0 || c==0){
           printf ("Dose thn pleyra c tou trigonou\n");
           scanf("%f",&c);getchar();
           if (c<0 || c==0)
               printf("Dose timh pano apo 0\n");
       }
       yp=0;
       while (yp<=0){
           printf ("Dose to ypsos tou trigonou\n");
           scanf("%f",&yp);getchar();
           if (yp<=0)
               printf("Dose timh pano apo 0\n");
       }
}


float Perimetros(float a, float b, float c){//float oxi int
   Per=a+b+c;
   printf ("H Perimetros toy trigonoy einai %f\n",Per);
   return Per;
}

float Embadon (float a, float b, float c , float yp){//float oxi int
   char x='1';
   while(x!='a' && x!='b' && x!='c'){
       printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n");
       scanf("%c",&x);getchar();
       if (x=='a'){
           Em=1/2*a*yp;
           printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em);
       }else if (x=='b'){
           Em=1/2*b*yp;
           printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em);
       }else if(x=='c'){//c oxi b
           Em=1/2*c*yp;
           printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em);
       }else
           printf("Dialekse anamesa se a, b h' c\n");
  }
  return Em;
}

int main(){
   EisagogiTimwn();
   Perimetros(a,b,c);
   Embadon(a,b,c,yp);
   getchar();
   return 0;
}

 

 

 

Υ.Γ. όπως σου έχουν υποδείξει και παραπάνω πρέπει να υπάρχουν κανονικά και κάποιοι έλεγχοι

π.χ. το ύψος σε σχέση με τις πλευρές αλλά και αν με τα μήκη των πλευρών που δίνει ο χρήστης

όντως σχηματίζουν τρίγωνο.

Δημοσ.

και αν με τα μήκη των πλευρών που δίνει ο χρήστης

όντως σχηματίζουν τρίγωνο.

 

σωστό !

αλλά μάλλον κώδικας δεν "στοχεύει" στη γεωμετρία αλλά στην εξάσκηση στη C

 

.gw-basic! πού την θυμήθηκες !

 

.

Δημοσ.

Αν και αρκετοί φίλοι σε έχουν βοηθήσει με την λύση της, εγώ θα μου επιτρέψεις να σταθώ στην LOOP που χρησιμοποίησες, θα σου πρότεινα να την αποφεύγεις (φιλικά πάντα μιλώντας), υπάρχουν πολύ καλύτεροι τρόποι, και παρουσιάζονται σε παραπάνω posts.

Δημοσ.

Σας ευχαριστώ όλους παιδιά.

Virxen75 το getchar() τί είναι. Που βρέθηκε.

fotis4u ναι το ξέρω ότι πρέπει να την αποφεύγω αλλά αυτή μου ήρθε πρώτη στο μυαλό.

Επίσης ότι νούμερο και να βάλω το εμβαδό 0 μου βγαίνει :/

(έβγαλα τα getchar())

Επίσης πως βάζουμε spoiler να σας βάλω μέσα την άσκηση.

Δημοσ.

 

Επίσης πως βάζουμε spoiler να σας βάλω μέσα την άσκηση.

 

"["spoiler] Επίσης πως βάζουμε spoiler να σας βάλω μέσα την άσκηση.

 

βγάλε τα εισαγωγικά

 

.

Δημοσ.

To εμβαδόν προκύπτει 0 διότι διαιρείς δυο ακεραίους : 1/2 = 0

Κάντο .5f και θα δουλέψει.

 

Ο τρόπος υπολογισμού που εφαρμόζεις είναι ο χειρότερος δυνατός.

Τις συντεταγμένες των κορυφών έπρεπε να δίνεις : A(x1,y1), B(x2,y2), C(x3,y3)

Όλα τα ζητούμενα (περίμετρος, εμβαδόν) υπολογίζονται από αυτές με απλούς τύπους.

 

Τέλος σου θυμίζω τον τύπο του Ήρωνα : E = sqrt(τ(τ-α)(τ-β)(τ-γ))

όπου τ είναι η ημιπερίμετρος του τριγώνου : τ=.5(α+β+γ)

Έτσι λαμβάνεται κατευθείαν το εμβαδόν από τα μήκη των πλευρών, δίχως την άμεση εμπλοκή του ύψους.

Όλα αυτά που κάνεις για το ύψος είναι άχρηστα !

 

 

@virxen

Tρεις πλευρές πάντα σχηματίζουν τρίγωνο αν ισχύει η τριγωνική ανισότητα.

Το θέμα είναι ότι δίνει ένα ύψος που δεν εξάγεται από αυτές και μπορεί να είναι λάθος.

Το ύψος λαμβάνεται από τα μήκη των πλευρών πάλι από τον τύπο του Ήρωνα αλλά

εδώ είναι άχρηστο διότι το εμβαδόν βρίσκεται δίχως αυτό.

 

@gtroza

Bλέπω η τελεία καλά κρατεί !!!

 

-

Δημοσ.

To εμβαδόν προκύπτει 0 διότι διαιρείς δυο ακεραίους : 1/2 = 0

Κάντο .5f και θα δουλέψει.

 

Τέλος, ο τρόπος υπολογισμού που εφαρμόζεις είναι ο χειρότερος δυνατός.

Τις συντεταγμένες των κορυφών έπρεπε να δίνεις : A(x1,y1), B(x2,y2), C(x3,y3)

Όλα τα ζητούμενα (περίμετρος εμβαδόν) υπολογίζονται από αυτές με απλούς τύπους.

 

Τέλος σου θυμίζω τον τύπο του Hρωνα :

 

E = sqrt(τ(τ-α)(τ-β)(τ-γ))

 

όπου τ είναι η ημιπερίμετρος του τριγώνου : τ=.5(α+β+γ)

Έτσι λαμβάνεται κατευθείαν το εμβαδόν από τα μήκη των πλευρών, δίχως την άμεση εμπλοκή του ύψους.

Όλα αυτά που κάνεις για το ύψος είναι άχρηστα !

 

-

Πως ακριβώς εφαρμόζουμε το 5f στον τύπο; Έβαλα δυο μηδενικά στο καθένακαι δούλεψε αλλά πως το βάζουμε αυτό μέσα στην εξίσωση. Δεν θυμάμαι.

Επίσης.

Το θέμα είναι να κάνουμε εξάσκηση στην C. Δεν καταλαβαίνω καν τι μου λες με συντεταγμένες και έτσι. Δεν λέει κάτι τέτοιο η εκφώνηση.

Άντε και γράφουμε εξάμηνο τον Ιανουάριο και μετά πάμε σε C++ :D

3 μήνες C από την αρχή μας έχουν πέσει μαζεμένα όλα.

Δημοσ.
Tρεις πλευρές πάντα σχηματίζουν τρίγωνο.

 

αν η μία είναι μεγαλύτερη απο το άθροισμα των άλλων δύο, δεν σχηματίζεται τρίγωνο

αλλά ο φίλος κάνει εξάσκηση στη C

 

Το θέμα είναι να κάνουμε εξάσκηση στην C. Δεν καταλαβαίνω καν τι μου λες με συντεταγμένες και έτσι. Δεν λέει κάτι τέτοιο η εκφώνηση.

 

 

διαβάζουν κι άλλοι το θέμα ! :D

 

.

Δημοσ.

Εξάσκηση δεν είναι μόνον η εκμάθηση της σύνταξης αλλά και η σωστή υλοποίηση/οργάνωση της μεθόδου σε πρόγραμμα.

Όσο καλά κι' αν μάθεις την σύνταξη, αν δεν ξέρεις πώς και τι τύπους να εφαρμόσεις, το πρόγραμμα θα είναι χάλια όπως αυτό εδώ.

 

Π.χ. κάνεις έλεγχο αν δίνει a,b,c και δεν ελέγχεις αν όντως σχηματίζουν τρίγωνο.

Δηλ. αν έχουν νόημα οι εισαχθείσες τιμές που είναι σημαντικότερο.

 

-

Δημοσ.
@gtroza

Έχεις δίκιο (τριγωνική ανισότητα), το διορθώνω*.

 

- < συνέπεια στη σύνταξη ! :mrgreen:

 

*

 

και στη χρήση κασμά, ισχύει αυτή η τριγωνική ανισότητα ! :mrgreen:

χρόνια πολλά καλή χρονιά

 

 

 

χρόνια πολλά σε όλους !

 

 

.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...