Παράδειγματα
description
Transcript of Παράδειγματα
21/2/2000 epl-032 1
Παράδειγματα
• Συναρτησεις
• Πανω-Κατω Σχεδιασμος
• Βασικες Τεχνικες Προγραμματισμου
21/2/2000 epl-032 2
Παράδειγμα με χρονο
• Γραψετε προγραμμα που παιρνει δυο δεδομενα: μια ωρα (σε μορφη hhmm) και τα λεπτα που πρεπει να προσθεθουν στην ωρα και υπολογιζει και τυπωνει την νεα ωρα (σε μορφη) hh:mm.
21/2/2000 epl-032 3
Τι πρεπει να γινει
• Κατανοηση με παραδειγματα
• μετα ιδωμεν...
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*/
Τι πρεπει να γινει
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);
Εισαγωγη Δεδομενων
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 */
Υπολογισμος
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 */
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 */
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);
21/2/2000 epl-032 10
Διαχωρισμος
intextract_hours(int time){
return time/100;}
intextract_minutes(int time){
return time%100;}
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;}
21/2/2000 epl-032 12
Μετατροπη Αριθμου Ωρων
inthours_to_daily_hours(int hours){
return hours%24;}
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);
21/2/2000 epl-032 14
Παράδειγμα
• Γραψετε ενα προγραμμα που υπολογιζει το αθροισμα μια απροσδιοριστου μεγεθους σειρα θετικων ακεραιων αριθμων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη 0.
• π.χ. εισοδου/εξοδου:Enter series: 2 4 236 6 31 23 0
to athroisma tis seiras einai 302
21/2/2000 epl-032 15
Χρήσιμες Λειτουργικοτητες
• Tι πρεπει να γινει– διαβασμα μια σειρας απροσδιοριστου μεγεθους
που τερματιζεται με καθορισμενη τιμη
– υπολογισμος αθροισματος μιας σειρας
• Χρήσιμες Λειτουργικοτητες – Πως διαβαζουμε μια σειρα απροσδιοριστου
μεγεθους που τερματιζεται με καθορισμενη τιμη?
– Πως υπολογιζουμε το αθροισμα μιας σειρας?
21/2/2000 epl-032 16
Aνάγνωση σειρας απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη
• Απαιτει εντολή επαναληψης (βροχος)
• Τυπικη Δομη
/*διαβασε το πρωτο στοιχειο*/while(/*το στοιχειο δεν σημαδοτει τελος*/){
/* διαβασε επομενο στοιχειο */
}
21/2/2000 epl-032 17
Διαβασμα σειρας απροσδιοριστου μεγεθους που τερματιζεται με 0
int number; fscanf(“%d”,&number); /* diabase prwto stoixeio */while(number != 0){
fscanf(“%d”,&number); /* διαβασε επομενο στοιχειο */
}
21/2/2000 epl-032 18
Διασπαση: εννοια του μερικου αποτελεσματος• Οταν δεν εχουμε εντολη που λυει ενα
προβλημα, διασπαζουμαι το προβλημα μεχρι να βρουμε ενα υποπροβλημα που υπαρχουν εντολες που το λυουν
• Π.χ. δεν υπαρχει τελεστης στην C που μπορει να προσθεσει ν τιμες μαζι (οπου το ν >2). Για ν τιμες χρεαζονται ? προσθεσεις
21/2/2000 epl-032 19
sum
sum
sum
sum
α1 α2 α3 α4
+
+
+
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*/
21/2/2000 epl-032 21
Παράδειγμα
• Γραψετε ενα προγραμμα που αναγνωριζει τον πιο μεγαλο αριθμο σε μια απροσδιοριστου μεγεθους σειρα θετικων ακεραιων αριθμων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη 0.
• π.χ. εισοδου/εξοδου: Enter series: 2 4 5236 6 31 978 5555 23 0 O megistos arithmos einai to 5555
21/2/2000 epl-032 22
Χρήσιμες Λειτουργικοτητες
• Πως διαβαζουμε μια σειρα απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη?
• Πως υπολογιζουμε τον μεγιστο αριθμο μιας σειρας? Διασπαση σε απλα υποπροβληματα:
υπολογισε μεγιστο ανα δυο
21/2/2000 epl-032 23
megistos
megistos
megistos
megistos
α1 α2 α3 α4
max
max
max
int max(int a,int b)
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);
21/2/2000 epl-032 25
int max(int a,int b)
• Γραψετε μια διαδικασια που παιρνει δυο ακεραιους παραμετρους και η τιμη εξοδου της ειναι η μεγιστη τιμη μεταξυ των δυο παραμετρων.
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;}
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;}
21/2/2000 epl-032 28
getchar/putchar
• Συναρτησεις εισοδου/εξοδου χαρακτηρων
• Διεπαφη– int getchar(), διαβασε τον επομενο χαρακτηρα
απο την εισοδο, κινησε δρομεα διαβασματος στον επομενο χαρακτηρα (διαβαζει χαρακτηρες μιας γραμμης μετα το enter)
– void putchar(int), τυπωσε χαρακτηρα στην μοναδα εξοδου
21/2/2000 epl-032 29
Παράδειγμα
• Γραψετε ενα προγραμμα που μετραει τον αριθμο χαρακτηρων σε μια απροσδιοριστου μεγεθους σειρα χαρακτηρων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη EOF.
• π.χ. εισοδου/εξοδου:Enter series: asdfre ^Z
το μεγεθος της σειρας ειναι 7
21/2/2000 epl-032 30
Χρήσιμες Λειτουργικοτητες
• Tι πρεπει να γινει– διαβασμα μια σειρας χαρακτηρων
απροσδιοριστου μεγεθους – υπολογισμος μεγεθους σειρας
• Χρήσιμες Λειτουργικοτητες – Πως διαβαζουμε μια σειρα χαρακτηρων που
τερματιζεται με καθορισμενη τιμη? – Πως υπολογιζουμε το μεγεθος μιας σειρας?
21/2/2000 epl-032 31
Aνάγνωση σειρας απροσδιοριστου μεγεθους χαρακτηρων
• Oπως προηγουμενος:– Απαιτει εντολή επαναληψης (βροχος)– Ιδια δομη
/*διαβασε το πρωτο στοιχειο*/while(/*το στοιχειο δεν σημαδοτει τελος*/){
/* διαβασε επομενο στοιχειο */
}
21/2/2000 epl-032 32
Διαβασμα σειρας χαρακτηρων
int c; c = getchar(); /* diabase prwto xaraktira */while(c != EOF){ /* oxi telos tou file */
c = getchar(); /* διαβασε επομενο xaraktira */
}
21/2/2000 epl-032 33
echo σειρας χαρακτηρων
int c; c = getchar(); /* diabase prwto xaraktira */while(c != EOF){
putchar(c); /* typwse xaraktira */c = getchar(); /* διαβασε επομενο xaraktira */
}
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 */
}
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 */}
Απλοποίηση?int get_int(){
int number;fscanf(“%d”,&number);return number;
}
int number; number = get_int(); /* diabase prwto stoixeio */while(number != 0){
number = get_int(); /* διαβασε επομενο στοιχειο */
}
21/2/2000 epl-032 37
Απλοποίηση int get_int(){
int number;fscanf(“%d”,&number);return number;
}
int number; while((number = get_int()) != 0){
}
21/2/2000 epl-032 38
Μετρημα Συγκεκριμενου Γεγονοτος
• Ποσες φορες παρουσιαστηκε ο χαρακτηρας Α?
• Tι πρεπει να γινει
– διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους
– ελεγχος για χαρακτηρα Α• αυξησε μετρητη καθε φορα
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 */
}
21/2/2000 epl-032 40
Μετρηση Συγκεκριμενου Γεγονοτος
• Ποσες γραμμες υπηρχουν στα δεδομενα?
• Tι πρεπει να γινει
– διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους
– ελεγχος για χαρακτηρα επομενη γραμμη??• αυξησε μετρητη καθε φορα
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 */
}