Programma non funzionante

di il
5 risposte

Programma non funzionante

Ho scritto un programma che dovrebbe simulare il famoso gioco "Paroliamo". In questo programma vengono estratte 10 lettere, 4 vocali e 6 consonanti, e due giocatori devono inserire 2 parole (di massimo 10 lettere appunto). Le parole devono essere valide da 2 punti di vista: per prima cosa devono essere composte dalle lettere fornite; per seconda cosa devono appartenere al vocabolario. Ho messo nella stessa cartella del file .c un file .h dove includo un vocabolario, contenente tutte (o comunque quasi) le parole. Il problema però arriva quando confronto le parole inserite in input con quelle contenute nel vocabolario. Sapreste aiutarmi? Devo consegnare il lavoro domani, e non so proprio come fare.
PS: So che non è ottimo dal punto di vista dell'efficienza, ma l'importante è che funzioni.
Gli errori che mi da sono questi:
In function 'main':
[Warning] passing argument 2 of 'strcmp' from incompatible pointer type
In file included from C:\Desktop\PROGETTO INFORMATICA\PROGETTO INFORMATICA.c
[Note] expected 'const char *' but argument is of type 'const char **'
[Warning] passing argument 2 of 'strcmp' from incompatible pointer type
In file included from C:\Desktop\PROGETTO INFORMATICA\PROGETTO INFORMATICA.c
[Note] expected 'const char *' but argument is of type 'const char **'
[#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<time.h>
#include<stdbool.h>
#include "vocabolario.h"
int isvowel(char c)
{    
    
    return c =='a' || c=='i' || c=='e' || c=='o' || c=='u';
}

int isconsonant(char c)
{
	return (isalpha (c)) && (0x7df7ddd>>(c&0x1f))&1;
}

int main()
{
	srand(time(NULL));
	int i=0, j=0, l=0, m=10, l1=0, l2=0;
	unsigned k=0;
	char str[100+1];
	char strcopy[100+1];
	char str1[100+1];	
	char str2[100+1];
	char x;
	bool o=true, p=true, q=false, r=false;
//	------------------------------------------------------------------------------- ESTRAZIONE LETTERE -------------------
	for(i=0; i<4; i++)
	{
	    x=(rand()%(26)+1)-1+'a';
	    if(isvowel(x))
		{
	    	str[i]=x;
			printf("%c ",str[i]);	
		}
		else if (isconsonant(x))
		{
			i--;
		} 
		x=0;
    }
	
    for(i=4; i<10; i++)	
	{
	    x=(rand()%(26)+1)-1+'a';
	    if(isconsonant(x))
		{
	    	str[i]=x;
			printf("%c ",str[i]);
	    }
	    else if (isvowel(x))
	    {
	    	i--;
		}
		x=0;
    }	
	printf("\n");
	//	------------------------------------------------------------------------------- VERIFICA VALIDITÀ PRIMA STRINGA ----------
	for(i=0; i<10; i++)
	{
		strcopy[i]=str[i];
	}
	printf("Parola giocatore 1: \n");
	fgets(str1, sizeof(str1), stdin);
	i=0; m=10; l=0;
	l1=strlen(str1)-1;
	for(k=0; strlen(str1)-1>k; k++)
	{
		j=k;
    	if(str1[k]!=strcopy[i])
    	{
    		l++;
    		j--;
    	}
    	else if(str1[k]==strcopy[i])
    	{
    		for(i=i+1; i<m; ++i)
    		{
    			strcopy[i-1]=strcopy[i];
			}
			l=0;
			m--;
		}
		if(l>m)
		{
			printf("La parola contiene lettere non disponibili \n");
			o=false;
			break;
		}
		k=j;
		i=l;
	}
//	------------------------------------------------------------------------------- VERIFICA VALIDITÀ SECONDA STRINGA ---------
	for(i=0; i<10; i++)
	{
		strcopy[i]=str[i];
	}
	printf("Parola giocatore 2: \n");
	fgets(str2, sizeof(str2), stdin);
	i=0; j=0; k=0; l=0, m=10;
	l2=strlen(str2)-1;
	for(k=0; strlen(str2)-1>k; k++)
	{
		j=k;
    	if(str2[k]!=strcopy[i])
    	{
    		l++;
    		j--;
    	}
    	else if(str2[k]==strcopy[i])
    	{
    		for(i=i+1; i<m; ++i)
    		{
    			strcopy[i-1]=strcopy[i];
			}
			l=0;
			m--;
		}
		if(l>m)
		{
			printf("La parola contiene lettere non disponibili \n");
			p=false;
			break;
		}
		k=j;
		i=l;
	}
	printf("\n");
//	------------------------------------------------------------------------------- VERIFICA ESISTENZA PRIMA STRINGA -----------
	if(strcmp(str1, Vocabolario) && o==true)
	{
		printf("La parola del giocatore 1 e' valida ed e' lunga %i lettere \n\n", l1);
		q=true;
	}
	else
	{
		printf("La parola del giocatore 1 e' sbagliata \n\n");
	}
//	------------------------------------------------------------------------------- VERIFICA ESISTENZA SECONDA STRINGA ---------	
	if(strcmp(str1, Vocabolario) && p==true)
	{
		printf("La parola del giocatore 2 e' valida ed e' lunga %i lettere \n\n", l2);
		r=true;
	}
	else
	{
		printf("La parola del giocatore 2 e' sbagliata \n\n");
	}
//	------------------------------------------------------------------------------- DETERMINAZIONE VITTORIA ---------
	if (o==true && p==true && q==true && r==true)
	{
		if(l1>l2)
		{
    	    printf("Il giocatore 1 vince");
    	}
    	else if(l1<l2)
    	{
    	    printf("Il giocatore 2 vince");
    	}
    	else
    	{
    	    printf("Le due parole hanno la stessa lunghezza. Parita'!");
    	}
	}
	else if ((o==true && q==true) && (p==false || r==false))
	{
		printf("La parola del giocatore 2 non e' valida. Vince il giocatore 1!");
	}
	else if ((p==true && r==true) && (o==false || q==false))
	{
		printf("La parola del giocatore 1 non e' valida. Vince il giocatore 1!");
	}
	
	return 0;
}]

5 Risposte

  • Re: Programma non funzionante

    Ma cosa è Vocabolario?

    La strcmp sia attende due puntatori a char
  • Re: Programma non funzionante

    È una stringa contenente tutte le parole del vocabolario.
    #ifndef VOCABOLARIO_H
    #define VOCABOLARIO_H
    const char *Vocabolario[] = {"a", "abate", "abati", ... , "zuppe", "zuppiera", "zuzzurellone", };
    #endif
  • Re: Programma non funzionante

    No non è una stringa ma un vettore di stringhe e c'è differenza. La strcmp confronta una stringa con un'altra stringa... dovrai usare un ciclo per comparare tutte le stringhe.

    Rivedi l'argomento stringhe del C
  • Re: Programma non funzionante

    oregon ha scritto:


    No non è una stringa ma un vettore di stringhe e c'è differenza. La strcmp confronta una stringa con un'altra stringa... dovrai usare un ciclo per comparare tutte le stringhe.

    Rivedi l'argomento stringhe del C
    Ho capito, grazie mille. Ho cambiato il programma ma continua a non andare... Non mi da né errori né warnings.
    [#include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<string.h>
    #include<time.h>
    #include<stdbool.h>
    #include<windows.h>
    #include "vocabolario.h"
    
    
    
    enum { BLACK=0, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY,
            DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE, };
    static short __BACKGROUND = 0;
    static short __FOREGROUND = 0;
    void textbackground(short color) {
    	__BACKGROUND = color;
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(hOut, __FOREGROUND + (color << 4));
    }
    
    
    
    void textcolor(short color) {
    	__FOREGROUND = color;
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(hOut, color + (__BACKGROUND << 4));
    }
    
    
    
    void gotoxy(short c, short r) {
    	if (c>0 && r>0) {
    		COORD CursorPosition = { c-1, r-1 };
    		HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    		SetConsoleCursorPosition(hOut, CursorPosition);
    	}
    }
    
    
    
    int isvowel(char c)
    {    
        
        return c =='a' || c=='i' || c=='e' || c=='o' || c=='u';
    }
    
    
    
    int isconsonant(char c)
    {
    	return (isalpha (c)) && (0x7df7ddd>>(c&0x1f))&1;
    }
    
    
    
    int main()
    {
    	srand(time(NULL));
    	int i=0, j=0, l=0, m=10, l1=0, l2=0;
    	unsigned k=0;
    	char str[100+1];
    	char strcopy[100+1];
    	char str1[100+1];	
    	char str2[100+1];
    	char x;
    	bool o=true, p=true, q=false, r=false;
    	textcolor(LIGHTCYAN);
    	printf("PAROLIAMO\nLEONARDO PENTUCCI\nTOMMASO RATTINI\nINIZIA IL GIOCO!\n");
    	
    //	------------------------------------------------------------------------------- ESTRAZIONE LETTERE -------------------
    	for(i=0; i<4; i++)
    	{
    	    x=(rand()%(26)+1)-1+'a';
    	    if(isvowel(x))
    		{
    	    	str[i]=x;
    	    	
    	    	textcolor(LIGHTMAGENTA);
    			printf("%c ",str[i]);	
    		}
    		else if (isconsonant(x))
    		{
    			i--;
    		} 
    		x=0;
        }
    	
        for(i=4; i<10; i++)	
    	{
    	    x=(rand()%(26)+1)-1+'a';
    	    if(isconsonant(x))
    		{
    	    	str[i]=x;
    	    	
    	    	textcolor(LIGHTMAGENTA);
    			printf("%c ",str[i]);
    	    }
    	    else if (isvowel(x))
    	    {
    	    	i--;
    		}
    		x=0;
        }	
    	printf("\n");
    	//	------------------------------------------------------------------------------- VERIFICA VALIDITÀ PRIMA STRINGA ----------
    	for(i=0; i<10; i++)
    	{
    		strcopy[i]=str[i];
    	}
    
    	textcolor(YELLOW);
    	printf("Parola giocatore 1: \n");
    	textbackground(BLACK);
    	textcolor(LIGHTGREEN);
    	fgets(str1, sizeof(str1), stdin);
    	i=0; m=10; l=0;
    	l1=strlen(str1)-1;
    	for(k=0; strlen(str1)-1>k; k++)
    	{
    		j=k;
        	if(str1[k]!=strcopy[i])
        	{
        		l++;
        		j--;
        	}
        	else if(str1[k]==strcopy[i])
        	{
        		for(i=i+1; i<m; ++i)
        		{
        			strcopy[i-1]=strcopy[i];
    			}
    			l=0;
    			m--;
    		}
    		if(l>m)
    		{
    		    textcolor(RED);
    			printf("La parola contiene lettere non disponibili \n");
    			o=false;
    			break;
    		}
    		k=j;
    		i=l;
    	}
    //	------------------------------------------------------------------------------- VERIFICA VALIDITÀ SECONDA STRINGA ---------
    	for(i=0; i<10; i++)
    	{
    		strcopy[i]=str[i];
    	}
    
    	textcolor(YELLOW);
    	printf("Parola giocatore 2: \n");
    	textbackground(BLACK);
    	textcolor(LIGHTGREEN);
    	fgets(str2, sizeof(str2), stdin);
    	i=0; j=0; k=0; l=0, m=10;
    	l2=strlen(str2)-1;
    	for(k=0; strlen(str2)-1>k; k++)
    	{
    		j=k;
        	if(str2[k]!=strcopy[i])
        	{
        		l++;
        		j--;
        	}
        	else if(str2[k]==strcopy[i])
        	{
        		for(i=i+1; i<m; ++i)
        		{
        			strcopy[i-1]=strcopy[i];
    			}
    			l=0;
    			m--;
    		}
    		if(l>m)
    		{
    			textcolor(RED);
    			printf("La parola contiene lettere non disponibili \n");
    			p=false;
    			break;
    		}
    		k=j;
    		i=l;
    	}
    	printf("\n");
    //	------------------------------------------------------------------------------- VERIFICA ESISTENZA PRIMA STRINGA -----------
    	for(size_t a=0; a<sizeof(Vocabolario); ++a)
    	{
    		if(strcmp(str1, Vocabolario[a])==0)
    		{
    			q=true;
    			break;
    		}
    	}
    	if(q==true && p==true)
    	{
    		textcolor(LIGHTBLUE);
    		printf("La parola del giocatore 1 e' valida ed e' lunga %i lettere \n\n", l1);
    	}
    	else
    	{
    		textcolor(RED);
    		printf("La parola del giocatore 1 e' sbagliata \n\n");
    	}
    //	------------------------------------------------------------------------------- VERIFICA ESISTENZA SECONDA STRINGA ---------
    	for(size_t b=0; b<sizeof(Vocabolario); ++b)
    	{
    		if(strcmp(str2, Vocabolario[b])==0)
    		{
    			r=true;
    			break;
    		}
    	}
    	if(r==true && p==true)
    	{
    		textcolor(LIGHTBLUE);
    		printf("La parola del giocatore 2 e' valida ed e' lunga %i lettere \n\n", l2);
    		r=true;
    	}
    	else
    	{
    		textcolor(RED);
    		printf("La parola del giocatore 2 e' sbagliata \n\n");
    	}
    //	------------------------------------------------------------------------------- DETERMINAZIONE VITTORIA ---------
    	if (o==true && p==true && q==true && r==true)
    	{
    		if(l1>l2)
    		{
    			textcolor(LIGHTGREEN);
        	    printf("Il giocatore 1 vince");
        	}
        	else if(l1<l2)
        	{
        		textcolor(LIGHTGREEN);
        	    printf("Il giocatore 2 vince");
        	}
        	else
        	{
        		textcolor(RED);
        	    printf("Le due parole hanno la stessa lunghezza. Parita'!");
        	}
    	}
    	else if ((o==true && q==true) && (p==false || r==false))
    	{
    		printf("La parola del giocatore 2 non e' valida. Vince il giocatore 1!");
    	}
    	else if ((p==true && r==true) && (o==false || q==false))
    	{
    		printf("La parola del giocatore 1 non e' valida. Vince il giocatore 2!");
    	}
    	
    	return 0;
    }]
  • Re: Programma non funzionante

    Due considerazioni. L'operatore sizeof in

    sizeof(Vocabolario)

    non ti restituisce il numero di stringhe presenti ma il numero di byte da cui è fatto il vettore.
    Essendo degli elementi di tipo puntatore a char (il quale è grande 4 byte), ad esempio, per 6 stringhe restituirà 24.
    Quindi, per ottenere l'effettivo numero di stringhe e non sforare devi scrivere

    sizeof(Vocabolario)/sizeof(char *)

    In secondo luogo, la funzione

    fgets

    che utilizzi per l'input della stringhe, aggiunge alla fine della stringa il carattere \n quindi, se scrivi ciao nella stringa avrai

    "ciao\n"

    e devi tenerne conto perché i confronti successivi con la strcmp falliranno tutti. Devi quindi eliminare l'ultimo carattere nella stringa dopo l'input.

    Sono tutte informazioni che trovi nella documentazione, che va studiata, prima di scrivere codice.

    Fatte queste correzioni comunque, non ho idea di cosa hai fatto nel codice e quindi non so se l'algoritmo che hai adottato ha un senso.
Devi accedere o registrarti per scrivere nel forum
5 risposte