Nereus Δημοσ. 20 Οκτωβρίου 2006 Δημοσ. 20 Οκτωβρίου 2006 Καλησπέρα. Αυτο τον καίρο εχω μια εργασία στη σχολή σε C. Ειναι η πρώτη φορα που γράφω ενα πρόγραμμα και δεν εχω πείρα.Το πρόγραμμα άρχικά δέχεται καποιες αριθμητικές τιμες (ακέραιες) με τις οποίες μετα κανει ορισμένες πράξεις.Βασικά το πρόγραμμα το έχω γράψει. Το ερώτημά μου είναι πως θα κανω το προγραμμα να μην δεχεται αλλες τιμες εκτος ακεραίων. Δηλαδή οταν καποιος πρόσπαθήσει να εισαγει π.χ. ενα γράμμα στην ακέραια μεταβλητή το προγραμμα να μην κολλαει αλλα να εμφανίζει ενα μύνημα προς τον χρήστη λέγοντάς του οτι επιτρέπονται μόνο ακέραιες τιμές. καμιά ιδέα? Please.
Bspus Δημοσ. 20 Οκτωβρίου 2006 Δημοσ. 20 Οκτωβρίου 2006 Μπορεις να δεχεσαι input αρχικα οχι μονο αριθμους αλλα χαρακτηρες γενικα. Μετα να ελεγχεις αν οι χαρακτηρες ειναι οντως μεταξυ 0-9 και αν ειναι προχωρας παρα περα. Δηλαδη μετα να αποσπασεις την τιμη του αριθμου χρησιμοποιωντας αυτους τους χαρακτηρες και να κανεις τις πραξεις σου. Δεν ξερω C για να σου πω πιο πολλες λεπτομερειες. Σε αλλες γλωσσες αυτη η διαδικασια ειναι αλλοτε πιο ευκολη και αλλοτε πιο δυσκολη. Παντως μια καλη αρχη ειναι να αρχισεις να ψαχνεις το reference της γλωσσας και τις βασικες ετοιμες συναρτησεις που διαθετει και σιγουρα θα βρεις κατι. Φυσικα οποισδηποτε ξερει βασικη C μπορει να σου το λυσει αμεσως αλλα ισως αξιζει να το ψαξεις λιγο μονος σου στην αρχη
chiossif Δημοσ. 20 Οκτωβρίου 2006 Δημοσ. 20 Οκτωβρίου 2006 Παρόλα αυτά πιστεύω ότι αν χρησιμοποιείς την scanf δεν έχεις παρά να διαβάσεις προσεκτικά την χρήση της. Για διευκόλυνση και ξεκαθάρισμα των νέων γνώσεων ξεκίνα το διάβασμα από την printf. Και αν έχεις απορίες...
Pan_Bvs Δημοσ. 20 Οκτωβρίου 2006 Δημοσ. 20 Οκτωβρίου 2006 Eftiaksa kati proxeiro kai vlepo oti douleuei int main() { int x; if(scanf("%d",&x)!= NULL) printf("%d\n",x); else printf("not an integer\n"); return 0; } H scanf an den parei to orisma ston typo pou theleis epistrefei NULL.
dimitrios67 Δημοσ. 22 Οκτωβρίου 2006 Δημοσ. 22 Οκτωβρίου 2006 Γι΄αυτο που θελεις δεν κανει η scanf, μολις εχω ελευθερο χρονο θα σου γραψω κατι...Ποτε ειναι να παραδοθει η ασκηση????
NoD Δημοσ. 22 Οκτωβρίου 2006 Δημοσ. 22 Οκτωβρίου 2006 Αυτό που γράφει ο Pan_Bvs δουλεύει και με 0 αντί για ΝULL δεν πετάει warning o gcc.
Nereus Δημοσ. 22 Οκτωβρίου 2006 Μέλος Δημοσ. 22 Οκτωβρίου 2006 Γι΄αυτο που θελεις δεν κανει η scanf, μολις εχω ελευθερο χρονο θα σου γραψω κατι...Ποτε ειναι να παραδοθει η ασκηση???? Μεχρι τέλος Οκτωβρίου.:|
dimitrios67 Δημοσ. 22 Οκτωβρίου 2006 Δημοσ. 22 Οκτωβρίου 2006 Eftiaksa kati proxeiro kai vlepo oti douleuei int main() { int x; if(scanf("%d",&x)!= NULL) printf("%d\n",x); else printf("not an integer\n"); return 0; } H scanf an den parei to orisma ston typo pou theleis epistrefei NULL. Paidia h scanf επιστρεφει το ΠΛΗΘΟΣ των ορισματων που διαβασε. ΔΕΝ επιστρεφει pointer!! Προσοχη.. Πρεπει απλα να διαβασουμε string me thn gets(temp) kai meta arithmos=atoi(temp); Ta leme...
Nereus Δημοσ. 22 Οκτωβρίου 2006 Μέλος Δημοσ. 22 Οκτωβρίου 2006 Paidia h scanf επιστρεφει το ΠΛΗΘΟΣ των ορισματων που διαβασε. ΔΕΝ επιστρεφει pointer!! Προσοχη..Πρεπει απλα να διαβασουμε string me thn gets(temp) kai meta arithmos=atoi(temp); Ta leme... Θα το δοκημάσω
Directx Δημοσ. 23 Οκτωβρίου 2006 Δημοσ. 23 Οκτωβρίου 2006 Ο παρακάτω κώδικας, γραμμένος σε Borland C/C++ Builder 6.0, ελέγχει για το εάν η είσοδος του χρήστη περιέχει μόνο αριθμητικές ή και άλλου είδους τιμές. Τούτο καθίσταται εφικτό με την χρήση της C ρουτίνας isdigit η οποία ελέγχει κάθε ASCII χαρακτήρα της εισόδου μας επιστρέφοντας 0 όταν κάποιος χαρακτήρας δεν είναι αριθμητικός. Ο παραπάνω έλεγχος υλοποιείται συνολικά από την ρουτίνα μας _TrueNumber η οποία επιστρέφει 1 εάν η είσοδος μας είναι αριθμητική (οπότε ο βρόχος εισαγωγής της τιμής διακόπτεται) ή μηδέν εάν όχι. Υ.Γ. Η atoi καλό είναι να μην χρησιμοποιείται ως μέθοδος ελέγχου διότι σε ορισμένες υλοποιήσεις δεν μπορεί να διακρίνει σωστά είσοδο που απαρτίζεται από αλφαριθμητικούς χαρακτήρες, παράλληλα δεν είμεθα σίγουροι για την έννοια που λαμβάνει το αποτέλεσμα που επιστρέφει καθώς το μηδέν μπορεί να συμβολίζει την αδυναμία μετατροπής των στοιχείων ή τον αριθμό μηδέν. > //--------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <conio.h> //--------------------------------------------------------------------------- char szUserInput[128]; //--------------------------------------------------------------------------- int _TrueNumber(char *pszBuffer); //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { for(; { printf(" Enter number:"); gets(szUserInput); if(!_TrueNumber(szUserInput)) printf(" Incorrect input - %s\n",szUserInput); else break; } printf(" Our Number = %d\nPlease hit any key to quit..",atoi(szUserInput)); getch(); return 0; } //--------------------------------------------------------------------------- int _TrueNumber(char *pszBuffer) { int nUserInputIdx; for(nUserInputIdx=0;nUserInputIdx<strlen(pszBuffer);nUserInputIdx++) if(!isdigit(pszBuffer[nUserInputIdx])) return 0; return 1; } Καλή τύχη!
dop Δημοσ. 23 Οκτωβρίου 2006 Δημοσ. 23 Οκτωβρίου 2006 Η gets() είναι επικίνδυνη (δεν ελέγχει πόσο διαβάζει). Η καλύτερη εναλλακτική είναι η fgets(), που δέχεται το μέγεθος του temporary buffer. Επιπλέον, η atoi() αν δει κάποιο χαρακτήρα δεν επιστρέφει μήνυμα λάθους - το πολύ πολύ να σου δώσει ένα 0 σαν τιμή επιστροφής. Το καλύτερο που μπορείς να κάνεις είναι το εξής: > int c; int n = 0; /* read input, stop when you encountered EOF or enter */ for (c = getchar(); c!=EOF && c!='\r' && c!='\n'; c = getchar()) { if (!isdigit(c)) { /* error - you must only use numbers */ } n *= 10; n += c - '0'; // works only with systems that digit are continuous }
Nereus Δημοσ. 24 Οκτωβρίου 2006 Μέλος Δημοσ. 24 Οκτωβρίου 2006 Nereus, Σου εστειλα ΠΜ...... Το διάβασα. 1. αν ο χρήστης εισάγει στην num το 0 το πρόγραμμα λέει οτι δεν έχει εισαχθεί ακέραιος.:-? 2. Σε μια απο τις άσκησεις που έχω ο χρήστης θα πρέπει να εισάγει 2 τιμές οι οποίες να χωρίζονται με space. Δηλαδη έχω γράψει scanf("%d %d"&a,&. Δεν ξέρω πως σε αυτό χρησημοποιήται η gets(). Πάντως στις άλλες δύο ασκήσεις η gets() θα βοηθάει. Όσο για τις πρότασεις του Directx και του dop θα τις δοκιμάσω αύριο.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.