Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Justowanie tekstu


maxisst

Rekomendowane odpowiedzi

Opublikowano

Jestem w trakcie kodowania programu, który ma wyrównywać wprowadzony doń tekst, tudzież wczytany z pliku do 120 znaków w linii.
Jeśli 120 znak to środek słowa, całe słowo leci do nowej linii i tak do końca. Potem brakująca ilość znaków ma być uzupełniana spacjami do 120 w każdej linii.

Aktualnie problemem jest dla mnie dzielenie tego tekstu na kolejne wiersze, większość trzyma się kupy, jest mniej niż 120, ale czasami znajduje się jakiś szalony, który ma kilka znaków więcej.
Od kilku godzin próbuję znaleźć błąd, lecz nie za bardzo mi to wychodzi. Daję cały kod i osobną funkcję, dopomóżcie :)

Funkcja

 

void justowanie(string tekst)

{

    string justed;

    int miejscespacji=0, x=1, y=0;

    cout << tekst;

    

    for(int i=0; i<tekst.length();i++)

    {

        

        if(x!=120 || i==0)

            justed+=tekst[i];

        if(x==120)

        {

            if(tekst[i]==' ')

            {

            justed+="\n";

            }

            else

            {

                justed.insert(miejscespacji,"\n");

                justed.erase(miejscespacji+1,1);

                x++;

            }    

        x=1;

        justed+=tekst[i];

        }    

        

        if(justed[i]==' ')

            miejscespacji=i;

        

        if(justed[justed.length()-1]==' ' && justed[justed.length()-2]=='\n')

        {

            justed.erase(justed.length()-1, 1);

            x--;

        }

        x++;

    }



    

    ofstream zapis;

    zapis.open("wyjustowany.txt");

    zapis << justed;

    zapis.close();

    }

 

 

 


Całość

 

 

#include <iostream>

#include <cstdlib>

#include <string>

#include <fstream>



using namespace std;



void justowanie(string tekst)

{

    string justed;

    int miejscespacji=0, x=1, y=0;

    cout << tekst;

    

    for(int i=0; i<tekst.length();i++)

    {

        

        if(x!=120 || i==0)

            justed+=tekst[i];

        if(x==120)

        {

            if(tekst[i]==' ')

            {

            justed+="\n";

            }

            else

            {

                justed.insert(miejscespacji,"\n");

                justed.erase(miejscespacji+1,1);

                x++;

            }    

        x=1;

        justed+=tekst[i];

        }    

        

        if(justed[i]==' ')

            miejscespacji=i;

        

        if(justed[justed.length()-1]==' ' && justed[justed.length()-2]=='\n')

        {

            justed.erase(justed.length()-1, 1);

            x--;

        }

        x++;

    }



    

    ofstream zapis;

    zapis.open("wyjustowany.txt");

    zapis << justed;

    zapis.close();

    }







bool start()

{

    int choose;

    cout <<"Program justuje tekst z pliku (.txt) o podanej nazwie, lub wczytany z klawiatury\n";

    system("pause"); system("cls");

    cout <<"Wczytac tekst z pliku, czy zostanie podany ?\n1.Z pliku.\n2.Podany.\nTwoj wybor: ";

    do{

    cin >> choose;

        if(!cin || choose!=1 && choose!=2)    

        {

            cout <<"\nPodaj poprawna liczbe: ";

            cin.clear();

            cin.sync();

        }

    }while(!cin || choose!=1 && choose!=2);

    system("pause"); system("cls");

    

    if(choose==1)

        return 1;

    else

        return 0;

}



void zpliku ()

{

    int choose;

    ifstream plik;

    string nazwapliku,tekst;

    

    do{

        cout <<"Podaj nazwe pliku (bez rozszerzenia), z ktorego wczytac tekst: ";

        cin >> nazwapliku;

        nazwapliku+=".txt";

        plik.open(nazwapliku.c_str());

        if(plik.is_open())

        {

            while(plik.good())

                {

                    getline(plik, tekst);

                }

            justowanie(tekst);

            choose=2;

        }

        else

        {

            cout <<"Problem z odczytem pliku. \nBrak pliku o takiej nazwie, lub plik nie jest plikiem .txt";

            cout <<"\n\n1.Podaj nazwe ponownie.\n2.Wyjdz.\n\nWybor: ";

            do{

            cin >> choose;

                if(!cin || choose!=1 && choose!=2)    

                {

                    cout <<"\nPodaj poprawna liczbe: ";

                    cin.clear();

                    cin.sync();

                }

            }while(!cin || choose!=1 && choose!=2);

        }

        system("pause"); system("cls");

    }while(!cin || choose==1 );

    

}



void stdstr()

{    

    string tekst;

    cout <<"Podaj tekst, ktory ma zostac wyjustowany: ";

    cin.clear();

    cin.sync();

    getline(cin, tekst);

    justowanie(tekst);

}







main()

{

    if(start())

        zpliku();

    else

        stdstr();

    

    return 0;

}

 

 

 

"The only person you should try to be better than is the person you were yesterday."

Opublikowano
Popatrz na część funkcji justowanie:

if (x == 120)
{
  if (tekst[i] == ' ') //!
  {
    justed += "\n";
  }
  else
  {
    justed.insert(miejscespacji, "\n");
    justed.erase(miejscespacji + 1, 1);
    x++;
  }
  x = 1;
  justed += tekst[i];
}
Instrukcja warunkowa if oznaczona wykrzyknikiem sprawdza, czy na określonej pozycji w zmiennej tekst nie ma spacji (co zapewne wiesz). Lecz zwróć uwagę, że jeśli będziesz "o kilka znaków do przodu", to może zostać postawiony znak nowej linii i w wierszu będzie za dużo znaków. Ponadto, będąc "o kilka znaków do przodu" w nowej linii, liczenie (zmienna x) rozpocznie się od początku - więc nadal będzie za dużo znaków.
 
Poniżej zamieszczam działającą wersję pętli w funkcji justowanie.

for (size_t i = 0; i < tekst.length(); i++)
{
  justed += tekst[i];   

  if (justed[i] == ' ')
    miejscespacji = i;

  if (x == 120)
  {
    justed[miejscespacji] = '\n';
    int old = justed.length();
    justed = justed.substr(0, miejscespacji + 1);
    i -= old - justed.length();
    x = 1;
    continue;
  }
  x++;
}

 

Opublikowano

 

Popatrz na część funkcji justowanie:

if (x == 120)
{
  if (tekst[i] == ' ') //!
  {
    justed += "\n";
  }
  else
  {
    justed.insert(miejscespacji, "\n");
    justed.erase(miejscespacji + 1, 1);
    x++;
  }
  x = 1;
  justed += tekst[i];
}
Instrukcja warunkowa if oznaczona wykrzyknikiem sprawdza, czy na określonej pozycji w zmiennej tekst nie ma spacji (co zapewne wiesz). Lecz zwróć uwagę, że jeśli będziesz "o kilka znaków do przodu", to może zostać postawiony znak nowej linii i w wierszu będzie za dużo znaków. Ponadto, będąc "o kilka znaków do przodu" w nowej linii, liczenie (zmienna x) rozpocznie się od początku - więc nadal będzie za dużo znaków.
 
Poniżej zamieszczam działającą wersję pętli w funkcji justowanie.

for (size_t i = 0; i < tekst.length(); i++)
{
  justed += tekst[i];   

  if (justed[i] == ' ')
    miejscespacji = i;

  if (x == 120)
  {
    justed[miejscespacji] = '\n';
    int old = justed.length();
    justed = justed.substr(0, miejscespacji + 1);
    i -= old - justed.length();
    x = 1;
    continue;
  }
  x++;
}

 

Wielkie dzięki, na samym końcu nawet myślałem, że mogę w pewnym momencie być za bardzo do przodu i to przez to, ale nie widziałem za nic w świecie gdzie...

Zabieram się za dalszą część kodu mam nadzieję, że już bez większych problemów ;)

 

"The only person you should try to be better than is the person you were yesterday."

Opublikowano

Aktualnie mam problem z pentlą, która dodaje spacje do każdego wiersza. Wydaje mi się, że jest napisana dobrze, ale pewnie się tylko wydaje.
Co działa nie tak, otóż wszystkie spacje dodawane są do miejsca 1wszej spacji, z założenia miało to działać w ten sposób, że jeśli pętla napotyka
miejsce ze spacją do dodaje w niej 1 spacje i szuka kolejnego miejsca.

 

for(int i=0; i<wiersze; i++)
    {
        dodac=120-justedtab[i].length()+1;
        for(int j=0; j<justedtab[i].length(); j++)
        {
            if(justedtab[i][j]==' ')
            {
                dodac--;
                justedtab[i].insert(j," ");
            }
            if(dodac<1)
                break;        
        }
    }



Tutaj cały kod:

#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>

using namespace std;

void justowanie(string tekst)
{
    string justed;
    int miejscespacji=0, x=1, wiersze=1;
    cout << tekst;
    
    for (size_t i = 0; i < tekst.length(); i++)
    {
      justed += tekst[i];   
    
      if (justed[i] == ' ')
        miejscespacji = i;
    
      if (x == 120)
      {
        justed[miejscespacji] = '\n';
        int old = justed.length();
        justed = justed.substr(0, miejscespacji + 1);
        i -= old - justed.length();
        x = 1;
        wiersze++;
        continue;
      }
      x++;
    }        
    
    string justedtab[wiersze];
    int y=0;
    for(int i=0; i<justed.length();i++)
    {
        justedtab[y]+=justed[i];
        if(justed[i]=='\n')
            y++;
    }
    
    int dodac=0;
    for(int i=0; i<wiersze; i++)
    {
        dodac=120-justedtab[i].length()+1;
        for(int j=0; j<justedtab[i].length(); j++)
        {
            if(justedtab[i][j]==' ')
            {
                dodac--;
                justedtab[i].insert(j," ");
            }
            if(dodac<1)
                break;        
        }
    }
    
    
    cout << wiersze;
    
    ofstream zapis;
    zapis.open("wyjustowany.txt");
    for(int i=0; i<wiersze; i++)
        zapis << justedtab[i];
    zapis.close();
    }



bool start()
{
    int choose;
    cout <<"Program justuje tekst z pliku (.txt) o podanej nazwie, lub wczytany z klawiatury\n";
    system("pause"); system("cls");
    cout <<"Wczytac tekst z pliku, czy zostanie podany ?\n1.Z pliku.\n2.Podany.\nTwoj wybor: ";
    do{
    cin >> choose;
        if(!cin || choose!=1 && choose!=2)    
        {
            cout <<"\nPodaj poprawna liczbe: ";
            cin.clear();
            cin.sync();
        }
    }while(!cin || choose!=1 && choose!=2);
    system("pause"); system("cls");
    
    if(choose==1)
        return 1;
    else
        return 0;
}

void zpliku ()
{
    int choose;
    ifstream plik;
    string nazwapliku,tekst;
    
    do{
        cout <<"Podaj nazwe pliku (bez rozszerzenia), z ktorego wczytac tekst: ";
        cin >> nazwapliku;
        nazwapliku+=".txt";
        plik.open(nazwapliku.c_str());
        if(plik.is_open())
        {
            while(plik.good())
                {
                    getline(plik, tekst);
                }
            justowanie(tekst);
            choose=2;
        }
        else
        {
            cout <<"Problem z odczytem pliku. \nBrak pliku o takiej nazwie, lub plik nie jest plikiem .txt";
            cout <<"\n\n1.Podaj nazwe ponownie.\n2.Wyjdz.\n\nWybor: ";
            do{
            cin >> choose;
                if(!cin || choose!=1 && choose!=2)    
                {
                    cout <<"\nPodaj poprawna liczbe: ";
                    cin.clear();
                    cin.sync();
                }
            }while(!cin || choose!=1 && choose!=2);
        }
        system("pause"); system("cls");
    }while(!cin || choose==1 );
    
}

void stdstr()
{    
    string tekst;
    cout <<"Podaj tekst, ktory ma zostac wyjustowany: ";
    cin.clear();
    cin.sync();
    getline(cin, tekst);
    justowanie(tekst);
}



main()
{
    if(start())
        zpliku();
    else
        stdstr();
    
    return 0;
}

"The only person you should try to be better than is the person you were yesterday."

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...