PDA

View Full Version : [C++]Programma automa


-Yara-
05-04-2005, 22:33
Salve a tutti.
Spero mi aiutiate a risolvere un problema :)
Si tratta di scrivere un programma in C++ che simuli il funzionamento di un automa.
In pratica, date 2 matrici di char, una contenente gli input (inseriti da tastiera) e una contenente gli stati (sempre inseriti da tastiera) il programma deve confrontare tutti gli elementi delle due matrici con altre due stringhe, sempre date in input, e con esse trovare le "coordinate" per la loro collocazione nella matrice (di char) delle uscite.

Questo è il codice che ho prodotto fin'ora:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define DIM 3
#define DIM2 3
//automa
using namespace std;

void caricamento(char[][DIM2],char[][DIM2],char[][DIM2],char[][DIM2]);
void simulazione(char[][DIM2],char[][DIM2],char[][DIM2],char[][DIM2],int&,int&);
//void uscite(int,int,char[][DIM2],char[][DIM2]);

int main(void)
{
char input[DIM][DIM2],stati[DIM][DIM2],matr_stato[DIM][DIM2],matr_uscite[DIM][DIM2];
char risp;
int scelta,lol,lol2;
do{
cout<<"Programma automa "<<endl;
cout<<"1-carticamento vettori e matrici. "<<endl;
cout<<"2-simulaz."<<endl;
cout<<"3-Uscite. "<<endl;
cout<<"4-Esci. "<<endl;
cin>>scelta;
switch(scelta)
{
case 1:caricamento(input,stati,matr_stato,matr_uscite);break;
case 2:simulazione(input,stati,matr_stato,matr_uscite,lol,lol2);break;
//case 3:uscite(lol,lol2,matr_stato,matr_uscite);break;
case 4:exit(0);break;
}
cout<<"\nContinuare? "<<endl;
cin>>risp;
}while(risp=='s');
getchar();
}
//******************************************************************************

void caricamento(char input[][DIM2],char stati[][DIM2],char matr_stato[][DIM2],char matr_uscite[][DIM2])
{
int i,j,lenght1,lenght2;
bool trovato=false;
//valori di input
cout<<"Valori di input: "<<endl;
cin.ignore();
for(i=0;i<DIM;i++)
{
do{
cout<<i<<" : ";
gets(input[i]);
for(j=0;j<i;j++)
{
if(strcmp(input[i],input[j])==0)
{
trovato=true;
break;
}
}
}while(trovato==true);
}
//valori di stato
cout<<"Valori di stato "<<endl;
do{
for(i=0;i<DIM;i++)
{
cout<<i<<" : ";
gets(stati[i]);
for(j=0;j<i;j++)
{
if(strcmp(stati[i],stati[j])==0)
{
trovato=true;
break;
}
}
}
}while(trovato==true);
}

//******************************************************************************

void simulazione(char input[][DIM2],char stats[][DIM2],char matr_stato[][DIM2],char matr_uscite[][DIM2],int& lol,int& lol2)
{
int i,j;
char input2[DIM2],stato2[DIM2];
cout<<"Inserisci l'input: "<<endl;
cin>>input2;
/*ciclo per la ricerca dell'input
inserito dall'utente nella matrice di char contenente
tutti gli input inseriti precedentemente */
for(i=0;i<DIM;i++)
{
if(strcmp(input[i],input2)==0) lol=i;
else lol=-1;
}
cout<<"Posizione trovata: "<<lol<<endl;
cout<<"Inserisci lo stato: "<<endl;
cin>>stato2;
/*ciclo per la ricerca dello stato
inserito dall'utente nella matrice di char contenente
tutti gli stati inseriti precedentemente */
for(i=0;i<DIM;i++)
{
if(strcmp(stats[i],stato2)==0) lol2=i;
else lol2=-1;
}
cout<<"Posizione trovata: "<<lol2;
getchar();
}

Ho pero' un problema nella funzione simulazione perchè qualsiasi valore inserisca, mi stampa sempre -1 (cioè non ha trovato nulla) e sinceramente non so perchè, pensavo fosse un mio sbagliato utilizzo di strcmp, ma mi sono guardato i valori di ritorno qua (http://www.cplusplus.com/ref/cstring/strcmp.html) e non mi sembra di aver fatto errori :(.
Ringrazio in anticipo chi mi vorrà aiutare..

Futuregames
05-04-2005, 22:43
se lo trova è un ciclo infinito... devi mettere dopo il for trovato=false??

-Yara-
05-04-2005, 22:45
Originariamente inviato da Futuregames
se lo trova è un ciclo infinito... devi mettere dopo il for trovato=false??

Grazie per aver risposto :D
Comunque non mi riferivo a quella funzione, bensi alla funzione "simulazione".

Futuregames
05-04-2005, 22:47
ma cin>>imput2 e dopo confronti input2 (che è un char) con input[](stringa) è sempre diverso

-Yara-
05-04-2005, 22:49
Originariamente inviato da Futuregames
ma cin>>imput2 e dopo confronti input2 (che è un char) con input[](stringa) è sempre diverso

Il problema è che se io inserisco da tastiera per esempio "abc" e dopo metto come input proprio "abc" lui lo ignora :D

Futuregames
05-04-2005, 22:50
si ma abc è na stringa devi dichiarare input2 na stringa e fare gets(input2);

-Yara-
05-04-2005, 22:55
Ma mi ricordavo che cin andava bene per una stringa senza spazi....oppure prende solo il primo carattere?
E cin.getline(input2,DIM2); non funziona ugualmente....

-Yara-
06-04-2005, 06:45
up

tglman
06-04-2005, 10:52
il problema sta nel for...
questa è la correzione che farei io

for(i=0;i<DIM;i++)
{
if(strcmp(input[i],input2)==0)
{
lol=i;
break;
}
else lol=-1;
}

o comunque ti e sufficente eliminare l'else es:

lol=-1;
for(i=0;i<DIM;i++)if(strcmp(input[i],input2)==0) lol=i;


il problema era semplicemente il dipendente al fatto che in caso tu avresti trovato un elemanto uguale non ti saresti fermato, e al successivo che non sarebbe stato uguale avresti impostato il risultato a -1, come se non ne avessi trovato nessuno.

Ciao...