PENNYSF Δημοσ. 9 Ιουνίου 2023 Δημοσ. 9 Ιουνίου 2023 ΚΑΛΗΣΠΕΡΑ ΣΑΣ ,ΣΤΟΝ ΠΑΡΑΚΑΤΩ ΚΩΔΙΚΑ ΑΝΤΙΜΕΤΟΠΙΖΩ ΕΝΑ ΠΡΟΒΛΗΜΑ ΥΠΑΡΧΕΙ ΚΑΠΟΙΟΣ ΓΝΩΣΤΗΣ ΝΑ ΜΟΥ ΤΟ ΛΥΣΕΙ ; ΟΙ ΣΥΝΑΡΤΗΣΕΙΣ ΠΟΥ ΧΡΗΣΗΜΟΠΟΙΟΥΝΤΑΙ ΒΡΙΣΚΟΝΤΑΙ ΥΛΟΠΟΙΗΜΕΝΕΣ ΣΕ ΕΝΑ ΑΛΛΟ ΔΙΣΔΙΑΣΤΑΤΟ ΑΡΧΕΙΟ ΣΥΝΔΕΔΕΜΕΝΟ ΜΕ ΤΗΝ MAIN,ΤΟ ΠΡΟΒΛΗΜΑ ΕΙΝΑΙ ΠΩΣ ΕΝΩ ΤΡΕΧΕΙ ΚΑΝΟΝΙΚΑ ΣΤΑΜΑΤΑΕΙ ΑΚΡΙΒΩΣ ΣΤΟ ΣΗΜΕΙΟ ΜΕΤΑ ΤΗΝ printmenu(); ΟΠΟΥ ΖΗΤΑ ΚΑΙ ΤΗΝ ΕΠΙΛΟΓΗ ΚΑΙ ΤΕΛΟΣ ΣΕ ΒΓΑΖΕΙ ΕΚΤΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΚΑΙ ΠΡΕΠΕΙ ΝΑ ΤΟ ΞΑΝΑΤΡΕΞΕΙΣ ΜΕΤΑ, ΕΧΩ ΚΑΝΕΙ ΠΟΛΛΕΣ ΔΟΚΙΜΕΣ-ΑΛΛΑΓΕΣ ΤΙΠΟΤΑ ΔΕΝ ΛΕΙΤΟΥΡΓΕΙ ! ΚΑΠΟΙΑ ΠΡΟΤΑΣΗ - ΛΥΣΗ !; Ο ΚΩΔΙΚΑΣ : #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <ctype.h> #include "students.h" int main(int argc, char *argv[]){ student s; srand(time(NULL)); printf("GIVE US YOUR FILENAME!\n"); char filen; scanf("%s",&filen); int ids,id1,id2,id3,id4,pr; char nam[25],n3[25],n[25]; list L=malloc(sizeof(struct listR)); L->head=NULL; L->tail=NULL; printMenu(); //ΦΟΡΤΩΣΗ ΤΟΥ ΑΡΧΕΙΟΥ load(filen,&L); //ΕΚΤΥΠΩΣΗ ΤΟΥ ΜΕΝΟΥ ΕΠΙΛΟΓΩΝ int choice; printf("GIVE US YOUR NUMBER-CHOICE !"); scanf("%d", &choice); if (isdigit(choice)==1){ } else{ printf("THE ENTRANCE WAS WRONG !\n"); } while(isdigit(choice)==1){ while(choice>=1 && choice<=6){ //ΕΠΙΛΟΓΗ ΠΡΟΣΘΕΣΗΣ ΝΕΟΥ ΜΑΘΗΤΗ ΣΤΗΝ ΛΙΣΤΑ if (choice==1){ printf("GIVE THE NAME OF THE STUDENT \n"); scanf("%s",n); printf("GIVE THE ID OF THE STUDENT\n"); scanf("%ld",&ids); strcpy(s.name, n); s.id = ids; if (isError(addStudent(s,L))==0){ addStudent(s,L); } else{ printf("THERE WAS AN ERROR FANCTION!\n"); break; }} //ΕΠΙΛΟΓΗ ΑΦΑΙΡΕΣΗΣ ΜΑΘΗΤΗ ΑΠΟ ΛΙΣΤΑ else if(choice==2){ printf("GIVE THE ID OF THE STUDENT YOU WANT TO DELETE!"); scanf("%ld",&id1); if (isError(deleteStudentById(id1,L))==0){ deleteStudentById(id1,L); } else{ printf("THERE WAS AN ERROR FUNCTION!\n"); break; } } //ΕΠΙΛΟΓΗ ΑΝΑΖΗΤΗΣΗΣ ΜΑΘΗΤΗ ΑΠΟ ΛΙΣΤΑ else if(choice==3){ printf("GIVE THE ID OF THE STUDENT YOU WANT TO SEARCH!"); scanf("%ld",&id2); if( isError(findStudent(id2,L,&s))==0){ findStudent(id2 ,L ,&s); } else{ printf("THERE WAS AN ERROR FUNCTION!\n"); break; } } //ΕΠΙΛΟΓΗ ΑΝΑΝΕΩΣΗΣ ΤΩΝ ΣΤΟΙΧΕΙΩΝ ΤΟΥ ΜΑΘΗΤΗ else if(choice==4){ printf("PLEASE PROVIDE US WITH THE ID OF THE STUDENT YOU WANT TO UPDATE\n"); scanf("%ld",&id3); printf("PLEASE PROVIDE US WITH THE NAME YOU WANT TO UPDATE THE STUDENT!\n"); scanf("%s",n3); s.id = id3; //updateStudent( s,L); if (isError(updateStudent(s,L))==0){ updateStudent(s,L); } else{ printf("THERE WAS AN ERROR FANCTION!\n"); break; } } //ΕΠΙΛΟΓΗ ΕΚΤΥΠΩΣΗΣ ΤΩΝ ΣΤΟΙΧΕΙΩΝ ΕΝΟΣ Η ΟΛΩΝ ΤΩΝ ΜΑΘΗΤΩΝ ΤΗΣ ΛΙΣΤΑΣ else if(choice==5){ printf("GIVE 1 IF YOU WANT TO PRINT ONE STUDENT ,OR GIVE 2 IF YOU WANT TO PRINT ALL OF THEM!\n"); scanf("%d",&pr); if (pr==1){ printf("PREASE GIVE THE NAME OF THE STUDENT !\n"); scanf("%s",&nam); printf("PLEASE GIVE TH ID OF THE STRUDENT !\n"); scanf("%ld",&id4); strcpy(s.name, nam); s.id = id4; printStudent(s); } else if (pr==2){ printStudents(L); } } //ΕΠΙΛΟΓΗ ΕΞΟΔΟΥ ΑΠΟ ΤΟ ΠΡΟΓΡΑΜΜΑ if (choice==6){ printf("YOU WANTED TO EXIT THE PROGRAM ,BYE!!!\n"); exit(1); } printMenu(); printf("GIVE US YOUR NUMBER-CHOICE !"); scanf("%d", &choice); if (isdigit(choice)==1){ } else{ printf("THE ENTRANCE WAS WRONG !\n"); } //ΑΠΟΘΗΚΕΥΣΗ ΑΡΧΕΙΟΥ save(filen,L); }}}
imitheos Δημοσ. 10 Ιουνίου 2023 Δημοσ. 10 Ιουνίου 2023 13 ώρες πριν, PENNYSF είπε ΟΠΟΥ ΖΗΤΑ ΚΑΙ ΤΗΝ ΕΠΙΛΟΓΗ ΚΑΙ ΤΕΛΟΣ ΣΕ ΒΓΑΖΕΙ ΕΚΤΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΚΑΙ ΠΡΕΠΕΙ ΝΑ ΤΟ ΞΑΝΑΤΡΕΞΕΙΣ ΜΕΤΑ int main(int argc, char *argv[]){ char filen; scanf("%s",&filen); //ΕΚΤΥΠΩΣΗ ΤΟΥ ΜΕΝΟΥ ΕΠΙΛΟΓΩΝ int choice; printf("GIVE US YOUR NUMBER-CHOICE !"); scanf("%d", &choice); if (isdigit(choice)==1){ } else{ printf("THE ENTRANCE WAS WRONG !\n"); } Το πρόγραμμα έχει πάρα πολλά λάθη (πχ δες τι τύπο έχει το filen και πώς το μεταχειρίζεσαι) οπότε και να μην σταματούσε στην επιλογή, πάλι δεν θα σου έπαιζε σωστά. Πάμε όμως σε αυτό που ρώτησες. Δηλώνεις μια μεταβλητή ακεραίου τύπου, ζητάς ένα ακέραιο μέσω της scanf, και μετά τρέχεις την συνάρτηση isdigit. Ο λόγος που σταματάει το πρόγραμμα και πρέπει να το ξανατρέξεις είναι γιατί αποτυγχάνει το if σου λόγω ότι η isdigit επιστρέφει 0 επειδή η τιμή της μεταβλητής σου δεν είναι "ψηφίο". % cat tmp.c #include <stdio.h> #include <string.h> #include <ctype.h> int main(int argc, char *argv[]) { int c1, c2; c1 = 1; c2 = '1'; printf("c1 has value %d. isdigit(c1)=%d\n", c1, isdigit(c1)); printf("c2 has value %d. isdigit(c2)=%d\n", c2, isdigit(c2)); // Let's convert c1 to a "digit" c1 += '0'; printf("c1 now has value %d. isdigit(c1)=%d\n", c1, isdigit(c1)); return 0; } % ./a.out c1 has value 1. isdigit(c1)=0 c2 has value 49. isdigit(c2)=2048 c1 now has value 49. isdigit(c1)=2048 Οπως βλέπεις, οι συναρτήσεις isτάδε δέχονται μεν ως όρισμα μεταβλητές int αλλά "δουλεύουν" με χαρακτήρες και όχι με ακεραίους. Στην δική σου περίπτωση που έχεις ακέραια μεταβλητή, δεν χρειάζεσαι την isdigit αλλά αρκεί ένας απλός έλεγχος πχ ((choice > 1) && (choice < 5)). Πέρα από αυτό όμως, έχεις πολλά άλλα προβλήματα που θα πρέπει να διορθώσεις.
cvb~ Δημοσ. 21 Ιουνίου 2023 Δημοσ. 21 Ιουνίου 2023 (επεξεργασμένο) Καλησπέρα. Αν και το παράδειγμα του Ημίθεου είναι πολύ καλό, εδώ έχει ένα πιο απλό παράδειγμα για τη χρήση της συνάρτησης isdigit(): https://www.programiz.com/c-programming/library-function/ctype.h/isdigit Το κλειδί νομίζω είναι αυτό που είπε ο Ημίθεος, ότι η isdigit() δουλεύει με χαρακτήρες. Σημειώστε ότι η isdigit() επιστρέφει έναν ακέραιο αριθμό διάφορο του 0 στην περίπτωση που το όρισμα που περνάμε στην isdigit() είναι αριθμητικός χαρακτήρας. Επεξ/σία 21 Ιουνίου 2023 από cvb~
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα