freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [11 Μηνύματα]      Bookmarks Tags: cπίνακεςάσκησηδημιουργίαπληκτρολόγιο Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
chief


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 14 Οκτ 2008 12:51    Θέμα: Άσκηση σε C με πίνακες ελέγχους και βρόχους.
Περιγραφή θέματος: Βήμα ένα, δημιουργία πίνακα και τοποθέτηση ακεραίων στον πίνακα από το πληκτρολόγιο.
Απάντηση με παράθεση  Mark this post and the followings unread

Θα ήθελα να με βοηθήσετε (και όχι να μου λύσετε...) στην ολοκλήρωση μιας άσκησης σε 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[i]=value;
}
while( ! (val1 >=0 && val1 <=16) )//συνθήκη ώστε οι τιμές να μην είναι πάνω από 16 και μικρότερη από 1
min = val1;//Μεταβλητές για την εύρεση του μικρότερου μεγαλύτερου και του μέσου όρου.
max = val1;
sum = val1;
}


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


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


Μέλος από: 04 Αυγ 2005
Μηνύματα: 256+
Περιοχή: Katerini
View users profile Send email to user Visit posters website
ΜήνυμαΣτις: 16 Οκτ 2008 10:54    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

κώδικας:
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[i]);
   }

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

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

      mo = mo + days[i];
   }
   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);

}
chief


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 16 Οκτ 2008 12:04    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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[i]);
}


Στο παραπάνω κομμάτι του κώδικα κάνεις επανάληψη του 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[i] > max) {
max = days[i];
daymax = i + 1;
}
if (days[i] < min) {
min = days[i];
daymin = i + 1;
}

mo = mo + days[i];
}
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


Μέλος από: 04 Αυγ 2005
Μηνύματα: 256+
Περιοχή: Katerini
View users profile Send email to user Visit posters website
ΜήνυμαΣτις: 16 Οκτ 2008 22:29    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

παράθεση:
Το fflush(null) το χρησιμοποιείς για κάποιο λόγο μήπως υπάρχει κάποια παράληψη ή είναι λάθος


Το fflush "εξαναγκάζει" το πρόγραμμα να τυπώσει αμέσως τον output buffer. Για να είσαι σίγουρος ότι αυτό που θέλεις θα τυπωθεί όταν πρέπει, κοτσάρεις το fflush. Διαφορετικά υπάρχει περίπτωση να περιμένει το runtime να γεμίσει κάποιος buffer πριν τυπώσει στην οθόνη. Τώρα το γιατί χτυπάει λάθος, δεν το ξέρω, πιθανώς να πρέπει να κάνεις include την stdio.h.

παράθεση:
η intmax και η intmin την αρχικοποιείς στην πρώτη θέση του πίνακα ή της δίνεις την τιμή 0


Τις αρχικοποιώ και τις δύο στην πρώτη θέση του πίνακα και αν χρειαστεί, θα αλλάξουν.

παράθεση:
Δεύτερη απορία το mo φαντάζομαι ότι είναι ο μέσος όρος ο οποίος δεν θα έπρεπε να ήταν float;


Σωστά, αν θέλεις ΜΟ δεκαδικό θα το κάνεις float ή double.

παράθεση:
Και Τρίτη ερώτηση για ποιων λόγο μηδενίζεις τον μέσο όρο;


Ο λόγος είναι αυτός:
κώδικας:
mo = mo + days[i];

Αν δεν μηδενίσεις αρχικά το mo, τότε στην πρώτη εκτέλεση του loop, το mo δεν έχει ακόμη τιμή, οπότε θα υπολογιστεί βάσει τις τυχαίας τιμής που έχει πάρει η mo και θα είναι φυσικά λάθος.
chief


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 17 Οκτ 2008 23:40    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

#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

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 18 Οκτ 2008 01:57    Θέμα: Re: Άσκηση σε C με πίνακες ελέγχους και βρόχους.
Περιγραφή θέματος: Βήμα ένα, δημιουργία πίνακα και τοποθέτηση ακεραίων στον πίνακα από το πληκτρολόγιο.
Απάντηση με παράθεση  Mark this post and the followings unread

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


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

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


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 18 Οκτ 2008 12:16    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 18 Οκτ 2008 13:20    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Κάνω το παρακάτω και εκτός ότι δεν παίζει το 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

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 18 Οκτ 2008 15:14    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

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

κώδικας:
int mindays=0;
for (i = 0; i < 7; i++) {
if (min == days[i]) mindays++;
}

print ("Ημέρες με λιγότερη ηλιοφάνεια: %d\n", mindays);


------------ edit ------------
Επιπλέον καλό θα ήταν κάθε μεταβλητή που δηλώνεις να της δίνεις και αρχική τιμή, μην την αφήνεις στην τύχη της.

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

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


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 18 Οκτ 2008 17:06    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Το ευρος των τιμών το τσεκάρω με ένα 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

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 18 Οκτ 2008 18:05    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

Ολα μαζί (χωρίς πίνακα) θα μπορούσαν να γίνουν κάπως έτσι:
κώδικας:
...
int mindays = 0;
int main()
{
    ...
    for (i=1; i<8; i++)
    {
        ...
        do {
            printf("day_%d:", i);
            scanf("%d", &temp);
            if (temp > 24 || temp < 10) puts("Invalid value\nTry again ");
        } while (temp > 24 || temp < 10);
        ...
        if (temp < min) {
            ...
            mindays = 0;
        }

        if (temp == min) ++mindays;
        ...
    }
    ...
    printf("Number of days with the shortest sunshine = %d", mindays);
    return 0;
}
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [11 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++


Σχετικά θέματα
 Θέματα   Απ/σεις   Αποστολέας   Τελευταίο μήνυμα 
ενας κωδικας σε C που βγαζει μη αναμενομενο αποτεσμα 1 teresa92 13 Αυγ 2016 21:26
teresa92 Εμφάνιση τελευταίου μηνύματος
 
Τώρα είναι 20 Ιαν 2017 11:51 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos