Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c++]errore nella ripetizione del ciclo

    salve a tutti.

    ho fatto (sudando ) 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)

    codice:
    #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

  2. #2
    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ì:

    codice:
    #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;
    }

  3. #3

  4. #4
    Se posso intervenire, quelle variabili dichiarate nel ciclo
    do...while() non mi piacciono per niente...
    Meglio spostarle all'inizio del blocco del main() dove si trova "int esci = 1;"
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Quoto si ha un ottimizzazione del programma maggiore: in questo modo ad ogni ciclo vengono dichiarate nuove variabili che incidono sulle risorse utilizzate

  6. #6
    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)
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    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 :
    codice:
    {
       int a=1
       {
          int a=2;
          ...
       }
       Qui a==1;

    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:
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    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 :
    codice:
    {
       int a=1
       {
          int a=2;
          ...
       }
       Qui a==1;

    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 .
    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... ,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.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Mi sono appena reso conto che stiamo andando OT, al limite apriamo un'altra discussione se hai altro da aggiungere in proposito.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.