Άσκηση σε C με πίνακες ελέγχους και βρόχους.

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

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

Απάντηση
chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από chief » 14 Οκτ 2008 13:51

Θα ήθελα να με βοηθήσετε (και όχι να μου λύσετε...) στην ολοκλήρωση μιας άσκησης σε C.
Καταρχάς δεν θα σας γράψω όλη την εκφώνηση για να πηγαίνουμε σιγά σιγά να λύνω το κάθε σκέλος της.
Το πρώτο σκέλος της εργασίας μου είναι να δημιουργήσω έναν πίνακα με 7 θέσεις σαν καθολική μεταβλητή, σε κάθε θέση θα μπαίνει ένας ακέραιος αριθμός ,διψήφιος, ο οποίος θα παρουσιάζει τις ώρες ηλιοφάνειας για κάθε μέρα της εβδομάδας.
Θα πρέπει να τοποθετηθούν οι ακέραιοι σωστά σε κάθε θέση του μονοδιάστατου πίνακα. π.χ. την ηλιοφάνεια της Δευτέρας στη θέση 0, της Τρίτης στη θέση 1, κοκ.

#include <stdio.h>
int days[7];//ο πίνακας days με 7 θέσεις, καθολική μεταβλητή
int val1;//Μεταβλητές για κάθε ημέρα της εβδομάδας.
int val2;
int val3;
int val4;
int val5;
int val6;
int val7;

main()
{
{
int value;
int = i;
printf(Give values of sunshine duration for the seven days of a week,\n starting from the value for Monday.\n Each value should be an integer in the range (0..16).\n);//το κείμενο που θα ζητάει τις μεταβλητές ωρών ηλιοφάνειας την ημέρα
printf("Monday:");
scanf("%d",&val1);//διαβάζει τις τιμές που του έδωσε η εντολή printf.
for (i=0; i<7; i++);//η επανάληψη για την αρχικοποίηση του πίνακα, βάση της i μεταβλητής.
{
days=value;
}
while( ! (val1 >=0 && val1 <=16) )//συνθήκη ώστε οι τιμές να μην είναι πάνω από 16 και μικρότερη από 1
min = val1;//Μεταβλητές για την εύρεση του μικρότερου μεγαλύτερου και του μέσου όρου.
max = val1;
sum = val1;
}


if (%d!=i);//θα χρησιμοποιηθεί πιο μετά για τσεκάρισμα ότι υπάρχει η τιμή που γράψαμε στις καταχωρημένες τιμές που δώσαμε στον πίνακα.
return -1;//Σε περίπτωση που δεν υπάρχει η τιμή θα γυρνάει -1
}


Τα σχόλια που έχω παραθέσει είναι τι πιστεύω ότι κάνω με τον κώδικα που έχω γράψει μέχρι τώρα (για καλύτερη κατανόηση της σκέψης μου).

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από lakritidis » 16 Οκτ 2008 11:54

Δες αυτό για αρχή και βλέπουμε

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

int days&#91;7&#93;;

int main&#40;&#41; &#123;
	int i;
	for &#40;i = 0; i < 7; i++&#41; &#123;
		printf&#40;"Dose wres gia imera %d&#58; ", i + 1&#41;; fflush&#40;NULL&#41;;
		scanf&#40;"%d", &days&#91;i&#93;&#41;;
	&#125;

	int min = days&#91;0&#93;;
	int max = days&#91;0&#93;;
	int mo = 0;
	int daymin = 0, daymax = 0;	

	for &#40;i = 0; i < 7; i++&#41; &#123;
		if &#40;days&#91;i&#93; > max&#41; &#123;
			max = days&#91;i&#93;;
			daymax = i + 1;
		&#125;
		if &#40;days&#91;i&#93; < min&#41; &#123;
			min = days&#91;i&#93;;
			daymin = i + 1;
		&#125;

		mo = mo + days&#91;i&#93;;
	&#125;
	mo = mo / 7;

	printf&#40;"Min value is %d observed at day %d.\n", min, daymin&#41;;
	printf&#40;"Max value is %d observed at day %d.\n", max, daymax&#41;;
	printf&#40;"Average value is %d.\n", mo&#41;;

&#125;

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από chief » 16 Οκτ 2008 13:04

Καταρχάς ευχαριστώ για την απάντηση σου.
Στην συνέχεια θα προσπαθήσω να αναλύσω τι έκανες για να καταλάβω την ροή του κώδικα, όπου πιστεύεις ότι κάνω λάθος καλό θα ήτανε να επεμβαίνεις.
int days[7];

int main() {
int i;
for (i = 0; i < 7; i++) {
printf("Dose wres gia imera %d: ", i + 1); fflush(NULL);
scanf("%d", &days);
}


Στο παραπάνω κομμάτι του κώδικα κάνεις επανάληψη του printf και του scanf κατά 7 φορές για κάθε μια ημέρα.
Το fflush(null) το χρησιμοποιείς για κάποιο λόγο μήπως υπάρχει κάποια παράληψη ή είναι λάθος; Όταν το έτρεξα μου έβγαζε σφάλμα το αφαίρεσα και έτρεξε ο κώδικας μια χαρά.



int min = days[0];
int max = days[0];
int mo = 0;
int daymin = 0, daymax = 0;


Στο παραπάνω μέρος δίνεις 4 ακέραιες μεταβλητές, εδώ έχω την πρώτη απορία, η intmax και η intmin την αρχικοποιείς στην πρώτη θέση του πίνακα ή της δίνεις την τιμή 0;
Δεύτερη απορία το mo φαντάζομαι ότι είναι ο μέσος όρος ο οποίος δεν θα έπρεπε να ήταν float;
Και Τρίτη ερώτηση για ποιων λόγο μηδενίζεις τον μέσο όρο;


for (i = 0; i < 7; i++) {
if (days > max) {
max = days;
daymax = i + 1;
}
if (days < min) {
min = days;
daymin = i + 1;
}

mo = mo + days;
}
mo = mo / 7;

printf("Min value is %d observed at day %d.\n", min, daymin);
printf("Max value is %d observed at day %d.\n", max, daymax);
printf("Average value is %d.\n", mo);

}

Στο τελευταίο μέρος κάνεις επανάληψη για την εύρεση του Min, max, mo.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από lakritidis » 16 Οκτ 2008 23:29

Το fflush(null) το χρησιμοποιείς για κάποιο λόγο μήπως υπάρχει κάποια παράληψη ή είναι λάθος
Το fflush "εξαναγκάζει" το πρόγραμμα να τυπώσει αμέσως τον output buffer. Για να είσαι σίγουρος ότι αυτό που θέλεις θα τυπωθεί όταν πρέπει, κοτσάρεις το fflush. Διαφορετικά υπάρχει περίπτωση να περιμένει το runtime να γεμίσει κάποιος buffer πριν τυπώσει στην οθόνη. Τώρα το γιατί χτυπάει λάθος, δεν το ξέρω, πιθανώς να πρέπει να κάνεις include την stdio.h.
η intmax και η intmin την αρχικοποιείς στην πρώτη θέση του πίνακα ή της δίνεις την τιμή 0
Τις αρχικοποιώ και τις δύο στην πρώτη θέση του πίνακα και αν χρειαστεί, θα αλλάξουν.
Δεύτερη απορία το mo φαντάζομαι ότι είναι ο μέσος όρος ο οποίος δεν θα έπρεπε να ήταν float;
Σωστά, αν θέλεις ΜΟ δεκαδικό θα το κάνεις float ή double.
Και Τρίτη ερώτηση για ποιων λόγο μηδενίζεις τον μέσο όρο;
Ο λόγος είναι αυτός:

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

mo = mo + days&#91;i&#93;; 
Αν δεν μηδενίσεις αρχικά το mo, τότε στην πρώτη εκτέλεση του loop, το mo δεν έχει ακόμη τιμή, οπότε θα υπολογιστεί βάσει τις τυχαίας τιμής που έχει πάρει η mo και θα είναι φυσικά λάθος.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από chief » 18 Οκτ 2008 00:40

Προτού συνεχίσω με την άσκηση που ξεκίνησες να γράφεις θα ήθελα να κάνω μια ερώτηση έχω λύσει μια άλλη αλλά μου μένει να κάνω κανά δυο πράγματα.
#include <stdio.h>

int daymax;
int daymin;
int temp;
int i;
int min=17;
int max=0;
float average;
int sum=0;

main ()

{
//temp=0;
//while (temp>=0 && temp<=16)

printf("Give values of sunshine duration for the seven days of a week,\nstarting from the value for Monday.\nEach value should be an integer in the range (0..16]:\n");

for (i=1; i<8; i++)

{

printf("day_%d:",i);
scanf("%d",&temp);

if(temp>max){
max=temp;
daymax=i;

}


if(temp<min){
min=temp;
daymin=i;

}


sum+=temp;
average= (float)sum/7;

}

printf("Day with the longest sunshine = %d\n", daymax);
printf("Day with the shortest sunshine = %d\n", daymin);
printf("Average duration of sunshine = %.3f\n", average);
printf("Number of days with the shortest sunshine = %d");/
return 0;

}
όλα τρέχουν σωστά απλά δεν μπορώ να βάλω έναν περιορισμό ώστε οι τιμές που θα βάζει ο χρίστις να είναι από 0 μέχρι 16 σε περίπτωση λάθους να των ενημερώνει να ξαναβάλει την σωστή και επίσης Το πλήθος των ημερών με ηλιοφάνεια ίση με τη μικρότερη τιμή ηλιοφάνειας (το τελευταίο print). Καμία συμβουλή;

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

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από dva_dev » 18 Οκτ 2008 02:57

chief έγραψε:...ένας ακέραιος αριθμός ,διψήφιος, ο οποίος θα παρουσιάζει τις ώρες ηλιοφάνειας για κάθε μέρα της εβδομάδας...
Για να είναι διψήφιος ο ακέραιος πρέπει να είναι από 10 εώς 24.
Εκεί που διαβάζεις τους ακέραιους κάνε έναν έλεγχο και εμφάνισε ένα μήνυμα αν δεν είναι αποδεκτός. Επίσης το διάβασμα της τιμής και ο έλεγχος με το μήνυμα πρέπει να μπεί μέσα σε ένα do ... while.

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

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από chief » 18 Οκτ 2008 13:16

Για το do...while το έχω υπόψη μου και το έχω δοκιμάσει αλλά κάπου στην σύνταξη κάνω λάθος, το πιο πιθανό είναι το λάθος να γίνεται με τις αγκύλες.
Επίσεις και στην ιδέα του loop για το τελευταίο print ήμουν κοντά , αλλά ένα παράδειγμα σύγκρησεις μπορείς να μου δώσεις;

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από chief » 18 Οκτ 2008 14:20

Κάνω το παρακάτω και εκτός ότι δεν παίζει το while το πρόγραμμα δεν τελειώνει ποτέ.
main ()

{
temp=0;
do {
printf("Give values of sunshine duration for the seven days of a week,\nstarting from the value for Monday.\nEach value should be an integer in the range (0..16]:\n");
for (i=1; i<8; i++)
{
/*emfanizi tin protropi gia topothetisi tis times apo ton xristi kai tis diavazi to programma*/

printf("day_%d:",i);
scanf("%d",&temp);

/*ipologizi thn megaliteri timi*/
if(temp>max){
max=temp;
daymax=i;
}

/*ipologizi tin mikroteri timi*/
if(temp<min){
min=temp;
daymin=i;

}

/*Athrizi tis times kai dieri gia na vri ton meso oro*/
sum+=temp;
average= (float)sum/7;
}

printf("Day with the longest sunshine = %d\n", daymax);//Exagi thn megaliteri timi
printf("Day with the shortest sunshine = %d\n", daymin);//Exagi thn mikroteri timi
printf("Average duration of sunshine = %.3f\n", average);//Exagi ton meso oro se float morfi kai 3 dekadika
printf("Number of days with the shortest sunshine = %d");//Exagi to sinolo ton imeron me ligoteri iliofania.

} while (temp>=0 && temp<=16);
return 0;
}

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

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από dva_dev » 18 Οκτ 2008 16:14

Να τα πάρουμε από την αρχή.

To do-while πρέπει να εσωκλείει μόνο το σημείο που διαβάζεις την τιμή και το σημείο που τυπώνεις τι πρόκειται να εισάγει ο χρήστης. Αυτό είναι το μόνο που σε ενδιαφέρει να επαναλαμβάνεις όχι όλο το πρόγραμμα από την αρχή.
Ο έλεγχος που σε ενδιαφέρει ώστε να γίνεται επανάληψη της εισαγωγής είναι αν η τιμή που δίνει χρήστης δεν είναι αποδεκτή (όχι το ανάποδο).
Μόλις έχεις κάποια αποδεκτή τιμή την αποθηκεύεις στον πίνακα με την ηλιοφάνειες.

Για να μετρήσεις πόσες μέρες είναι που έχουν την μικρότερη ηλιοφάνεια πρέπει να έχεις μια μεταβλητή που να παίξει το ρόλο του μετρητή.
Φτιάχνεις λοιπόν ένα loop για τις μέρες της εβδομάδας και συγκρίνεις αν το min είναι ίσο με την ηλιοφάνεια της κάθε μέρας. πχ:

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

int mindays=0;
for &#40;i = 0; i < 7; i++&#41; &#123;
if &#40;min == days&#91;i&#93;&#41; mindays++;
&#125;

print &#40;"Ημέρες με λιγότερη ηλιοφάνεια&#58; %d\n", mindays&#41;;
------------ edit ------------
Επιπλέον καλό θα ήταν κάθε μεταβλητή που δηλώνεις να της δίνεις και αρχική τιμή, μην την αφήνεις στην τύχη της.

Οι ώρες ηλιοφάνειας θέλεις να είναι διψήφιος αριθμός. Οπότε το εύρος που έχεις διαλέξει είναι λάθος. Οι μόνες διψήφιες ώρες είναι 10-24.

Η main πρέπει να επιστρέφει int, δήλωσε την σαν
int main() ή ακόμα καλύτερα int main(void) αφού δεν θέλεις παραμέτρους.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από chief » 18 Οκτ 2008 18:06

Το ευρος των τιμών το τσεκάρω με ένα if αλλά δεν το σταματάει για να βάλει την σωστή τιμή.
/*Tsekari to evros timon na einai metaxi 0 kai 16*/

if (temp>16 || temp<0)

{

printf("value out of range\n");

}

Το παράδειγμα που μου έγραψες είναι για πίνακα.... μπορείς να μου το ξαναδώσεις χωρίς πίνακα;

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

Άσκηση σε C με πίνακες ελέγχους και βρόχους.

Δημοσίευση από dva_dev » 18 Οκτ 2008 19:05

Αυτό που λέω είναι ότι το εύρος τιμών που τσεκάρεις είναι λάθος. Αφού ζητάς διψήφιο νούμερο το μόνο σωστό είναι το 10..24. Από 0 εώς 9 είναι μονοψήφια νούμερα.
δεν το σταματάει για να βάλει την σωστή τιμή
Δεν το σταματάει γιατί το έχεις σε λάθος σημείο. Δεν το ελέγχεις εκεί που δίνεις την τιμή αλλά στο τέλος του προγράμματος.

Ολα μαζί (χωρίς πίνακα) θα μπορούσαν να γίνουν κάπως έτσι:

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

...
int mindays = 0;
int main&#40;&#41;
&#123;
    ...
    for &#40;i=1; i<8; i++&#41;
    &#123;
        ...
        do &#123;
            printf&#40;"day_%d&#58;", i&#41;;
            scanf&#40;"%d", &temp&#41;;
            if &#40;temp > 24 || temp < 10&#41; puts&#40;"Invalid value\nTry again "&#41;;
        &#125; while &#40;temp > 24 || temp < 10&#41;;
        ...
        if &#40;temp < min&#41; &#123;
            ...
            mindays = 0;
        &#125;

        if &#40;temp == min&#41; ++mindays;
        ...
    &#125;
    ...
    printf&#40;"Number of days with the shortest sunshine = %d", mindays&#41;;
    return 0;
&#125;

Απάντηση

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

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

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