Star_Light Δημοσ. 24 Ιουνίου 2012 Δημοσ. 24 Ιουνίου 2012 +1 στον Χρήστο. Διότι σε τι ακριβώς θα σε βοηθήσει πρακτικά το να μάθεις πως υλοποιείται η rand(); Συν ότι μερικά από τα links που παρέθεσες αναλύουν πιθανές υλοποιήσεις της rand(), οπότε ποιο το νόημα αφενός να μας τα παραθέτεις links που εξηγούν αυτό που ρωτάς και ταυτόχρονα να ρωτάς και μας; Παρόλα αυτά, απλά και μόνο από περιέργεια, ορίστε μια ακόμα απλοποιημένη εξήγηση πιθανής υλοποίησης: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random-numbers-with-rand/1109109#1109109 EDIT: διόρθωση του link. Το νοημα των links ειναι για οσους θα έχουν τις ιδιες αποριες ή θα ψαχνουν για την rand.
migf1 Δημοσ. 24 Ιουνίου 2012 Δημοσ. 24 Ιουνίου 2012 Το νοημα των links ειναι για οσους θα έχουν τις ιδιες αποριες ή θα ψαχνουν για την rand. Α... οπότε διευκρίνησέ το αν θέλεις, γιατί έτσι όπως είναι τώρα φέρνει περισσότερο σε τρολάρισμα.
imitheos Δημοσ. 24 Ιουνίου 2012 Δημοσ. 24 Ιουνίου 2012 Εγω δεν ψάχνω τυχαιους αριθμους εγω ηθελα να μαθω απλα πως διαλεγει η rand αριθμους απο την srand που εχει βγαλει την ακολουθια. Το νοημα των links ειναι για οσους θα έχουν τις ιδιες αποριες ή θα ψαχνουν για την rand. [ειρωνεία] Όποιος έχει απορία να δει πως δουλεύει η rand (και η οποιαδήποτε Χ συνάρτηση) μπορεί να χρησιμοποιήσει μια νέα μαγκιά που εφευρέθηκε τους τελευταίους μήνες και λέγεται "source code repository" [/ειρωνεία] > static u_long next = 1; int rand() { return (int)((next = next * 1103515245 + 12345) % ((u_long)RAND_MAX + 1)); } void srand(u_int seed) { next = seed; } Ο παραπάνω κώδικας είναι από την libc του NetBSD (link εδώ). Επίσης εδώ είναι η αντίστοιχη υλοποίηση της glibc (όπως πάντα σε γραμμική β). Αν κάποιος ενδιαφέρεται πραγματικά να δει πως υλοποιούνται διάφορες συναρτήσεις (πχ strcpy, κτλ) και δεν τρολάρει απλά για να περνάει η ώρα, μπορεί να βλέπει την υλοποίηση του NetBSD μια και πάντα είναι από τις απλούστερες και πιο ευκολονόητες υλοποιήσεις. γιατί έτσι όπως είναι τώρα φέρνει περισσότερο σε τρολάρισμα. Ενώ σε προηγούμενα μηνύματα δεν τρόλαρε ποτέ
migf1 Δημοσ. 24 Ιουνίου 2012 Δημοσ. 24 Ιουνίου 2012 ... Επίσης εδώ είναι η αντίστοιχη υλοποίηση της glibc (όπως πάντα σε γραμμική β). ...
Star_Light Δημοσ. 24 Ιουνίου 2012 Δημοσ. 24 Ιουνίου 2012 Σε αραμαικά ειναι γραμμένες αυτες οι συναρτήσεις ρε σεις?
Star_Light Δημοσ. 29 Ιουνίου 2012 Δημοσ. 29 Ιουνίου 2012 Έφτιαξα μια δικιά μου ασκησουλα με τα ζάρια και ειπα να την υλοποιησω σαν παιχνιδι. Ένα menu με 3 επιλογες... Απλο παιχνιδι , Advanced παιχνιδι + εξοδο στην 1η επιλογη αν φέρεις ιδιο αριθμο και στα 2 ζάρια νικησες και το προγραμμα εμφανιζει τις νικες... το προγραμμα επισης ρωταει το χρηστη τον αριθμο των φορων που θελει να ριξει τα ζάρια. Αν ο χρηστης επιλεξει την δευτερη επιλογη τοτε θα πρεπει να δωσει εναν μυστικο αριθμο και θα κερδισει ΑΝ ο αριθμος αυτος ερθει και στα 2 ζάρια. > #include<stdio.h> #include<stdlib.h> #include<time.h> #include<ctype.h> #define Win_S(x) (arr1[j] == arr2[j]) // Win in simple mode #define Win_A(x) arr1[j] == ( guess ) && arr2[j] == ( guess ) // Win in Advanced mode void roll_dice( int , int [], int []); void play_game( int , int [] , int []); void roll_dice_adv(int , int , int[] , int[]); int main(void) { int n , ch , guess; srand(time(NULL)); puts(" - - - - - - - - - - - - - - - - - - - - - \n"); puts(" The Game Of Craps!!! "); puts("\n1.Simple Game\n2.Advanced Game\n3.Exit\n"); puts(" - - - - - - - - - - - - - - - - - - - - - \n"); scanf("%d" ,&ch); if( ch > 2 || ch < 0) { puts("Goodbye!"); return 0; } puts("Ηow many times?"); scanf("%d", &n); int arr1[n], arr2[n]; if( n == 0 || n < 0) { puts(" Error Option "); return 0; } switch(ch) { case 1: roll_dice(n , arr1 , arr2); play_game(n, arr1 , arr2); break; case 2: puts("Give your guess: \n"); scanf("%d" , &guess); roll_dice_adv( n , guess , arr1 , arr2); break; case 3: puts("Exit\n"); break; } return 0; } //---------------------------------------------------------------------- void roll_dice( int n , int arr1[n] , int arr2[n]) { int i=0; for(; i<n; i++) { arr1[i]=rand()%6+1; arr2[i]=rand()%6+1; } for(i=0; i<n; i++) printf(" You rolled : |_%d_| |_%d_| \n" ,arr1[i] , arr2[i]); return; } //---------------------------------------------------------------------- void play_game( int n , int arr1[n] , int arr2[n]) { int j=0 , count=0; for(j=0; j<n; j++) { if(Win_S(x)) ++count; } if(count) printf(" Congratulations you have : %d Win(s) !!! " , count ); else puts("Sorry! You lost."); return; } //---------------------------------------------------------------------- void roll_dice_adv(int n , int guess , int arr1[] , int arr2[]) { int j=0 , count=0; if( guess < 0 ) return; roll_dice(n,arr1,arr2); for(; j<n; j++) { if( Win_A(x)) count++; } if(count) printf(" Congratulations you have : %d Win(s) in Advanced Mode!!! " , count ); else puts("Sorry! You lost."); return; } Ο κωδικας τρεχει μια χαρα αλλα εχω μια απορια. > #define Win_A(x) arr1[j] == ( guess ) && arr2[j] == ( guess ) εδω αν το αλλαξω σε > #define Win_A(x) arr1[j] && arr2[j] == guess δεν θα παιρνω καλα αποτελεσματα αν ο χρηστης επιλεξει Advanced game... Πχ > - - - - - - - - - - - - - - - - - - - - - | The Game Of Craps | - - - - - - - - - - - - - - - - - - - - - ****************************************** 1.Simple Game 2.Advanced Game 3.Exit ****************************************** 2 Ηow many times? 2 Give your guess: 2 You rolled : |_3_| |_3_| You rolled : |_5_| |_2_| Congratulations you have : 1 Win(s) in Advanced Mode!!! * 1.Simple Game 2.Advanced Game 3.Exit ****************************************** 2 Ηow many times? 2 Give your guess: 1 You rolled : |_2_| |_3_| You rolled : |_3_| |_3_| Congratulations you have : 2 Win(s) in Advanced Mode!!! * * * ********************************************************************/ Δεν ξερω γιατι το παθαινει αυτο ... έτρεξα και ενα απλο παραδειγμα και μου παιζει κανονικα : > #include <stdio.h> int main( void ) { int arr1[10]={1,2,3,4,5,6,7,8,9,10} , arr2[10]={1,2,3,4,5,6,7,8,9,10}; int i=0; for(; i<10; i++) if( arr1[i] && arr2[i] == i+1 ) printf(" OK "); return 0; } :/ Και τελος αν κανεις εχει καμια επισημανση για τον κωδικα να γραφτει καλυτερα σε κάποια σημεια του καλοδεχουμενη. Να ξεκαθαρισω πως δεν θελω κριτικες που έχουν να κανουν με την εισοδο σαν string με την fgets κτλπ οτιδηποτε με πινακες- συναρτησεις και ως εκει πχ. Προς το παρον του βαζω πολυ στοιχειωδη ελεγχο.
defacer Δημοσ. 29 Ιουνίου 2012 Δημοσ. 29 Ιουνίου 2012 Κριτικές σχετικά με το ότι χρησιμοποιείς macros ενώ θα έπρεπε να χρησιμοποιείς functions δέχεσαι; Ειδικά οι 2 συγκεκριμένες macros που έχεις είναι ανάθεμα. Δεν ξέρω αν φτάνει να τις σβήσεις. Ίσως χρειαστεί να κάψεις και το πληκτρολόγιο με το οποίο γράφτηκαν για να εξιλεωθείς. (δεν είναι φυσικά τυχαίο ότι σου δημιουργούν και προβλήματα)
gon1332 Δημοσ. 29 Ιουνίου 2012 Δημοσ. 29 Ιουνίου 2012 Μία άσχετη ερώτηση με τα προηγούμενα posts, αλλά ο τίτλος είναι γενικός... Αν έχω αυτό το κομμάτι κώδικα, πετάγεται run time error: Floating point exception: > ... int x, i; if(x%i == 0){ ... ...ομολογώ ότι μου φαίνεται λογικό... Αν έχω αυτό, ο compiler μου πετά error: invalid operands to binary % (have ‘float’ and ‘float’): > ... float x, i; if(x%i == 0){ ...
migf1 Δημοσ. 29 Ιουνίου 2012 Δημοσ. 29 Ιουνίου 2012 Μία άσχετη ερώτηση με τα προηγούμενα posts, αλλά ο τίτλος είναι γενικός... Αν έχω αυτό το κομμάτι κώδικα, πετάγεται run time error: Floating point exception: > ... int x, i; if(x%i == 0){ ... ...ομολογώ ότι μου φαίνεται λογικό... Λογικό είναι, αλλά ξέρεις το γιατί; (ακόμα και στον ίδιο compiler μπορεί τη μια να σου τρέχει και την άλλη να χτυπάει) Αν έχω αυτό, ο compiler μου πετά error: invalid operands to binary % (have ‘float’ and ‘float’): > ... float x, i; if(x%i == 0){ ... Κι αυτό λογικό είναι. Ο τελεστής % λειτουργεί μόνο με ακέραιους. Αν θες να κάνεις mod σε float πρέπει να χρησιμοποιήσεις συναρτήσεις (π.χ. την fmod() ). Επίσης μην συγκρίνεις απευθείας για ισότητα ή με το 0 τους float.
gon1332 Δημοσ. 29 Ιουνίου 2012 Δημοσ. 29 Ιουνίου 2012 Λογικό είναι, αλλά ξέρεις το γιατί; (ακόμα και στον ίδιο compiler μπορεί τη μια να σου τρέχει και την άλλη να χτυπάει) Η αλήθεια είναι ότι δε μπορώ να το εξηγήσω και άρα δεν έχω καταλάβει καλά το λάθος. Κι αυτό λογικό είναι. Ο τελεστής % λειτουργεί μόνο με ακέραιους. Αν θες να κάνεις mod σε float πρέπει να χρησιμοποιήσεις συναρτήσεις (π.χ. την fmod() ). Επίσης μην συγκρίνεις απευθείας για ισότητα ή με το 0 τους float. Θέλω να ελέγξω αν ο i είναι πολλαπλάσιο του x. Η πρώτη μου σκέψη ήταν ο πρώτος μου κώδικας, αλλά κάτι μου τα χαλούσε. Έχω μπερδευτεί..τώρα δεν καταλαβαίνω γιατί το πρώτο δε μου δουλεύει; Γιατί να δουλεύει κάτι τέτοιο: x%2; Αφού και το i μου integer είναι Πραγματικά έχω σκαλώσει άγρια.
migf1 Δημοσ. 29 Ιουνίου 2012 Δημοσ. 29 Ιουνίου 2012 Η αλήθεια είναι ότι δε μπορώ να το εξηγήσω και άρα δεν έχω καταλάβει καλά το λάθος. Θέλω να ελέγξω αν ο i είναι πολλαπλάσιο του x. Η πρώτη μου σκέψη ήταν ο πρώτος μου κώδικας, αλλά κάτι μου τα χαλούσε. Έχω μπερδευτεί..τώρα δεν καταλαβαίνω γιατί το πρώτο δε μου δουλεύει; Γιατί να δουλεύει κάτι τέτοιο: x%2; Αφού και το i μου integer είναι Πραγματικά έχω σκαλώσει άγρια. Ο 1ος κώδικας είναι ο σωστός (δεν χρειάζεται να μπλέξεις με float, εκτός αν το ζητάει η εκφώνηση). Το πρόβλημά σου είναι πως αφήνεις χωρίς αρχικοποίηση το i, οπότε όταν το χρησιμοποιείς στην πράξη μετά δεν έχεις ιδέα τι μπορεί να περιέχει. Αν περιέχει 0, χτυπάει διότι προφανώς διαίρεση με 0 δεν μπορεί να γίνει.
gon1332 Δημοσ. 30 Ιουνίου 2012 Δημοσ. 30 Ιουνίου 2012 Ο 1ος κώδικας είναι ο σωστός (δεν χρειάζεται να μπλέξεις με float, εκτός αν το ζητάει η εκφώνηση). Το πρόβλημά σου είναι πως αφήνεις χωρίς αρχικοποίηση το i, οπότε όταν το χρησιμοποιείς στην πράξη μετά δεν έχεις ιδέα τι μπορεί να περιέχει. Αν περιέχει 0, χτυπάει διότι προφανώς διαίρεση με 0 δεν μπορεί να γίνει. Ουπς...το i το έχω αρχικοποιημένο σε 0(η if είναι σε for loop) Εγώ φταίω που καλοκαιριάτικα καταπιάστικα με αυτά http://projecteuler.net/
migf1 Δημοσ. 30 Ιουνίου 2012 Δημοσ. 30 Ιουνίου 2012 ... Και τελος αν κανεις εχει καμια επισημανση για τον κωδικα να γραφτει καλυτερα σε κάποια σημεια του καλοδεχουμενη .... Το "καλύτερα" είναι σχετικό. Απλώς σου δίνω μια εναλλακτική υλοποίηση που δεν χρησιμοποιεί πίνακες και ελέγχει και το input (εκτός από type overflows)... > #include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define VALID_TIMES(n) ((n) > 0 ) #define VALID_GUESS(g) ((g) > 0 && (g) < 7) // ------------------------------------------------------------ char get_menu( void ) { char input[256] = {'\0'}; puts("------------------------"); puts(" The Game Of Craps"); puts("------------------------"); puts("1. Simple game"); puts("2. Advanced game"); puts("3. Exit"); puts("------------------------"); do { printf("> "); fgets( input, 256, stdin ); } while ( *input < '1' || *input > '3' ); return *input; } // ------------------------------------------------------------ int get_times( void ) { int times = 0; char input[256] = {'\0'}; do { printf("Ηow many times (no less than 1)? "); fgets( input, 256, stdin ); times = atoi( input ); } while ( !VALID_TIMES(times) ); return times; } // ------------------------------------------------------------ int get_guess( void ) { int guess = 0; char input[256] = {'\0'}; do { printf("Give your guess (1 to 12): "); fgets( input, 256, stdin ); guess = atoi( input ); } while ( !VALID_GUESS(guess) ); return guess; } //---------------------------------------------------------------------- void play( int n, bool isadvanced ) { int r1=0, r2=0, wins = 0; int guess = isadvanced ? get_guess() : 0; while ( n-- ) { printf( "You rolled: %2d, %2d", r1=rand()%6+1, r2=rand()%6+1 ); if ( (isadvanced && r1 == guess && r2 == guess) || ( !isadvanced && r1 == r2 ) ){ puts( " -- WIN --" ); wins++; } else putchar('\n'); } if ( !wins ) puts( "Sorry, you lost." ); else printf( "You made %d wins\n", wins ); return; } // ------------------------------------------------------------ int main( void ) { char ch = '\0'; srand( time(NULL) ); if ( '3' != (ch=get_menu()) ) play( get_times(), '2' == ch ); return 0; } EDIT: Και μια εκδοχή πιο συμπαγής και πιο ευέλικτη ως προς το resuablity του input (ενδεχομένως εις βάρος του readability, αν και πιστεύω πως το prompt ως 1ο όρισμα παίζει έως ένα βαθμό και τον ρόλο σχολίου ) > #include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> // ------------------------------------------------------------ char get_bounded_char( const char *prompt, char lo, char hi ) { char input[256] = {'\0'}; // swap limits if necessary if (lo > hi ) { char temp = lo; lo = hi; hi = temp; } // demand in bounds do { if ( prompt ) printf( prompt ); fgets( input, 256, stdin ); } while ( *input < lo || *input > hi ); return *input; } // ------------------------------------------------------------ int get_bounded_int( const char *prompt, int lo, int hi ) { int ret = 0; char input[256] = {'\0'}; // swap limits if necessary if (lo > hi ) { int temp = lo; lo = hi; hi = temp; } // demand in bounds do { if ( prompt ) printf( prompt ); fgets( input, 256, stdin ); ret = atoi( input ); } while ( ret < lo || ret > hi ); return ret; } // ------------------------------------------------------------ char get_menu( void ) { puts("------------------------"); puts(" The Game Of Craps"); puts("------------------------"); puts("1. Simple game"); puts("2. Advanced game"); puts("3. Exit"); puts("------------------------"); return get_bounded_char( "> ", '1','3' ); } //---------------------------------------------------------------------- void play( int n, bool isadvanced ) { int r1=0, r2=0, wins = 0; int guess = isadvanced ? get_bounded_int( "Give your guess (1 to 6): ", 1,6 ) : 0; while ( n-- ) { printf( "You rolled: %2d, %2d", r1=rand()%6+1, r2=rand()%6+1 ); if ( (isadvanced && r1 == guess && r2 == guess) || ( !isadvanced && r1 == r2 ) ){ puts( " -- WIN --" ); wins++; } else putchar('\n'); } if ( !wins ) puts( "Sorry, you lost." ); else printf( "You made %d wins\n", wins ); return; } // ------------------------------------------------------------ int main( void ) { char ch = '\0'; srand( time(NULL) ); if ( '3' != (ch=get_menu()) ) play( get_bounded_int( "Ηow many times (1-100)? ", 1,100 ), '2' == ch ); return 0; }
Star_Light Δημοσ. 30 Ιουνίου 2012 Δημοσ. 30 Ιουνίου 2012 Καλημέρα παιδιά. mIGF1 ευχαριστω για τον κωδικα που δινεις.... ωραιος ειναι αλλα βλεπω βαζεις και συναρτησεις για να παιρνει την εισοδο??? γιατι? για να μην παραφουσκωνεις την main? ή για να μην βάζεις πολλα ορισματα σε συναρτησεις ? σε μια περασα μεχρι και 4 Επισης βλεπω οτι μεσα στο if τον && τον χειριζεσαι ακριβως οπως και εγω..... @defacer κοιτα το προβλημα δεν βρισκεται στις MACROS αλλα βρισκοταν στον && οπως λεω... σου φαινονται πολυ ασχημες ετσι οπως τις εχω γραψει? Γιατι? Γραψε τη δικη σου εκδοχη . Παντως και ετσι οπως ειναι τα macros οι κωδικας δουλευει μια χαρα... παρτον και δοκιμασε τον.
Προτεινόμενες αναρτήσεις