[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από Connor MacLeod » 13 Δεκ 2011 11:32

Στο δευτερο, αν η διερεση γίνεται (δλδ, αν το SecondNumber ειναι διαφορο του 0) με δειχνει σωστα τα αποτελεσματα).
Στο πρώτο αν κανω μια διαιρεση με το 0. πχ 4/0 με βγαζει σωστα το printf που λεει "De ginetai dieresi me to 0"
Αλλα απο κατω εμφανιζει και ενα -2147483648.
Why?

Source:

Κώδικας: Επιλογή όλων

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

float twoNumbers&#40; float FirstNumber, float SecondNumber &#41;&#123;

  float Dieresi;
  if &#40;SecondNumber==0&#41;
  printf&#40;"De ginetai dieresi me to 0"&#41;;
  else
  Dieresi = FirstNumber / SecondNumber;
  return Dieresi;

&#125;

int main&#40;void&#41; &#123;
    int n1;
    int n2;
    int apotelesma;
    printf&#40;"\nDose 2 arithmous &#58; "&#41;;
    scanf&#40;"%i %i", &n1, &n2&#41;;
    apotelesma = twoNumbers&#40;n1,n2&#41;;
    printf&#40;"\n To apotelesma einai&#58; %i \n", apotelesma&#41;;
    system&#40;"pause"&#41;;
&#125;
Εικόνα
Τελευταία επεξεργασία από το μέλος Connor MacLeod την 13 Δεκ 2011 21:03, έχει επεξεργασθεί 1 φορά συνολικά.
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3752
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από DGeorge » 13 Δεκ 2011 16:17

Connorα πολλή Καλησπέρα σου :D :D
Δεν γνωρίζω από C, ή C++, απ'όπου φαντάζομαι ότι είναι ο κώδικάς σου (λόγω 'Κατηγορίας').
Από τα όσα γνωρίζω από προγραμματισμό Η/Υ, φαντάζομαι ότι:
Σε περίπτωση διαίρεσης με το "0", αφού βγάλει το "De ginetai dieresi me to 0", ο κώδικας πηγαίνει -λογικά- στο

Κώδικας: Επιλογή όλων

return Dieresi;
όπου -επίσης- καταλήγει και το

Κώδικας: Επιλογή όλων

else 
Dieresi = FirstNumber / SecondNumber;
αυτό το

Κώδικας: Επιλογή όλων

return Dieresi;
σημαίνει άραγε;- μηδενισμό της μεταβλητής 'Dieresi' κι επιστροφή στο

Κώδικας: Επιλογή όλων

float twoNumbers&#40; float FirstNumber, float SecondNumber &#41;&#123;
(Διότι κάπως έτσι φαντάζομαι ένα σωστό LOOP σε οποιαδήποτε Γλώσσα Προγραμματισμού!)

Άβαταρ μέλους
xmavidis
Honorary Member
Δημοσιεύσεις: 1217
Εγγραφή: 02 Δεκ 2003 19:59
Τοποθεσία: Ηράκλειο

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από xmavidis » 13 Δεκ 2011 17:22

Στο παράδειγμα σου η apotelesma έχει μια random τιμή.

Δοκίμασε το παρακάτω:
Αν πας να διαιρέσεις με το 0 η twoNumbers() θα γυρνάει -1 αλλιώς θα γυρνάει την Dieresi.
Μέσα στην main(), πριν τυπώσεις το αποτέλεσμα έλεγξε αν η apotelesma >= 0.

Κώδικας: Επιλογή όλων

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

float twoNumbers&#40; float FirstNumber, float SecondNumber &#41;&#123; 

  float Dieresi; 
  if &#40;SecondNumber==0&#41; &#123;
  printf&#40;"De ginetai dieresi me to 0"&#41;;
  return -1;
  &#125; else &#123; 
  Dieresi = FirstNumber / SecondNumber; 
  return Dieresi;
 &#125; 

&#125; 

int main&#40;void&#41; &#123; 
    int n1; 
    int n2; 
    int apotelesma; 
    printf&#40;"\nDose 2 arithmous &#58; "&#41;; 
    scanf&#40;"%i %i", &n1, &n2&#41;; 
    apotelesma = twoNumbers&#40;n1,n2&#41;; 
    if &#40;apotelesma >= 0&#41; &#123;
    printf&#40;"\n To apotelesma einai&#58; %i \n", apotelesma&#41;; 
    &#125;
    system&#40;"pause"&#41;;
    return 0; 
&#125;
I want to know God’s thoughts; the rest are details.
Albert Einstein

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από gvre » 13 Δεκ 2011 18:36

Σε κάποια γλώσσα που υποστηρίζει exceptions θα μπορούσες να "πετάξεις" ένα στην περίπτωση διαίρεσης με το 0. Στη C έχεις διάφορες επιλογές όπως:

1. int twoNumbers(float a, float b, float *result)
Περνάς στην result το αποτέλεσμα της διαίρεσης και επιστρέφεις 0 αν όλα είναι οκ αλλιώς 1 αν το b = 0.

2. float twoNumbers(float a, float b, int *err)
Αν έχεις διαίρεση με το 0 θέτεις την err=1 και επιστεφεις ό,τι θέλεις (πχ 0).
Αν το b != 0 τότε θέτεις την err=0 και επιστρέφεις το αποτέλεσμα.

Προσωπικά προτείνω τη 2η λύση.

Κώδικας: Επιλογή όλων

#include <stdio.h>

float twoNumbers&#40;float a, float b, int *err&#41;;
float twoNumbers&#40;float a, float b, int *err&#41;
&#123;
        if &#40;b == 0&#41;
        &#123;
                *err = 1;
                return 0;
        &#125;

        *err = 0;
        return a / b;
&#125;

int main&#40;void&#41;
&#123;
        float a = 4., b = -2., result;
        int err = 0;

        result = twoNumbers&#40;a, b, &err&#41;;
        if &#40;err&#41;
                printf&#40;"Division by zero\n"&#41;;
        else
                printf&#40;"%f / %f = %f\n", a, b, result&#41;;

        return 0;
&#125;
@xmavidis το -1 είναι πιθανό αποτέλεσμα πχ -2/2. Πιθανό αποτέλεσμα είναι επίσης οποιοσδήποτε αρνητικός αριθμός.

@Connor Διάβασε το http://en.wikipedia.org/wiki/Function_prototype

Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από Connor MacLeod » 13 Δεκ 2011 21:02

Πωωωωω, πω,πω..
Πραγματικά πολυ διαβασμα αυτη η C.
Html που εμαθα με ειχε φανει πολυ πιο εύκολη, εκτος αν ηταν λογο ηλικιας (19 ειμουν και τωρα 27)

Thanks gvre.

Ps. Αυτο το πραγμα με το * (τελεστης μνημης ή οπως αλιως το λενε) ολο με μπερδευει. Το καταλαβαίνω όταν το διαβαζω σε ενα source, αλλα αν με πεις να το χρησιμοποιήσω δεν το εχω...
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από Connor MacLeod » 13 Δεκ 2011 21:10

gvre βρηκα αυτο αν σε ενδιαφερει ριξτου μια ματια, αν και φανταζομαι εσυ τα ξερεις αυτα.
Exception Handling in C without C++:

http://www.on-time.com/ddj0011.htm
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από gvre » 13 Δεκ 2011 21:37

Ενδιαφέρον φαίνεται. Νομίζω ότι κάποια στιγμή παλιά το είχα ξαναδεί.

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3752
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από DGeorge » 14 Δεκ 2011 09:12

Connor MacLeod έγραψε:Πωωωωω, πω,πω..
Πραγματικά πολυ διαβασμα αυτη η C.
Html που εμαθα με ειχε φανει πολυ πιο εύκολη, εκτος αν ηταν λογο ηλικιας (19 ειμουν και τωρα 27)..........
Connorα Πολλή Καλημέρα σου :D :D και μη μασσάς :D :D
Ξέρω σίγουρα πολύ-μα πάρα πολύ- λιγότερα για την Html, απ'όσα για τη C!
Όμως ξέρω ότι η C είναι σχεδόν ένα κλικ, πάνω από την Assembly σε επίπεδο.
Οπότε, μήπως φταίει η διαφορά 'επιπέδων' ανάμεσα σε C και Html, που σε δυσκολεύει;
Δεν ξέρω -φαντάζομαι- ότι γνωρίζεις να φτιάχνεις διαγράμματα ροής 'flow charts', όπως π.χ. αυτό εδώ, πριν ξεκινήσεις έναν δύσκολο κώδικα.
...Ξέρεις... Είναι πολύ εξυπηρετικά στη στρατηγική κατάστρωση του προγράμματός σου, ώστε μάλιστα να αποφεύγεις και περιττές εντολές, οι οποίες (όταν βρίσκονται μέσα σε κάποιο LOOP) ίσως καθυστερήσουν το όλο πρόγραμμα, και -φυσικά- το τελικό αποτέλεσμα!!
Κατόπιν, αφού σε ικανοποιήσει πλήρως το διάγραμμα ροής σου... Τότε είσαι σε θέση να το 'μεταφράσεις' σε οποιαδήποτε Γλώσσα Προγραμματισμού, βάζοντας απλούστατα τις όποιες εντολές, μεταβλητές, και παραμέτρους έχει δικές της η καθεμιά (Γλώσσα Προγραμματισμού) από αυτές!
"Αν μάθεις να καταστρώνεις σωστά διαγράμματα ροής, γνωρίζεις όλες τις Γλώσσες Προγραμματισμού, που υπάρχουν και θα υπάρξουν!" Αυτό ήταν κουβέντα ενός καθηγητή μου στον Προγραμματισμό Η/Υ (προγραμμάτιζα σε FORTRAN 2000 - τότε), όταν του παραπονέθηκα, ότι μιά τέτοια Γλώσσα Προγραμματισμού δεν θα ζητηθεί -και τόσο- στην 'αγορά εργασίας'.
Τον θυμήθηκα αρκετά χρόνια μετά, όταν 'έπαιξα' με επιτυχία το πρώτο πρόγραμμά μου σε Assembly, πάνω στο δικό μου 8088 PCδάκι.
Μπορεί η απόσταση FORTRAN με Assembly να δείχνει τεράστια, όμως τα Διαγράμματα Ροής παραμένουν τα ίδια, ακριβώς! :wink:
Έτσι... Αφού γνωρίζεις ήδη να προγραμματίζεις σε Html, όπως γράφεις, με ένα σωστό διάγραμμα ροής, κι έναν 'τυφλοσούρτη' της C, θα καταφέρεις:
1) Να μάθεις την ίδια την C (παραμέτρους, σύνταξη εντολών, κλπ) και
2) Να φτιάξεις κι εσύ, πολύ σύντομα, το πρώτο -δικό σου-ολοκληρωμένο και πετυχημένο- προγραμματάκι, που θα 'τρέχει' μιά χαρά στο δικό σου PC, όπως και σε οποιοδήποτε άλλο PC :P :P

Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από Connor MacLeod » 14 Δεκ 2011 10:14

Οχι δεν ξερω να κανω flow charts. :P
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3752
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από DGeorge » 14 Δεκ 2011 10:43

Ψάξε στο Google, είτε ως "διάγραμμα ροής", είτε ως "flow chart" και θα 'πήξεις' :lol:
Από τα τόσα παραδείγματα, που θα δείς (όπως π.χ. αυτό) θα δεις ότι είναι πολύ εύκολα... Διότι αυτά κι αν είναι Ψυχρή -Ψηφιακή- Λογική!

Υ.Γ. Το πρώτο Link είναι λίγο διαννολητικά προβληματικό (τουλάχιστον όπως το είδα). Αυτό είναι κλάσσεις ανώτερο από το προηγούμενο!! Ο δάσκαλος διδάσκει με όλη τη σημασία όλων των όρων. Απλά, κατανοητά, όπως -ακριβώς- το χρειάζεσαι για να ξεκινήσεις.
Βέβαια αυτό είναι πιο σχετικό, αλλά δεν είναι ούτε τόσο απλό, ούτε τόσο κατανοητό όσο το προηγούμενο... Προϋποθέτει κάποιες γνώσεις! :wink:
Μερικά κάπως ανάλαφρα περαδείγματα: Αυτό, αυτό, και αυτό.
Φίλε αυτά είναι για να σου ανοίξω την όρεξη.... Έχει πολύ πράμα άμα το ψάξεις :D
Τελευταία επεξεργασία από το μέλος DGeorge την 14 Δεκ 2011 13:11, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
c0d3punk
Honorary Member
Δημοσιεύσεις: 1076
Εγγραφή: 15 Σεπ 2008 22:32
Τοποθεσία: Puerto pollo
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από c0d3punk » 14 Δεκ 2011 12:28

Connora έχει δίκιο ο DGeorge σε αυτό που λέει και μην το περνάς στο ντούκου.

Φαντάζομαι σας ξεκίνησαν C χωρίς πρώτα να σας διδάξουν τις βασικές αρχές επίλυσης ενός προβλήματος, ψευδοκώδικα, σχεδιασμό διαγραμμάτων ροής (και άλλων ειδών διαγραμμάτων) και γενικότερα σχεδιασμό προγραμμάτων. Να υποθέσω αυτά ήταν μαθήματα του πρώτου εξαμήνου και εσύ μπήκες στο δεύτερο?
like ants in a colony we do our share
but there's so many other f****' insects out there || Ανανεωμένα Παρτάλια || biZfind.gr

Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από Connor MacLeod » 14 Δεκ 2011 14:14

Ναι ακριβως αυτο. Απλα κωδικα. Κατευθειαν. Δεν μας ειπαν τιποτε για flow charts. Εχω διαβασει βεβαια απο μονος μου καποια πραγματα αλλα δεν πολυ εδωσα σιμασια. Οχι πρωτο εξαμην ειμαι και στον προγραματισμο Ι κανουμε c και στο επομενο εξαμηνο στο 2ο προγραματισμο II, java. Βασικες αρχες δεν κανουμε καθολου. Κατευθειαν στο ψιτο
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από gvre » 14 Δεκ 2011 14:27

Αυτά είναι ύλη λυκείου.
Μπορείς να βρεις μερικά παραδείγματα στη διεύθυνση http://goo.gl/Pn0tY

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3752
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από DGeorge » 14 Δεκ 2011 15:02

Εξοργίζομαι αληθινά, βλέποντας τα χάλια τόσο της Δημόσιας, όσο και της Ιδιωτικής Εκπαίδευσης.
Μα είναι ποτέ δυνατόν να ξεκινάς Γραμματική, χωρίς προηγούμενα να έχεις δείξει -τουλάχιστον- το Αλφάβητο :question: :question: :evil: :evil:
Είναι δυνατόν να ξεκινάς, την οποιαδήποτε Γλώσσα Προγραμματισμού, χωρίς προηγούμενη διδασκαλία Διαγραμμάτων Ροής :question: :evil: :evil:
Πόση πια 'Διδακτική Ώρα' θα χρειαστεί για κάτι τόσο απλό, και βασικό :question: :evil: :evil:
Τόση πλέον βαρεμάρα κι αδιαφορία έχει επικρατήσει :question: :evil: :evil:

Ρε Connorα, δεν φαντάζομαι να τους πληρώνεις κιόλας, για τέτοιες κραυγαλαίες π@πες!!
Κι απ'το σπίτι σου αγόρι μου! Βγαίνεις μιά στο Internet, μαθαίνεις ταχύτατα τι εστί "Διάγραμμα Ροής" και πως λειτουργεί το 'εργαλείο'.
Μετά, είτε παίρνεις ένα βιβλίο C, (ή άλλης-οποιασδήποτε Γλώσσας Προγραμματισμού), είτε πάλι από το Internet ό,τι βρεις και γι'αυτήν.... Και ιδού!
Τσίκι, τσίκι, όπως και σε οποιαδήποτε Σχολή, μαθαίνεις τελικά να δημιουργείς τα δικά σου πετυχημένα προγράμματα!! ....Τόσο απλά!! (Από την ώρα που έχεις πλέον την άνεση να 'παίζεις' με τα Διαγράμματα Ροής!) :wink:

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3752
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

[Solved] - Γιατι με βγαζει 2 αποτελεσματα?

Δημοσίευση από DGeorge » 14 Δεκ 2011 15:21

Αν δείτε και στο Θέμα Πρόβλημα στην εμφάνιση αποτελέσματος πολλαπλασιασμού. είναι προφανέστατη η έλλειψη ενός κατεστρωμένου προηγούμενου Διαγράμματος Ροής!!!
Σ'αυτό θα φαινόταν εξόφθαλμα το σφάλμα, που τελικά εντοπίστηκε, και λύθηκε το πρόβλημα.
Η Γλώσσα Προγραμματισμού ήταν Assembly.... Ωστόσο το Διάγραμμα Ροής, θα ήταν κάτι ίδιο/ανάλογο, με αυτό της περίπτωσης του Connorα, σε Γλώσσα Προγραμματισμού C!!!!
Απλώς αλλάζουν οι εντολές, οι μεταβλητές, κι οι παράμετροι! Η Φιλοσοφία παραμένει ακριβώς ίδια, μεταξύ Assembly. και C, διότι -πολύ απλά- πρόκειται περί δύο Γλωσσών Προγραμματισμού του ίδιου μηχανήματος!! Αυτού του πανηλίθιου Η/Υ!!!!!!!!!!!!!!!!

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες