Title: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: Apostolof on April 13, 2016, 19:32:57 pm Άσκηση 7 Σημείωση για την παράδοση Στο elearning θα ανεβάσετε σε ένα αρχείο τις απαντήσεις σας Η ονομασία του αρχείου θα έχει ως εξής: Α7-Αριθμος Μητρώου π.χ Α7-9000 Γράψτε ένα πρόγραμμα το οποίο διαβάζει χαρακτήρες από την είσοδό του μέχρι o χρήστης να δώσει το χαρακτήρα θαυμαστικό. Στη συνέχεια να τυπώνει ένα ραβδόγραμμα με αστεράκια για κάθε έναν από τους εμφανιζόμενους χαρακτήρες. Επιπλέον για τους χαρακτήρες που εμφανίζονται στην είσοδο του προγράμματος τις μέγιστες και τις ελάχιστες φορές εμφανίζει τον αντίστοιχο χαρακτήρα καθώς και τον αριθμό των φορών που εμφανίστηκε. Παράδειγμα εξόδου: a ******** b **** e ************ z * Most frequent: e; 12 time(s). Least frequent: z; 1 time(s). Λήξη υποβολής εμπρόθεσμων εργασιών: Τρίτη, 19 Απρίλιος 2016, 12:00 πμ Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: potirikolonato on April 15, 2016, 16:36:12 pm Παραθέτω μέρος του προγράμματος που αντιμετωπίζω πρόβλημα.
Code: int main() { Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: Apostolof on April 15, 2016, 17:05:02 pm Η εύκολη λύση είναι να αφήσεις ένα κενό πριν το % μέσα στο scanf, δλδ να κάνεις:
Code: scanf (" %c",&letter); Αλλιώς θες να κάνεις flush (καθαρίσεις) το input buffer σου χρησιμοποιώντας το: Code: fflush(stdin); Περισσότερα εδώ: http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c *όπως θα δεις και στο link το fflush(stdin); δε λειτουργεί πάντα. Πάντως στο κωδικά σου θα λειτουργήσει. Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: potirikolonato on April 15, 2016, 17:28:54 pm Γιατί συμβαίνει αυτό; Θενκς btw
Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: Apostolof on April 15, 2016, 17:42:58 pm Από το link που πόσταρα:
Quote ...when the user presses Enter, it will leave in the input buffer 2 character: Enter key (ASCII code 13) and \n (ASCII code 10). Therefore, at Line 2 (σε εσένα στο line 13 στο scanf), it will read the \n and will not wait for the user to enter a character. Πχ. γίνετε η πρώτη επανάληψη και δίνεις είσοδο a. Στο input buffer πάνε το a, το "enter key" και το "\n". Εκτελούνται όλες οι άλλες εντολές και ξαναφτάνει το πρόγραμμα στη γραμμή 12 (printf) σου ζητάει είσοδο και στη 13 στο scanf (δεύτερη επανάληψη) περιμένει μια είσοδο. Από τη προηγούμενη επανάληψη θα έχει μείνει μέσα το "\n" το οποίο στο πρόγραμμά σου θα θεωρηθεί είσοδος. Αν εμφανίσεις και όλα τα "\n" στο τέλος θα δεις ότι είναι ίσα με το συνολικό αριθμό γραμμάτων που έδωσες**. **στον αρχικό κώδικα που πόσταρες, όχι εφόσον βάλεις το fflush(stdin); Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: yorgos_78 on April 15, 2016, 17:57:54 pm Βασικά έπεσες με τη μία στην περίπτωση. Το πρόβλημα αυτό εμφανίζεται όταν πραγματοποιείς scanf με char (δλδ "%c") μέσα σε κάποιου είδους loop. Χοντρικά, η scanf όταν πάει να διαβάσει characters διαβάζει ο,τι υπάρχει σε ένα free-text buffer. Το new line όμως - σε ο,τι αφορά την scanf - είναι ΚΑΙ αυτό ένας χαρακτήρας! Υποθέτωντας FIFO-buffer λοιπόν, δλδ οτι ο,τι μπει πρώτο θα βγει και πρώτο, η ΕΠΟΜΕΝΗ scanf του loop θα βρει σαν ΠΡΩΤΟ χαρακτήρα μέσα στο buffer το new line του προηγούμενου loop (για το λόγο αυτό το πρόβλημα εμφανίζεται αφότου έχει τρέξει πρώτη φορά το loop. Καλό είναι λοιπόν σε κάθε κύκλο να γίνεται flush το buffer. Εναλλακτικά βάζεις ένα white space - όπως είπε ο φίλος πιο πάνω - πριν το %c για να κάνει consume αυτόν ακριβώς το χαρακτήρα (αν το buffer δεν έχει τίποτα τότε δεν θα υπάρχει και τίποτα για να γίνει consume οπότε κανένα πρόβλημα).
Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: potirikolonato on April 15, 2016, 19:01:06 pm Ευχαριστώ πολύ παιδιά, πολύ ψιλά γράμματα αλλά σημαντικά!!
Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: leukosaraphs! on April 15, 2016, 21:31:34 pm Ειχα το ιδιο προβλημα με την εμφανιση της printf κι ετσι απλα εβγαλα την printf εξω απο την do..while
Ωστοσο ,δν μου εμφανιζοταν μονο η printf , αλλα μπροστα απο αυτην 2 φορες το γραμμα που πληκτρολογουσα Καπως ετσι: c cc Type a character or exclamation mark to finish cc Type a character or exclamation mark to finish d dd Type a character or exclamation mark to finish dd Type a character or exclamation mark to finish κοκ. βεβαια μολις εβγαλα την printf απο εξω ολα διορθωθηκαν, αλλα ξερεις κανεις τον λογο που εμφανιζονταν τα 2 γραμματα? Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: Apostolof on April 15, 2016, 23:34:17 pm Χωρίς κώδικα δύσκολο.
Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: leukosaraphs! on April 15, 2016, 23:38:22 pm Χωρίς κώδικα δύσκολο. Απλα ολοκληρωσα την ασκηση , κι ετσι δεν μου βρισκεται ευκαιρο :-\ :-\ Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: potirikolonato on April 16, 2016, 01:07:11 am Απλα ολοκληρωσα την ασκηση , κι ετσι δεν μου βρισκεται ευκαιρο :-\ :-\ μπορείς απλά να μπεις στο elearning στην ασκηση 7 που κατεθεσες και να κατεβασεις το αρχειο για να βρεις τον κωδικα ;) Title: Re: [Δομημένος Προγραμματισμός] Άσκηση 7 (Hμ/νία λήξης: 19/4/2016) Post by: leukosaraphs! on April 16, 2016, 12:08:42 pm μπορείς απλά να μπεις στο elearning στην ασκηση 7 που κατεθεσες και να κατεβασεις το αρχειο για να βρεις τον κωδικα ;) Δικο μου λαθος , εννοουσα οτι επειδη βρηκα πως διορθωνεται , αλλαξα το προγραμμα μου και ετσι δν μπορω να παραθεσω τον ιδιο ακριβως κωδικα ετσι ωστε να σασ βοηθησω (Λογικα ηταν καποια λεπτομερεια , καποιας περιπτωσης) |