Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429

    [C++] Giustificazione del testo

    Ho scritto questo programma (assai grezzo) pre giusitifcare del testo, solo che mandandolo in esecuzione, una volta che ho scritto il testo di una riga e premo invio, invece di passare alla scrittura della riga successiva chiude la schermata del DOS e termina il programma, che invece dovrebbe terminare, dato il mio ciclo, inserendo il carattere '*' .
    Ecco il programma:

    codice:
    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    
    void clear_buffer(), giustifica();
    const int n=5;
    int i;
    char testo[80], testo2[80];
    
    int main(){
        cout<<"Inserire il testo (Premere * per terminare):\n\n";
        i=0;
        do{
            cin.get(testo,80,'\n');
            clear_buffer();
            if(testo[0] != '*')
                 giustifica();
            i++;
        }while((i<n)&&(testo[0]!='*'));
        getch();
        return 0;
    }
    
    void clear_buffer(){
          char car;
          do{
              car=cin.get();
          }while(car != '\n');
    }
    
    void giustifica(){
          int j, conta_caratteri, conta_parole, num_spazi, spa_ins, k, l;
          // conteggio dei caratteri e delle parole
          for(j=0;j<80;j++){
               if(testo[j]!=' ')
                   conta_caratteri++;
               else
                   conta_parole++;
          }
          // determ. spazi
          num_spazi=80-conta_caratteri;
          spa_ins=conta_parole/num_spazi;
          // inserimento spazi
          k=0;
          while(testo[k]!='\n'){
                  if(testo[k]==' '){
                       l=0;
                       while(l<spa_ins){
                              testo2[k+l]=' ';
                              l++;
                       }
                   }
                   else
                       testo2[k]=testo[k];
                   k++;
           }
    }

    Uso Dev-C++....sarà ò'istruzione cin.get???
    Perchè facendolo a scuola in lab, con il turbo-c++ funzionava...

  2. #2
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Ehm....nessuno può aiutarmi???

  3. #3
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Scusate i tre post di fila ma qui nessuno mi aiuta e io nn so come fare...almeno ditemi che nn sapete come fare che mi metto l'animo in pace

  4. #4
    invece di cin.get , prova a utilizzare getchar ()
    Vinum dolce gloriosum
    pingue facit et carnosum
    Vinum forte,vinum purum
    reddit hominem securum

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    14
    credi che l'errore principale sia il fatto che cin.get() esclude il carattere '\n' nel suo input, cosa invece necessaria nella funzione giustifica().

    Ci sono poi altri piccoli errori, per esempio le dichiarazioni non rispettano del tutto l'ANSI; infatti andrebbero fatte in questo modo :
    #include <cstdio>
    /* per quanto riguarda le librerie del C che vuoi usare nel C++*/

    #include <iostream>
    /* Librerie del C++, inoltre devi anche definire il namespace std attraverso l'istruzione using namespace std.*/

    Altro errore nella funzione giustifica sta nel fatto che la stringa testo2 non termina con un carattere '\0'

  6. #6
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Ho provato a mettere le librerie da te indicate, ma lo stesso nn va, anche con getchar().
    Ecco il programma:

    codice:
    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <cstdio> 
    #include <iostream>
    
    void clear_buffer(), giustifica();
    const int n=5;
    int i;
    char testo[80], testo2[80];
    
    int main(){
        cout<<"Inserire il testo (Premere * per terminare):\n\n";
        i=0;
        do{
            getchar(testo,80,'\n');
            clear_buffer();
            if(testo[0] != '*')
                 giustifica();
            i++;
        }while((i<n)&&(testo[0]!='*'));
          for(i=0;i<80;i++)
           cout<<testo2[i] ;
        getch();
        return 0;
    }
    
    void clear_buffer(){
          char car;
          do{
              car=getchar();
          }while(car != '\n');
    }
    
    void giustifica(){
          int j, conta_caratteri, conta_parole, num_spazi, spa_ins, k, l;
          // conteggio dei caratteri e delle parole
          for(j=0;j<80;j++){
               if(testo[j]!=' ')
                   conta_caratteri++;
               else
                   conta_parole++;
          }
          // determ. spazi
          num_spazi=80-conta_caratteri;
          spa_ins=conta_parole/num_spazi;
          // inserimento spazi
          k=0;
          while(testo[k]!='\n'){
                  if(testo[k]==' '){
                       l=0;
                       while(l<spa_ins){
                              testo2[k+l]=' ';
                              l++;
                       }
                   }
                   else
                       testo2[k]=testo[k];
                   k++;
           }
    }
    Così scritto,mandandolo in esecuzione, scritta una riga e premendo invio, la schermata del DOS si chiude...come devo fare?
    Potreste illustrarmi una versione del programma che funzioni?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    14
    guarda così dovrebbe funzionare un po meglio (è una risposta frettolosa quindi non so se funziona) :
    codice:
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    // #include <cconio>
    #include <cstdlib>
    
    using namespace std;
    
    void clear_buffer(), giustifica();
    const int n=5;
    int i;
    char testo[80], testo2[200];
    
    int main(){
        cout<<"Inserire il testo (Premere * per terminare):\n\n";
        i=0;
        do{
            cin.get(testo,79,'\n');
    	testo[strlen(testo) + 1] = '\n';
            clear_buffer();
            if(testo[0] != '*')
                 giustifica();
            i++;
        }while((i<n) && (testo[0]!='*'));
        // getch();
        
        cout << "\n\ntesto2: " <<  testo2 << endl;
        
        return 0;
    }
    
    void clear_buffer(){
          char car;
          do{
              car=cin.get();
          }while(car != '\n');
    }
    
    void giustifica(){
          int j, conta_caratteri=0, conta_parole=1, num_spazi, spa_ins, k, l;
          
          // conteggio dei caratteri e delle parole
          for(j=0;j<80;j++){
               if(testo[j]!=' ')
                   conta_caratteri++;
               else
                   conta_parole++;
          }
          
          // determ. spazi
          num_spazi=80-conta_caratteri;
          spa_ins= conta_parole/num_spazi;
          
          // inserimento spazi
          k=0;
          while(testo[k]!='\n'){
                  if(testo[k]==' '){
    		    l=0;
    		    do{
    			testo2[k+l]=' ';
    			l++;
    		    }while(l < spa_ins);
    		    k += l;
                   }
                   else
                       testo2[k]=testo[k];
    	       k++;
          }
        testo2[k] = '\0';
    }

  8. #8
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    No nn funziona correttamente...cmq ho aggiutno qualcosa e adesso comincia a funzionare, più o meno...
    In effetti se io scrivo:

    codice:
    a b
    Devo vedere visualizzato un testo giustificato in modo tale da ottenere:

    codice:
    a                                                                           b
    Ma è nella determinazione degli spazi che nn funziona qualcosa...ci sto sbattendo troppo la testa e sto un pò fuso...se come determinazione degli spazi da inserire tra una parola e l'altra facessi: spa_ins=80-conta_caratteri la cosa potrebbe anche funzionare se io scrivessi due parole da un carattere ciascuna, cioè a b ma per gli altri casi no....come li posso determinare?

    Questa è l'ultima versione:

    codice:
    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    
    
    void clear_buffer(), giustifica();
    const int n=5;
    int i;
    char testo[80], testo2[80];
    
    int main(){
        cout<<"Inserire il testo (Premere * per terminare):\n\n";
        i=0;
        do{
    	cin.get(testo,80,'\n');
            clear_buffer();
            if(testo[0] != '*')
                 giustifica();
            i++;
        }while((i<n)&&(testo[0]!='*'));
        for(i=0;i<80;i++)
           cout<<testo2[i] ;
        getch();
        return 0;
    }
    
    void clear_buffer(){
          char car;
          do{
    	  car=cin.get();
          }while(car != '\n');
    }
    
    void giustifica(){
          int s=0, j, conta_caratteri=0, conta_parole=0, num_spazi, spa_ins, k, l;
          // conteggio dei caratteri e delle parole
          j=0;
          while(testo[j]!='\0'){
    	   if(testo[j]!=' ')
    	       conta_caratteri++;
    	   if(((testo[j]==' ')&&(testo[j+1]!=' ')||(testo[j+1]=='\0')))
    	       conta_parole++;
    	   j++;
          }
          // determ. spazi
          num_spazi=80-conta_caratteri;
          spa_ins=num_spazi/conta_parole;
          // inserimento spazi
          k=0;
          l=0;
          while(testo[k]!='\0'){
    	      if(testo[k]==' '){
    		   l=0;
    		   while(l<spa_ins){
    			  testo2[k+s]=' ';
    			  l++;
    			  s++;
    		   }
    		   s--;
    	       }
    	       else
    		   testo2[k+s]=testo[k];
    	       k++;
           }
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.