THMMY.gr

Μαθήματα Βασικού Κύκλου => Δομημένος Προγραμματισμός => Topic started by: Apostolof on April 13, 2016, 19:32:57 pm



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() {
char letter;
int table[26]={0};
int i,j,v_min,v_max,f_min,f_max;



do {
printf("Give me a letter. If you want to stop give me (!)\n");
scanf ("%c",&letter);
//Μετατροπή κεφαλαίου σε μικρού.
if (letter>= 'A' || letter<= 'Z'){
letter=tolower(letter);

}

/*Το πρόγραμμα μας θέλούμε να κάνει καταμέτρηση μόνο για τα γράμματα απο a εως z για
και να ανεβάζει την τιμή της αντίστοιχης θέσης στον πίνακα. Το letter-97 προκύπτει
γιατί η μεταβλητη letter αν και δηλώνεται ως char στην ουσία είναι ένας int με τίμη
την τίμη ASCII του αντιστοιχου γράμματος.Επίσης a-z αντιστοιχει στους αριθμους 97-122*/
 
if(letter>='a'|| letter<='z'){
table[letter-97]++;

}


}
return 0;
}
Καθως ζητάω γράμματα απο τον χρήστη μου εμφανίζει για κάθε επόμενο γράμμα 2 φορες αυτην την printf("Give me a letter. If you want to stop give me (!)\n");. Ξέρετε τι παίζει;;


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);
ακριβώς κάτω από το scanf.
Περισσότερα εδώ: 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 που κατεθεσες και να κατεβασεις το αρχειο για να βρεις τον κωδικα  ;)

Δικο μου λαθος , εννοουσα οτι επειδη βρηκα πως διορθωνεται , αλλαξα το προγραμμα μου και ετσι δν μπορω να παραθεσω τον ιδιο ακριβως κωδικα ετσι ωστε να σασ βοηθησω (Λογικα ηταν καποια λεπτομερεια , καποιας περιπτωσης)