410 likes | 591 Views
Παράδειγματα. Συναρτησεις Πανω-Κατω Σχεδιασμος Βασικες Τεχνικες Προγραμματισμου. Παράδειγμα με χρονο. Γραψε τε προγραμμα που παιρνει δυο δεδομενα: μια ωρα (σε μορφη hhmm) και τ α λεπτα που πρεπει να προσθεθουν στην ωρα και υπολογιζει και τυπωνει την νεα ωρα ( σε μορφη ) hh:mm.
E N D
Παράδειγματα • Συναρτησεις • Πανω-Κατω Σχεδιασμος • Βασικες Τεχνικες Προγραμματισμου epl-032
Παράδειγμα με χρονο • Γραψετε προγραμμα που παιρνει δυο δεδομενα: μια ωρα (σε μορφη hhmm) και ταλεπτα που πρεπει να προσθεθουν στην ωρα και υπολογιζει και τυπωνει την νεα ωρα (σε μορφη) hh:mm. epl-032
Τι πρεπει να γινει • Κατανοηση με παραδειγματα • μετα ιδωμεν... epl-032
Τι πρεπει να γινει /* get two input data - time and increment*/ /* determine new time */ /* display old time, increment and new time se morfi hh:mm*/ epl-032
Εισαγωγη Δεδομενων /* get two input data - time and increment*/ printf(“Enter time (hhmm) and number of minutes to increment: “); scanf(“%d%d”,&old_time, &increment); epl-032
Υπολογισμος /* determine new time */ /* diaxwrise wres kai lepta apo old_time*/ /* determine new time’s minutes */ /* determine new time’s hours */ epl-032
/* 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 */ epl-032
/* 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 */ epl-032
/* 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); epl-032
Διαχωρισμος int extract_hours(int time) { return time/100; } int extract_minutes(int time) { return time%100; } epl-032
Μετατροπη Αριθμου Λεπτων σε Ωρες και Λεπτα int number_of_hours_in_minutes(int minutes) { return time/60; } int number_of_hourly_minutes_in_minutes(int minutes) { return time%60; } epl-032
Μετατροπη Αριθμου Ωρων int hours_to_daily_hours(int hours) { return hours%24; } epl-032
Εξαγωγη Δεδομενων /* 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); epl-032
Παράδειγμα • Γραψετε ενα προγραμμα που υπολογιζει το αθροισμα μια απροσδιοριστου μεγεθους σειρα θετικων ακεραιων αριθμων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη 0. • π.χ. εισοδου/εξοδου: Enter series: 2 4 236 6 31 23 0 to athroisma tis seiras einai 302 epl-032
Χρήσιμες Λειτουργικοτητες • Tι πρεπει να γινει • διαβασμα μια σειρας απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη • υπολογισμος αθροισματος μιας σειρας • Χρήσιμες Λειτουργικοτητες • Πως διαβαζουμε μια σειρα απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη? • Πωςυπολογιζουμε το αθροισμα μιας σειρας? epl-032
Aνάγνωσησειρας απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη • Απαιτει εντολή επαναληψης (βροχος) • Τυπικη Δομη /*διαβασε το πρωτο στοιχειο*/ while(/*το στοιχειο δεν σημαδοτει τελος*/){ /* διαβασε επομενο στοιχειο */ } epl-032
Διαβασμα σειρας απροσδιοριστου μεγεθους που τερματιζεται με 0 int number; fscanf(“%d”,&number); /* diabase prwto stoixeio */ while(number != 0){ fscanf(“%d”,&number); /* διαβασε επομενο στοιχειο */ } epl-032
Διασπαση: εννοια του μερικου αποτελεσματος • Οταν δεν εχουμε εντολη που λυει ενα προβλημα, διασπαζουμαι το προβλημα μεχρι να βρουμε ενα υποπροβλημα που υπαρχουν εντολες που το λυουν • Π.χ. δεν υπαρχει τελεστης στην C που μπορει να προσθεσει ν τιμες μαζι (οπου το ν >2). Για ν τιμες χρεαζονται ? προσθεσεις epl-032
α2 α3 α4 + + + sum α1 sum sum sum epl-032
Αθροισμα σειρας 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*/ epl-032
Παράδειγμα • Γραψετε ενα προγραμμα που αναγνωριζει τον πιο μεγαλο αριθμο σε μια απροσδιοριστου μεγεθους σειρα θετικων ακεραιων αριθμων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη 0. • π.χ. εισοδου/εξοδου: Enter series: 2 4 5236 6 31 978 5555 23 0 O megistos arithmos einai to 5555 epl-032
Χρήσιμες Λειτουργικοτητες • Πως διαβαζουμε μια σειρα απροσδιοριστου μεγεθους που τερματιζεται με καθορισμενη τιμη? • Πωςυπολογιζουμε τον μεγιστο αριθμο μιας σειρας? Διασπαση σε απλα υποπροβληματα: υπολογισε μεγιστο ανα δυο epl-032
α2 α3 α4 max max max megistos α1 megistos megistos megistos int max(int a,int b) epl-032
Μέγιστη τιμη 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); epl-032
int max(int a,int b) • Γραψετε μια διαδικασια που παιρνει δυο ακεραιους παραμετρους και η τιμη εξοδου της ειναι η μεγιστη τιμη μεταξυ των δυο παραμετρων. epl-032
/* * max - epistrefei tin megisti metaxy twn dyo parametrvn */ int max(int a, int b) { if (a>b) return a; return b; } epl-032
int max(int a, int b) { if (a>b) return a; return b; } int max(int a, int b) { if (a>b) return a; else return b; } int max(int a, int b) { int megistos; if (a>b) megistos = a; else megistos = b; return megistos; } int max(int a, int b) { int megistos; megistos = b; if (a>b) megistos = a; return megistos; }
getchar/putchar • Συναρτησεις εισοδου/εξοδου χαρακτηρων • Διεπαφη • int getchar(), διαβασε τον επομενο χαρακτηρα απο την εισοδο, κινησε δρομεα διαβασματος στον επομενο χαρακτηρα (διαβαζει χαρακτηρες μιας γραμμης μετα το enter) • void putchar(int), τυπωσε χαρακτηρα στην μοναδα εξοδου epl-032
Παράδειγμα • Γραψετε ενα προγραμμα που μετραει τον αριθμο χαρακτηρων σε μια απροσδιοριστου μεγεθους σειρα χαρακτηρων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη EOF. • π.χ. εισοδου/εξοδου: Enter series: asdfre ^Z το μεγεθος της σειρας ειναι 7 epl-032
Χρήσιμες Λειτουργικοτητες • Tι πρεπει να γινει • διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους • υπολογισμος μεγεθους σειρας • Χρήσιμες Λειτουργικοτητες • Πως διαβαζουμε μια σειρα χαρακτηρων που τερματιζεται με καθορισμενη τιμη? • Πωςυπολογιζουμε το μεγεθος μιας σειρας? epl-032
Aνάγνωσησειρας απροσδιοριστου μεγεθους χαρακτηρων • Oπως προηγουμενος: • Απαιτει εντολή επαναληψης (βροχος) • Ιδια δομη /*διαβασε το πρωτο στοιχειο*/ while(/*το στοιχειο δεν σημαδοτει τελος*/){ /* διαβασε επομενο στοιχειο */ } epl-032
Διαβασμα σειρας χαρακτηρων int c; c = getchar(); /* diabase prwto xaraktira */ while(c != EOF){ /* oxi telos tou file */ c = getchar(); /* διαβασε επομενο xaraktira */ } epl-032
echo σειρας χαρακτηρων int c; c = getchar(); /* diabase prwto xaraktira */ while(c != EOF){ putchar(c); /* typwse xaraktira */ c = getchar(); /* διαβασε επομενο xaraktira */ } epl-032
ΜεγεθοςΣειρας Χαρακτηρων 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 */ } epl-032
Απλοποίηση??? int c; int size; size = 0; /* arxikopoihsh */ while((c = getchar() )!= EOF){/* diabase kai elegxe xaraktira */ size = size + 1; /* metra akomi ena xaraktira */ } epl-032
Απλοποίηση? int get_int() { int number; fscanf(“%d”,&number); return number; } int number; number = get_int(); /* diabase prwto stoixeio */ while(number != 0){ number = get_int(); /* διαβασε επομενο στοιχειο */ }
Απλοποίηση int get_int() { int number; fscanf(“%d”,&number); return number; } int number; while((number = get_int()) != 0){ } epl-032
Μετρημα Συγκεκριμενου Γεγονοτος • Ποσες φορες παρουσιαστηκε ο χαρακτηρας Α? • Tι πρεπει να γινει • διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους • ελεγχος για χαρακτηρα Α • αυξησε μετρητη καθε φορα epl-032
Μετρηση Γεγονοτος int c; int count; count = 0; /* arxikopoihsh */ while((c = getchar() )!= EOF){ /* diabase xaraktira */ if (c==‘A’) ++count; /* metra akomi ena xaraktira */ } epl-032
Μετρηση Συγκεκριμενου Γεγονοτος • Ποσες γραμμες υπηρχουν στα δεδομενα? • Tι πρεπει να γινει • διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους • ελεγχος για χαρακτηρα επομενη γραμμη?? • αυξησε μετρητη καθε φορα epl-032
Μετρηση Γεγονοτος 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 */ } epl-032