jimisvog Δημοσ. 17 Νοεμβρίου 2012 Μέλος Δημοσ. 17 Νοεμβρίου 2012 Μα πριν απο αυτο δεν μου την "εβλεπε". Δεν την εκτελει καθολου.. :/ Βασικα απο'τι καταλαβα δεν διαβαζει το scanf του τελεστη.. Το προσπερναει και ετσι δεν εχει την μεταβλητη για να μπει στην if...
antbyron Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Μα πριν απο αυτο δεν μου την "εβλεπε". Δεν την εκτελει καθολου.. :/ Βασικα απο'τι καταλαβα δεν διαβαζει το scanf του τελεστη.. Το προσπερναει και ετσι δεν εχει την μεταβλητη για να μπει στην if... παρε τον χαρακτηρα καλυτερα με την j= getch();
jimisvog Δημοσ. 17 Νοεμβρίου 2012 Μέλος Δημοσ. 17 Νοεμβρίου 2012 Ετσι το επιασε.. Αλλα γιατι δεν την εβλεπε την scanf? Γιατι το αποτελεσμα το πετυχαμε αλλα καλο ειναι να δουμε και γιατι δεν δουλευε το αλλο..
antbyron Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Από ότι διαβάζω στο βιβλίο του Χατζηγιαννακη υπάρχουν διάφορα προβλήματα με την scanf και τους χαρακτήρες, υπό προυποθέσεις. Δηλ στην συγκεκριμένη περίπτωση διαβάζει δύο ακεραίους και πατώντας enter παραμένει στο buffer ο χαρακτήρας enter ο οποιος και δημιουργεί πρόβλημα. Εκχωρείται ως τιμή στην επόμενη scanf. Ας μας διαφωτίσει κάποιος πιο έμπειρος. Μια λύση για να υλοποιηθεί με scanf θα ήταν: printf("Dwse enan arithmitiko telesti etsi wste na ginei i praksi:\n"); getchar();//διαβάζει τον παραμένοντα χαρακτήρα(δηλ το enter) scanf("%c",&j);
Star_Light Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 (επεξεργασμένο) Ετσι το επιασε.. Αλλα γιατι δεν την εβλεπε την scanf? Γιατι το αποτελεσμα το πετυχαμε αλλα καλο ειναι να δουμε και γιατι δεν δουλευε το αλλο.. Επιτηδες άφησα ένα κενο μεσα στο format string " ..... " της scanf πριν τον μορφοποιητη %c στον κώδικα που σου έδωσα προηγουμενως. Ακριβως για να μην μας δημιουργησει προβληματα ο χαρακτηρας αλλαγης γραμμης κοινως το ΕΝΤΕΡ που πατας οταν θα εχεις ηδη πληκτρολογησει τους 2 ακεραιους. Πιο συγκεκριμενα για την scanf μπορουμε να πουμε τα εξης : Έστω > printf(" Give a character: "); scanf("%c" , &c1); Άν ο χρήστης δώσει ειτε κενό ειτε χαρακτήρα αλλαγής γραμμής (πατήσει ENTER) δηλαδή δεν θα γινει skip όπως με το άν περίμενε ακέραιο ή κινητης υποδιαστολής. Με αυτο εννοείται οτι η μεταβλητή c1 θα έχει την τιμή '\n' (τυπικά 10 σε ASCII) αν δοκιμάσεις να το εκτυπώσεις μεσω μιας printf σαν %d. Ο χρήστης μπορεί να χρησιμοποιήσει ένα κενό μεσα στο format string της scanf για να διορθώσει το παραπάνω ζήτημα . Το κενό αυτο σημαινει για την scanf να παραλείψει έναν ή περισσότερους κενούς χαρακτήρες. H σύνταξη της scanf λέει ότι βάζοντας το κενό αγνοείς όλες τις εμφανίσεις των "white-space" χαρακτήρων οπότε εκτός από το κενό αυτό καθεαυτό, αγνοείς και το tab και το newline. > printf(" Give a character: "); scanf(" %c" , &c1); Eδω η scanf θα κάνει discard κάθε κενό χαρακτήρα ή αλλαγής γραμμής μέχρι να δοθεί ένας κανονικός και να τοποθετηθεί στην c1 . Ένας χαρακτήρας αλλαγής γραμμής ανήκει στην κατηγορία των white-space characters ενω το αντίστροφο δεν ισχύει δηλαδη υπάρχουν white-space characters οι οποίοι ΔΕΝ ειναι χαρακτήρες αλλαγής γραμμής (όπως ο κενός χαρακτήρας απο μονος του , ο χαρακτήρας tab κτλπ). Από ότι διαβάζω στο βιβλίο του Χατζηγιαννακη υπάρχουν διάφορα προβλήματα με την scanf και τους χαρακτήρες, υπό προυποθέσεις. Δηλ στην συγκεκριμένη περίπτωση διαβάζει δύο ακεραίους και πατώντας enter παραμένει στο buffer ο χαρακτήρας enter ο οποιος και δημιουργεί πρόβλημα. Εκχωρείται ως τιμή στην επόμενη scanf. Ας μας διαφωτίσει κάποιος πιο έμπειρος. Μια λύση για να υλοποιηθεί με scanf θα ήταν: printf("Dwse enan arithmitiko telesti etsi wste na ginei i praksi:\n"); getchar();//διαβάζει τον παραμένοντα χαρακτήρα(δηλ το enter) scanf("%c",&j); Βασικα οπως η scanf ετσι και η getchar ΔΕΝ κανει skip τους κενους χαρακτηρες που διαβάζει. Το θεμα πρεπει να το διορθωσει ο προγραμματιστης manually με δικο του κωδικα. Υπάρχει και η γνωστη προταση του migf1 να επεξεργάζεται καποιος την εισοδο σαν string και μετα να κανει την μετατροπη της σε ακεραιο. > #include <stdio.h> #include<ctype.h> int main(void) { int ch; while( (ch = getchar()) == '\n' || ch == ' ') ; printf(" You gave : %c " , ch); return 0; } Επεξ/σία 18 Νοεμβρίου 2012 από Star_Light
antbyron Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Επιτηδες άφησα ένα κενο μεσα στο format string " ..... " της scanf πριν τον μορφοποιητη %c στον κώδικα που σου έδωσα προηγουμενως. Ακριβως για να μην μας δημιουργησει προβληματα ο χαρακτηρας αλλαγης γραμμης κοινως το ΕΝΤΕΡ που πατας οταν θα εχεις ηδη πληκτρολογησει τους 2 ακεραιους. Πιο συγκεκριμενα για την scanf μπορουμε να πουμε τα εξης : Έστω > printf(" Give a character: "); scanf("%c" , &c1); Άν ο χρήστης δώσει ειτε κενό ειτε χαρακτήρα αλλαγής γραμμής (πατήσει ENTER) δηλαδή δεν θα γινει skip όπως με το άν περίμενε ακέραιο ή κινητης υποδιαστολής. Με αυτο εννοείται οτι η μεταβλητή c1 θα έχει την τιμή '\n' (τυπικά 10 σε ASCII) αν δοκιμάσεις να το εκτυπώσεις μεσω μιας printf σαν %d. Ο χρήστης μπορεί να χρησιμοποιήσει ένα κενό μεσα στο format string της scanf για να διορθώσει το παραπάνω ζήτημα . Το κενό αυτο σημαινει για την scanf να παραλείψει έναν ή περισσότερους κενούς χαρακτήρες. H σύνταξη της scanf λέει ότι βάζοντας το κενό αγνοείς όλες τις εμφανίσεις των "white-space" χαρακτήρων οπότε εκτός από το κενό αυτό καθεαυτό, αγνοείς και το tab και το newline. > printf(" Give a character: "); scanf(" %c" , &c1); Eδω η scanf θα κάνει discard κάθε κενό χαρακτήρα ή αλλαγής γραμμής μέχρι να δοθεί ένας κανονικός και να τοποθετηθεί στην c1 . Ένας χαρακτήρας αλλαγής γραμμής ανήκει στην κατηγορία των white-space characters ενω το αντίστροφο δεν ισχύει δηλαδη υπάρχουν white-space characters οι οποίοι ΔΕΝ ειναι χαρακτήρες αλλαγής γραμμής (όπως ο κενός χαρακτήρας απο μονος του , ο χαρακτήρας tab κτλπ). Βασικα οπως η scanf ετσι και η getchar ΔΕΝ κανει skip τους κενους χαρακτηρες που διαβάζει. Το θεμα πρεπει να το διορθωσει ο προγραμματιστης manually με δικο του κωδικα. Υπάρχει και η γνωστη προταση του migf1 να επεξεργάζεται καποιος την εισοδο σαν string και μετα να κανει την μετατροπη της σε ακεραιο. > #include <stdio.h> #include<ctype.h> int main(void) { char ch; while( (ch = getchar()) == '\n' || ch == ' ') ; printf(" You gave : %c " , ch); return 0; } thanks έγινε πιο ξεκάθαρο.
Star_Light Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Ok. Απλα ο τελευταιος κωδικας που ποσταρισα δεν ειναι η μεθοδος που προτεινει ο migf1. Eιναι απλα ενας τροπος να κανεις την getchar να κανει skip τους χαρακτηρες αυτους. O migf1 χρησιμοποιει την fgets και μετα κανει την μετατροπη μεσω της atoi μπορεις να ψαξεις για αυτες τις 2 συναρτησεις αλλα αν εισαι αρχαριος δεν θα στο προτεινα για αρχη. IMO παντα
imitheos Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Εγώ δεν θα πρότεινα την atoi και έμπειρος να ήταν Αν η άσκηση ζητάει να γίνει με scanf, τότε είναι αιχμάλωτος να το κάνει έτσι. Σε άλλη περίπτωση αυτό που πρότεινε ο migf1 είναι από τις καλύτερες μεθόδους. Διαβάζεις τα πάντα σαν "string" και μετά μετατρέπεις σε ό,τι χρειάζεσαι πχ σε ακέραιο με την strtol (μακρυά από τις atoX συναρτήσεις).
Star_Light Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Εγώ δεν θα πρότεινα την atoi και έμπειρος να ήταν Αν η άσκηση ζητάει να γίνει με scanf, τότε είναι αιχμάλωτος να το κάνει έτσι. Σε άλλη περίπτωση αυτό που πρότεινε ο migf1 είναι από τις καλύτερες μεθόδους. Διαβάζεις τα πάντα σαν "string" και μετά μετατρέπεις σε ό,τι χρειάζεσαι πχ σε ακέραιο με την strtol (μακρυά από τις atoX συναρτήσεις). Ναι οτι εχει προτεινει τελοςπαντων.... δεν θυμαμαι Καλυτερα να διαβαζει κανεις τα παντα σαν string συμφωνω και εγω και μετα να τα μετατρεπει αναλογα τις αναγκες του εκαστοτε προγραμματος. Παντως και με την scanf αν βαλει ενα κενάκι ειναι ενταξει οπως ειπαμε.
jimisvog Δημοσ. 17 Νοεμβρίου 2012 Μέλος Δημοσ. 17 Νοεμβρίου 2012 Συγγνωμη για το πρηξιμο αλλα σε αυτον το κωδικα αν δινω επανειλλημενα ως 0 τον δευτερο αριθμο κρασαρει. Αν δωσω πρωτη φορα το 0 και κανω διαιρεση μπαινει στην if.. Αν το ξαναδωσω κρασαρει.. Γιατι γινεται αυτο εφοσον εχω βαλει την do...while? > #include <stdio.h> #include <stdlib.h> int main(void) { int numb1, numb2, result; char j; printf("Dwse 1 akeraio aritmo:\n"); scanf("%d",&numb1); printf("Dwse ton deftero akeraio arithmo:\n"); scanf("%d",&numb2); printf("Dwse enan arithmitiko telesti ('+','-','*','/')\n"); scanf(" %c", &j); if (j == '/'); { if (numb2 = 0); { do { printf("H diairesi me to miden einai adunati\n"); printf("Dwse ton deftero akeraio arithmo:\n"); scanf("%d",&numb2); }while (numb2=0); } } if (j == '+'){ result = numb1+numb2; printf("To athrisma twn arithmwn einai: %d\n", result); } else if (j == '-'){ result = numb1-numb2; printf("H diafora twn arithmwn einai: %d\n", result); } else if (j =='*'){ result = numb1*numb2; printf("To ginomeno twn arithmwn einai: %d\n", result); } else if (j=='/'){ result= numb1/numb2; printf("To piliko twn arithmwn einai: %d\n", result); } system("pause"); return 0; }
antbyron Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 βγάλε τα ερωτηματικά από τις συνθήκες των if. Πχ if (x<y) //δεν παίρνει ερωτηματικό επιπλέον στην if(numb2 = 0) //θέλεις σύγκριση και όχι ανάθεση. Δηλ if (numb2 == 0) Και τέλος στην while(numb2==) θέλεις πάλι σύγκριση και όχι ανάθεση. Γι 'αυτό κολάει.
jimisvog Δημοσ. 17 Νοεμβρίου 2012 Μέλος Δημοσ. 17 Νοεμβρίου 2012 Αν το κανω αυτο τοτε κρασαρει απο την πρωτη φορα που θα δωσω το 0.. π.χ δινω πρωτο αριθμο, δινω μετα το 0, μετα την πραξη (διαιρεση) και κρασαρει..
imitheos Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Συγγνωμη για το πρηξιμο αλλα σε αυτον το κωδικα αν δινω επανειλλημενα ως 0 τον δευτερο αριθμο κρασαρει. Αν δωσω πρωτη φορα το 0 και κανω διαιρεση μπαινει στην if.. Αν το ξαναδωσω κρασαρει.. Γιατι γινεται αυτο εφοσον εχω βαλει την do...while? if (j == '/'); { if (numb2 = 0); <------ { do { printf("H diairesi me to miden einai adunati\n"); printf("Dwse ton deftero akeraio arithmo:\n"); scanf("%d",&numb2); }while (numb2=0); <------ } Αν το κανω αυτο τοτε κρασαρει απο την πρωτη φορα που θα δωσω το 0.. π.χ δινω πρωτο αριθμο, δινω μετα το 0, μετα την πραξη (διαιρεση) και κρασαρει.. Δεν τον κοίταξα οπότε ίσως υπάρχει και κάτι άλλο αλλά για αρχή διόρθωσε αυτά
antbyron Δημοσ. 17 Νοεμβρίου 2012 Δημοσ. 17 Νοεμβρίου 2012 Εμένα παίζει κανονικά αυτός ο κώδικας με τις διορθώσεις. Δεν τον έχω τσεκάρει για σφάλματα.
jimisvog Δημοσ. 17 Νοεμβρίου 2012 Μέλος Δημοσ. 17 Νοεμβρίου 2012 Αν μετα τις if δεν υπαρχουν ερωτηματικα κρασαρει με το που δωσω π.χ 5/0
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα