02-07-2011, 13:13
|
#2
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Originariamente inviato da informatico91
Codice:
#include<stdio.h>
int main()
{
char parola_g1[] = {0}; //errore: non allochi spazio per l'array! riservati almeno 20 caratteri dichiarando "char parola_g1[20];"
int i, j, k, lunghezza_p1 = 0, uscita = 0, fine = 0, tent = 0;
char car1, car2;
printf("Giocatore 1: Inserisci la parola segreta: ");
scanf("%s", parola_g1); //qui avevi riservato soltanto un byte di spazio, non sai dove vai a scrivere in memoria!
for ( i = 0; parola_g1[i] != '\0'; i++ )
{
lunghezza_p1++; //errore: stai incrementando lunghezza_p1 ma non l'hai inizializzato a 0!
}
int posizioni[lunghezza_p1];
char parola_g2[lunghezza_p1];
for ( i = 0; i < lunghezza_p1; i++)
{
parola_g2[i] = '-';
}
printf("\nGiocatore 2: La parola che devi indovinare e' formata da %d caratteri.\nInserisci la tua parola. Hai 10 tentativi!!!\n ", lunghezza_p1);
for ( i = 0; i < 10; i++ ) // for per i tentativi massimi
{
uscita = 0;
fine = 0;
for ( j = 0; j < lunghezza_p1; j++) //Azzera gli elementi della matrice delle posizioni. Questo va fatto in modo tale che
{ // ogni volta che rientra nel ciclo più esterno si sappia la posizione delle lettere trovate
posizioni[j] = 0;
}
fflush(stdin);
printf("\nTentativo %d. Inserisci una lettera: ", i + 1);
scanf("%c", &car1);
/*Considera i casi maiuscolo e minuscolo*/
if ( car1 >= 97 )
{
car2 = car1 - 32;
}
else if ( car1 <= 90 )
{
car2 = car1 + 32;
}
/*Scorre la parola alla ricerca di caratteri uguali a quello immesso*/
for ( j = 0; j < lunghezza_p1; j++ )
{
if ( parola_g1[j] == car1 || parola_g1[j] == car2)
{
posizioni[j]++;
parola_g2[j] = car1;
}
else if ( parola_g1[j] != car1 || parola_g1[j] != car2 )
{
uscita++;
}
//printf("%d\n", uscita); //il sistema che usi è abbastanza contorto, ma cerchiamo di correggere prima gli errori, poi di ottimizzare
}
if ( uscita == lunghezza_p1 )
{
printf("La lettera digita non è stata trovata\n");
}
else
{
i--;// Il tentativo corrente sarà ancora valido
printf("La lettera '%c' e' stata trovata nella/e posizione/i: ", car1);
for ( j = 0; j < lunghezza_p1; j++ )
{
if ( posizioni[j] != 0 )
{
printf("%d, ", j + 1);
}
}
printf("\n");
for ( j = 0; j < lunghezza_p1; j++ ) //qui stampi una stringa carattere per carattere; non ti conviene aggiungerci il terminatore '\0' e stamparla direttamente come stringa?
{
printf("%c", parola_g2[j]);
}
for ( j = 0; j < lunghezza_p1; j++)
{
if ( parola_g2[j] != '-' )
{
fine++;
}
}
//printf("%d\n", uscita);
if ( fine == lunghezza_p1 )
{
printf("\nComplimenti hai indovinato la parola!!!!");
i = lunghezza_p1 + 1; //perchè? basta il break per uscire, e poi se la parola è composta da meno di 10 caratteri, con questa riga di codice fornisci tentativi infiniti al giocatore, no? Forse volevi fare i = (tentativi) + 1?
break; // questo serve per evitare che venga svolta la successiva istruzione if e non è questa istruzione a dare
// il problema dell'invio segnalazione errori
}
}
if ( i == 9 )
{
printf("Hai superato il numero massimo di tentativi per indovinare la parola. Rigioca sarai piu' fortunato!!");
}
}
printf("\nProgramma terminato");
return 0;
}
Ho fatto diversi tentativi di esecuzione e l'algoritmo sembra funzionare correttamente. *tossisce*  Succede però che qualsiasi strada prendo (o decido di indovinare la parola o di finire i tentavi) ogni volta che termina il main mi esce la solita finestrella di windows invia segnalazione errori.
Secondo voi perchè si comporta così???
|
Probabilmente per la gestione della memoria non proprio ottimale, vai a scrivere in aree non allocate, incrementi valori non inizializzati... prova ad aggiustare queste cosine, poi c'è anche l'algoritmo da rivedere.
Ultima modifica di AngeL) : 02-07-2011 alle 13:17.
|
|
|