PDA

Visualizza la versione completa : [C++] Errore nella ripetizione del ciclo


Manuelandro
13-01-2006, 18:11
salve a tutti.

ho fatto (sudando :D ) questo script per eliminare da una stringa, tutti i caratteri uguali al carattere dato. Il programma funzione bene ma al momento di "Un altro giro?" quando scelgo di si, il programma va in tilt!Mi da "INSERISCI UNA STRINGA" ed "INSERISCI UN CARATTERE" insieme, e se provo a digitare qualcosa impazzisce completamente!!(come se creasse dei cicli infiniti)



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

using namespace std;
int elimina_carattere(char[], const char);
const int DIM = 100;


int elimina_carattere(char S[], const char X) {
int el=0, i=0;
int cont=0;
while(S[i]!='\0') {
if(S[i]==X) {
int j = i;
while(S[j]!='\0') {
S[j] = S[j+1];
j++;
}
cont ++; i--;
} i++;
} return cont;
}


int main() {
int esci = 1;
do{

char X;
char S[DIM];

cout << "INSERISCI UNA STRINGA" << endl;
cin.getline(S,DIM-1);
cout << "INSERISCI UN CARATTERE" << endl;
cin >> X;

char ris;

ris=elimina_carattere(S, X);
if(!ris) { cout << "NESSUN CARATTERE ELIMINATO" << endl; }
else { cout << ris << " CARATTERI ELIMINATI" << endl;
cout << "LA STRINGA RESTANTE E': " << S << endl; }



cout << "\n UN ALTRO GIRO? (Y=1,N=2)" << endl;
cin >> esci;
system("cls");
}
while(esci);

system("PAUSE");
return 0;
}


dov'è l'errore??
thx

zero85
13-01-2006, 18:55
Allora c'è un errore nel do while e una cosetta da sistemare:

il do while ripete il ciclo se la condizione è vera, mentre esce se è falsa. A questo punto bisogna sottolineare che nel c++ (e in tutti i linguaggi di programmazione) i valori diversi da 0 vengono interpretati come true e lo 0 come false.

Altra cosetta da sistemare è inserire un cin.ignore(1); dopo cin >> esci; questo perchè cin non esegue il flush dell stin come il getline e sull standard input rimane \n che viene dato in pasto al nuovo getline.

Altro problema la funzione elimina_carattere ritorna un intero, ma tu lo assegni a un char senza fare cast espliciti, cosa che non è ottimale ne per la leggibilità del codice che per la correttezza dello stesso

io correggerei così:



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

using namespace std;
int elimina_carattere(char[], const char);
const int DIM = 100;


int elimina_carattere(char S[], const char X) {
int el=0, i=0;
int cont=0;
while(S[i]!='\0') {
if(S[i]==X) {
int j = i;
while(S[j]!='\0') {
S[j] = S[j+1];
j++;
}
cont ++; i--;
} i++;
} return cont;
}


int main() {
int esci = 1;
do{

char X;
char S[DIM];

cout << "INSERISCI UNA STRINGA" << endl;
cin.getline(S,DIM-1);
cout << "INSERISCI UN CARATTERE" << endl;
cin >> X;

int ris;
ris = elimina_carattere(S, X);
if(!ris) { cout << "NESSUN CARATTERE ELIMINATO" << endl; }
else { cout << ris << " CARATTERI ELIMINATI" << endl;
cout << "LA STRINGA RESTANTE E': " << S << endl; }



cout << "\n UN ALTRO GIRO? (Y=1,N=0)" << endl;
cin >> esci;
cin.ignore(1);
system("cls");
}
while(esci);

system("PAUSE");
return 0;
}

Manuelandro
13-01-2006, 18:59
grazie :D

Samuele_70
13-01-2006, 19:18
Se posso intervenire, quelle variabili dichiarate nel ciclo
do...while() non mi piacciono per niente... :nonono: :D
Meglio spostarle all'inizio del blocco del main() dove si trova "int esci = 1;" :zizi:

zero85
13-01-2006, 19:22
Quoto si ha un ottimizzazione del programma maggiore: in questo modo ad ogni ciclo vengono dichiarate nuove variabili che incidono sulle risorse utilizzate

unomichisiada
14-01-2006, 00:21
Io invece non sono d'accordo! Trattandosi di C++ e non di C mi risulta che sia deprecato dichiarare le variabili tutte all'inizio e sia buona norma dichiararle quando servono.Questo può avere degli effetti negativi (irrisori direi) sulle prestazioni ma se ne avvantaggia la minore propensione agli errori del programma in quanto le variabili locali ad un while hanno scope limitato a quello e li bisogna cercare se c'è un errore.E' lo stesso principio riportato più in piccolo per cui le variabili globali sono sconsigliate (anche in C quelle)

Samuele_70
14-01-2006, 03:06
Originariamente inviato da unomichisiada
Io invece non sono d'accordo! Trattandosi di C++ e non di C mi risulta che sia deprecato dichiarare le variabili tutte all'inizio e sia buona norma dichiararle quando servono.Questo può avere degli effetti negativi (irrisori direi) sulle prestazioni ma se ne avvantaggia la minore propensione agli errori del programma in quanto le variabili locali ad un while hanno scope limitato a quello e li bisogna cercare se c'è un errore.E' lo stesso principio riportato più in piccolo per cui le variabili globali sono sconsigliate (anche in C quelle)

Non voglio sembrare insistente, ma definire le variabili
proprio all'interno di un ciclo...
Sinceramente non ne vedo una reale necessità, d'accordo lo scope limitato
che evita certi errori ma paradossalmente ne potrebbe
creare altri, di metti il caso :


{
int a=1
{
int a=2;
...
}
Qui a==1;

:confused:
Inoltre in un altro ipotetico programma che utilizzasse delle stringhe di tot
caratteri, e che cicli migliaia di volte si dichiarerebbero
variabili di continuo, quando si potrtebbe riutilizzare
benissimo sempre le medesime.
Potrei invece capire delle dichiarazioni sparse per il
codice, ma comunque sempre fuori dai cicli.
Scusami ma forse non riesco ancora ad uscire completamente
dalla logica del c :master:

unomichisiada
14-01-2006, 03:30
Originariamente inviato da Samuele_70
Non voglio sembrare insistente, ma definire le variabili
proprio all'interno di un ciclo...
Sinceramente non ne vedo una reale necessità, d'accordo lo scope limitato
che evita certi errori ma paradossalmente ne potrebbe
creare altri, di metti il caso :


{
int a=1
{
int a=2;
...
}
Qui a==1;

:confused:
Inoltre in un altro ipotetico programma che utilizzasse delle stringhe di tot
caratteri, e che cicli migliaia di volte si dichiarerebbero
variabili di continuo, quando si potrtebbe riutilizzare
benissimo sempre le medesime.
Potrei invece capire delle dichiarazioni sparse per il
codice, ma comunque sempre fuori dai cicli.
Scusami ma forse non riesco ancora ad uscire completamente
dalla logica del c :master:

No no se non sei d'accordo è giusto che tu sia insistente è un forum di DISCUSSIONE :zizi: .
Comunque io ho parlato di "dichiararle quando servono", effettivamente dentro ai cicli lo faccio rararamente anche io ,comunque direi che è il caso di trovare un compromesso tra questo caso estremo e l'altro diametralemente opposto di dichiarare tutto all'inizio.Io generalmente alloco subito prima di un ciclo se una variabile mi serve al suo interno.
Inoltre come al solito il buon senso deve essere il nostro faro e la nostra guida, se stiamo parlando di riallocare ad ogni iterazione uan misera variabile int direi che ce lo possiamo tranquillamente sempre permettere, altra cosa è reistanziare a ogni ciclo un oggetto di qualche kb.
Quello che hai postato tu non mi sembra un errore... :confused: ,anzi è chiarissimo il valore che deve avere a (il piùesterno )ed è chiarissimo che un errore nel suo contenuto non può essere stato causato all'interno del ciclo.

unomichisiada
14-01-2006, 03:37
Mi sono appena reso conto che stiamo andando OT, al limite apriamo un'altra discussione se hai altro da aggiungere in proposito. :ciauz:

Loading