lockgun Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 Καλησπερα σε ολους.Η εκφωνηση λεει:Αναπτύξτε ένα πρόγραμμα που θα κάνει προσομοίωση την ρίψη ενός ζαριού, δηλαδή την παραγωγή τυχαίων ακέραιων αριθμών 1,2,3,4,5,6. Το πρόγραμμα να αποθηκεύει 1000 τέτοιους τυχαίους αριθμούς σε πίνακα. Ακολούθως, να καταμετρά τους αριθμούς με την ίδια τιμή (6 αποτελέσματα) και να εκτυπώνει τα αποτελέσματα. Ειμαι αρχαριος και γι αυτο ζηταω τη βοηθεια σας.Εχω φτασει σε αυτο το σημειο: #include <stdio.h>#include <stdlib.h>#include <time.h>int main(){ int pinakas[1000],pinakas2[6]; int ar,i; srand(time(NULL)); for(i=0;i<1000;i++) { pinakas=rand()%6+1; } for(ar=1;ar<=6;ar++) { for(i=0;i<1000;i++) { if(pinakas==ar) { pinakas2[ar]++; } } printf("o arithmos %d irthe %d fores\n",ar,pinakas2[ar]); } } Κατι δε κανω σωστα η εχω παραληψει κατι..Αν μπορει καποιος να με βοηθησει θα το εκτιμουσα πολυ.Ευχαριστω εκ των προτερων.
Drosatos Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 Απλα η θεση pinakas2[0] θα εχει μια τυχαια τιμη. Βαλτου την τιμη 0, και νομιζω εισαι σωστος Update: Απο οτι ειδα δεν εχεις βαλεια ρχικες τιμες σε ολο τον πινακα pinakas2. Στην C δεν παιρνουν αρχικη τιμη 0 απο μονοι τους. Χρειαζεσαι μια for απο πανω που να κανει pinakas2 = 0 για i=0 εως 5
lockgun Δημοσ. 30 Μαρτίου 2014 Μέλος Δημοσ. 30 Μαρτίου 2014 Ουσιαστικα αυτο που ζηταει η ασκηση ειναι να εμφανιζει το ποσες φορες ηρθε η καθε ζαρια δηλαδη ο καθε αριθμος. πχ. ο αριθμος 1 ηρθε 200 φορες οαριθμος 2 ηρθε 300 φορες ο αριθμος 3 ηρθε 50 φορες κλπ..
gon1332 Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int pinakas[1000],pinakas2[6]; int ar,i; srand(time(NULL)); for(i=0;i<1000;i++) { pinakas[i]=rand()%6+1; } for(ar=1;ar<=6;ar++) { for(i=0;i<1000;i++) { if(pinakas[i]==ar) { pinakas2[ar]++; } } printf("o arithmos %d irthe %d fores\n",ar,pinakas2[ar]); } } Ένα λάθος που βλέπω είναι ότι προσπελαύνεις τον pinakas2 σε θέση που δε σου ανήκει. Φταίει η δεικτοδότησή του με το ar, το οποίο αρχικοποιείς με 1 (δεν λαμβάνεις υπόψιν σου το πρώτο στοιχείο του πίνακα) και καταλήγει σε 6 που είναι έξω από τα όρια του πίνακα. Θα ήθελες κάτι τέτοιο: for(ar=0;ar<6;ar++) { for(i=0;i<1000;i++) { if(pinakas[i]==ar+1) { pinakas2[ar]++; } } printf("o arithmos %d irthe %d fores\n",ar+1,pinakas2[ar]); } Επίσης καλό είναι να ελέγχεις την όλη λειτουργικότητα. Αυτό που έκανες ήταν και λογικό λάθος. Πρόσθεσε αυτόν τον κώδικα στο τέλος για να ελέγχεις ότι όλα πάνε καλά (παίζεις με "μεγάλα νούμερα" και την τυχαιότητα): sum=0; for(i=0; i<6; i++) { sum += pinakas2[i]; } printf("sum = %d\n", sum); Αν το αποτέλεσμα είναι διάφορο του 1000 έχεις πρόβλημα. Γιατί; Για δοκίμασε αυτά και πες μου τι σου εμφανίζει. Δεν το ανέφερες αυτό στην αρχή.
lockgun Δημοσ. 30 Μαρτίου 2014 Μέλος Δημοσ. 30 Μαρτίου 2014 Δηλαδη εαν τον δηλωσω απ την αρχη με τιμες ειναι το ιδιο? δλδ αμα κανω: int pinakas2[6]={0,0,0,0,0,0};
gon1332 Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 Δηλαδη εαν τον δηλωσω απ την αρχη με τιμες ειναι το ιδιο? δλδ αμα κανω: int pinakas2[6]={0,0,0,0,0,0}; Αυτό που λες είναι το καλύτερο. Να τον αρχικοποιήσεις με 0 από την αρχή. Εδώ ο ts τον αρχικοποιεί μέσα στo βασικό του loop κατευθείαν με τιμές. Είναι ριψοκίνδυνο και είδες ότι την πάτησε. Πρέπει να είναι σίγουρος κάποιος ότι αρχικοποιούνται τα πάντα όπως θέλει, ειδικά ότι βάζουμε και τον παράγοντα τύχη στην εφαρμογή μας. Για τον παράγοντα τύχη, καλό είναι όσο αναπτύσσουμε το πρόγραμμά μας να χρησιμοποιούμε ένα συγκεκριμένο seed πχ 200. Έτσι παράγονται τυχαίοι αριθμοί σύμφωνα με αυτό και αυτοί οι τυχαίοι αριθμοί είναι ίδιο σε κάθε εκτέλεση, οπότε καταλαβαίνεις πόσο πολύ βοηθάει το debugging. @ts Btw, έτρεξες gdb;
lockgun Δημοσ. 30 Μαρτίου 2014 Μέλος Δημοσ. 30 Μαρτίου 2014 δεν κατάλαβα το sum τι δουλειά κάνει?Το έβαλα και βγάζει 5128 σταθερά όσες φορές και αν τρέξω το πρόγραμμα.Το πρόγραμμα παρ όλα αυτά δουλεύει κανονικά.Ευχαριστώ πολύ για τη βοήθεια!
gon1332 Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 δεν κατάλαβα το sum τι δουλειά κάνει?Το έβαλα και βγάζει 5128 σταθερά όσες φορές και αν τρέξω το πρόγραμμα.Το πρόγραμμα παρ όλα αυτά δουλεύει κανονικά.Ευχαριστώ πολύ για τη βοήθεια! O pinakas έχει 1000 θέσεις. Η κάθε θέση περιέχει έναν αριθμό από 1 μέχρι και 6. Ο pinakas αποτελεί το δείγμα σου. Ο pinakas2 έχει 6 θέσεις, οι οποίες αναπαριστούν τη συχνότητα εμφάνισης των αριθμών 1 έως 6 στο δείγμα σου κατ' αντιστοιχίαν με τις θέσεις του pinakas2 (αριθμός 1 στη pinakas2[0], αριθμός 2 στη pinakas2[1] κοκ). Έστω ότι ο pinakas2 καταλήγει κάπως έτσι: pinakas[0] = x pinakas[1] = y pinakas[2] = z pinakas[3] = k pinakas[4] = l pinakas[5] = m Εσύ δε θα περίμενες x + y + z + k + l + m = 1000 όσο δηλαδή το μέγεθος του δείγματός σου; Αυτό συμβαίνει γιατί ένας αριθμός πχ ο 1 δε μπορεί να μετρηθεί και στο pinakas2[0] και στο pinakas2[1]. Τρέξε το πρόγραμμα στο χαρτί για ένα μικρό μέγεθος δείγματος και θα δεις πως δουλεύει (μαθηματικά γενικής κατεύθυνσης γ' λυκείου).
Star_Light Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 Δηλαδη εαν τον δηλωσω απ την αρχη με τιμες ειναι το ιδιο? δλδ αμα κανω: int pinakas2[6]={0,0,0,0,0,0}; Aυτο ειναι περιττό. Το int pinakas2[6] = {0}; αρκεί αν θυμαμαι κλά. Αρχικοποιεί με την μια ολα τα στοιχεια του πίνακα στο 0. 1
lockgun Δημοσ. 30 Μαρτίου 2014 Μέλος Δημοσ. 30 Μαρτίου 2014 οκ καταλαβα gon1332.Ευχαριστω πολυ για τη βοηθεια!Το προγραμμα τρεχει σωστα. Εχω και ενα αλλο προβλημα το οποιο χρειαζομαι βοηθεια.μου ζητηθηκε να εξηγησω τι ακριβως κανει το παρακατω προγραμμα. #include <stdio.h> int main() { float A[16]={ 2.5, 4.5, 6.5, 8.5, 10.5, 12.5, 14.5, 13.5, 11.5, 9.5, 7.5, 5.5, 3.5, 1.5, 2.7, 4.7 }; int i,j; for (i=0; i<16; i++) { printf("%.2f ",A); } printf("\n"); for (i=12; i<16; i++) { for (j=10; j<14; j++) { if ( i+j<16 ) { printf("%.2f ",A[i+j]); } else if ( i-j>0) { printf("%.2f ",A[i-j]); } } } printf("\n"); return 0; } Βλέπω πως στην πρώτη γραμμή εμφανίζει απλά τις τιμές που έχει δώσει στον πίνακα Α[16]. Μετά όμως δε μπορώ να καταλάβω πως προκύπτουν αυτά τα αποτελέσματα. (Για να καταλάβετε,αυτές τις ασκήσεις μας τις βάζουν με σκοπό να ψάξουμε μόνοι μας και να βρούμε τη λύση.Δεν έχουμε διδαχτεί ποτέ C.)
Star_Light Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 Η πρωτη for εκτυπώνει τα στοιχεια ενος floating-point πινακα δεδομένων. Φτιάξε καλύτερα την μορφοποιήση βάλε τον κώδικα μέσα σε ετικέτες code ... /code με αγκύλες [] γυρω απο τα code ωστε να ειναι πιο ευαναγνωστος.
gon1332 Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 (Για να καταλάβετε,αυτές τις ασκήσεις μας τις βάζουν με σκοπό να ψάξουμε μόνοι μας και να βρούμε τη λύση.Δεν έχουμε διδαχτεί ποτέ C.) Μορφοποίησε τον κώδικα όπως είπε ο/η Star_Light και πες μας τι καταλαβαίνεις από αυτό. Τότε μπορούμε να σε κατευθύνουμε.
lockgun Δημοσ. 30 Μαρτίου 2014 Μέλος Δημοσ. 30 Μαρτίου 2014 #include <stdio.h>int main(){ float A[16]={ 2.5, 4.5, 6.5, 8.5,10.5, 12.5, 14.5, 13.5,11.5, 9.5, 7.5, 5.5, 3.5, 1.5, 2.7, 4.7 }; int i,j; for (i=0; i<16; i++) { printf("%.2f ",A); } printf("\n"); for (i=12; i<16; i++) { for (j=10; j<14; j++) { if ( i+j<16 ) { printf("%.2f ",A[i+j]); } else if ( i-j>0) { printf("%.2f ",A[i-j]); } } } printf("\n"); return 0;}
gon1332 Δημοσ. 30 Μαρτίου 2014 Δημοσ. 30 Μαρτίου 2014 #include <stdio.h> int main() { float A[16]={ 2.5, 4.5, 6.5, 8.5,10.5, 12.5, 14.5, 13.5,11.5, 9.5, 7.5, 5.5, 3.5, 1.5, 2.7, 4.7 }; int i,j; for (i=0; i<16; i++) { printf("%.2f ",A); } printf("\n"); for (i=12; i<16; i++) { for (j=10; j<14; j++) { if ( i+j<16 ) { printf("%.2f ",A[i+j]); } else if ( i-j>0) { printf("%.2f ",A[i-j]); } } } printf("\n"); return 0; } πριν το πρώτο #include, γράψε [ code] και στο τέλος του κώδικα γράψε [/ code] (με τις αγκύλες όλα αυτά και χωρίς κενά μέσα)
lockgun Δημοσ. 30 Μαρτίου 2014 Μέλος Δημοσ. 30 Μαρτίου 2014 Δεν μπορώ να καταλάβω τη σχέση του for με τις τιμές που επιστρέφει η printf.Δηλαδή αρχικοποιεί το i σε 12 και το j σε 10.Στο if που έχει βάλει απο κάτω ελέγχει αν το i+j ειναι μικροτερο του 16.Οταν κάνει τον έλεγχο το i και το j έχουν ήδη πάρει τιμές του πίνακα ή απλά ισχύουν οι αρχικές τίμες που τους έδωσε δλδ 12 και 10? #include <stdio.h> int main() { float A[16]={ 2.5, 4.5, 6.5, 8.5,10.5, 12.5, 14.5, 13.5,11.5, 9.5, 7.5, 5.5, 3.5, 1.5, 2.7, 4.7 }; int i,j; for (i=0; i<16; i++) { printf("%.2f ",A[i]); } printf("\n"); for (i=12; i<16; i++) { for (j=10; j<14; j++) { if ( i+j<16 ) { printf("%.2f ",A[i+j]); } else if ( i-j>0) { printf("%.2f ",A[i-j]); } } } printf("\n"); return 0; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα