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

    consiglio su codice c++

    Allora devo fare un programma che legge da un file source.txt, in cui incollero un testo qualunque abbastanza lungo e anche con paragrafi ovviamente senza formattazione, il programma in questione deve prende ogni parola e ricopiarla sul file destinatario però sostituendo piu o meno due lettere a parola con un codice particolare di cui dispongo, io ho gia redatto un po di codice che funziona però non rispetta il limite di due lettere per parola, ma sostituisce tutte quelle che trova e di cui dispone del codice; Il programma è una bozza e non rispetta nessuna regola di velocita complessita, deve solo funzionare tanto è per un uso personale. Vi posto quello che ho fatto:

    http://www.megaupload.com/?d=FO4EFIC0

    Il codice come ho detto funziona e fa quello che deve fare solo che lo fa per tutte le lettere presenti nello switch, invece dovrei regolare la cosa per fare due lettere a parola, e per parole di due lettere magari solo una, avevo provata a fare dei sottocicli con contatore che si fermassero non appena si becca lo spazio ma il confronto con lo spazio non va proprio avete qualche idea?
    grazie in anticipo
    Pa007

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma perché non posti il codice (con i tag CODE) sul forum come fanno tutti ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    
    int main () {
    ifstream ingr ;
    ofstream usc ;
    ingr.open( "source.txt", ios::in);
    if (ingr.fail()) exit(-1);
    usc.open("dest.txt", ios::out);
    if (usc.fail()) exit(-1);
    char app;
    ingr.get(app);
    if (ingr.bad()) exit(-1);
    usc<<"<p style=\"text-align: justify;\"><font face=\"Arial\">";
    while (!ingr.eof())
    {
        switch(app){
        case 'b': {usc<<"&#1068";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'c': {usc<<"&#1089";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'e': {usc<<"&#1257";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'h': {usc<<"&#1211";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'i': {usc<<"&#1110";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'j': {usc<<"&#1112";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'k': {usc<<"&#312";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'm': {usc<<"&#1084";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'o': {usc<<"&#959";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'p': {usc<<"&#1088";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'r': {usc<<"&#1075";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 's': {usc<<"&#1109";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'u': {usc<<"&#965";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'v': {usc<<"&#957";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'w': {usc<<"&#969";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'x': {usc<<"&#1093";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case 'y': {usc<<"&#1199";
                   if (usc.bad()) exit(-1);
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   break;}
        case '\n': {usc<<"</font></p>"<<endl;
                    usc<<endl;
                   if (usc.bad()) exit(-1);
                   bool t=true;
                   while (t){
                   ingr.get(app);
                   if (ingr.bad()) exit( -1);
                   switch(app){
                        case '\n': t=true;
                        default: t=false;
                        }
                   }
                   usc<<"<p style=\"text-align: justify;\"><font face=\"Arial\">";
                   break;}
        default: {usc<<app;
                 if (usc.bad()) exit(-1);
                 ingr.get(app);
                 if (ingr.bad()) exit( -1);
                 break;
                }
    
        }
    }
    usc<<"</font></p>"<<endl;
    usc<<"<p style=\"text-align: justify;\"></p>"<<endl;
    usc<<"<p style=\"text-align: justify;\">fonte: webnews.it</p>"<<endl;
    usc<<"<p style=\"text-align: justify;\"></p>"<<endl;
    ingr.close();
    usc.close();
    }
    pensavo non si formattasse bene cmq è qui scusate
    Pa007

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Lo switch non è l'approccio giusto.

    Prima di tutto devi leggere dal file riga per riga e ottenere le singole stringhe.

    Dato che utilizzi C++ puoi usare un oggetto di classe

    string
    http://www.cplusplus.com/reference/string/string/

    ed eseguire uno "split" delle varie parole (puoi trovare parecchi esempi di split di frasi in C++ su google).

    In seguito, potrai lavorare con le singole parole per sostituire le due lettere con una

    replace
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    avevo provato a lavorare con la classe string, utilizzando la length e poi vedendo la stringa come vettore il problema che nel file mi ci ritrovavo poi anche i caratteri di fine stringa, e poi spittando la frase in parole non riuscirei a capire quando trovo il fine riga per poter mettere i tag no?
    Pa007

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non è il fine riga il problema ... quello lo togli prima di elaborare le parole.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    
    int main () {
    char o_letter[17];
    string n_letter[17];
    // dizionari li ho messi dentro le graffe per poterli chiudere nell'IDE
    {o_letter[0]='b';
    o_letter[1]='c';
    o_letter[2]='e';
    o_letter[3]='h';
    o_letter[4]='i';
    o_letter[5]='j';
    o_letter[6]='k';
    o_letter[7]='m';
    o_letter[8]='o';
    o_letter[9]='p';
    o_letter[10]='r';
    o_letter[11]='s';
    o_letter[12]='u';
    o_letter[13]='v';
    o_letter[14]='w';
    o_letter[15]='x';
    o_letter[16]='y'; }
    
    {n_letter[0]="&#1068";
     n_letter[1]="&#1089";
     n_letter[2]="&#1257";
     n_letter[3]="&#1211";
     n_letter[4]="&#1110";
     n_letter[5]="&#1112";
     n_letter[6]="&#312";
     n_letter[7]="&#1084";
     n_letter[8]="&#959";
     n_letter[9]="&#1088";
     n_letter[10]="&#1075";
     n_letter[11]="&#1109";
     n_letter[12]="&#965";
     n_letter[13]="&#957";
     n_letter[14]="&#969";
     n_letter[15]="&#1093";
     n_letter[16]="&#1199";
    
    }
    
    ifstream ingr ;
    ofstream usc ;
    ingr.open( "source.txt", ios::in);
    if (ingr.fail()) exit(-1);
    usc.open("dest.txt", ios::out);
    if (usc.fail()) exit(-1);
    usc<<"<p style=\"text-align: justify;\"><font face=\"Arial\">";
    string str;
    size_t found;
    ingr >> str;
    while (!ingr.eof())    
    {if (ingr.bad()) exit(-1);
     unsigned int sostituzioni, max_sosti;
     if (str.length()<=2)
        max_sosti=1;
     else
        max_sosti=2;
     sostituzioni=0;
     do{
     found=0;
     int i=0;
     for(; (i<16)&&((found==0)or(found==string::npos)); i++)      // string::npos viene messo su found quando non trova la stringa
         found=str.find(o_letter[i]);
     if (found!=string::npos) {str.replace(found,1,n_letter[i-1]);
                               sostituzioni++;
                              }
     else break;
     }while(sostituzioni<max_sosti);
     usc<<str<<" ";
     ingr >> str;
    }
    usc<<"</font></p>"<<endl;
    usc<<"<p style=\"text-align: justify;\"></p>"<<endl;
    usc<<"<p style=\"text-align: justify;\">fonte: webnews.it</p>"<<endl;
    usc<<"<p style=\"text-align: justify;\"></p>"<<endl;
    ingr.close();
    usc.close();
    return 0;
    }

    Ho riscritto il prog sempre senza classi però utilizzando le stringhe e del c++, devo dire che in effetti risulta molto meno confusionario, adesso il prog fa quasi quello che deve fare, in realtà funziona però ha due piccole pecche una che non capisco da cosa deriva e un altra che non mi sovviene come poterla gestire;
    la prima quella che non capisco da dove deriva riguarda il find, praticamente la sostituzione funziona sempre, tranne quando la lettera da sostituire è la prima della parola, praticamente le prime lettere delle parole non le trova mai, e in oltre se si mette una stringa con tante lettere uguali non li sostituisce tipo cccc mentre cccce sostituisce la e finale anche se in realtà dovrebbe sostituire le prime due c.
    Il dubbio invece che non trovo modo di risolvere è quello riguardante i paragrafi, praticamente il testo che inserisco ogni tanto più o meno tre o quattro volte a fine di un pò di frasi ha un ritorno carrello che delimita la fine del paragrafo, gestendo le stringhe parola per parola come faccio a catturare il ritorno carrello? anche perché oltre a non venirmi più i paragrafi non posso inserire i tag che mi servono alla fine e all'inizio del paragrafo.
    Pa007

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima di tutto, come fai a compilare questo codice con una

    or

    al suo interno? In C/C++ la OR è ||

    In secondo luogo, se found è uguale a 0 allora il carattere trovato è in prima posizione e lo devi trattare.

    Infine, non avrei fatto così questo programma ... è meglio avere una stringa di caratteri in cui cercare ogni carattere della stringa sorgente. Ad esempio, una sola stringa

    string lettere = "bcehijkmoprsuvwxy";

    e cerchi al suo interno ogni carattere di ogni parola.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Originariamente inviato da pa007
    consiglio su codice c++
    Invito a usare un titolo più significativo in futuro, come indicato nel Regolamento.

    Qui l'ho corretto io.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    
    int main () {
    char o_letter[17];
    string n_letter[17];
    
    {o_letter[0]='b';
    o_letter[1]='c';
    o_letter[2]='e';
    o_letter[3]='h';
    o_letter[4]='i';
    o_letter[5]='j';
    o_letter[6]='k';
    o_letter[7]='m';
    o_letter[8]='o';
    o_letter[9]='p';
    o_letter[10]='r';
    o_letter[11]='s';
    o_letter[12]='u';
    o_letter[13]='v';
    o_letter[14]='w';
    o_letter[15]='x';
    o_letter[16]='y'; }
    
    {n_letter[0]="&#1068";
     n_letter[1]="&#1089";
     n_letter[2]="&#1257";
     n_letter[3]="&#1211";
     n_letter[4]="&#1110";
     n_letter[5]="&#1112";
     n_letter[6]="&#312";
     n_letter[7]="&#1084";
     n_letter[8]="&#959";
     n_letter[9]="&#1088";
     n_letter[10]="&#1075";
     n_letter[11]="&#1109";
     n_letter[12]="&#965";
     n_letter[13]="&#957";
     n_letter[14]="&#969";
     n_letter[15]="&#1093";
     n_letter[16]="&#1199";
    
    }
    
    ifstream ingr ;
    ofstream usc ;
    ingr.open( "source.txt", ios::in);
    if (ingr.fail()) exit(-1);
    usc.open("dest.txt", ios::out);
    if (usc.fail()) exit(-1);
    usc<<"<p style=\"text-align: justify;\"><font face=\"Arial\">";
    string str;
    size_t found;
    while (!ingr.eof()){
         stringstream paragrafo;
         getline(ingr, str);
         paragrafo << str;
         if (ingr.bad()) exit(-1);
         while (!paragrafo.eof()){
             paragrafo >> str;
             unsigned int sostituzioni, max_sosti;
             if (str.length()<=2)
                max_sosti=1;
             else
                max_sosti=2;
             sostituzioni=0;
             do{
                found=string::npos;
                int i=0;
                for(; (i<17)&&(found==string::npos); i++)
                       found=str.find(o_letter[i]);
                if (found!=string::npos) {str.replace(found,1,n_letter[i-1]);
                                          sostituzioni++;
                                          }
                else break;
               }while(sostituzioni<max_sosti);
        usc<<str<<" ";
        }
    usc<<"</font></p>"<< endl;
    usc<<"<p style=\"text-align: justify;\"><font face=\"Arial\">";
    }
    usc<<"</font></p>"<<endl;
    usc<<"<p style=\"text-align: justify;\"></p>"<<endl;
    usc<<"<p style=\"text-align: justify;\">fonte: xxxxx.it</p>"<<endl;
    usc<<"<p style=\"text-align: justify;\"></p>"<<endl;
    ingr.close();
    usc.close();
    return 0;
    }
    Eccovi il codice definitivo con cui ho risolto il problema devo dire che alla fine non era cosi difficile e a grazie al sito http://www.cplusplus.com/reference/ non ci sono stato tanto, c'è davvero tutto.
    Mi scuso per il titolo poco esaustivo, devo scrivere Risolto adesso?
    Pa007

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.