Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α6.10 · Αποσφαλμάτωση αθροίσματος με όριο

Εργαστήριο 3, Άσκηση 4 · Δυσκολία ★☆☆ · debug · Κεφάλαια: 6

Το παρακάτω πρόγραμμα 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)