PDA

View Full Version : [C++] Piccolo aiuto


Sh4k3!
09-04-2007, 17:04
Ciau a tutti e auguri :D

Il prof. di informatica per le vacanze pasquali ci ha dato quest'esercizio:

Dato un vettore di N stringhe, costruire una funzione che dopo aver inserito N stringhe permetta di ottenere una stringa costituita da tutti i caratteri numerici e alfabetici minuscoli di tutte le stringhe.

Ho scritto il programma usando Borland C++ v3.1 senza grossi problemi, eccolo:

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#define n_max_car 20
#define n_max 20

void ins (int N, char vet_stringhe[n_max][n_max_car]);
void costr_strin (char vet_stringhe[n_max][n_max_car], int N, char stringa[n_max_car]);
void visua (char stringa[n_max_car]);

void main ()
{
char vet_stringhe_1[n_max][n_max_car], stringa_1[n_max_car];
int N_1;
ins (N_1,vet_stringhe_1);
costr_strin(vet_stringhe_1,N_1,stringa_1);
visua(stringa_1);
}

void ins (int N, char vet_stringhe[n_max][n_max_car]);
{
clrscr();
int I;
do
{
cout<<"Inserisci il numero massimo di stringhe ";
cin>>N;
}
while (!((N>=2)&&(N<=n_max)));
for (I=0;I<N;I++)
{
cout<<"Inserisci la "<<I+1<<"^ stringa del vettore ";
gets(vet_stringhe[I]);
}
}

void costr_strin (char vet_stringhe[n_max][n_max_car], int N, char stringa[n_max_car]);
{
int I,J,K;
K=0;
for(I=0;I<N;I++)
{
for(J=0;J<strlen(vet_stringhe[I]);J++)
{
if ( ((vet_stringhe[I][J]>='1')&&(vet_stringhe[I][J]<='9')) ||
((vet_stringhe[I][J]>='a')&&(vet_stringhe[I][J]<='z')) )
{
stringa[K]=vet_stringhe[I][J];
K++;
}
}
}
stringa[K]='\0';
}

void visua (char stringa[n_max_car]);
{
cout<<"La stringa formata dai caratteri numerici e dai caratteri minuscoli del vettore e' "<<stringa<<endl;
while (!kbhit());
}

come avrete notato è scritto proprio "terra terra" :D, però errori di sintassi non ce ne sono, l'unico problema è che quando lo mando in esecuzione si blocca sulla funzione if ( ((vet_stringhe[i][J]>='1')&&(vet_stringhe[i][J]<='9')) || ((vet_stringhe[i][J]>='a')&&(vet_stringhe[i][J]<='z')) )

e l'unica soluzione è quella di arrestare il programma.

Aiutatemi a capire dov'è il problema :cry:

Grazie e ancora auguri :)

ndakota
09-04-2007, 19:02
strano.. come fa a non darti errore il punto e virgola nella definizione della funzione? e poi in certe funzioni hai dichiarato I ma usavi i.. insomma a me dava un sacco di errori, ho messo a posto tutto ma spara fuori due cout senza farti inserire niente.. sicuramente bisogna svuotare il buffer. ho provato a usare la fflush ma non cambia nulla..

Sh4k3!
09-04-2007, 19:52
lol infatti ci sono alcuni errori perchè l'ho provato a scuola e poi l'ho ricopiato in dev-c++ senza neanche controllare eventuali errori di copia :muro: :D.

Comunque anche correggendolo si blocca sempre su quella stringa, e poi non ho la minima idea di come sia il buffer, e la stessa cosa vale per il fflush :D.

PS nel compilatore le i sono tutte maiuscole:confused:

ndakota
09-04-2007, 20:02
lol infatti ci sono alcuni errori perchè l'ho provato a scuola e poi l'ho ricopiato in dev-c++ senza neanche controllare eventuali errori di copia :muro: :D.

Comunque anche correggendolo si blocca sempre su quella stringa, e poi non ho la minima idea di come sia il buffer, e la stessa cosa vale per il fflush :D.

PS nel compilatore le i sono tutte maiuscole:confused:


no ce n'era una minuscola e quindi dava errore.. comunque ho risolto con un fflush(stdin) dopo che inserisci il numero di stringhe solo che non va ancora lol.. la stringa non prende mai i caratteri maiuscoli.. boooooooooo..

Sh4k3!
09-04-2007, 20:08
infatti deve prendere solo quelli numerici a minuscoli :D

ndakota
09-04-2007, 20:18
infatti deve prendere solo quelli numerici a minuscoli :D


ok ma non prende neanche quelli.. non prende proprio niente.. mi sono arreso.. eheheh

Sh4k3!
09-04-2007, 20:22
si è arreso anche il prof lol, che compilatore hai usato?

sottovento
10-04-2007, 01:56
void ins (int N, char vet_stringhe[n_max][n_max_car]);
...

void main ()
{
char vet_stringhe_1[n_max][n_max_car], stringa_1[n_max_car];
int N_1;
ins (N_1,vet_stringhe_1);
costr_strin(vet_stringhe_1,N_1,stringa_1);
visua(stringa_1);
}

void ins (int N, char vet_stringhe[n_max][n_max_car]);
{
clrscr();
int I;
do
{
cout<<"Inserisci il numero massimo di stringhe ";
cin>>N;
}
while (!((N>=2)&&(N<=n_max)));
for (I=0;I<N;I++)
{
cout<<"Inserisci la "<<I+1<<"^ stringa del vettore ";
gets(vet_stringhe[I]);
}
}
...


Penso che fosse tua intenzione assegnare il valore alla variabile N_1 all'interno della funzione ins().
Purtroppo, siccome il passaggio dei parametri e' per valore, non assegni nulla. Al termine dell'esecuzione di ins() hai ancora in N_1 il valore precedente.
Il valore precedente e': INDETERMINATO. Non hai assegnato alcun valore.

Sh4k3!
10-04-2007, 10:48
Se ho capito bene quello che intendi N_1 è il prototipo, il valore va assegnato ad N, che rappresenta il numero di stringhe.

ndakota
10-04-2007, 13:01
Se ho capito bene quello che intendi N_1 è il prototipo, il valore va assegnato ad N, che rappresenta il numero di stringhe.


ho usato il devcpp.. comunque intende che hai usato un passagio di varibili per valore (cioè che crea una copia e usa quella) e che quindi poi nel main e nelle altre funzioni n_1 avrà il valore che aveva prima.. se invece vuoi proprio modificare il valore di n_1 devi passarglielo per riferimento cioè &n_1.

ndakota
10-04-2007, 13:09
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define k 20

using namespace std;

void ins (int &N, char vet_stringhe[k][k]);
void costr_strin (char vet_stringhe[k][k], int &N, char stringa[k]);
void visua (char stringa[k]);

int main ()
{
char vet_stringhe_1[k][k], stringa_1[k];
int N_1;

ins (N_1,vet_stringhe_1);
costr_strin(vet_stringhe_1,N_1,stringa_1);
visua(stringa_1);

getch();
return 0;
}

void ins (int &N, char vet_stringhe[k][k])
{
system("cls");
int i;

do
{
cout<<"Inserisci il numero massimo di stringhe ";
cin>>N;
fflush(stdin);
}
while (!((N>=2)&&(N<=k)));
for (i=0;i<N;i++)
{
cout<<"Inserisci la "<<i+1<<"^ stringa del vettore ";
gets(vet_stringhe[i]);
}
}

void costr_strin (char vet_stringhe[k][k], int &N, char stringa[k])
{
int i,J,f;
f=0;

for(i=0;i<N;i++)
{
for(J=0;J<strlen(vet_stringhe[i]);J++)
{
if (islower(vet_stringhe[i][J])) {stringa[f]=vet_stringhe[i][J];
f++;}
}
}
stringa[f+1]='\0';
}

void visua (char stringa[k])
{
cout<<"La stringa formata dai caratteri numerici e dai caratteri minuscoli del vettore";
cout<<" e' "<<stringa<<endl;
}



così sembra funzionare.. prova un po'..

Sh4k3!
11-04-2007, 20:56
Salve...scusatemi se mi faccio vivo solo ora :), grazie al vostro aiuto ho trovato l'errore: non avevo messo &N nella prima funzione. :muro:

Grazie :D