Ανάγνωση πολλών αριθμών

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

Ανάγνωση πολλών αριθμών

Δημοσίευση από ggeo1 » 24 Φεβ 2007 13:58

Καλησπέρα σε όλους

Είχα ξεκινήσει με τη C++ πριν κάποιους μήνες αλλά λόγω έλλειψης χρόνου δεν μπόρεσα να ασχοληθώ.Τώρα όμως επιστρέφω!Με λίγα λόγια έιμαι αρχάριος..

Το πρόβλημα που αντιμετωπίζω είναι το εξής: Ζητάω από το χρήστη να μου δώσει αριθμούς.Όχι συγκεκριμενο σύνολο αριθμών αλλά όσους θέλει.Στο τέλος θέλω να υπολογίζει το μέσο όρο αυτών των αριθμών.Εδώ είναι και το πρόβλημα.Αν έχω π.χ 3 αριθμούς δίνω :
.......
for (j=0; j<3; j++) {
}
m=(a+b+c)/j;
.....
και μου βγάζει σωστά το μέσο όρο.
Τώρα που δε δίνω όμως συγκεκριμένο σύνολο αριθμών,έχω κάνει το εξής:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int main()
{
float arithmoi[100];
int i=0;
float x;
// γέμισμα πίνακα
do {
cout << "Δώσε τον " << i+1 << "αριθμό ";
cin >> arithmoi;
x=arithmoi;
i++;
} while (x!=0);


// υπολογισμός μέσου όρου

float mesos;
float sum=0;
for (i=0; i<100; i++){
sum=sum +x;
}
mesos=sum/i;

cout << "Ο μέσος όρος είναι " << mesos;

return 0;
}

To πρόβλημα είναι πως μου βγάζει μέσο όρο συνέχεια το μηδέν.
Επίσης θέλω να ρωτήσω ,οι βρόγχοι είναι τόσο μπέρδεμα ή εμένα με φαίνονται έτσι?
Ακόμη,πως μπορώ να συμπεριλάβω την εντολή kbhit().Γνωρίζω ότι θέλει τη βιβλιοθήκη <conio.h> αλλά δεν την αναγνωρίζει ο μεταγλωττιστής.

Ευχαριστώ

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ανάγνωση πολλών αριθμών

Δημοσίευση από dva_dev » 24 Φεβ 2007 16:23

To πρόβλημα είναι πως μου βγάζει μέσο όρο συνέχεια το μηδέν.
Αν κοιτάξεις πιο προσεκτικά τον κώδικα σου θα δείς το εξής:

Κώδικας: Επιλογή όλων

do &#123;
...
&#125; while &#40;x!=0&#41;;
Οταν βγεί από το loop η μεταβλητή x είναι 0

Παρακάτω υπολογίζεις το μέσο όρο χρησημοποιώντας το x, το οποίο παραμένει 0 και δεν αλλάζει πουθενά η τιμή του.

Κώδικας: Επιλογή όλων

float mesos; 
float sum=0; 
for &#40;i=0; i<100; i++&#41;&#123; 
sum=sum +x;
&#125;
mesos=sum/i;
Αρα 0/100=0 (αυτός είναι ο μέσος όρος που υπολογίζεις).

Τα λάθη που θα πρότεινα να διορθώσεις είναι στα εξής σημεία:

α) Ελέγχεις αν ο αριθμός που δίνει ο χρήστης είναι το 0, προφανώς για να σταματήσεις να ζητάς άλλους αριθμούς, αλλά δεν κρατάς κάπου πόσοι είναι οι αριθμοί που έδωσε ο χρήστης. Εδωσε 1, 10, 100;
Ισως αυτό τον στόχο έχει η εντολή i++, αλλά κατόπιν το αγνοείς. Επίσης το τελευταίο νούμερο που δίνει ο χρήστης για να βγεί από το loop (το μηδέν), πρέπει να το χρησιμοποιήσεις όταν υπολογίζεις το μέσο όρο; Μάλλον όχι. Οπότε το πλήθος των αριθμών που έχει δώσει ο χρήστης όταν βγεί από το while είναι i-1.

β) Παρακάτω που υπολογίζεις τον μέσο όρο (πέρα του ότι ξαναχρησιμοποιείς την μεταβλητή i για να κάνεις το loop, οπότε έχασες το πλήθος αφού δεν το αποθήκευσες κάπου), δεν χρησιμοποιείς να νούμερα που έχεις αποθηκεύσει στον πίνακα σου, αλλά μόνο το τελευταίο (που είναι μηδέν).

γ) Δεν πρέπει να κάνεις loop μέχρι το 100 αλλά μέχρι όσο είναι το πλήθος των αριθμών που έδωσε ο χρήστης.

Για το kbhit δες το http://www.linux-sxs.org/programming/kbhit.html
Ισως σε βοηθήσει.

ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

Ανάγνωση πολλών αριθμών

Δημοσίευση από ggeo1 » 24 Φεβ 2007 17:23

Ευχαριστώ πολύ για τις παρατηρήσεις σου.

α) Ελέγχεις αν ο αριθμός που δίνει ο χρήστης είναι το 0, προφανώς για να σταματήσεις να ζητάς άλλους αριθμούς, αλλά δεν κρατάς κάπου πόσοι είναι οι αριθμοί που έδωσε ο χρήστης. Εδωσε 1, 10, 100;
Ισως αυτό τον στόχο έχει η εντολή i++, αλλά κατόπιν το αγνοείς. Επίσης το τελευταίο νούμερο που δίνει ο χρήστης για να βγεί από το loop (το μηδέν), πρέπει να το χρησιμοποιήσεις όταν υπολογίζεις το μέσο όρο; Μάλλον όχι. Οπότε το πλήθος των αριθμών που έχει δώσει ο χρήστης όταν βγεί από το while είναι i-1.
-- Αυτό είναι το πρόβλημα που αντιμετωπίζω.Δεν μπορώ δηλ να καταλάβω πώς θα κρατήσει τους αριθμούς που έχω δώσει.Πώς θα καταλάβει πόσους έδωσα.Εφόσον τους βάζω στον πίνακα arithmoi[100] δεν είναι αρκετό αυτό?(Δε ζητάω να μου λύσεις το πρόβλημα γράφοντάς μου τον κώδικα απλά αν γίνεται να με κατευθύνεις λίγο ακόμη)
β) Παρακάτω που υπολογίζεις τον μέσο όρο (πέρα του ότι ξαναχρησιμοποιείς την μεταβλητή i για να κάνεις το loop, οπότε έχασες το πλήθος αφού δεν το αποθήκευσες κάπου), δεν χρησιμοποιείς να νούμερα που έχεις αποθηκεύσει στον πίνακα σου, αλλά μόνο το τελευταίο (που είναι μηδέν). γ) Δεν πρέπει να κάνεις loop μέχρι το 100 αλλά μέχρι όσο είναι το πλήθος των αριθμών που έδωσε ο χρήστης.

-- float mesos;
float sum=0;
int j;
for (j=0; j<(i-1); j++){
sum=sum +arithmoi;
}
mesos=sum/i-1;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ανάγνωση πολλών αριθμών

Δημοσίευση από dva_dev » 25 Φεβ 2007 04:43

Στον κώδικα σου κάνεις το εξής:

int i=0; //Αρχικοποιείς το i με 0
float x;
// γέμισμα πίνακα
do {
cout << "Δώσε τον " << i+1 << "αριθμό ";
cin >> arithmoi[ i ];
x=arithmoi[ i ];
i++; //Κάθε φορά που παίρνεις έναν αριθμό αυξάνεις το i, άρα το i έχει το πλήθος
} while (x!=0);

Επειδή το i έχει μετρήσει και το τελευταίο νούμερο (το 0), που έδωσες για να βγείς από το loop, το οποίο βασικά δεν το χρησιμοποιείς για να υπολογίσεις το μέσο όρο, το πλήθος των αριθμών σου είναι i-1.

Από εδώ και πέρα ο κώδικας που έχεις αρκεί -σχεδόν- (αφού για το δεύτερο loop που υπολογίζεις το μέσο όρο χρησιμοποιείς την μεταβλητή j).
Δεν μπορώ δηλ να καταλάβω πώς θα κρατήσει τους αριθμούς που έχω δώσει.
Γι αυτό το λόγο χρησιμοποιείς τον πίνακα arithmoi, για να κρατάς τους αριθμούς που έχει δώσει ο χρήστης. Στο κώδικα σου έχεις

Κώδικας: Επιλογή όλων

cin >> arithmoi&#91;i&#93;;
Πώς θα καταλάβει πόσους έδωσα
Γι αυτό το λόγο χρησιμοποιείς την μεταβλητή i, για να μετράει πόσους έχεις δώσει. Στον κώδικα σου έχεις

Κώδικας: Επιλογή όλων

i++;
Εφόσον τους βάζω στον πίνακα arithmoi[100] δεν είναι αρκετό αυτό?
Ναι είναι αρκετό. Αρκεί να το ξέρεις ότι τους βάζεις εκεί, και να τους διαβάζεις από εκεί όταν υπολογίζεις το μέσο όρο.

Βλέπω ότι τα διόρθωσες τα περισσότερα λάθη στον κώδικα σου, αλλά σου ξέφυγε ένα σημείο, εδώ κολλάει το "σχεδόν" που ανέφερα στην αρχή.
Κάνεις:

Κώδικας: Επιλογή όλων

sum=sum +arithmoi&#91;i&#93;; 
ενώ ο μετρητής σου στο loop είναι το j και όχι το i. Οπότε πρέπει να γίνει:

Κώδικας: Επιλογή όλων

for &#40;j=0; j<&#40;i-1&#41;; j++&#41;&#123;
    sum=sum + arithmoi&#91;j&#93;; //οχι arithmoi&#91;i&#93;
&#125;
Καλή συνέχεια.

ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

Ανάγνωση πολλών αριθμών

Δημοσίευση από ggeo1 » 26 Φεβ 2007 00:35

Ευχαριστώ πολύ για τη βοήθεια!

Διορθώνοντας και τις γραμμές
sum=sum +arithmoi[j];
mesos=sum/j;

βγάζει πλέον τα σωστά αποτελέσματα

Εκείνο που με μπερδεύει είναι με την cin >> arithmoi;
Δηλ καταχωρώ τους αριθμούς στον πίνακα arithmoi με την μεταβλητή i .Η μεταβλητή αυτή δηλ είναι υπεύθυνη για το ποιούς αριθμούς καταχώρησα.
Βάζοντας στο loop την for (j=0; j<(i-1); j++) χρησιμοποιώ την j για να αντιστοιχίσω το πλήθος των αριθμών.
Πώς γίνεται να βάλω την sum=sum +arithmoi[j]; ,να βάλω δηλ την j μέσα στην arithmoi[],αφού η i είναι αυτή που κρατάει το ποιούς αριθμούς έδωσα

Ευχαριστώ

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ανάγνωση πολλών αριθμών

Δημοσίευση από dva_dev » 26 Φεβ 2007 14:32

Θα προσπαθήσω να το πω όσο πιο απλά μπορώ, και ελπίζω να γίνω κατανοητός.

Αυτό που κάνεις είναι να ορίσεις ένα πίνακα 100 θέσεων. Μπορεί να κρατήσει μέχρι 100 πραγματικούς αριθμούς.

Κώδικας: Επιλογή όλων

float arithmoi&#91;100&#93;;
Κάθε φορά που δίνει έναν αριθμό ο χρήστης, τον αποθηκεύεις στον πίνακα (arithmoi[]) όχι στο i όχι στο j ούτε πουθενά αλλού.

Δεν τον αποθηκεύεις όμως στον πίνακα έτσι γενικά κι αόριστα, αλλά σε κάποια συγκεκριμένη θέση. Την 1η την 2η, την ν-οστή.

Το ποιά θα είναι αυτή η θέση το δείχνει κάποιος δείκτης.
Στο 1ο loop σου, το ρόλο του δείκτη τον παίζει η μεταβλητή i.

Κώδικας: Επιλογή όλων

cin >> arithmoi&#91;i&#93;;
Στο 2ο loop σου, το ρόλο του δείκτη τον παίζει η μεταβλητή j.

Κώδικας: Επιλογή όλων

sum=sum +arithmoi&#91;j&#93;;
Κάθε φορά όμως αυτό που πας και διαβάζεις ή γράφεις είναι ο πίνακας aritmoi[]. Αυτός κρατάει τα νούμερα.

Αυτό που δεν ξέρει ο πίνακας είναι το πόσα είναι αυτά τα νούμερα.

Το πόσα είναι αυτά τα νούμερα το μετράει η μεταβλητή i στο 1ο loop (γι αυτό και δεν πρέπει να το χάσεις αυτό το νούμερο), επειδή μετά από κάθε αριθμό που δίνει ο χρήστης την αυξάνεις κατά 1.

Κώδικας: Επιλογή όλων

i++;
Πριν που χρησιμοποιούσες το i στο 2ο loop, αυτόματα έχασες την παλιά τιμή που είχε το i, δηλαδή το πόσα νούμερα είχε δώσει ο χρήστης. Γι αυτό πρέπει να χρησιμοποιήσεις άλλη μεταβλητή να παίξει το ρόλο του δείκτη, την j, στο 2ο loop.

Μόλις τελειώσει και το 2ο loop η μεταβλητή j έχει την ίδια τιμή με το i (όσα είναι δηλαδή τα νούμερα που έδωσε ο χρήστης).

[edit]Λάθος! Τώρα που πρόσεξα τον κώδικα, το j στο 2ο loop, πάει μέχρι το (i-1). [/edit]

Να έχεις υπόψην σου ότι οι πίνακες στη C ξεκινάνε από το 0. Ενας πίνακας 100 θέσεων πάει από 0...99
Τελευταία επεξεργασία από το μέλος dva_dev την 27 Φεβ 2007 02:59, έχει επεξεργασθεί 1 φορά συνολικά.

ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

Ανάγνωση πολλών αριθμών

Δημοσίευση από ggeo1 » 26 Φεβ 2007 14:58

Εντάξει ,το κατάλαβα τώρα!

Ευχαριστώ πολύ!

Θα επανέλθω πιστεύω με νέες ερωτήσεις!

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες