View Full Version : [C++]problema scolastico "automa riconoscitore del linguaggio"
karlo1993a
16-11-2011, 21:15
ho scritto tutto il programma ma purtroppo alla fine mi da un errore a cui non riesco a venirne a capo vi scrivo il codice spero che qualcuno più esperto di me riesca a darmi una mano :)
l'errore me lo trova nella quartultima stringa precisamente :
while(s!=6 && risp=1);
e l'errore è questo
main.cpp In function `int main(int, char**)':
main.cpp non-lvalue in assignment
Makefile.win [Build Error] [main.o] Error 1
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{int s,risp;
char car;
s=0;
cout<<"inserire carattere: "<<endl;
cin>>car;
do
{
switch(s)
{
case 0:
switch(car)
{
case 'a': s=1;
break;
case 'b': s=3;
break;
default : s=6;
}
case 1:
switch(car)
{
case 'b': s=2;
break;
default : s=6;
}
case 2:
switch(car)
{
case 'a': s=1;
break;
case 'c': s=3;
break;
default : s=6;
}
case 3:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
}
case 4:
switch(car)
{
case 'e': s=5;
break;
default : s=6;
}
case 5:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
}
}
if(s=6)
cout<<"l'ultimo carattere digitato crea un'errore nella stringa";
else
{
cout<<"vuoi inserire un'altro carattere?"<<endl<<"1.continuare"<<endl<<"2.non continuare"<<endl<<"inserire numero della risposta";
cin>>risp;
}
}
while(s!=6 && risp=1);
system("PAUSE");
return EXIT_SUCCESS;
}
Gimli[2BV!2B]
16-11-2011, 21:34
Attenzione alla differenza tra operatore di confronto di uguaglianza == e di assegnamento =
risp=1 significa che desideri che la variabile risp contenga il valore 1
risp==1 significa che vuoi sapere se risp vale 1
karlo1993a
16-11-2011, 21:43
ok ora l'errore alla fine non me lo da più però nonostante io all'inizio digito 'a' mi dice "l'ultimo carattere digitato crea un'errore nella stringa", ma dovrebbe chiedermi di digitare un nuovo carattere... forse ho sbagliato qualcosa nel dichiarare le variabili?
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{int s,risp;
char car;
s=0;
cout<<"inserire carattere: "<<endl;
cin>>car;
do
{
switch(s)
{
case 0:
switch(car)
{
case 'a': s=1;
break;
case 'b': s=3;
break;
default : s=6;
}
case 1:
switch(car)
{
case 'b': s=2;
break;
default : s=6;
}
case 2:
switch(car)
{
case 'a': s=1;
break;
case 'c': s=3;
break;
default : s=6;
}
case 3:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
}
case 4:
switch(car)
{
case 'e': s=5;
break;
default : s=6;
}
case 5:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
}
}
if(s==6)
cout<<"l'ultimo carattere digitato crea un'errore nella stringa";
else
{
cout<<"vuoi inserire un'altro carattere?"<<endl<<"1.continuare"<<endl<<"2.non continuare"<<endl<<"inserire numero della risposta";
cin>>risp;
}
}
while(s!=6 && risp==1);
system("PAUSE");
return EXIT_SUCCESS;
}
karlo1993a
16-11-2011, 21:53
cmq se può servire il problema da risolvere è questo:
(ab)^n c (de)^ m n>=0 m>0
cioè
esempio
abcde stringa corretta
cde stringa corretta
abc stringa non corretta
abababcdedede corretta
abccccdede non corretta
nel programma mancherebbe ancora un pezzo alla fine ma prima vorrei risolvere questo problema qua xD
Gimli[2BV!2B]
16-11-2011, 22:08
Mancan dei break... ora tira dritto fino al case 5.
Ti consiglierei anche di tenere un'indentazione più ordinata, aiuta a notare ad occhio differenze nella "forma" dei blocchi simili rendendo più evidenti mancanze di questo tipo, oltre ad aumentare notevolmente la leggibilità.
karlo1993a
19-11-2011, 00:58
oddio grazie 1000 non l'avevo proprio notato xD grazie grazie :D
cmq visto che mi hai parlato di indentatura mi potresti dare qualche consiglio su come andrebbe indentato per capire meglio?
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{int s,risp;
char car;
s=0;
do
{
cout<<"inserire carattere: "<<endl;
cin>>car;
switch(s)
{
case 0:
switch(car)
{
case 'a': s=1;
break;
case 'b': s=3;
break;
default : s=6;
break;
}
break;
case 1:
switch(car)
{
case 'b': s=2;
break;
default : s=6;
break;
}
break;
case 2:
switch(car)
{
case 'a': s=1;
break;
case 'c': s=3;
break;
default : s=6;
break;
}
break;
case 3:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
break;
}
break;
case 4:
switch(car)
{
case 'e': s=5;
break;
default : s=6;
break;
}
break;
case 5:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
break;
}
}
if(s==6)
cout<<"l'ultimo carattere digitato crea un'errore nella stringa"<<endl;
else
{
cout<<"vuoi inserire un'altro carattere?"<<endl<<"1.continuare"<<endl<<"2.non continuare"<<endl<<"inserire numero della risposta: ";
cin>>risp;
}
}
while(s!=6 && risp==1);
if(s==5)
cout<<"la stringa e' corretta"<<endl;
else
cout<<"la stringa non e' corretta"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Gimli[2BV!2B]
19-11-2011, 01:43
Questo è lo stile di indentazione che utilizziamo al lavoro (tab impostato a 2 spazi, gli otto usati da questo forum sono troppi, quattro sono considerati ottimi dai più); non si tratta di uno degli stili "standard". (http://en.wikipedia.org/wiki/Indent_style)
Tieni conto che la scelta viene solitamente fatta in base al gusto personale (sempre nei limiti delle regole fondamentali comuni a tutti gli stili più diffusi), oppure dettata da una base di codice ereditata.#include <cstdlib>
#include <iostream>
using namespace std;
int main( int argc, char *argv[] )
{
int s, risp ;
char car ;
s = 0 ;
do
{
cout << "inserire carattere: " << endl ;
cin >> car ;
switch( s )
{
case 0:
switch( car )
{
case 'a':
s = 1 ;
break ;
case 'b':
s = 3 ;
break ;
default :
s = 6 ;
break;
}
break ;
case 1:
switch( car )
{
case 'b':
s = 2 ;
break ;
default :
s = 6 ;
break ;
}
break ;
case 2:
switch(car)
{
case 'a':
s = 1 ;
break ;
case 'c':
s = 3 ;
break ;
default :
s = 6 ;
break ;
}
break ;
case 3:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
break;
}
break;
case 4:
switch(car)
{
case 'e': s=5;
break;
default : s=6;
break;
}
break;
case 5:
switch(car)
{
case 'd': s=4;
break;
default : s=6;
break;
}
}
if( s == 6 )
cout << "l'ultimo carattere digitato crea un'errore nella stringa" << endl ;
else
{
cout << "vuoi inserire un'altro carattere?"<<endl<<"1.continuare"<<endl<<"2.non continuare"<<endl<<"inserire numero della risposta: " ;
cin >> risp ;
}
}
while( s != 6 && risp == 1 ) ;
if( s == 5 )
cout << "la stringa e' corretta" << endl ;
else
cout << "la stringa non e' corretta" << endl ;
system("PAUSE") ;
return EXIT_SUCCESS ;
}
karlo1993a
21-11-2011, 20:28
molto interessante, vorrà dire che dovrò migliorare un po nell'indentatura :)... comunque ultime due domande:
1. se voglio che ha fine programma cioè quando gli dico che non voglio continuare, vorrei unire tutti i caratteri digitati in modo da scrivere tutta la stringa corretta a fine programma.
2. vorrei che a ogni volta che digito il carattere e la risposta la pagina si azzeri, mi aveva detto qualcosa un mio amico ma purtroppo non ricordo era qualcosa tipo screen ma non ricordo bene...
Gimli[2BV!2B]
21-11-2011, 22:46
1. se voglio che ha fine programma cioè quando gli dico che non voglio continuare, vorrei unire tutti i caratteri digitati in modo da scrivere tutta la stringa corretta a fine programma.Sai quanti caratteri avrai raccolto alla fine: 6.
[...]
crea array char di dimensione fissa corretta ;
inizializzalo con caratteri '\0' ;
ciclo acquisizione
{
salva car nella giusta posizione nel buffer ;
[...]
}
stampa array di char ed altri messaggi ;
2. vorrei che a ogni volta che digito il carattere e la risposta la pagina si azzeri, mi aveva detto qualcosa un mio amico ma purtroppo non ricordo era qualcosa tipo screen ma non ricordo bene...Non programmo in console in Win da tempo, ma mi risulta che il metodo preferibile sia:
#include <cstdlib>
[...]
system( "cls" ) ;
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.