geodark Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 Καλησπερα, στο προγραμμα που θελω να φτιαξω απαιτειται το διαβασμα μιας ωρα στην 24ωρη της μορφη. Δηλαδη θα πρεπει να ειναι ΩΡΕΣ:ΛΕΠΤΑ πχ. 9:00,12:19,22:40 Το διαβασμα το κανω ως εξης: scanf("%d:%d", &HH1,&MM1) Πως μπορω να αποφυγω την περιπτωση που ο χρηστης θα δοκιμασει να δωσει τυχαιους χαρακτηρες και το προγραμμα να κρασαρει?
Star_Light Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 Καλησπερα, στο προγραμμα που θελω να φτιαξω απαιτειται το διαβασμα μιας ωρα στην 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; }
geodark Δημοσ. 16 Νοεμβρίου 2013 Μέλος Δημοσ. 16 Νοεμβρίου 2013 Μα το προβλημα δεν ειναι εκει. Αυτον τον ελεγχο τον κανω παρακατω γιατι χρησιμοποιω επαναληπτικη διαδικασια. το θεμα ειναι στο "διαβασμα" την ωρα της scanf.
Star_Light Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 Μα το προβλημα δεν ειναι εκει. Αυτον τον ελεγχο τον κανω παρακατω γιατι χρησιμοποιω επαναληπτικη διαδικασια. το θεμα ειναι στο "διαβασμα" την ωρα της scanf. Ποιο ειναι δηλαδη το προβλημα? να βάλεις οριο στην πληκτρολογηση των ψηφιων απο τον χρηστη?
geodark Δημοσ. 16 Νοεμβρίου 2013 Μέλος Δημοσ. 16 Νοεμβρίου 2013 Εννοω αν πχ αντι ο χρηστης γραψει 11:20 γραψει 11'20,11sasas,sdad κτλ.
Star_Light Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 Εννοω αν πχ αντι ο χρηστης γραψει 11:20 γραψει 11'20,11sasas,sdad κτλ. Δοκιμασε αμα σου κάνει αυτο : printf("give value: "); scanf("%2d" , &x); printf("You gave: %d " , x); //Aν ο χρηστης δωσει 2345 τοτε το 23 αποθηκευεται.
Retromaniac Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 Θες να μην μπορεί να πατάει καθόλου τέτοιους χαρακτήρες; Αν ναι θα πρέπει να φτιάξεις μία δικιά σου ρουτίνα που να ζητάει την ωρά. Αν θες απλά να πιάνεις το λάθος χωρίς να κρασάρει τότε στην scanf να ζητάς string αντί για ακεραίους και μετά να ελέγχεις εσύ το λεκτικό για λάθος χαρακτήρες.
geodark Δημοσ. 16 Νοεμβρίου 2013 Μέλος Δημοσ. 16 Νοεμβρίου 2013 Θες να μην μπορεί να πατάει καθόλου τέτοιους χαρακτήρες; Αν ναι θα πρέπει να φτιάξεις μία δικιά σου ρουτίνα που να ζητάει την ωρά. Αν θες απλά να πιάνεις το λάθος χωρίς να κρασάρει τότε στην scanf να ζητάς string αντί για ακεραίους και μετά να ελέγχεις εσύ το λεκτικό για λάθος χαρακτήρες. οταν λες ρουτινα τι εννοεις?
Retromaniac Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 Ρωτάς τι σημαίνει ρουτίνα; Ή τι να κάνει η ρουτίνα; Αν ρωτάς το 1ο τότε οι γνώσεις δεν φτάνουν για να φτιάξεις αυτό που σου λέω. Αν ρωτάς το 2ο τότε μπορώ να σου πω περίπου.
lion2486 Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 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'; } κάπως έτσι θα το σκεφτόμουν απλά... 1
Retromaniac Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 θα πρέπει να χρησιμοποιήσεις μέσα σε ένα 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. 1
geodark Δημοσ. 16 Νοεμβρίου 2013 Μέλος Δημοσ. 16 Νοεμβρίου 2013 Σ'ευχαριστω lion και Retro, θα το δοκιμασω αυριο το πρωι για να δω!!
Retromaniac Δημοσ. 16 Νοεμβρίου 2013 Δημοσ. 16 Νοεμβρίου 2013 (επεξεργασμένο) Κάτσε να σου γράψω λίγο τον αλγόριθμο. 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 Επεξ/σία 17 Νοεμβρίου 2013 από Retromaniac 1
geodark Δημοσ. 16 Νοεμβρίου 2013 Μέλος Δημοσ. 16 Νοεμβρίου 2013 Eιμαι ολος αυτια Oκ το καταλαβα,σ ευχαριστω πολυ!!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα