koslibpro Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 Καλησπερα, φτιαχνω ενα προγραμματακι στην C,στο οποιο ο χρηστης εισαγει διαφορα γραμματα ή αριθμους,και γινονται διαφορες λειτουργιες. θελω τωρα με καποιον τροπο να αναγνωρισω αν ο χρηστης εισαγει εναν αριθμο,και αν εισαγει εναν αριθμο να κανω διαφορετικες λειτουργιες. πως μπορω να αναγνωρισω αν εισαγει αριθμο λοιπον ο χρηστης? προτιμηταιο ειναι να μην χρησιμοποιηθει καμια βιβλιοθηκη αριθμων ή κατι τετοιο,παρα μονο η παλια καλη stdio.h,εκτος αν φυσικα κατι τετοιο δεν ειναι εφικτο. ευχαριστω εκ των προτερων
koslibpro Δημοσ. 12 Ιουλίου 2012 Μέλος Δημοσ. 12 Ιουλίου 2012 scanf ? ναι,τι ακριβως να κανω με την scanf(); ομως?πως να την χρησιμοποιησω για να "ανιχνευσω" το ειδος του χαρακτηρα που εισαγεται απο τον χρηστη?
migf1 Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 Πες μας τι ακριβώς θες να κάνεις με τα data που διαβάζεις ή δώσε μας ένα παράδειγμα για να μπορέσουμε να βοηθήσουμε, γιατί είναι πολύ γενικό αυτό που ρωτάς στο αρχικό ποστ. Σε γενικές γραμμές, πάντα διαβάζεις χαρακτήρες και κατόπιν τους μετατρέπεις σε ότι θέλεις ανάλογα με τις ανάγκες σου. Αυτό κάνει και η scanf(), η οποία ως "ανάγκες" θεωρεί τα type specifiers που βάζεις στο format string της.
firewalker Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 Αν ο ASCII αριθμός του χαρακτήρα που εισάγει ο χρήστης είναι μεγαλύτερος ή ίσος με το 48 και μικρότερος ή ίσος του 57 τότε είναι αριθμός.
koslibpro Δημοσ. 12 Ιουλίου 2012 Μέλος Δημοσ. 12 Ιουλίου 2012 κατσε firewalker με εριξες στα βαθια! ο κωδικας που χρησιμοποιω ειναι αυτος: > #include <stdio.h> main() { int c; while ((c = getchar()) != '.') switch(c){ case 'a': printf("\n"); printf("Alpha"); break; case 'b': printf("\t"); printf("Bravo"); break; case 'c': printf("\t"); putchar('Charlie'); break; case 'd': printf("\t"); putchar('Delta'); break; case 'e': printf("\t"); putchar('Echo'); break; case 'f': printf("\t"); putchar('Foxtrot'); break; case 'g': printf("\t"); putchar('Golf'); break; case 'h': printf("\t"); putchar('Hotel'); break; case 'i': printf("\t"); putchar('India'); break; case 'j': printf("\t"); putchar('Juliet'); break; case 'k': printf("\t"); putchar('Kilo'); break; case 'l': printf("\t"); putchar('Lima'); break; case 'm': printf("\t"); putchar('Mike'); break; case 'n': printf("\t"); putchar('November'); break; case 'o': printf("\t"); putchar('Oscar'); break; case 'p': printf("\t"); putchar('Papa'); break; case 'q': printf("\t"); putchar('Quebek'); break; case 'r': printf("\t"); putchar('Romeo'); break; case 's': printf("\t"); putchar('Sierra'); break; case 't': printf("\t"); putchar('Tango'); break; case 'u': printf("\t"); putchar('Uniform'); break; case 'v': printf("\t"); putchar('Victor'); break; case 'w': printf("\t"); putchar('Whiskey'); break; case 'x': printf("\t"); putchar('Xray'); break; case 'y': printf("\t"); putchar('Yankee'); break; case 'z': printf("\t"); putchar('Zulu'); break; default: printf("\t"); putchar(c); break; } } και θελω να προσθεσω ενα τμημα που οταν ο χρηστης διαβαζει εναν αριθμο,να εμφανιζει τοσα * οσος ειναι ο αριθμος.
koslibpro Δημοσ. 12 Ιουλίου 2012 Μέλος Δημοσ. 12 Ιουλίου 2012 Δες τις isdigit() και isalpha() στην ctype.h οκ ευχαριστω πολυ!θα καθησω να τις μελετησω και αν βρω προβλημα θα ενημερωσω.ευχαριστω
migf1 Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 οκ ευχαριστω πολυ!θα καθησω να τις μελετησω και αν βρω προβλημα θα ενημερωσω.ευχαριστω Παρακαλώ Δες επίσης και τις atoi() / atol() / atof() και strtol() / strtod() στην stdlib.h
Haldol Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 και θελω να προσθεσω ενα τμημα που οταν ο χρηστης διαβαζει εναν αριθμο,να εμφανιζει τοσα * οσος ειναι ο αριθμος. Εφόσον κάνεις χρήση της getchar() δεν υπάρχει αριθμός. Υπάρχουν μόνο χαρακτήρες. Για να ελέγξεις λοιπόν εάν αυτός ο χαρακτήρας που έδωσε ο χρήστης αντιστοιχεί σε κάποιον αριθμό, θα μπλέξεις λιγάκι με τον ASCII code, όπως σου έγραψε ο firewalker. Στον ASCII code, οι αριθμητικοί χαρακτήρες είναι από το 0x30 έως και το 0x39, ή σε «κανονικά» νούμερα, από τη θέση 48 έως και τη θέση 57 (η 48η θέση είναι το 0 και η 57η το 9). Δεδομένου ότι στη μνήμη και οι χαρακτήρες αποθηκεύονται ως αριθμοί, μπορείς με έναν απλό έλεγχο να βρεις εάν κάποιος χαρακτήρας είναι αριθμός ή όχι. Έστω ότι η getchar() σου δίνει αποτέλεσμα σε μία μεταβλητή char input. Εσύ το μόνο που έχεις να κάνεις, είναι να δεις εάν αυτή η μεταβλητή είναι μικρότερη από 58 και μεγαλύτερη από 47- σα να ήταν απλό νούμερο! Δηλαδή... >if ( input > 47 && input < 58) // είναι αριθμός Εάν ισχύσει αυτή η συνθήκη, ο χαρακτήρας είναι αριθμός. Τώρα θέλεις να πάρεις και την τιμή του, σωστά; Ε... μιας και είναι συμβατοί οι τύποι, το μόνο που χρειάζεται να κάνεις είναι... >int num = input - 48; And that's it. Τώρα έχεις μια int μεταβλητή, η οποία περιέχει την αριθμητική τιμή του χαρακτήρα που εισήγαγε ο χρήστης. Εάν λ.χ. εισήγαγε το '2', θα έχεις 50 (η τιμή του 2 στον ASCII code) - 48 = ...2! Μετά αρκεί μία for-loop για να τυπώσεις όσα * θέλεις.
παπι Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 κατσε firewalker με εριξες στα βαθια! ο κωδικας που χρησιμοποιω ειναι αυτος: > #include <stdio.h> main() { int c; while ((c = getchar()) != '.') switch(c){ case 'a': printf("\n"); printf("Alpha"); break; case 'b': printf("\t"); printf("Bravo"); break; case 'c': printf("\t"); putchar('Charlie'); break; case 'd': printf("\t"); putchar('Delta'); break; case 'e': printf("\t"); putchar('Echo'); break; case 'f': printf("\t"); putchar('Foxtrot'); break; case 'g': printf("\t"); putchar('Golf'); break; case 'h': printf("\t"); putchar('Hotel'); break; case 'i': printf("\t"); putchar('India'); break; case 'j': printf("\t"); putchar('Juliet'); break; case 'k': printf("\t"); putchar('Kilo'); break; case 'l': printf("\t"); putchar('Lima'); break; case 'm': printf("\t"); putchar('Mike'); break; case 'n': printf("\t"); putchar('November'); break; case 'o': printf("\t"); putchar('Oscar'); break; case 'p': printf("\t"); putchar('Papa'); break; case 'q': printf("\t"); putchar('Quebek'); break; case 'r': printf("\t"); putchar('Romeo'); break; case 's': printf("\t"); putchar('Sierra'); break; case 't': printf("\t"); putchar('Tango'); break; case 'u': printf("\t"); putchar('Uniform'); break; case 'v': printf("\t"); putchar('Victor'); break; case 'w': printf("\t"); putchar('Whiskey'); break; case 'x': printf("\t"); putchar('Xray'); break; case 'y': printf("\t"); putchar('Yankee'); break; case 'z': printf("\t"); putchar('Zulu'); break; default: printf("\t"); putchar(c); break; } } και θελω να προσθεσω ενα τμημα που οταν ο χρηστης διαβαζει εναν αριθμο,να εμφανιζει τοσα * οσος ειναι ο αριθμος. Ω ρε μανα μου ενα switch.. Αυτο δενθα το εγραφα ουτε με script
Timonkaipumpa Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 Ω ρε μανα μου ενα switch.. Αυτο δενθα το εγραφα ουτε με script Ακριβώς!!! Θα μπορούσε να γίνει ως εξής με χρήση πινάκα και μίας συνάρτησης... οι πίνακες: > #define STRINGS_TO_PRINT 2 char **pAnsStrs; pAnsStrs = (char**) malloc ( sizeof(char*) * STRINGS_TO_PRINT ); pAnsStrs[0] = (char*) malloc(sizeof(char) * 5); pAnsStrs[0] = "Ans1\0"; pAnsStrs[1] = (char*) malloc ( sizeof(char) * 5 ); pAnsStrs[1] = "Ans2\0"; η συνάρτηση: > void strPrint(char* inputStr) { printf("%s\n", inputStr); } Οπότε... μπορείς να κάνεις: > strPrint(pAnsStrs[theValueChar-48]);
Directx Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 Και εγώ σε πίνακες θα κατέληγα (αλλά με συμβατική μέθοδο ). > /* NATO phonetic alphabet utility */ #include <stdio.h> #include <ctype.h> typedef struct { char Letter; char *Word; }_LetWord; int main(void) { _LetWord LW[] = { {'a', "Alpha"}, {'b', "Bravo"} , {'c', "Charlie"}, {'d', "Delta"}, {'e', "Echo" } , {'f', "Foxtrot"}, {'g', "Golf" }, {'h', "Hotel"} , {'i', "India" }, {'j', "Juliet"},{'k', "Kilo" } , {'l', "Lima" }, {'m', "Mike" }, {'n', "November"},{'o',"Oscar" }, {'p', "Papa" }, {'q', "Quebek"} ,{'r', "Romeo" }, {'s', "Sierra"},{'t', "Tango"} ,{'u', "Uniform"}, {'v', "Victor"},{'w', "Whiskey"} ,{'x',"Xray" }, {'y', "Yankee"},{'z', "Zulu"} }; /* LW length */ const int LWSize = sizeof(LW) / sizeof(_LetWord); int LWIdx, Chr; unsigned char KnownChr; /* On '.' quit */ while((Chr = getchar()) != '.') { /* Process 0 to 9 digits (chrs) */ if(isdigit(Chr)) { int Number = Chr - '0'; while(Number--) putchar('*'); putchar('\n'); } else { /* Process a to z letters (chrs) */ for(LWIdx = 0; LWIdx < LWSize; LWIdx++) if((KnownChr = LW[LWIdx].Letter == Chr)) printf("\t%s\n", LW[LWIdx].Word); if(!KnownChr) printf("\t%c\n", Chr); } } return 0; } ΕΙΣΟΔΟΣ: > abc9 ΕΞΟΔΟΣ: > Alpha a Bravo b Charlie c ********* Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες
Timonkaipumpa Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 directx Αφού indexing παίρνεις από την τιμή του char... γιατί να κάνεις extra indexing;
imitheos Δημοσ. 12 Ιουλίου 2012 Δημοσ. 12 Ιουλίου 2012 κατσε firewalker με εριξες στα βαθια! ο κωδικας που χρησιμοποιω ειναι αυτος: > #include <stdio.h> main() { int c; while ((c = getchar()) != '.') switch(c){ case 'a': printf("\n"); printf("Alpha"); break; case 'b': printf("\t"); printf("Bravo"); break; } } και θελω να προσθεσω ενα τμημα που οταν ο χρηστης διαβαζει εναν αριθμο,να εμφανιζει τοσα * οσος ειναι ο αριθμος. Edit: Με πρόλαβαν οι Timon, DirectX. Αν ο ASCII αριθμός του χαρακτήρα που εισάγει ο χρήστης είναι μεγαλύτερος ή ίσος με το 48 και μικρότερος ή ίσος του 57 τότε είναι αριθμός. Στον ASCII code, οι αριθμητικοί χαρακτήρες είναι από το 0x30 έως και το 0x39, ή σε «κανονικά» νούμερα, από τη θέση 48 έως και τη θέση 57 (η 48η θέση είναι το 0 και η 57η το 9). Δεδομένου ότι στη μνήμη και οι χαρακτήρες αποθηκεύονται ως αριθμοί, μπορείς με έναν απλό έλεγχο να βρεις εάν κάποιος χαρακτήρας είναι αριθμός ή όχι. Έστω ότι η getchar() σου δίνει αποτέλεσμα σε μία μεταβλητή char input. Εσύ το μόνο που έχεις να κάνεις, είναι να δεις εάν αυτή η μεταβλητή είναι μικρότερη από 58 και μεγαλύτερη από 47- σα να ήταν απλό νούμερο! Δηλαδή... >if ( input > 47 && input < 58) // είναι αριθμός Εάν ισχύσει αυτή η συνθήκη, ο χαρακτήρας είναι αριθμός. Τώρα θέλεις να πάρεις και την τιμή του, σωστά; Ε... μιας και είναι συμβατοί οι τύποι, το μόνο που χρειάζεται να κάνεις είναι... >int num = input - 48; And that's it. Τώρα έχεις μια int μεταβλητή, η οποία περιέχει την αριθμητική τιμή του χαρακτήρα που εισήγαγε ο χρήστης. Εάν λ.χ. εισήγαγε το '2', θα έχεις 50 (η τιμή του 2 στον ASCII code) - 48 = ...2! Μετά αρκεί μία for-loop για να τυπώσεις όσα * θέλεις. Όχι βέβαια ότι ο OP θα χρησιμοποιήσει κάποιο σύστημα που δεν θα έχει ASCII αλλά δεν χάνει κάτι (ίσα ίσα κερδίζει ότι δεν χρειάζεται να θυμάται τα ascii codes) να χρησιμοποιεί input >= '0', input <= '9', input - '0' αντίστοιχα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα