Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Πληκτρολογουμε την λεξη και το παιχνιδι ξεκινάει ,εχουμε 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;
}

Δημοσ.

Έχω την εντύπωση πως με c standards δεν γίνεται αυτό που θες. Χρειάζεσαι είτε conio.h είτε κάτι άλλο.. ή απλά να κάνεις κάτι άλλο, να γεμίσεις την οθόνη με μπερδεμένα ώστε να μην φαίνεται η λέξη (και στην αρχή και στο τέλος). Νομίζω για κάτι απλό και γρήγορο θα ήταν εύκολο!

Δημοσ.
  Στις 4/6/2015 στις 1:46 ΜΜ, vaggos_ece είπε

Είναι για εργαστήριο οποτε θέλει 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; έχεις λάθος τύπους, αντιγράφεις δείκτη σε ακέραιο!

Δημοσ.
  Στις 4/6/2015 στις 1:36 ΜΜ, vaggos_ece είπε

Πληκτρολογουμε την λεξη και το παιχνιδι ξεκινάει ,εχουμε 10 ευκαιριες.Θελω να ρωτήσω πωσ γίνεται οταν του δώσουμε την λεξη να την σβήνει(για να μην την δεί ο παιχτης) και  για την συνθήκη που εχω στον κώδικα ετσι <----.

Μπορείς να το κάνεις όπως γίνεται με την εισαγωγή κωδικών σε διάφορα εργαλεία linux, έτσι.

Δημοσ.

Μπορείς να πειράξεις τον 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 για ένα εργαστήριο.
Δημοσ.
  Στις 4/6/2015 στις 3:29 ΜΜ, vaggos_ece είπε

δυστηχος τα περισσοτερα μου είναι άγνωστα

Ολόκληρο θα πρέπει να σου είναι άγνωστο :) γιατί δεν είναι πρότυπη C αλλά ένας τρόπος να πειράξεις τον terminal driver σε linux. Δυστυχώς σε μερικές από τις εκφωνήσεις που δίνονται σε σχολές ή πρέπει να ξεφύγεις από standard C ή πρέπει να γράψεις μια κακάσχημη και άβολη λύση της άσκησης.

Δημοσ.
  Στις 4/6/2015 στις 3:34 ΜΜ, imitheos είπε

Ολόκληρο θα πρέπει να σου είναι άγνωστο :) γιατί δεν είναι πρότυπη C αλλά ένας τρόπος να πειράξεις τον terminal driver σε linux. Δυστυχώς σε μερικές από τις εκφωνήσεις που δίνονται σε σχολές ή πρέπει να ξεφύγεις από standard C ή πρέπει να γράψεις μια κακάσχημη και άβολη λύση της άσκησης.

Συμφωνώ, απλά αν σε κάνει να ψάξεις τις εναλλακτικές πετυχαίνει τους σκοπούς της!

 

Πάνω στο θέμα, αν γενικά έχετε συγκεκριμένο λειτουργικό σύστημα που θέλετε να τρέχει υπάρχει λύση,  αν θέλετε να είναι c standard, τότε τα πράγματα δυσκολεύουν. 

Γενικά έτρεξα την υλοποίησή σου, αλλά δεν ρέει πολύ καλά η εκτέλεση.. μάλλον θέλει λίγη προσοχή παραπάνω..

Δημοσ.
  Στις 4/6/2015 στις 4:34 ΜΜ, lion2486 είπε

Γενικά έτρεξα την υλοποίησή σου, αλλά δεν ρέει πολύ καλά η εκτέλεση.. μάλλον θέλει λίγη προσοχή παραπάνω..

Τι πρόβλημα αντιμετώπισες ?

  • Like 1
Δημοσ.

    Γεια. Προσπαθώ να κάνω 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

Πως διορθώνεται;



 

Δημοσ.

To r δεν είναι ακέραια σταθερά, οπότε ο πίνακας v ορίζεται ως Variable Length Array (VLA). Τα VLA εισήχθησαν στη C99, την οποία ο compiler του Visual Studio ΔΕΝ υποστηρίζει.

 

Για να το διορθώσεις μπορείς να ορίσεις δυναμικά τον v με malloc() (αντί δλδ ως VLA).

 

  Στις 4/6/2015 στις 1:36 ΜΜ, vaggos_ece είπε

...Θελω να ρωτήσω πωσ γίνεται οταν του δώσουμε την λεξη να την σβήνει(για να μην την δεί ο παιχτης)...

Όπως ειπώθηκε ήδη, με στάνταρ 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;
}
  Αναφορά σε κείμενο

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Ο κώδικάς σου έχει λάθη. Ανέβασε το warnings level του compiler σου για να τα δεις at compile time. Προσωπικά δεν μπορώ να τον κάνω review τον κώδικα διότι δεν έχει ούτε επαρκή σχόλια ούτε ευανάγνωστες ονομασίες μεταβλητών.
Δημοσ.
  Στις 5/6/2015 στις 10:05 ΜΜ, migf1 είπε

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

Μόλις τον έκανες. :P

  • Like 1
Δημοσ.
  Στις 5/6/2015 στις 10:22 ΜΜ, gon1332 είπε

Μόλις τον έκανες. :P

Λοιπόν, δεν είχα κάτι καλύτερο να κάνω σήμερα το πρωί, οπότε είδα τον κώδικα. Τα κύρια λάθη έχουν ήδη επισημανθεί, οπότε απλά ξανάγραψα τον κώδικα πιο δομημένα και με καλύτερη διαχείριση του input,  αλλά προσπάθησα να διατηρήσω την αλγοριθμική σκέψη του vaggos_ece. Προσέθεσα όμως κι ένα buffer (c-string) για τις λανθασμένες μαντεψιές, καθώς κι ελέγχους για το αν μια μαντεψιά έχει ήδη παιχτεί.

 

Αν είναι εργασία, ελπίζω να έχω συμπεριλάβει πράγματα εκτός ύλης, ώστε να μην μπορεί να γίνει copy & paste. Επίσης, ενδέχεται να περιέχει bugs.

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

Τον ποστάρω επίσης με την ελπίδα πως μπορεί θα βοηθήσει τον vaggos_ece να βελτιώσει τον δικό του κώδικα.

 

Κώδικας (C99, Windows):

  Εμφάνιση κρυμμένου περιεχομένου

 

Δημοσ.

mig1f ευχαριστώ για την βοήθεια. Σχετικά με τον κώδικα του προγράμματος σου γίνεται compile στο vs2008sp1 αν βγάλεις τo stdbool.h και το πρόγραμμα λειτουργεί κανονικά.

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

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...