stefanos59 Δημοσ. 6 Δεκεμβρίου 2010 Δημοσ. 6 Δεκεμβρίου 2010 καλησπερα θα ηθελα να ρωτησω: θελω να ζηταω απο τον χρηστη να μου πχ εναν αριθμητικο κωδικο οσο μεγαλος και αν ειναι, και στην συνεχεια να τον ελεγχο αυτον τν αριθμο ψηφιο ψηφιο.. τον κωδικα θα τον δηλωσουμε ως string px κατι τετοιο >#include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ string int number; printf("Dwse ton kwdika:"); scanf("%s",&number); /*ena for pou elegxei kathe psifio tou kvdika*/ printf("o arithmos pou edwses einai o %s",number); system("PAUSE") ; }
parsifal Δημοσ. 6 Δεκεμβρίου 2010 Δημοσ. 6 Δεκεμβρίου 2010 Δεν υπάρχει τύπος δεδομένων "string" στη standard library της C. Πίνακας τύπου char είναι αυτό που θέλεις. Στο παράδειγμά σου θα δήλωνες π.χ.: > char numberAsString[256]; Και όταν διαβάζεις είσοδο από τον χρήστη, θα περιορίζεις αντίστοιχα τον αριθμό των μάξιμουμ χαρακτήρων που θα διαβάζονται, για να μην έχεις overflow.
lion2486 Δημοσ. 6 Δεκεμβρίου 2010 Δημοσ. 6 Δεκεμβρίου 2010 θα μπορούσες να κάνεις κάτι ως εξής: > #include <stdio.h> #include <stdlib.h> int main(void) { char *ptr; int i = 0, num; ptr = malloc(sizeof(char)); while((ch = getchar()) != EOF){ ptr[i] = ch i ++; ptr = realloc(ptr, (i+1)*sizeof(char)); } ptr[i] = '\0'; num = atoi(ptr); /* o arithmos pou 8es! */ } πιστε'υω αυτό να βοηθήσει, δεν την έχω χρησιμοποιήσει εγώ την realloc, θα μπορούσες να θέσεις ένα μέγιστο όριο, π.χ. το όριο ενός int ή κάτι άλλο και να ορίσεις εξ' αρχής ένα πίνακα με τόσες θέσεις.
Timonkaipumpa Δημοσ. 6 Δεκεμβρίου 2010 Δημοσ. 6 Δεκεμβρίου 2010 θα μπορούσες να κάνεις κάτι ως εξής: > #include <stdio.h> #include <stdlib.h> int main(void) { char *ptr; int i = 0, num; ptr = malloc(sizeof(char)); while((ch = getchar()) != EOF){ ptr[i] = ch i ++; ptr = realloc(ptr, (i+1)*sizeof(char)); } ptr[i] = '\0'; num = atoi(ptr); /* o arithmos pou 8es! */ } πιστε'υω αυτό να βοηθήσει, δεν την έχω χρησιμοποιήσει εγώ την realloc, θα μπορούσες να θέσεις ένα μέγιστο όριο, π.χ. το όριο ενός int ή κάτι άλλο και να ορίσεις εξ' αρχής ένα πίνακα με τόσες θέσεις. το μέγεθος 256 που πρότεινε πριν ο parsifal είναι το σωστό στην συγκεκριμένη περίπτωση, μιας και δεν ξέρει πόσους χαρακτήρες θα έχει και μίας και είναι το μέγιστο.
lion2486 Δημοσ. 6 Δεκεμβρίου 2010 Δημοσ. 6 Δεκεμβρίου 2010 γιατί απλά να μην δεσμεύει ένα χαρακτήρα παραπάνω σε κάθε επανάληψη με στόχο τη πλήρη δυναμικότητα... πρακτικά πολύ λίγες φορές έχει αυτό πρακτική αξία όμως!
stefanos59 Δημοσ. 6 Δεκεμβρίου 2010 Μέλος Δημοσ. 6 Δεκεμβρίου 2010 εκανα το παρακατω αλλα δν τρεχει σωστα για καθε λαθος >#include<stdio.h> #include<stdlib.h> #include<string.h> char check(); char buf[256]; size_t mikos; int main(){ printf("dwse tn kwdika arithmo\n"); gets(buf); mikos=strlen(buf); check(); system("PAUSE"); } ////sunartiseis //sunartisi pou elegxei an uparxei 0 i 1 char check(){ int i=0; for (i = 0; i < mikos; i++) { if ((buf[i]<2)) { printf ("upirxe to 0 i to 1 ston kwdika arithmo---->>Dwse neo kwdika arithmo:"); gets(buf); gets(buf); mikos=strlen(buf); i=0; } } }
Directx Δημοσ. 6 Δεκεμβρίου 2010 Δημοσ. 6 Δεκεμβρίου 2010 Μπορείς να ελέγξεις την ύπαρξη των χαρακτήρων 0 & 1 με την βοήθεια της ρουτίνας memchr η οποία επιστρέφει έναν δείκτη με το σημείο όπου βρέθηκε ο αναζητούμενος χαρακτήρας ή αν δεν υπάρχει NULL. Από εκεί και πέρα, την περίπτωση εισαγωγής μη αποδεκτού κωδικού καλύτερα είναι να την διαχειρίζεσαι εντός του main, με την βοήθεια για παράδειγμα ενός while-loop το οποίο θα επαναλαμβάνεται ενημερώνοντας τον χρήστη κατάλληλα μέχρι ότου δοθεί ένας αποδεκτός κωδικός: > #include<stdio.h> #include<stdlib.h> #include<string.h> char* check(char*); char buf[256]; int main(){ printf("dwse tn kwdika arithmo\n"); while(1) { /* Read from stdin. */ gets(buf); /* Validate buf. */ if(check(buf) == NULL)/* buf invalid, warn user and redo input. */ printf("upirxe to 0 i to 1 ston kwdika arithmo----\n>>Dwse neo kwdika arithmo:"); else/* buf valid, break loop. */ break; } printf("Code = %s\n", buf); printf("Press Enter to exit!"); getchar(); /* End of program. */ return 0; } ////sunartiseis //sunartisi pou elegxei an uparxei 0 i 1 char* check(char *ptrBuff) { /* If ptrBuff contains '0' or '1' return NULL else return ptrBuff. */ return (memchr(ptrBuff, '0', strlen(ptrBuff)) || memchr(ptrBuff, '1', strlen(ptrBuff))) ? NULL: ptrBuff; } ΕΞΟΔΟΣ: > dwse tn kwdika arithmo 1234567890 upirxe to 0 i to 1 ston kwdika arithmo---- >>Dwse neo kwdika arithmo:234567890 upirxe to 0 i to 1 ston kwdika arithmo---- >>Dwse neo kwdika arithmo:23456789 Code = 23456789 Press Enter to exit! Καλή συνέχεια!!
stefanos59 Δημοσ. 7 Δεκεμβρίου 2010 Μέλος Δημοσ. 7 Δεκεμβρίου 2010 Για να μην ανοιγω νεο θεμα και ειναι και συνεχεια του παραπανω ρωταω εδω.. θελω τον καθε ψηφιο που παιρνω απο τον κωδικα να τον αντιστοιχο σε καποια γραμματα και στην συνεχεια να εμφανιζω τις εναλλακτικες λεξεις. Πχ. το 2-->{Α,Β} το 3-->{C,D} και εγω του δινω τον κωδικα 23 θα ηθελα να μου εμφανιζει τους παρακατω συνδυασμους: 1.ΑC 2.AD 3.BC 4.BD εχω κανει το παρακατω >#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> //sunartisi gia ton elegxo psifiwn char* check(char*); char buf[256]; char new_buf[256]; char two[12]="ABC"; char three[12]="DEF"; char four[12]="GHI"; char five[12]="JKL"; char six[12]="MNO"; char seven[12]="PRS"; char eight[12]="TUV"; char nine[12]="WXY"; size_t mikos; int main(){ int i=0; int j=0; int d; printf("Dwse tn kwdika arithmo\n"); while(1) { gets(buf); if(check(buf) == NULL) printf("Upirxe to 0 i to 1 ston kwdika arithmo\nDwse neo kwdika arithmo:"); else break; } printf("O kwdika arithmos pou edwses einai o %s\n", buf); mikos=strlen(buf); d=pow(3,mikos);//pithanoi sundiasmoi leksewn for(j=0;j<d;j++){ for(i=0;i<=miko;i++){ if(buf[i]=2){ printf("%s",two); } if(buf[i]=3){ printf("%s",three); } if(buf[i]=4){ printf("%s",four); } if(buf[i]=5){ printf("%s",five); } if(buf[i]=6){ printf("%s",six); } if(buf[i]=7){ printf("%s",seven); } if(buf[i]=8){ printf("%s",eight); } if(buf[i]=9){ printf("%s",nine); } } } printf("Press Enter to exit!"); getchar(); // End of program. return 0; } ////sunartiseis //sunartisi pou elegxei an uparxei 0 i 1 char* check(char *ptrBuff) { if(ptrBuff=='0' || ptrBuff=='1') return NULL; else return ptrBuff; strlen(ptrBuff); }
virxen75 Δημοσ. 7 Δεκεμβρίου 2010 Δημοσ. 7 Δεκεμβρίου 2010 για αρχή άλλαξε τα = από τα if σου σε == π.χ. if(buf=5){ μετά το d=(int)pow(3,mikos); και το for(i=0;i<=mikos;i++){ επίσης άλλαξε το gets με fgets και την συνάρτηση check τέλος ο τρόπος που δηλώνεις τους πίνακες δεν είναι ότι καλύτερο.Στο έφτιαξα διαφορετικά δες τον κώδικα ,ότι δεν καταλαβαίνεις ρώτα ο κώδικας σου με τις αλλαγές για να κάνει compile. > #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> //sunartisi gia ton elegxo psifiwn int check(char*); char buf[256]; char numberLetters[10][4]; size_t mikos; int main(){ int i=0,j=0,d; for (i=2;i<10;i++){ for (j=0;j<4-1;j++) numberLetters[i][j]=(char)((int)'A'+i+j-2); numberLetters[i][3]='\0'; printf("\ni=%d ---> letters=%s",i,numberLetters[i]); } printf("\nDwse ton kwdiko arithmo\n"); while(1) { fgets(buf,256,stdin); if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]='\0'; if(check(buf) == 1) printf("\nUpirxe to 0 i to 1 ston kwdika arithmo\nDwse neo kwdika arithmo:"); else break; } mikos=strlen(buf); d=(int)pow(3,mikos);//pithanoi sundiasmoi leksewn for(j=0;j<d;j++){ for(i=0;i<=mikos;i++){ int choice=(int)buf[i]-(int)'0'; if (choice>1 && choice<10) printf("\n%s",numberLetters[choice]); } } printf("Press Enter to exit!"); getchar(); // End of program. return 0; } ////sunartiseis //sunartisi pou elegxei an uparxei 0 i 1 int check(char *ptrBuff){ int i=0; while(ptrBuff[i]!='\0'){ if(ptrBuff[i]=='0' || ptrBuff[i]=='1') return 1;//yes 0,1 i++; } return 0;//no 0,1 } Υ.Γ. όσο για την λειτουργία προσπάθησε να το εξηγήσεις καλύτερα.
virxen75 Δημοσ. 7 Δεκεμβρίου 2010 Δημοσ. 7 Δεκεμβρίου 2010 τα αλλαξα... δες το ξανά γιατί έκανα κάποιες αλλαγές στον κώδικα
stefanos59 Δημοσ. 7 Δεκεμβρίου 2010 Μέλος Δημοσ. 7 Δεκεμβρίου 2010 επειδη αυτο το κομματι δεν το καταλαβαινω >for (i=2;i<10;i++){ for (j=0;j<4-1;j++) numberLetters[i][j]=(char)((int)'A'+i+j-2); numberLetters[i][3]='\0'; printf("\ni=%d ---> letters=%s",i,numberLetters[i]); } να γινει καπως ετσι: >numberLetters[2][3]='A','B','C'; numberLetters[3][3]='D','E','F'; numberLetters[4][3]='G','H','I'; numberLetters[5][3]='J','K','L'; numberLetters[6][3]='M','N','O'; numberLetters[7][3]='P','R','S'; numberLetters[8][3]='T','U','V'; numberLetters[9][3]='W','X','Y'; for (i=2;i<10;i++){ for (j=0;j<4-1;j++) printf("\ni=%d ---> letters=%s",i,numberLetters[i][j]); } επισης και αυτο το κομματι δεν το καταλαβα > int choice=(int)buf[i]-(int)'0'
stefanos59 Δημοσ. 7 Δεκεμβρίου 2010 Μέλος Δημοσ. 7 Δεκεμβρίου 2010 εννοεις να εξηγησω τι κανει το προγραμμα? Ουσιαστικα του δινω ενα κωδικα και θελω να μου εμφανισει τις πιθανες λεξεις που μπορουν να δημιουργηθουν. πχ. 2-->{Α,Β,C} 3-->{D,E,F} 4-->{G,H,I} και τα λοιπα.. αν του δωσω λοιπον εγω τον κωδικα 234 θελω να μου εμφανισει τα παρακατω ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEH BEI BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.