Παράδειγματα

41
21/2/2000 epl-032 1 Παράδειγματα • Συναρτησεις • Πανω-Κατω Σχεδιασμος • Βασικες Τεχνικες Προγραμματισμου

description

Παράδειγματα. Συναρτησεις Πανω-Κατω Σχεδιασμος Βασικες Τεχνικες Προγραμματισμου. Παράδειγμα με χρονο. Γραψε τε προγραμμα που παιρνει δυο δεδομενα: μια ωρα (σε μορφη hhmm) και τ α λεπτα που πρεπει να προσθεθουν στην ωρα και υπολογιζει και τυπωνει την νεα ωρα ( σε μορφη ) hh:mm. - PowerPoint PPT Presentation

Transcript of Παράδειγματα

Page 1: Παράδειγματα

21/2/2000 epl-032 1

Παράδειγματα

• Συναρτησεις

• Πανω-Κατω Σχεδιασμος

• Βασικες Τεχνικες Προγραμματισμου

Page 2: Παράδειγματα

21/2/2000 epl-032 2

Παράδειγμα με χρονο

• Γραψετε προγραμμα που παιρνει δυο δεδομενα: μια ωρα (σε μορφη hhmm) και τα λεπτα που πρεπει να προσθεθουν στην ωρα και υπολογιζει και τυπωνει την νεα ωρα (σε μορφη) hh:mm.

Page 3: Παράδειγματα

21/2/2000 epl-032 3

Τι πρεπει να γινει

• Κατανοηση με παραδειγματα

• μετα ιδωμεν...

Page 4: Παράδειγματα

21/2/2000 epl-032 4

/* get two input data - time and increment*/

/* determine new time */

/* display old time, increment and new time se morfi hh:mm*/

Τι πρεπει να γινει

Page 5: Παράδειγματα

21/2/2000 epl-032 5

/* get two input data - time and increment*/printf(“Enter time (hhmm) and number of minutes to increment: “);scanf(“%d%d”,&old_time, &increment);

Εισαγωγη Δεδομενων

Page 6: Παράδειγματα

21/2/2000 epl-032 6

/* determine new time */

/* diaxwrise wres kai lepta apo old_time*/

/* determine new time’s minutes */

/* determine new time’s hours */

Υπολογισμος

Page 7: Παράδειγματα

21/2/2000 epl-032 7

/* determine new time */

/* diaxwrise wres kai lepta apo old_time*//* old_time_minutes, old_time_hours*//* increment_minutes */

/* determine new time’s minutes *//* new_time_minutes = old_time_minutes + increment_minutes*//* possible new_time_minutes > 59.

need to compute extra_hours in new_time_minutes need to compute hourly_minutes in new_time_minutes */

/* determine new time’s hours */

Page 8: Παράδειγματα

21/2/2000 epl-032 8

/* determine new time */

/* diaxwrise wres kai lepta apo old_time*//* old_time_minutes, old_time_hours, increment_minutes*/

/* determine new time’s minutes *//* new_time_minutes = old_time_minutes + increment_minutes*//* possible new_time_minutes > 59.

need to compute increment_hours in new_time_minutes need to compute hourly_minutes (0-59) in new_time_minutes */

/* determine new time’s hours *//* new_time_hours = old_time_hours + increment_hours *//* possible new_time_hours > 23

need to compute daily hours (0-23) in new_time_hours */

Page 9: Παράδειγματα

21/2/2000 epl-032 9

/* determine new time *//* diaxwrise wres kai lepta apo old_time*/old_time_hours = extract_hours(old_time);old_time_minutes = extract_minutes(old_time);increment_minutes = increment;

/* determine new time’s minutes *//* new_time_minutes = old_time_minutes+increment_minutes */new_time_minutes = old_time_minutes+increment_minutes;/* possible new_time_minutes > 59 -extract hours and determine hourly minutes*/increment_hours = number_of_hours_in_minutes(new_time_minutes);new_time_minutes = number_of_hourly_minutes_in_minutes(new_time_minutes);

/* determine new time’s hours *//* new_time_hour = old_time_hour + increment_hours */new_time_hour = old_time_hour + increment_hours;/* pssible new_time_hour > 23 --- so do correction to find the right time */new_time_hour = hours_to_daily_hours(new_time_hour);

Page 10: Παράδειγματα

21/2/2000 epl-032 10

Διαχωρισμος

intextract_hours(int time){

return time/100;}

intextract_minutes(int time){

return time%100;}

Page 11: Παράδειγματα

21/2/2000 epl-032 11

Μετατροπη Αριθμου Λεπτων σε Ωρες και Λεπτα

intnumber_of_hours_in_minutes(int minutes){

return time/60;}

intnumber_of_hourly_minutes_in_minutes(int minutes){

return time%60;}

Page 12: Παράδειγματα

21/2/2000 epl-032 12

Μετατροπη Αριθμου Ωρων

inthours_to_daily_hours(int hours){

return hours%24;}

Page 13: Παράδειγματα

21/2/2000 epl-032 13

Εξαγωγη Δεδομενων

/* display old time, increment and new time se morfi hh:mm*/printf(“Adding %d minutes to time %02d:%02d results in %02d:%02d\n“,increment_minutes, old_hours, old_minutes, new_time_hours, new_time_minutes);

Page 14: Παράδειγματα

21/2/2000 epl-032 14

Παράδειγμα

• Γραψετε ενα προγραμμα που υπολογιζει το αθροισμα μια απροσδιοριστου μεγεθους σειρα θετικων ακεραιων αριθμων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη 0.

• π.χ. εισοδου/εξοδου:Enter series: 2 4 236 6 31 23 0

to athroisma tis seiras einai 302

Page 15: Παράδειγματα

21/2/2000 epl-032 15

Χρήσιμες Λειτουργικοτητες

• Tι πρεπει να γινει– διαβασμα μια σειρας απροσδιοριστου μεγεθους

που τερματιζεται με καθορισμενη τιμη

– υπολογισμος αθροισματος μιας σειρας

• Χρήσιμες Λειτουργικοτητες – Πως διαβαζουμε μια σειρα απροσδιοριστου

μεγεθους που τερματιζεται με καθορισμενη τιμη?

– Πως υπολογιζουμε το αθροισμα μιας σειρας?

Page 16: Παράδειγματα

21/2/2000 epl-032 16

Aνάγνωση σειρας απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη

• Απαιτει εντολή επαναληψης (βροχος)

• Τυπικη Δομη

/*διαβασε το πρωτο στοιχειο*/while(/*το στοιχειο δεν σημαδοτει τελος*/){

/* διαβασε επομενο στοιχειο */

}

Page 17: Παράδειγματα

21/2/2000 epl-032 17

Διαβασμα σειρας απροσδιοριστου μεγεθους που τερματιζεται με 0

int number; fscanf(“%d”,&number); /* diabase prwto stoixeio */while(number != 0){

fscanf(“%d”,&number); /* διαβασε επομενο στοιχειο */

}

Page 18: Παράδειγματα

21/2/2000 epl-032 18

Διασπαση: εννοια του μερικου αποτελεσματος• Οταν δεν εχουμε εντολη που λυει ενα

προβλημα, διασπαζουμαι το προβλημα μεχρι να βρουμε ενα υποπροβλημα που υπαρχουν εντολες που το λυουν

• Π.χ. δεν υπαρχει τελεστης στην C που μπορει να προσθεσει ν τιμες μαζι (οπου το ν >2). Για ν τιμες χρεαζονται ? προσθεσεις

Page 19: Παράδειγματα

21/2/2000 epl-032 19

sum

sum

sum

sum

α1 α2 α3 α4

+

+

+

Page 20: Παράδειγματα

21/2/2000 epl-032 20

Αθροισμα σειρας

int number; /* holds input number one at a time */int sum; /* current sum */

fscanf(“%d”,&number); /* diabase prwto stoixeio */sum = 0; /* arxikopoihsh */while(number != 0){

sum = sum + number; * επεξεργασια*/fscanf(“%d”,&number); /* διαβασε επομενο στοιχειο*/

}printf(“To athroisma της σειρας ειναι %d\n”,sum); /*ejodos*/

Page 21: Παράδειγματα

21/2/2000 epl-032 21

Παράδειγμα

• Γραψετε ενα προγραμμα που αναγνωριζει τον πιο μεγαλο αριθμο σε μια απροσδιοριστου μεγεθους σειρα θετικων ακεραιων αριθμων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη 0.

• π.χ. εισοδου/εξοδου: Enter series: 2 4 5236 6 31 978 5555 23 0 O megistos arithmos einai to 5555

Page 22: Παράδειγματα

21/2/2000 epl-032 22

Χρήσιμες Λειτουργικοτητες

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

• Πως υπολογιζουμε τον μεγιστο αριθμο μιας σειρας? Διασπαση σε απλα υποπροβληματα:

υπολογισε μεγιστο ανα δυο

Page 23: Παράδειγματα

21/2/2000 epl-032 23

megistos

megistos

megistos

megistos

α1 α2 α3 α4

max

max

max

int max(int a,int b)

Page 24: Παράδειγματα

21/2/2000 epl-032 24

Μέγιστη τιμη

int number; /* hold input number one at a time */int maximum; /* hold current maximum */

fscanf(“%d”,&number); /* diabase prwto stoixeio */maximum = 0; /* arxikopoihsh */while(number != 0){

maximum = max(maximum,number); /* επεξεργασια*/fscanf(“%d”,&number); /* διαβασε επομενο στοιχειο*/

}printf(“To megisto stoixeio της σειρας ειναι %d\n”, /*ejodos*/

maximum);

Page 25: Παράδειγματα

21/2/2000 epl-032 25

int max(int a,int b)

• Γραψετε μια διαδικασια που παιρνει δυο ακεραιους παραμετρους και η τιμη εξοδου της ειναι η μεγιστη τιμη μεταξυ των δυο παραμετρων.

Page 26: Παράδειγματα

21/2/2000 epl-032 26

/* * max - epistrefei tin megisti metaxy twn dyo parametrvn */intmax(int a, int b){

if (a>b)return a;

return b;}

Page 27: Παράδειγματα

intmax(int a, int b){

if (a>b)return a;

return b;}

intmax(int a, int b){

if (a>b)return a;

elsereturn b;

}

intmax(int a, int b){

int megistos;if (a>b)

megistos = a;else

megistos = b;return megistos;

}

intmax(int a, int b){

int megistos;megistos = b;if (a>b)

megistos = a;

return megistos;}

Page 28: Παράδειγματα

21/2/2000 epl-032 28

getchar/putchar

• Συναρτησεις εισοδου/εξοδου χαρακτηρων

• Διεπαφη– int getchar(), διαβασε τον επομενο χαρακτηρα

απο την εισοδο, κινησε δρομεα διαβασματος στον επομενο χαρακτηρα (διαβαζει χαρακτηρες μιας γραμμης μετα το enter)

– void putchar(int), τυπωσε χαρακτηρα στην μοναδα εξοδου

Page 29: Παράδειγματα

21/2/2000 epl-032 29

Παράδειγμα

• Γραψετε ενα προγραμμα που μετραει τον αριθμο χαρακτηρων σε μια απροσδιοριστου μεγεθους σειρα χαρακτηρων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη EOF.

• π.χ. εισοδου/εξοδου:Enter series: asdfre ^Z

το μεγεθος της σειρας ειναι 7

Page 30: Παράδειγματα

21/2/2000 epl-032 30

Χρήσιμες Λειτουργικοτητες

• Tι πρεπει να γινει– διαβασμα μια σειρας χαρακτηρων

απροσδιοριστου μεγεθους – υπολογισμος μεγεθους σειρας

• Χρήσιμες Λειτουργικοτητες – Πως διαβαζουμε μια σειρα χαρακτηρων που

τερματιζεται με καθορισμενη τιμη? – Πως υπολογιζουμε το μεγεθος μιας σειρας?

Page 31: Παράδειγματα

21/2/2000 epl-032 31

Aνάγνωση σειρας απροσδιοριστου μεγεθους χαρακτηρων

• Oπως προηγουμενος:– Απαιτει εντολή επαναληψης (βροχος)– Ιδια δομη

/*διαβασε το πρωτο στοιχειο*/while(/*το στοιχειο δεν σημαδοτει τελος*/){

/* διαβασε επομενο στοιχειο */

}

Page 32: Παράδειγματα

21/2/2000 epl-032 32

Διαβασμα σειρας χαρακτηρων

int c; c = getchar(); /* diabase prwto xaraktira */while(c != EOF){ /* oxi telos tou file */

c = getchar(); /* διαβασε επομενο xaraktira */

}

Page 33: Παράδειγματα

21/2/2000 epl-032 33

echo σειρας χαρακτηρων

int c; c = getchar(); /* diabase prwto xaraktira */while(c != EOF){

putchar(c); /* typwse xaraktira */c = getchar(); /* διαβασε επομενο xaraktira */

}

Page 34: Παράδειγματα

21/2/2000 epl-032 34

Μεγεθος Σειρας Χαρακτηρων

int c; int size;size = 0; /* arxikopoihsh */c = getchar(); /* diabase prwto xaraktira */while(c != EOF){

size = size + 1; /* metra akomi ena xaraktira */c = getchar(); /* διαβασε επομενο xaraktira */

}

Page 35: Παράδειγματα

21/2/2000 epl-032 35

Απλοποίηση???

int c; int size;size = 0; /* arxikopoihsh */while((c = getchar() )!= EOF){/* diabase kai elegxe xaraktira */

size = size + 1; /* metra akomi ena xaraktira */}

Page 36: Παράδειγματα

Απλοποίηση?int get_int(){

int number;fscanf(“%d”,&number);return number;

}

int number; number = get_int(); /* diabase prwto stoixeio */while(number != 0){

number = get_int(); /* διαβασε επομενο στοιχειο */

}

Page 37: Παράδειγματα

21/2/2000 epl-032 37

Απλοποίηση int get_int(){

int number;fscanf(“%d”,&number);return number;

}

int number; while((number = get_int()) != 0){

}

Page 38: Παράδειγματα

21/2/2000 epl-032 38

Μετρημα Συγκεκριμενου Γεγονοτος

• Ποσες φορες παρουσιαστηκε ο χαρακτηρας Α?

• Tι πρεπει να γινει

– διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους

– ελεγχος για χαρακτηρα Α• αυξησε μετρητη καθε φορα

Page 39: Παράδειγματα

21/2/2000 epl-032 39

Μετρηση Γεγονοτος

int c; int count;count = 0; /* arxikopoihsh */while((c = getchar() )!= EOF){ /* diabase xaraktira */

if (c==‘A’)++count; /* metra akomi ena xaraktira */

}

Page 40: Παράδειγματα

21/2/2000 epl-032 40

Μετρηση Συγκεκριμενου Γεγονοτος

• Ποσες γραμμες υπηρχουν στα δεδομενα?

• Tι πρεπει να γινει

– διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους

– ελεγχος για χαρακτηρα επομενη γραμμη??• αυξησε μετρητη καθε φορα

Page 41: Παράδειγματα

21/2/2000 epl-032 41

Μετρηση Γεγονοτος

int c; int count;count = 0; /* arxikopoihsh */while((c = getchar() )!= EOF){ /* diabase xaraktira */

if (c==‘\n’) /* elegxe gia epomeni grammi */++count; /* metra akomi ena xaraktira */

}