PDA

View Full Version : Un mio semplice programma: come miglioralo?


zanardi84
18-10-2010, 13:57
Sto scrivendo un semplice programma di cui vi inserirò il codice.
Nella versione non completa attuale e funzionante ho cercato di inserire ciò che ho sino ad ora imparato, cioè poco: funzioni e vettori. Il mio scopo è stato quello di cercare di scrivere più funzioni possibile, versatili per scopi disparati, adattabili e semplici. Il main doveva essere poco più di una sequenza di chiamate a funzione.

C'è sicuramente un bug comune che andrebbe risolto con una funzione ad hoc, ma che non sono in grado di trovare e di scrivere: il menu del mio programma è strutturato in modo che la scelta sia sempre numerica. Nel momento in cui inserisco un solo carattere letterale va in loop, e ciò non è ovviamente ammissibile.

Due cose che non mi piacciono:
1) l'interfaccia delle chiamate, forse un po' complicate da gestire.. qualche consiglio in proposito?
2) Il primo elemento del vettore ha indice 0. Vorrei che avesse indice 1. Ho qualche dubbio su come fare.

Vorrei un vostro parere sull'operato, sino a questo punto.
Quando imparerò liste e strutture lo potenzierò.

N.B. Intanto è solo un "prototipo" con il vettore già riempito, per simulare la situazione.

!fazz
18-10-2010, 14:34
per risolvere il loop


int inserimento (string messaggio1, string messaggio2, int estremo_inferiore, int estremo_superiore)
{
int dato;
char cdato
cout << messaggio1<<endl;
cout <<endl;
cout << messaggio2<<endl;
cin >>cdato;
dato=atoi(cdato)

if (dato==0)&&(cdato!='0')
cout<<"errore";
else{

while (dato < estremo_inferiore || dato > estremo_superiore)
{
cout << "Errore! Il valore non deve essere inferiore di " <<estremo_inferiore<< " e maggiore di " <<estremo_superiore<< "! Ridigitare"<<endl;
cin >> dato;
}
}
return dato;
}

zanardi84
18-10-2010, 15:13
per risolvere il loop


int inserimento (string messaggio1, string messaggio2, int estremo_inferiore, int estremo_superiore)
{
int dato;
char cdato
cout << messaggio1<<endl;
cout <<endl;
cout << messaggio2<<endl;
cin >>cdato;
dato=atoi(cdato)

if (dato==0)&&(cdato!='0')
cout<<"errore";
else{

while (dato < estremo_inferiore || dato > estremo_superiore)
{
cout << "Errore! Il valore non deve essere inferiore di " <<estremo_inferiore<< " e maggiore di " <<estremo_superiore<< "! Ridigitare"<<endl;
cin >> dato;
}
}
return dato;
}



Qualcosa non quadra, ho errori di compilazione.
71 invalid conversion from `char' to `const char*'

71 initializing argument 1 of `int atoi(const char*)'

73 expected identifier before '(' token

73 expected `;' before '(' token

!fazz
18-10-2010, 16:18
Qualcosa non quadra, ho errori di compilazione.
71 invalid conversion from `char' to `const char*'

71 initializing argument 1 of `int atoi(const char*)'

73 expected identifier before '(' token

73 expected `;' before '(' token

vabbè ho scritto di fretta nel forum senza un ide sotto, lo scopo era farti vedere come si risolve non risolverti il problema fatto e finito

(cmq per l'esattezza manca il ; nella dichiarazione di cdato)

i loop li hai quando inserisci un carattere al posto di un intero la soluzione è acquisire un carattere e dopo trasformarlo in un intero mediante la funzione atoi

il problema è che atoi restituisce 0 se il dato inserito non è un numero quindi se vuoi usare anche lo 0 nel menu devi controllare che il valore inserito sia effettivamente 0 l'if te l'ho messo li a caso devi integrare il controllo nel tuo codice

zanardi84
18-10-2010, 17:30
vabbè ho scritto di fretta nel forum senza un ide sotto, lo scopo era farti vedere come si risolve non risolverti il problema fatto e finito

(cmq per l'esattezza manca il ; nella dichiarazione di cdato)

i loop li hai quando inserisci un carattere al posto di un intero la soluzione è acquisire un carattere e dopo trasformarlo in un intero mediante la funzione atoi

il problema è che atoi restituisce 0 se il dato inserito non è un numero quindi se vuoi usare anche lo 0 nel menu devi controllare che il valore inserito sia effettivamente 0 l'if te l'ho messo li a caso devi integrare il controllo nel tuo codice

Da quel che ho capito implementando un piccolo programma per testare il funzionamento, atoi funge così, per esempio:

Inserisco 11 -> restituisce 11.
Inserisco A -> restituisce 0.
Inserisco 123a -> restituisce 123 ignorando la a.
Inserisco "nel mezzo del cammin di nostra vista..." -> restituisce 0.
Inserisco A4 -> restituisce 0.

e così via.
Buon funzionamento, ma voglio prevedere l'uso dello 0 per qualche ragione. Come posso fare?

!fazz
18-10-2010, 17:48
Da quel che ho capito implementando un piccolo programma per testare il funzionamento, atoi funge così, per esempio:

Inserisco 11 -> restituisce 11.
Inserisco A -> restituisce 0.
Inserisco 123a -> restituisce 123 ignorando la a.
Inserisco "nel mezzo del cammin di nostra vista..." -> restituisce 0.
Inserisco A4 -> restituisce 0.

e così via.
Buon funzionamento, ma voglio prevedere l'uso dello 0 per qualche ragione. Come posso fare?

guarda l'if che ho inserito

per controllare lo 0 devi controllare quando atoi restituisce 0 se il carattere inserito è effettivamente 0

zanardi84
19-10-2010, 08:55
guarda l'if che ho inserito

per controllare lo 0 devi controllare quando atoi restituisce 0 se il carattere inserito è effettivamente 0

Non posso fare il controllo diretto perchè dato è un intero e cdato è una stringa. Devo trovare un modo alternativo per fare il confronto, ma al momento non mi viene in mente nulla.

!fazz
19-10-2010, 14:54
Non posso fare il controllo diretto perchè dato è un intero e cdato è una stringa. Devo trovare un modo alternativo per fare il confronto, ma al momento non mi viene in mente nulla.

a parte che dopo questo ti consiglio di riguardarti le basi di programmazione

cdato è un carattere non una stringa

se ti ho detto di guardare l'if che ti ho scritto appositamente io ci sarà un motivo no?

if (dato==0)&&(cdato!='0')
cout<<"errore";

zanardi84
19-10-2010, 15:07
a parte che dopo questo ti consiglio di riguardarti le basi di programmazione

cdato è un carattere non una stringa

se ti ho detto di guardare l'if che ti ho scritto appositamente io ci sarà un motivo no?

if (dato==0)&&(cdato!='0')
cout<<"errore";

Ho sbagliato a chiamare un carattere come stringa, ma è su queste (col tipo string) che sto lavorando attualmente nei programmi (e l'implementazione che ho provato con successo, ma senza gesitone dello 0, prevede vettore di char che è una stringa ;)
Se io quell'if lo inserisco nel compilatore, l'unico errore che restituisce è quello di compilazione perchè non può confrontare un char come cdato con un int come dato.

!fazz
19-10-2010, 15:51
Ho sbagliato a chiamare un carattere come stringa, ma è su queste (col tipo string) che sto lavorando attualmente nei programmi (e l'implementazione che ho provato con successo, ma senza gesitone dello 0, prevede vettore di char che è una stringa ;)
Se io quell'if lo inserisco nel compilatore, l'unico errore che restituisce è quello di compilazione perchè non può confrontare un char come cdato con un int come dato.

non so a casa tua ma a casa mia quell'if confronta un intero con una costante intera e un carattere con una costante carattere

zanardi84
19-10-2010, 16:20
non so a casa tua ma a casa mia quell'if confronta un intero con una costante intera e un carattere con una costante carattere

Se io inserisco il tuo codice, mettendo il ; dopo la dichiarazione della variabile e la chiamata di funzione e sistemando la sintassi dell'if, ottengo quanto puoi vedere nello screen.

http://img230.imageshack.us/img230/6001/catturat.th.png (http://img230.imageshack.us/i/catturat.png/)

da cui non so uscire al momento perchè sto cercando di imparare.

Qualche idea?

!fazz
19-10-2010, 16:38
Se io inserisco il tuo codice, mettendo il ; dopo la dichiarazione della variabile e la chiamata di funzione e sistemando la sintassi dell'if, ottengo quanto puoi vedere nello screen.

http://img230.imageshack.us/img230/6001/catturat.th.png (http://img230.imageshack.us/i/catturat.png/)

da cui non so uscire al momento perchè sto cercando di imparare.

Qualche idea?

comincia con il sistemare le parentesi


if ((dato==0)&&(cdato!='0'))

zanardi84
19-10-2010, 16:42
comincia con il sistemare le parentesi


if ((dato==0)&&(cdato!='0'))

Non sono servite ;)

L'errore è sempre alla riga dell'atoi.

!fazz
20-10-2010, 09:32
Non sono servite ;)

L'errore è sempre alla riga dell'atoi.

allora il problema non è l'if

comunque rileggendo l'errore pare che la tua atoi legga solo le stringhe e non i caratteri

sostituisci cdato con una stringa il cin con un cin.getline ecc ecc

ma comunque sappi che quel codice non ha nessuna valenza pratica è fondamentalmente sbagliato

a che scopo dare estremo inferiore e superiore per comunicare solo due messaggi? dovresti sistemarlo almeno con una matrice di caratteri in grado di creare un menu ndimensionale

zanardi84
20-10-2010, 11:59
allora il problema non è l'if

comunque rileggendo l'errore pare che la tua atoi legga solo le stringhe e non i caratteri

sostituisci cdato con una stringa il cin con un cin.getline ecc ecc

ma comunque sappi che quel codice non ha nessuna valenza pratica è fondamentalmente sbagliato

a che scopo dare estremo inferiore e superiore per comunicare solo due messaggi? dovresti sistemarlo almeno con una matrice di caratteri in grado di creare un menu ndimensionale

Guarda bene l'interfaccia con cui chiamo "inserimento" :passo due messaggi come string e due interi che sono gli estremi:
Ho trovato una funzione generica già pronta (l'avevo preparata per un altro programma semplice) e l'ho riutilizzata col minimo delle modiiche (cioè ho aggiunto un parametro string in più), ma potrei potenziarla aggiungendole qualche if (o un costrutto switch) per farle fare altre operazioni come chiamare altre funzioni alla pressione di un tasto, ma l'inferfaccia sarebbe sempre quella, con gli estremi numerici fuori dai quali avrei la non accettabilità. Ovviamente conosco il limite del controllo, cioè se metto un letterale al posto di un numero mi crasha tutto.

Torniamo pertanto alla questione principale! Voglio che mi prenda, per il mio scopo, solo numeri e non caratteri letterali o "grafici".

-MiStO-
20-10-2010, 15:16
Non sono servite ;)

L'errore è sempre alla riga dell'atoi.

ad atoi devi passargli l'indirizzo del char

dato=atoi(&cdato);

comunque il while è errato, non ripete il controllo numerico

zanardi84
20-10-2010, 16:22
ad atoi devi passargli l'indirizzo del char

dato=atoi(&cdato);

comunque il while è errato, non ripete il controllo numerico

Dunque, ho implementato un semplice programmino che analizza la situazione (il while poi si aggiusta, ma mi interessava vedere il comportamento effettivo dell'atoi) e devo dire che fa quasi tutto quello che voglio: gestisce anche lo 0 con l'if creato, ma manca ancora una cosa.

Se io digito in input per esempio 23er45, vorrei che mi dicesse che è un dato sbagliato. Ho provato a implementare usando la stringa di caratteri da convertire in intero, così

int i;
char input[256];
cout << "Inserire un numero: ";
cin >> input;

i = atoi(input);

if((i==0) && (*input!='0')) //se il dato inserito è
cout << "Dato non accettato"<<endl;

else if ((i==0) && (*input='0'))
cout << "inserito lo 0: "<<i<<endl;

else

cout << "dato inserito: "<<i;

ma pur funzionando, invece di darmi l'avviso di dato non corretto, mi tronca il dato a partire dal letterale.
Cioè 23er45 per lui è 23, mentre vorrei che mi dicesse che è errore.
Lavora a dovere se scrivo i primi versi della Divina Commedia (segnala errore) o se gli digito un numero, per esempio 23 è proprio 23 (e se gli faccio calcolare il doppio viene 46). Ok anche se gli metto 000000000002, mi tronca gli zeri.

Cosa mi suggerite per risolvere?

!fazz
20-10-2010, 17:41
Dunque, ho implementato un semplice programmino che analizza la situazione (il while poi si aggiusta, ma mi interessava vedere il comportamento effettivo dell'atoi) e devo dire che fa quasi tutto quello che voglio: gestisce anche lo 0 con l'if creato, ma manca ancora una cosa.

Se io digito in input per esempio 23er45, vorrei che mi dicesse che è un dato sbagliato. Ho provato a implementare usando la stringa di caratteri da convertire in intero, così

int i;
char input[256];
cout << "Inserire un numero: ";
cin >> input;

i = atoi(input);

if((i==0) && (*input!='0')) //se il dato inserito è
cout << "Dato non accettato"<<endl;

else if ((i==0) && (*input='0'))
cout << "inserito lo 0: "<<i<<endl;

else

cout << "dato inserito: "<<i;

ma pur funzionando, invece di darmi l'avviso di dato non corretto, mi tronca il dato a partire dal letterale.
Cioè 23er45 per lui è 23, mentre vorrei che mi dicesse che è errore.
Lavora a dovere se scrivo i primi versi della Divina Commedia (segnala errore) o se gli digito un numero, per esempio 23 è proprio 23 (e se gli faccio calcolare il doppio viene 46). Ok anche se gli metto 000000000002, mi tronca gli zeri.

Cosa mi suggerite per risolvere?

controlla la lunghezza della stringa che leggi e confrontala con il dato

se è un numero da 0-9 la stringa deve essere 1 carattere
se è tra 10-99 due caratteri

ecc ecc

zanardi84
20-10-2010, 18:55
controlla la lunghezza della stringa che leggi e confrontala con il dato

se è un numero da 0-9 la stringa deve essere 1 carattere
se è tra 10-99 due caratteri

ecc ecc

Questa è un'ottima idea!!!!

zanardi84
21-10-2010, 09:33
controlla la lunghezza della stringa che leggi e confrontala con il dato

se è un numero da 0-9 la stringa deve essere 1 carattere
se è tra 10-99 due caratteri

ecc ecc

Implementata, funziona perfettamente. In un lampo l'ho adattata alla mia interfaccia! L'unica cosa è che adesso modificherò, se posso, le chiamate di funzione, sostituendo i numeri con delle costanti che metto a inizio codice in modo tale da fare modifiche al volo se devo ampliare i vettori.
Poi continuerò a sviluppare il programma aggiungendo sempre più cose come per esempio una bella gestione delle prenotazioni (adesso è molto grezza e minimale), file, sotituisco il vettore con una bella lista (e all'interfaccia potrebbe cambiare solo il parametro del vettore sostituendolo con uno che identifichi la lista e sostituendo la ricerca vettore con quella della lista) e chi più ne ha più ne metta!

zanardi84
08-11-2010, 09:43
Riesumo il thread perchè nei miei esperimenti è capitato un nuovo tipo di controllo.

Devo sempre verificare di aver inserito un intero, ma stavolta non ho un numero di cifre fisso. Spiego: devo controllare che la durata di un volo (in secondi) non sia per esempio "2e4tdf33" e segnalare l'errore. Non mi viene in mente niente.
Qualche idea amici?

-MiStO-
08-11-2010, 10:16
invece del cin potresti usare la getchar per leggere in input un carattere alla volta (e controllare la sua validità)

http://www.cplusplus.com/reference/clibrary/cstdio/getchar/

WarDuck
08-11-2010, 10:26
controlla la lunghezza della stringa che leggi e confrontala con il dato

se è un numero da 0-9 la stringa deve essere 1 carattere
se è tra 10-99 due caratteri

ecc ecc

Per farlo in maniera più elegante si può usare il logaritmo in base 10, aggiungendo 1 (e troncando il risultato ad un intero) restituisce esattamente il numero di cifre del numero stesso.

Comunque atoi è di manica molto larga, se gli passi una stringa pura ti restituisce 0.

Potresti farti una funzione che legge la stringa al contrario un carattere per volta e aggiunge la quantità desiderata (se l'input corrente rappresenta un intero tra 0 e 9).

Ad esempio:

stringa="123"

leggo 3: aggiungo +003
leggo 2: aggiungo +020
leggo 1: aggiungo +100
-----------------------
totale: +123

Ad ogni passo del ciclo quello che fai è ricavarti il numero (se il carattere è tale) e usare un moltiplicatore che ad ogni passo del ciclo viene moltiplicato di 10 (supponendo che usiamo la rappresentazione in base 10).

Chiaramente devi gestire anche l'eventuale caso di overflow e numero negativo.

Se usi C++ direi senza dubbio di usare le eccezioni per gestire gli errori, così che se trovi un carattere che non rappresenta un numero lanci l'eccezione.

Questo giusto se ti piace reinventare la ruota, altrimenti devi ricorrere ad espedienti e trucchetti vari.

zanardi84
08-11-2010, 15:33
Per farlo in maniera più elegante si può usare il logaritmo in base 10, aggiungendo 1 (e troncando il risultato ad un intero) restituisce esattamente il numero di cifre del numero stesso.

Comunque atoi è di manica molto larga, se gli passi una stringa pura ti restituisce 0.

Potresti farti una funzione che legge la stringa al contrario un carattere per volta e aggiunge la quantità desiderata (se l'input corrente rappresenta un intero tra 0 e 9).

Ad esempio:

stringa="123"

leggo 3: aggiungo +003
leggo 2: aggiungo +020
leggo 1: aggiungo +100
-----------------------
totale: +123

Ad ogni passo del ciclo quello che fai è ricavarti il numero (se il carattere è tale) e usare un moltiplicatore che ad ogni passo del ciclo viene moltiplicato di 10 (supponendo che usiamo la rappresentazione in base 10).

Chiaramente devi gestire anche l'eventuale caso di overflow e numero negativo.

Se usi C++ direi senza dubbio di usare le eccezioni per gestire gli errori, così che se trovi un carattere che non rappresenta un numero lanci l'eccezione.

Questo giusto se ti piace reinventare la ruota, altrimenti devi ricorrere ad espedienti e trucchetti vari.

Capisco, ma pur essendo divertente, preferirei non reinventare la ruota rivolgendomi a qualche trucchetto. Il problema è che non ne conosco.
Qualche ideuzza?

WarDuck
08-11-2010, 18:02
Capisco, ma pur essendo divertente, preferirei non reinventare la ruota rivolgendomi a qualche trucchetto. Il problema è che non ne conosco.
Qualche ideuzza?

Beh le stringhe in C++ sono oggetti, quindi potresti usare il metodo .size() per poterti ricavare la lunghezza della stringa corrente ed eventualmente fare confronti usando il logaritmo del numero.

Esempio:


str = "5prova";

int n = atoi(&str); // ritorna 5

int cifre = (int)log10(abs(n)) + str[0]=='-' ? 2 : 1; // ritorna il logaritmo+1 del valore assoluto di n, se il valore è negativo infatti bisogna contare anche il segno

print cifre == str.size(); // 1 == 5 ? No. Stampa 0 ovvero False

zanardi84
09-11-2010, 09:37
Ho cercato un modo alternativo per controllare l'input e mi è venuto in mente ciò che riporto nel listato.

In poche parole, faccio l'atoi (che però non funziona e devo indagare il motivo, suggerite pure) su ogni singolo elemento della stringa e in base a quello decido se poseguire la scansione o inerromperla esortando al reinserimento.

int controllo_stringa (char stringa[])
{
int temp;
int i;
int dimensione;
int esito;

cout << "Digitare un numero" <<endl;
fgets ( stringa, 30, stdin );

dimensione = strlen(stringa);

while (esito != 0)
{
//da 0 a 9
if (dimensione ==1)
{
temp = atoi(stringa[0]);

//caso di inserimento dello 0
if (temp == 0 && dimensione[0] == 0)
{
esito = 0;
}
/*caso di inserimento di un carattere diverso da una
cifra*/
else if (temp == 0 && stringa[0] !=0 )
{
esito = 1;
}
//caso buono in cui il controllo è ok
else if (temp !=0)
{
esito == 0;
return temp;
}

}
//da 10 in poi
else if (dimensione >1)
{
for (i == 0; i <= dimensione; i++)
{
temp = atoi (dimensione[i];
//una delle cifre dopo la prima è 0 (10, 20, 30...110)
if (temp == 0 && stringa[i]==0 && i > 0)
{
esito = 0;
}
//una delle cifre non è una cifra, ma un carattere
else if (temp == 0 && stringa[i] != 0)
{
cout <<"Errore! ";
esito = 1;
break;
}
}
if (esito ==1)
{
cout << "Formato dell'input non accettato. Ridigitare"<<endl;
fgets ( stringa, 30, stdin );
}
}
return 1000;
}

Il return 1000 finale è provvisorio perchè al momento mi interessa capire se funziona la gestione degli errori. (e poi perchè non saprei come convertire la stringa, se corretta, in un numero :D ).

EDIT: La conversione finale è con l'atoi su tutta la stringa :D

WarDuck
09-11-2010, 10:37
Meno male che volevi fare le cose semplici :D

Io lo farei così:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int conv(const char* str)
{
int len = strlen(str);
int n = atoi(str);

int c = (int)log10(abs(n)) + (str[0] == '-' ? 2:1);

if (c!=len)
{
fprintf(stderr, "Error: string not represent an integer -> %s.\n", str);
exit(-1);
}

return n;
}

Questa funzione (è in C puro) chiaramente ti restituisce il numero se la stringa è valida, altrimenti ti da errore ed esce.

Ovviamente puoi modificare il codice all'interno dell'if per cambiargli il comportamento.

Comunque se il tuo scopo è trovare solo gli errori puoi fare anche così:


int check(const char* str)
{
int len = strlen(str);
if (len == 0) return 0;

for (int i=0; i<len; i++)
{
if (!isdigit(str[i])) return 0; // se trovi un carattere non numerico ritorna False
}

return 1; // fine della scansione senza uscire, ritorna True
}

##[esempio utilizzo]##

const char* str = "123a"

int n = 0;
if (check(str)) n = atoi(str);
...


Questi codici si possono adattare al caso di input da tastiera.

Poi le varianti possibili sono milioni, però forse non ho ben capito cos'è che devi fare.

zanardi84
09-11-2010, 10:49
Meno male che volevi fare le cose semplici :D

Io lo farei così:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int conv(const char* str)
{
int len = strlen(str);
int n = atoi(str);

int c = (int)log10(abs(n)) + (str[0] == '-' ? 2:1);

if (c!=len)
{
fprintf(stderr, "Error: string not represent an integer -> %s.\n", str);
exit(-1);
}

return n;
}

Questa funzione (è in C puro) chiaramente ti restituisce il numero se la stringa è valida, altrimenti ti da errore ed esce.

Ovviamente puoi modificare il codice all'interno dell'if per cambiargli il comportamento.

Comunque se il tuo scopo è trovare solo gli errori puoi fare anche così:


int check(const char* str)
{
int len = strlen(str);
if (len == 0) return 0;

for (int i=0; i<len; i++)
{
if (!isdigit(str[i])) return 0; // se trovi un carattere non numerico ritorna False
}

return 1; // fine della scansione senza uscire, ritorna True
}

##[esempio utilizzo]##

const char* str = "123a"

int n = 0;
if (check(str)) n = atoi(str);
...


Le varianti possibili sono milioni, però forse non ho ben capito cos'è che devi fare.

Non avevo pensato all'eventualità di usare isdigit!
Adesso mi studio un po' la situazione e vedo cosa implementare.

zanardi84
10-11-2010, 09:48
Stavo pensando che dovrei mettere un controllo sul numero di caratteri che digito nella stringa.
Esiste qualcosa di già pronto o devo inventarmi una ruota?

zanardi84
10-11-2010, 16:15
Scritta!

Che ve ne pare?

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int controllo_stringa (string stringa);

int converti_stringa (string stringa);

int main(int argc, char *argv[])
{
string input;
int esito;
int dato;
cout << "Digitare un numero" <<endl;
cin >> input;
esito = controllo_stringa(input);
while (esito ==1)
{
cout << "Formato non accettato, ripetere l'inserimento"<<endl;
cin >> input;
esito = controllo_stringa(input);

}

dato = converti_stringa(input);

cout << input << " per 10 = " <<dato*10<<endl;





system("PAUSE");
return EXIT_SUCCESS;
}

int controllo_stringa (string stringa)
{
int i;
int dimensione;

dimensione = stringa.length();

if (dimensione == 0)
{
return 1;
}

//un solo carattere
else if (dimensione == 1)
{
if(isdigit(stringa[0]))
{
return 0;
}
else
{
return 1;
}

}
//almeno due caratteri
else if (dimensione > 1)
{
//scansione stringa
for (i = 0; i < dimensione; i++)
{

if (!isdigit(stringa[i]) || stringa[0] == '0')
{
return 1;
break;
}
}

}
return 0;
}


int converti_stringa (string stringa)
{
char *vettore;
int lunghezza;
int numero;
lunghezza = stringa.length();

vettore = new char [lunghezza+1];

strcpy (vettore, stringa.c_str());

numero = atoi (vettore);

return numero;
}

Poi la inserirò in un contesto diverso e potrò espanderla nel caso in cui mi serviranno i numeri negativi!

zanardi84
11-11-2010, 17:04
Ho usato il post editato per insrire la funzione.
Si può migliorare ulteriormente?

zanardi84
16-11-2010, 10:47
Nuova puntata:
Voglio utilizzare le mie funzioni create per le stringhe in altre funzioni in un programma più corposo. Cosa mi consigliate di fare?

Creare un file header .h in modo da non doverle dichiarare o dichiararle e richiamarle nelle funzioni con dei puntatori?