vaggos_ece Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Πληκτρολογουμε την λεξη και το παιχνιδι ξεκινάει ,εχουμε 10 ευκαιριες.Θελω να ρωτήσω πωσ γίνεται οταν του δώσουμε την λεξη να την σβήνει(για να μην την δεί ο παιχτης) και για την συνθήκη που εχω στον κώδικα ετσι <----. #include <stdio.h>#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) { int i,r,t,k,j;//i,j diktes gia vrouxouw / t,k diktes gia to an exase h kerdise / r megethos ths leksis char buffer[225],*str,*g; k=0; printf("dwse leksi"); fgets(buffer, 254, stdin); r=strlen(buffer)-1; str = malloc(r * sizeof(char)) ; strcpy(str, buffer); char v[r]; for(i=0;i<r;i++){ v='-'; } printf("%d",r); printf("grammata\n"); t=10; while(1){ printf("dwse gramma, exeis apo tis 10 eukeries alles "); printf("%d\n",t); scanf("%c\n",&g); for(i=0;i<r;i++){ if(strcmp(str,g)==0){//<-------- edo kati kano lathos v=g; printf("einai gramma,h leksi einai etsi : \n"); for(j=0;j<r;j++){ printf("%c",v[j]); } k=k+1; printf("\n"); } else if(i==(r-1)){ printf("den einai kai thimisou to\n"); t=t-1; printf("apo tis 10 eukeries exeis"); printf("%d\n",t); } } if(t==0){ printf("exases\n"); break; } if(k==r){ printf("kerdises\n"); break; } } return 0;}
lion2486 Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Έχω την εντύπωση πως με c standards δεν γίνεται αυτό που θες. Χρειάζεσαι είτε conio.h είτε κάτι άλλο.. ή απλά να κάνεις κάτι άλλο, να γεμίσεις την οθόνη με μπερδεμένα ώστε να μην φαίνεται η λέξη (και στην αρχή και στο τέλος). Νομίζω για κάτι απλό και γρήγορο θα ήταν εύκολο!
vaggos_ece Δημοσ. 4 Ιουνίου 2015 Μέλος Δημοσ. 4 Ιουνίου 2015 Είναι για εργαστήριο οποτε θέλει c, if(strcmp(str,g)==0) για αυτό ξέρεις αν κάνω κατι λαθος?
lion2486 Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Είναι για εργαστήριο οποτε θέλει c, if(strcmp(str,g)==0) για αυτό ξέρεις αν κάνω κατι λαθος? Πρόσθεσε #include <string.h> στο κομμάτι που λες δίνεις ορίσματα str --> char g --> char * Θέλει 2 char * και συγκρίνει 2 συμβολοσειρές ολόκληρες! Προτείνω: 1. κάνε το g αντί για char *, char. 2. αντί για strcmp, βάλε if( g == str ) //ισότητα χαρακτήρων Υ.Γ.: δεν διάβασα ακόμα προσεκτικά τον κώδικα και δεν το έτρεξα... Edit: στις σειρές v = g; έχεις λάθος τύπους, αντιγράφεις δείκτη σε ακέραιο!
gon1332 Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Πληκτρολογουμε την λεξη και το παιχνιδι ξεκινάει ,εχουμε 10 ευκαιριες.Θελω να ρωτήσω πωσ γίνεται οταν του δώσουμε την λεξη να την σβήνει(για να μην την δεί ο παιχτης) και για την συνθήκη που εχω στον κώδικα ετσι <----. Μπορείς να το κάνεις όπως γίνεται με την εισαγωγή κωδικών σε διάφορα εργαλεία linux, έτσι.
imitheos Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Μπορείς να πειράξεις τον terminal driver ώστε να σου επιτρέπει να δέχεσαι είσοδο χαρακτήρα-χαρακτήρα, ανάλογα όμως το λειτουργικό σου. Αν μιλάμε για *nix, μπορείς να χρησιμοποιήσεις κάτι σαν το παρακάτω: #include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> #include <ctype.h> int main(void) { int c = 0; struct termios oldt, newt; /* Sozoume tin katastasi toy termatikou oste na tin epanaferoume */ /* STDIN_FILENO einai o descriptor tou standard input. To idio * apotelesma 8a eixame kai me fileno(stdin) alla einai peritto */ tcgetattr(STDIN_FILENO, &oldt); /* Den 8etoume ainte mia timh poy na energopoiei thn raw katastasi * giati 8a phdhksei tis ypoloipes parametrous. Antigrafoyme tis * palies parametrous (h C epitrepei anathesi se domes) kai apla * apenergopoioume thn kanonikopoihmenh morfh. Yparxoun ena karo * akomi parametroi poy mporoume na thesoyme alla h ICANON einai * h elaxisti poy xreiazetai. Pekse me tis ypoloipes an thes * kati kalutero. */ newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); /* Apo edo kai pera, exoume raw katastasi kai etsi h getchar kai oles * oi paromoies sunarthseis epistrefoyn mono ena xarakthra. * Shmeioteon oti prepei emeis na xeiristoyme backspace, escape * kai loipa plhktra kai sunduasmous */ tcsetattr(STDIN_FILENO, TCSANOW, &newt); while (c != 'q') { c = getchar(); /* isprint gia na doyleuoyme mono me plhktra kai oxi backspace, * delete, ktl */ if (isprint(c)) printf("Edoses %d - %c\n", c, c); } /* Epanaferoyme tis arxikes ruthmiseis */ tcsetattr(STDIN_FILENO, TCSANOW, &oldt); return 0; } Έξοδος: % ./a.out Edoses 121 - y Edoses 116 - t Edoses 114 - r Edoses 101 - e Edoses 119 - w Edoses 113 - q Η παραπάνω λύση έχει πάρα πολλά μειονεκτήματα αλλά την έγραψα επίτηδες έτσι γιατί ήδη είναι πολύπλοκη και μη-portable για ένα εργαστήριο.
vaggos_ece Δημοσ. 4 Ιουνίου 2015 Μέλος Δημοσ. 4 Ιουνίου 2015 δυστηχος τα περισσοτερα μου είναι άγνωστα
imitheos Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 δυστηχος τα περισσοτερα μου είναι άγνωστα Ολόκληρο θα πρέπει να σου είναι άγνωστο γιατί δεν είναι πρότυπη C αλλά ένας τρόπος να πειράξεις τον terminal driver σε linux. Δυστυχώς σε μερικές από τις εκφωνήσεις που δίνονται σε σχολές ή πρέπει να ξεφύγεις από standard C ή πρέπει να γράψεις μια κακάσχημη και άβολη λύση της άσκησης.
lion2486 Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Ολόκληρο θα πρέπει να σου είναι άγνωστο γιατί δεν είναι πρότυπη C αλλά ένας τρόπος να πειράξεις τον terminal driver σε linux. Δυστυχώς σε μερικές από τις εκφωνήσεις που δίνονται σε σχολές ή πρέπει να ξεφύγεις από standard C ή πρέπει να γράψεις μια κακάσχημη και άβολη λύση της άσκησης. Συμφωνώ, απλά αν σε κάνει να ψάξεις τις εναλλακτικές πετυχαίνει τους σκοπούς της! Πάνω στο θέμα, αν γενικά έχετε συγκεκριμένο λειτουργικό σύστημα που θέλετε να τρέχει υπάρχει λύση, αν θέλετε να είναι c standard, τότε τα πράγματα δυσκολεύουν. Γενικά έτρεξα την υλοποίησή σου, αλλά δεν ρέει πολύ καλά η εκτέλεση.. μάλλον θέλει λίγη προσοχή παραπάνω..
imitheos Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Γενικά έτρεξα την υλοποίησή σου, αλλά δεν ρέει πολύ καλά η εκτέλεση.. μάλλον θέλει λίγη προσοχή παραπάνω.. Τι πρόβλημα αντιμετώπισες ? 1
cvb Δημοσ. 6 Ιουνίου 2015 Δημοσ. 6 Ιουνίου 2015 Γεια. Προσπαθώ να κάνω compile τον κώδικα του vaggos_ece στο Visual Studio 2008. Πρόσθεσα την γραμμή #include <string.h>στην αρχή με τις επικεφαλίδες και πιο κάτω άλλαξα την γραμμή με την συνάρτηση malloc σε str = (char *) malloc(r * sizeof(char));O μεταγλωττιστής μου εμφανίζει για την γραμμή char v[r];που βρίσκεται πιο κάτω error C2057: expected constant expressionΠως διορθώνεται;
migf1 Δημοσ. 6 Ιουνίου 2015 Δημοσ. 6 Ιουνίου 2015 To r δεν είναι ακέραια σταθερά, οπότε ο πίνακας v ορίζεται ως Variable Length Array (VLA). Τα VLA εισήχθησαν στη C99, την οποία ο compiler του Visual Studio ΔΕΝ υποστηρίζει. Για να το διορθώσεις μπορείς να ορίσεις δυναμικά τον v με malloc() (αντί δλδ ως VLA). ...Θελω να ρωτήσω πωσ γίνεται οταν του δώσουμε την λεξη να την σβήνει(για να μην την δεί ο παιχτης)...Όπως ειπώθηκε ήδη, με στάνταρ C δεν γίνεται. Αν είσαι σε Windows και δεν σε ενδιαφέρουν άλλες πλατφόρμες, ο πιο εύκολος τρόπος είναι με χρήση της <conio.h> (επίσης ειπώθηκε): // C99 #include <conio.h> #include <stdio.h> char *read_password( char *pass, size_t sz ) { if ( NULL == pass || sz < 1 ) { return NULL; } int c; size_t i = 0; while ( i < sz-1 && '\r' != (c=getch()) && EOF != c) { putchar( '*' ); pass[i++] = c; } fflush( stdout ); pass[i] = '\0'; return pass; } int main( void ) { char pass[BUFSIZ] = {'\0'}; if ( NULL != read_password( pass, BUFSIZ ) ) { printf( "You typed: %s\n", pass ); } return 0; } #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int i,r,t,k,j;//i,j diktes gia vrouxouw / t,k diktes gia to an exase h kerdise / r megethos ths leksis char buffer[225],*str,*g; k=0; printf("dwse leksi"); fgets(buffer, 254, stdin); r=strlen(buffer)-1; str = malloc(r * sizeof(char)) ; strcpy(str, buffer); char v[r]; for(i=0;i<r;i++){ v='-'; } printf("%d",r); printf("grammata\n"); t=10; while(1){ printf("dwse gramma, exeis apo tis 10 eukeries alles "); printf("%d\n",t); scanf("%c\n",&g); for(i=0;i<r;i++){ if(strcmp(str,g)==0){//<-------- edo kati kano lathos v=g; printf("einai gramma,h leksi einai etsi : \n"); for(j=0;j<r;j++){ printf("%c",v[j]); } k=k+1; printf("\n"); } else if(i==(r-1)){ printf("den einai kai thimisou to\n"); t=t-1; printf("apo tis 10 eukeries exeis"); printf("%d\n",t); } } if(t==0){ printf("exases\n"); break; } if(k==r){ printf("kerdises\n"); break; } } return 0; } Ο κώδικάς σου έχει λάθη. Ανέβασε το warnings level του compiler σου για να τα δεις at compile time. Προσωπικά δεν μπορώ να τον κάνω review τον κώδικα διότι δεν έχει ούτε επαρκή σχόλια ούτε ευανάγνωστες ονομασίες μεταβλητών.
gon1332 Δημοσ. 6 Ιουνίου 2015 Δημοσ. 6 Ιουνίου 2015 Προσωπικά δεν μπορώ να τον κάνω review τον κώδικα διότι δεν έχει ούτε επαρκή σχόλια ούτε ευανάγνωστες ονομασίες μεταβλητών. Μόλις τον έκανες. 1
migf1 Δημοσ. 6 Ιουνίου 2015 Δημοσ. 6 Ιουνίου 2015 Μόλις τον έκανες. Λοιπόν, δεν είχα κάτι καλύτερο να κάνω σήμερα το πρωί, οπότε είδα τον κώδικα. Τα κύρια λάθη έχουν ήδη επισημανθεί, οπότε απλά ξανάγραψα τον κώδικα πιο δομημένα και με καλύτερη διαχείριση του input, αλλά προσπάθησα να διατηρήσω την αλγοριθμική σκέψη του vaggos_ece. Προσέθεσα όμως κι ένα buffer (c-string) για τις λανθασμένες μαντεψιές, καθώς κι ελέγχους για το αν μια μαντεψιά έχει ήδη παιχτεί. Αν είναι εργασία, ελπίζω να έχω συμπεριλάβει πράγματα εκτός ύλης, ώστε να μην μπορεί να γίνει copy & paste. Επίσης, ενδέχεται να περιέχει bugs. Περισσότερο το ποστάρω για να δικαιολογήσω τι εννοούσα όταν έγραφα πως δεν μπορώ να κάνω review τον αρχικό κώδικα επειδή δεν έχει επαρκή σχόλια, ούτε ευανάγνωστες ονομασίες μεταβλητών. Τον ποστάρω επίσης με την ελπίδα πως μπορεί θα βοηθήσει τον vaggos_ece να βελτιώσει τον δικό του κώδικα. Κώδικας (C99, Windows): // C99 #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <stdbool.h> /*****************************************//** * Read up to sz-1 chars from stdin into an existing c-string s. * Flush any extra chars from stdin, and drop the terminating '\n' * if present. * Return the updated c-string on success, or NULL on error. ********************************************* */ char *read_string( char *s, size_t sz ) { if ( NULL == s || 0 == sz ) { return NULL; } int c; size_t i = 0; while ( i < sz-1 && '\n' != (c=getchar()) && EOF != c ) { s[i++] = c; } s[i] = '\0'; /* flush any extra chars from stdin */ if ( '\n' != c ) { while ( '\n' != (c=getchar()) && EOF != c ) { ; /* void */ } } return s; } /*****************************************//** * (WINDOWS ONLY) * Read up to sz-1 chars from stdin into an existing c-string * without echoing them to stdout. If chmask is a printable char, * use that for echoing to stdout during input. * Return the updated c-string on success, or NULL on error. ********************************************* */ char *read_password( char *pass, size_t sz, int chmask ) { if ( NULL == pass || 0 == sz ) { return NULL; } int c; size_t i = 0; while ( i < sz-1 && '\r' != (c=getch()) && EOF != c) { if ( !isprint(c) ) { continue; } if ( isprint(chmask) ) { putchar( chmask ); } pass[i++] = c; } fflush( stdout ); pass[i] = '\0'; return pass; } /*****************************************//** * ********************************************* */ int main( void ) { char input[BUFSIZ] = {'\0'}; /* for generic input from stdin */ int len; /* length of inputed secret word */ char inbuf[BUFSIZ] = {'\0'}; /* the secret word */ char outbuf[BUFSIZ] = {'\0'}; /* the masked secret word */ char nobuf[BUFSIZ] = {'\0'}; /* c-string holding wrong guesses */ int noidx = 0; /* count of wrong guesses (also indexer of nobuf) */ int yescount = 0; /* count of correct guesses */ int i; /* generic indexer/counter */ int turns; /* count of guesses */ /* prompt for the secret word (inbuf), repeat until it is valid */ for (; { printf( "Dwse mystikh lejh: " ); fflush( stdout ); read_password( inbuf, BUFSIZ, '-' ); putchar( '\n' ); /* populate outbuf with so many dashes as inbuf's length */ for (i=0; '\0' != inbuf[i]; i++) { outbuf[i] = '-'; } /* remember length of inputed inbuf */ len = i; /* validate inputed inbuf */ printf( "H leksi exei %d grammata\n", len ); if ( 0 == len ) { puts( "Akyrh lejh, prospathise jana\n" ); continue; } break; } /* game loop */ turns = 10; yescount = noidx = 0; for (; { printf( "\n Mystikh lejh: %s\n", outbuf ); printf( "Lathos mantepsies: %s\n", nobuf ); printf( "Exeis akoma %d eykairies\n\n", turns ); /* Prompt for a letter (input[0]). * Repeat if it is invalid, or already played. */ printf( "Dwse gramma: " ); fflush( stdout ); read_string( input, BUFSIZ ); /* invalid letter? */ if ( !isalpha(input[0]) ) { puts( "Akyro gramma, prospathise jana\n" ); continue; } /* already played letter? */ if ( strchr(nobuf, input[0]) || strchr(outbuf, input[0]) ) { puts( "To exeis pei ayto to gramma, prospathise jana\n" ); continue; } /* Search for all instances of the inputed letter inside inbuf. * If found, update yescount and copy the letter into outbuf. */ bool found = false; for (i=0; i < len; i++) { if ( input[0] == inbuf[i] ) { outbuf[i] = input[0]; yescount++; found = true; } } /* letter not found in inbuf, copy it to nobuf & continue */ if ( !found ) { printf( "To %c den yparxei sth lejh.\n", input[0] ); nobuf[ noidx++ ] = input[0]; continue; } /* * Game-loop breaking conditions */ /* winner (count of correct guesses equals length of secret word) */ if ( yescount == len ) { puts( "Kerdises" ); break; } /* loser (run out of turns) */ turns--; if ( 0 == turns ) { puts( "Exases" ); break; } } printf( "\nMystikh lejh: %s\n", inbuf ); return 0; }
cvb Δημοσ. 6 Ιουνίου 2015 Δημοσ. 6 Ιουνίου 2015 mig1f ευχαριστώ για την βοήθεια. Σχετικά με τον κώδικα του προγράμματος σου γίνεται compile στο vs2008sp1 αν βγάλεις τo stdbool.h και το πρόγραμμα λειτουργεί κανονικά.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα