Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

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

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

Απάντηση
Luna_Diviner
Δημοσιεύσεις: 4
Εγγραφή: 30 Δεκ 2011 12:12

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από Luna_Diviner » 30 Δεκ 2011 13:03

Όπως θα καταλάβετε από το απλό πρόγραμμα που ακολουθεί δεν έχω μεγάλη εμπειρία με τη c.
Παλέυω τώρα τέσσερις μέρες αλλά δεν μπορώ να καταλάβω γιατί δεν τρέχει σωστά.
Αυτό που θέλω είναι αφού μου δώσει το αποτέλεσμα μιας πράξης να εμφανιστούν πάλι τα "parakalw priktrologiste + gia prosthesi...". Δεν βγαίνει έτσι όπως θέλω όπως θα δείτε και στο exe αρχείο. Οποιαδήποτε βοήθεια θα μου έλυνε τα χέρια. Χρονια πολλά καλη χρονιά :) !!

Κώδικας:

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


int plus(int x, int y);
int minus(int x, int y);
int multiply(int x, int y);
float divide(int x, int y);
float power(int x, int y);

int main()
{

int one;
int two;
char choice;
printf("Parakalw pliktrologiste:\n + gia prosthesi\n - gia afairesh\n");
printf("* gia pollaplasiasmo\n / gia diairesh\n ^ gia ton ypologismo dynamhs\n");
printf("e gia eksodo apo to programma\n");
scanf("%c", &choice);
while( choice != 'e' ) {

if (choice == '+' || choice == '-' || choice == '*' || choice == '/' || choice == '^') {
printf("Dwste dyo arithmous");
scanf("%d%d", &one, &two);
if (choice == '+') {
printf("%d\n", plus(one,two));
}
else if (choice == '-') {
printf("%d\n", minus(one,two));
}
else if (choice == '*') {
printf("%d\n", multiply(one,two));
}
else if (choice == '/') {
if (two != 0) {
printf("%7.2f\n", divide(one,two)); }
else {
printf("Adynath Diairesh"); }
}
else if (choice == '^') {
printf("%7.2f\n", power(one,two));
}
} /* liksi if */
else {
printf("Dwsate lathos symbolo");
}

printf("Parakalw pliktrologiste:\n + gia prosthesi\n - gia afairesh\n");
printf("* gia pollaplasiasmo\n / gia diairesh\n ^ gia ton ypologismo dynamhs\n");
printf("e gia eksodo apo to programma\n");
scanf("%c", &choice);

} /* liksi while */

return 0;
}
int plus(int x, int y) {
return x + y;
}
int minus(int x, int y) {
return x - y;
}
int multiply(int x, int y) {
return x*y;
}
float divide(int x, int y) {
return x/y;
}
float power(int x, int y) {
return pow(x,y);
}


Το exe αρχείο το ανέβασα στο imageshack γιατί δεν ήξερα πως αλλίως. Συγχωρέστε την noobia μου... Xρησιμοποίησα πρόσθεση του 2+2

imageshack.us/photo/my-images/836/39888231.jpg/

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από dva_dev » 30 Δεκ 2011 15:30

Τι ακριβώς κάνει που δεν θα ήθελες;

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

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από xmavidis » 30 Δεκ 2011 15:50

Αρχικά άλλαξε την συνάρτηση divide σε:

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

float divide&#40;int x, int y&#41; &#123;
return &#40;float&#41; x/y;
&#125;
Χρειάζεται το (float) μπροστά διαφορετικά δεν θα επιστρέψει το αποτέλεσμα που θες. Για παράδειγμα, το 5/9 θα σου δώσει 0.00 χωρίς το (float) καθώς διαιρείς δύο ακέραιους.
I want to know God’s thoughts; the rest are details.
Albert Einstein

Luna_Diviner
Δημοσιεύσεις: 4
Εγγραφή: 30 Δεκ 2011 12:12

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από Luna_Diviner » 30 Δεκ 2011 17:05

Ok thx για το tip 'xmavidis'!
Για να καταλάβετε τι εννοώ οτί δεν κάνει όπως θέλω δείτε το exe αρχείο. Όταν δώσω τους δύο αριθμούς 2 + 2 και πατήσω enter όλο το υπόλοιπο βγαίνει αμέσως.
Δηλαδή είναι σαν αγνοεί την scanf που έχω στο τέλος του while, κάνοντας προσπέλαση πάλι το πρόγραμμα και να εμφανίζει το μήνυμα "Parakalw priktrologiste..." 2 φορές.
Εγώ θέλω μόλις πάρω την απάντηση, δηλαδή στην περίπτωσή μας 4, να εμφανίζεται αυτό το μήνυμα μια φορά ζητώντας έτσι πάλι από τον χρήστη ένα σύμβολο για να κάνει πάλι πράξη.
Ελπίζω να σας βοήθησα να καταλάβετε τι εννοώ...

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

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

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

Βάλε μια getchar(); μετά από κάθε scanf() και πες αν δουλεύει σωστά.
Αντί για while μπορείς να χρησιμοποιήσεις την do/while.

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

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από xmavidis » 30 Δεκ 2011 23:07

Σε μένα τουλάχιστον δουλεύει έτσι όπως το θέλεις με getchar() μετά από κάθε scanf και με do...while.

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

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


int plus&#40;int x, int y&#41;;
int minus&#40;int x, int y&#41;;
int multiply&#40;int x, int y&#41;;
float divide&#40;int x, int y&#41;;
float power&#40;int x, int y&#41;;

int main&#40;&#41;
&#123;

int one;
int two;
char choice;


// do while anti gia do
do &#123;
    printf&#40;"Parakalw pliktrologiste&#58;\n + gia prosthesi\n - gia afairesh\n"&#41;;
    printf&#40;"* gia pollaplasiasmo\n / gia diairesh\n ^ gia ton ypologismo dynamhs\n"&#41;;
    printf&#40;"e gia eksodo apo to programma\n"&#41;;
     // reset choice
    scanf&#40;"%c", &choice&#41;;
    getchar&#40;&#41;;
    // to 'e' einai valid sumvolo&#58; kleinei to programma, opote vale choice != 'e' edw
    if &#40;choice == '+' || choice == '-' || choice == '*' || choice == '/' || choice == '^'&#41; &#123;
        printf&#40;"Dwste dyo arithmous\n"&#41;;
        scanf&#40;"%d%d", &one, &two&#41;;
        getchar&#40;&#41;;
        if &#40;choice == '+'&#41; &#123;

            printf&#40;"%d\n", plus&#40;one,two&#41;&#41;;
        &#125; else if &#40;choice == '-'&#41; &#123;

            printf&#40;"%d\n", minus&#40;one,two&#41;&#41;;
        &#125; else if &#40;choice == '*'&#41; &#123;

            printf&#40;"%d\n", multiply&#40;one,two&#41;&#41;;
        &#125; else if &#40;choice == '/'&#41; &#123;
            printf&#40;"Dwste dyo arithmous\n"&#41;;
            scanf&#40;"%d%d", &one, &two&#41;;
            if &#40;two != 0&#41; &#123;
                printf&#40;"%7.2f\n", divide&#40;one,two&#41;&#41;;
           &#125; else &#123;
                printf&#40;"Adynath Diairesh\n"&#41;;
            &#125;
        &#125; else if &#40;choice == '^'&#41; &#123;

            printf&#40;"%7.2f\n", power&#40;one,two&#41;&#41;;
        &#125; // -----
    &#125; else &#123;
        printf&#40;"Dwsate lathos symbolo\n"&#41;;
    &#125;


&#125; while&#40; choice != 'e'&#41;; /* liksi do...while */

return 0;
&#125;

int plus&#40;int x, int y&#41; &#123;
    return x + y;
&#125;
int minus&#40;int x, int y&#41; &#123;
    return x - y;
&#125;
int multiply&#40;int x, int y&#41; &#123;
    return x*y;
&#125;
float divide&#40;int x, int y&#41; &#123;
    return &#40;float&#41; x/y;
&#125;
float power&#40;int x, int y&#41; &#123;
    return pow&#40;x,y&#41;;
&#125;
I want to know God’s thoughts; the rest are details.
Albert Einstein

Luna_Diviner
Δημοσιεύσεις: 4
Εγγραφή: 30 Δεκ 2011 12:12

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από Luna_Diviner » 31 Δεκ 2011 02:19

Πράγματι τα getchar και το do while ως δια μαγείας λύνουν τα προβλήματα.
Στον κώδικα που μου έδωσες έχεις βάλει να διαβάζει για δεύτερη φορά τους αριθμούς στην else if choice=='/' που από ότι είδα δεν χρειάζεται. Επίσης παρατήρησα ότι το πρόγραμμα τρέχει κανονικά και αν αφαιρέσεις την 1η getchar() πριν την έναρξη της επανάληψης. Αν αφαιρέσεις όμως και την 2η τότε το τρέχει όπως πριν(προβληματικά δηλαδή).
Να σαι καλά φίλος που κάθισες και ασχολήθηκες τέτοιες γιορτινές μέρες, truthfully ευχαριστώ!!
Μία τελευταία απορία πάντως:
Μπορείς να μου εξηγήσεις τι επιτυγχάνω χρησιμοποιώντας την getchar, δηλαδή πως λειτουργεί στο πρόγραμμα γιατί πρέπει να γράψω και μια εξήγηση για την χρησιμοποίησή της;

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

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

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

http://www.gidnetwork.com/b-60.html

Μπορείς επίσης να χρησιμοποιήσεις switch αντί για την if με τους πολλούς ελέγχους.

Luna_Diviner
Δημοσιεύσεις: 4
Εγγραφή: 30 Δεκ 2011 12:12

Το επαναληπτικό κομπιουτεράκι δεν μου δουλεύει όπως θα ήθελα

Δημοσίευση από Luna_Diviner » 31 Δεκ 2011 18:05

Οκ ευχαριστώ πολύ για την βοήθεια :)

Απάντηση

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

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

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