Το παρακάτω πρόγραμμα limit.c ευελπιστεί να υπολογίζει την παράσταση
1 - 1/2 + 1/4 - 1/8 + 1/16 - … για όσους όρους είναι μεγαλύτεροι από το LIMIT. Για
να το πετύχει αυτό, ο προγραμματιστής του έκανε την εξής σκέψη:
“Σε μια μεταβλητή
cθα κρατάω τον τρέχοντα όρο που θα προστεθεί, ο οποίος παράγεται από τον προηγούμενο αν πολλαπλασιάσω με ½. Θέλω ανά πάσα στιγμή ο όροςcνα μην ξεπερνά τοLIMIT. Τοcέχει διαφορετικό πρόσημο σε κάθε όρο, οπότε θα χρησιμοποιήσω μια μεταβλητήsignπου θα την πολλαπλασιάζω με το -1 ώστε ανά δύο όρους να έχει το ίδιο πρόσημο. Τελικά θα εκτυπώσω το άθροισμαS”.
Το πρόγραμμα αυτό όμως έχει λογικά λάθη. Μπορείτε να το αποσφαλματώσετε και να γράψετε
ένα σωστό limit.c;
#include <stdio.h>
#define LIMIT 0.008
int main() {
float S = 0, c = 1;
int sign = 1;
while (c < LIMIT) {
S = S + c;
sign = (-1) * sign;
c = sign * (1.0 / 2) * c;
}
printf("%f\n", S);
}
Βάλτε μια printf μέσα στον βρόχο που τυπώνει S, c και sign σε κάθε επανάληψη και
δείτε πόσες φορές εκτελείται. Ελέγξτε τη συνθήκη σε σχέση με το τι σημαίνει «όροι
μεγαλύτεροι από το LIMIT», και αναρωτηθείτε τι γίνεται στη σύγκριση όταν ο όρος
γίνει αρνητικός. Επίσης, αφού το c κουβαλά ήδη το πρόσημο του προηγούμενου όρου, τι
κάνει ο πολλαπλασιασμός με το sign που αλλάζει κάθε φορά;
Αριθμός στον οδηγό: Α6.10
(στο κεφάλαιο) ·
Μόνιμο αναγνωριστικό: lab-lab03-limit ·
Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab03-limit.html ·
Markdown (GitHub)