Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

ΚΑΛΗΣΠΕΡΑ ΣΑΣ ,ΣΤΟΝ ΠΑΡΑΚΑΤΩ ΚΩΔΙΚΑ ΑΝΤΙΜΕΤΟΠΙΖΩ ΕΝΑ ΠΡΟΒΛΗΜΑ ΥΠΑΡΧΕΙ ΚΑΠΟΙΟΣ ΓΝΩΣΤΗΣ ΝΑ ΜΟΥ ΤΟ ΛΥΣΕΙ ;

ΟΙ ΣΥΝΑΡΤΗΣΕΙΣ ΠΟΥ ΧΡΗΣΗΜΟΠΟΙΟΥΝΤΑΙ ΒΡΙΣΚΟΝΤΑΙ ΥΛΟΠΟΙΗΜΕΝΕΣ ΣΕ ΕΝΑ ΑΛΛΟ ΔΙΣΔΙΑΣΤΑΤΟ ΑΡΧΕΙΟ ΣΥΝΔΕΔΕΜΕΝΟ ΜΕ ΤΗΝ 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);
}}}
Δημοσ.
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)).

 

Πέρα από αυτό όμως, έχεις πολλά άλλα προβλήματα που θα πρέπει να διορθώσεις.

  • 2 εβδομάδες αργότερα...
Δημοσ. (επεξεργασμένο)

Καλησπέρα. Αν και το παράδειγμα του Ημίθεου είναι πολύ καλό, εδώ έχει ένα πιο απλό παράδειγμα για τη χρήση της συνάρτησης isdigit(): https://www.programiz.com/c-programming/library-function/ctype.h/isdigit

Το κλειδί νομίζω είναι αυτό που είπε ο Ημίθεος, ότι η isdigit() δουλεύει με χαρακτήρες.

Σημειώστε ότι η isdigit() επιστρέφει έναν ακέραιο αριθμό διάφορο του 0 στην περίπτωση που το όρισμα που περνάμε στην isdigit() είναι αριθμητικός χαρακτήρας.

Επεξ/σία από cvb~

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...