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

Πρόγραμμα σε C


geodark

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

Καλησπερα, στο προγραμμα που θελω να φτιαξω απαιτειται το διαβασμα μιας ωρα στην 24ωρη της μορφη.

Δηλαδη θα πρεπει να ειναι ΩΡΕΣ:ΛΕΠΤΑ πχ. 9:00,12:19,22:40

Το διαβασμα το κανω ως εξης:

                scanf("%d:%d", &HH1,&MM1)

Πως μπορω να αποφυγω την περιπτωση που ο χρηστης θα δοκιμασει να δωσει τυχαιους χαρακτηρες και το προγραμμα να κρασαρει?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 66
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Καλησπερα, στο προγραμμα που θελω να φτιαξω απαιτειται το διαβασμα μιας ωρα στην 24ωρη της μορφη.

Δηλαδη θα πρεπει να ειναι ΩΡΕΣ:ΛΕΠΤΑ πχ. 9:00,12:19,22:40

Το διαβασμα το κανω ως εξης:

                scanf("%d:%d", &HH1,&MM1)

Πως μπορω να αποφυγω την περιπτωση που ο χρηστης θα δοκιμασει να δωσει τυχαιους χαρακτηρες και το προγραμμα να κρασαρει?

 

Bάλε μια if να ελέγχει αν ο χρηστης δώσει τιμή μεγαλύτερη απο 24 ή μικροτερη απο 0. 

 

Πολυ παλιοτερα ειχα γράψει εναν κωδικα που εκανε μετατροπες απο 24ωρη ωρα σε 12ωρη κτλπ τοτε ειχα χρησιμοποιησει κάτι τετοιο :

 
#include<stdio.h>
int main(void)
{
    int hours , minutes;
    printf(" Enter a 24-hour time : ");
    scanf("%d:%d", &hours , &minutes);
 
    if(hours>=24) {
              printf(" Wrong Input , try again ");
              return 0;
    }
    if(hours == 0)
             printf("Equivalent 12-hour time: 12:%.2d AM" , minutes);
    else if(hours< 12)
            printf("Equivalent 12-hour time : %.2d:%.2d AM " , hours , minutes);
    else if(hours == 12)
            printf(" Equivalent 12-hour time : %d:%.2d PM " , hours , minutes);
    else
            printf(" Equivalent 12-hour time : %d:%.2d PM " , (hours-12) , minutes);
 
/* %.2d θα διατηρήσει το 0 στην εκτύπωση αν πχ δώσεις ώρα 24:00 θα δώσει 12:00 κ.ο.κ
είτε χρησιμοποιείς το απο πάνω είτε το %02d ειναι το ίδιο. */
   return 0;
}
 
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μα το προβλημα δεν ειναι εκει. Αυτον τον ελεγχο τον κανω παρακατω γιατι χρησιμοποιω επαναληπτικη διαδικασια. το θεμα ειναι στο "διαβασμα" την ωρα της scanf.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μα το προβλημα δεν ειναι εκει. Αυτον τον ελεγχο τον κανω παρακατω γιατι χρησιμοποιω επαναληπτικη διαδικασια. το θεμα ειναι στο "διαβασμα" την ωρα της scanf.

 

Ποιο ειναι δηλαδη το προβλημα? να βάλεις οριο στην πληκτρολογηση των ψηφιων απο τον χρηστη?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εννοω αν πχ αντι ο χρηστης γραψει 11:20 γραψει 11'20,11sasas,sdad κτλ.

 

Δοκιμασε αμα σου κάνει αυτο :

 
 printf("give value: ");
 scanf("%2d" , &x);  printf("You gave: %d " , x);  

//Aν ο χρηστης δωσει 2345 τοτε το 23 αποθηκευεται.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θες να μην μπορεί να πατάει καθόλου τέτοιους χαρακτήρες;

Αν ναι θα πρέπει να φτιάξεις μία δικιά σου ρουτίνα που να ζητάει την ωρά.

Αν θες απλά να πιάνεις το λάθος χωρίς να κρασάρει τότε στην scanf να ζητάς string αντί για ακεραίους και μετά να ελέγχεις εσύ το λεκτικό για λάθος χαρακτήρες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θες να μην μπορεί να πατάει καθόλου τέτοιους χαρακτήρες;

Αν ναι θα πρέπει να φτιάξεις μία δικιά σου ρουτίνα που να ζητάει την ωρά.

Αν θες απλά να πιάνεις το λάθος χωρίς να κρασάρει τότε στην scanf να ζητάς string αντί για ακεραίους και μετά να ελέγχεις εσύ το λεκτικό για λάθος χαρακτήρες.

οταν λες ρουτινα τι εννοεις?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ρωτάς τι σημαίνει ρουτίνα;

Ή τι να κάνει η ρουτίνα;

Αν ρωτάς το 1ο τότε οι γνώσεις δεν φτάνουν για να φτιάξεις αυτό που σου λέω.

Αν ρωτάς το 2ο τότε μπορώ να σου πω περίπου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

int tmp1, tmp2, minute, hour, error = 0;

do{
  if(error)
    printf("Δώστε αριθμό της μορφής HH:MM\n");

  if(!is_int(tmp1 = getchar())){
    error = 1;
    continue;
  }
  if(!is_int(tmp2 = getchar())){
    error = 1;
    continue;
  }
  hour = tmp1 * 10 + tmp2;
  
  if(getchar() != ':'){
    error = 1;
  }

  if(!is_int(tmp1 = getchar())){
    error = 1;
    continue;
  }
  if(!is_int(tmp2 = getchar())){
    error = 1;
    continue;
  }
  minute = tmp1 * 10 + tmp2;

  fflush(stdin);
}while(error);

int is_int(int tmp){
  return tmp >= '0' || tmp <= '9';
}

κάπως έτσι θα το σκεφτόμουν απλά...

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

θα πρέπει να χρησιμοποιήσεις μέσα σε ένα while την getchar();

Ελέγχεις αν είναι μεταξύ 0 και 9. Αν είναι μεταξύ 0 και 9 τότε το αποθηκεύεις και πας για το επόμενο.

Όταν φτάσει στο 3ο τότε βάζεις αυτόματα : και προχωράς μία θέση ακόμη και ζητάς με τον ίδιο τρόπο τα υπόλοιπα 2 ψηφία.

το while αυτό θα τερματίζει όταν η getchar επιστρέψει το enter (13) και αφού έχει δώσει και τα 4 ψηφία.

 


int tmp1, tmp2, minute, hour, error = 0;

do{
  if(error)
    printf("Δώστε αριθμό της μορφής HH:MM\n");

  if(!is_int(tmp1 = getchar())){
    error = 1;
    continue;
  }
  if(!is_int(tmp2 = getchar())){
    error = 1;
    continue;
  }
  hour = tmp1 * 10 + tmp2;
  
  if(getchar() != ':'){
    error = 1;
  }

  if(!is_int(tmp1 = getchar())){
    error = 1;
    continue;
  }
  if(!is_int(tmp2 = getchar())){
    error = 1;
    continue;
  }
  minute = tmp1 * 10 + tmp2;

  fflush(stdin);
}while(error);

int is_int(int tmp){
  return tmp >= '0' || tmp <= '9';
}

κάπως έτσι θα το σκεφτόμουν απλά...

 

 

Ναι μία απλή λύση, αλλά πολύ άβολη. Κάθε φορά που πατάει λάθος χαρακτήρα του ζητάει όλη την ώρα από την αρχή. Επίσης έχει και ένα Bug. Αν κάνει λάθος δεν θα τερματίσει ποτέ γιατί το error θα είναι πάντα 1.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Κάτσε να σου γράψω λίγο τον αλγόριθμο.

 

i = 0;

do

{

     key = getchar();

     if (key >= '0' && key <= '9')

     {

         if ((i == 0 && key <= '2') ||

             (i == 1 && time[0] < '2') ||

             (i == 1 && time[0] == '2' && key <= '3') ||

             (i == 3 && key <= '5') ||

             (i == 4))

          {

            time[i++] = key;

            if (i == 2)

              time[i++] = ':';

          }

     }

     if (key == '\8' && i > 0) // backspace

     {

        if (--i == 2)

          i--;

     }

     time = '\0'; 

     Console.SetCursorPosition(0, 0); 

     Console.Write(time);

     Console.SetCursorPosition(i, 0); 

     fflush(stdin)

} while ((i < 5) || (key != '\n'))

 
Αυτό στα γρήγορα γιατί δεν έχω c ή c++ στο pc να κάτσω να στο κάνω ολοκληρωμένο και έχω και χρόνια να γράψω c.
ΕΠΙΣΗΣ μπορείς να προσθέσεις να χρησιμοποιεί και το del και να πηγαίνει και προς τα πίσω.
Kαι επίσης σε κάθε loop πρέπει να εμφανίζεις το time σε σταθερή θέση χρησιμοποιώντας το console.
 
EDIT: Στα έκανα εγώ!
EDIT: Σου πρόσθεσα και του ελέγχους για 24h
Επεξ/σία από Retromaniac
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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