Obracanie napisów

0

Witam. Mam do rozwiązania pewien problem. Mianowici mam wczytać z pliku do 100 wersów tekstu nie dłuższego niż 100 znaków i wypisać te wersy od ostatniego do pierwszego, pionowo.

Przykładowe wejście:

1234
1234567

Przykładowe wyjście:

11
22
33
44
5*
6*
7*

Gdzie zamiast gwiazdek (*) mają być spacje. Nie bardzo wiem jak wypełnić pozostałą część wersu spacjami...

Próbowałem jakoś forem od 0 do długości najdłuższego wersu, ale nie mogę sobie z tym poradzić.

Na początek pomińmy wypisywanie w pionie. Chciałbym prosić o pomoc w uzupełnianiu wersów spacjami.

Do tej pory mam coś takiego:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <conio.h>

using namespace std;

int main()
{
    int i=1;
    int max=0;
    string s[100]={};
    bool sprawdz[100]={};

    getline(cin, s[0]);
    max=s[0].length();

    while(!cin.eof())
    {
        getline(cin, s[i]);;
        i++;
    }


    for (int j=0; j<i; j++)
        {

            if (s[j].length() < s[j+1].length())
                {
                    max=s[j+1].length();
                }
        }


    cout << "Dlugosc najdluzszego wiersza wynosi: " << max << endl;

    for (int k=i-1; k>=0; k--)
    {

        for (int l=0; l< max ; l++)
        {
            if (s[k][l])
            cout << s[k][l];

            else
            cout << "*";
        }

    cout << endl;

    }






    return 0;
}

 
0
  1. znajdź najkrótszy oraz najdłuższy wiersz
  2. for(int i = 0; i < najkrotszy_wiersz; i++) <- wyswietlasz liczby
  3. for(int i = najkrotszy; i < najdluzszy; i++) <- wyswietlasz pozostale znaki (z najdluzszego wiersza) i dopisujesz spacje.

sprawa jest trudniejsza dla więcej niż 2 wersy, trzeba pewien algorytm ułożyć rozpisz sobie na kartce i zobacz

0

Zrobiłem nieco inaczej. Tyle, ze wyswietla mi za duzo o jeden wiersz... Nie moge sie z tym uporac :)

 #include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <conio.h>

using namespace std;

int main()
{
    int i=1;
    int l=0;
    int max=0;
    string s[100]={};
    int eol=0;
    bool sprawdz[1000]={};

    getline(cin, s[0]);
    max=s[0].length();

    while(!cin.eof())
    {
        getline(cin, s[i]);
        i++;
    }


    /*for (int j=0; j<i; j++)
        {

            if (s[j].length() < s[j+1].length())
                {
                    max=s[j+1].length();
                }
        }


    cout << "Dlugosc najdluzszego wiersza wynosi: " << max << endl;*/



    while(eol<i)
    {

    for (int k=i-1; k>=0; k--)
    {

            if (s[k][l] == '\0')
            {

                if (!sprawdz[k])
                {
                    sprawdz[k]=1;
                    eol++;
                    cout << "#";
                }
                else
                    cout<<"+";
            }
            else
                {
                if (sprawdz[k])
                    cout<<"*";
                else
                    cout<<s[k][l];
                }
    }
    l++;
    cout << endl;

    }

   return 0;
}

Dla wejścia:

pierwsze zdanie
drugie zdanie
trzecie najdluzsze zdanie
123456789123456789012345678909

mam wyjscie:

1tdp
2rri
3zue
4egr
5ciw
6ies
7e z
8 ze
9nd
1aaz
2jnd
3dia
4len
5u#i
6z+e
7s*#
8z**
9e**
0 ++
1z++
2d**
3a**
4n**
5i+*
6e**
7#+*
8+*+
9+++
0***
9***
#***

Chcialbym sie pozbyc tego ostatniego
#***

1

to jest źle :

    while(!cin.eof())
    {
        getline(cin, s[i]);
        i++;
    }

Powinno być:

    while(getline(cin, s[i]))
        i++;

Wypisywanie jest przekombinowane. Najlepiej podczas wczytywania wyznaczyć maksymalną długość wierszy wejściowych i trzymać w "max".

for(int w=0; w<max ;++w)
{
     for(int k=0; k<i; ++k)
     {
          if (s[k].size()>w)
               cout << s[k].at(w);
          else
              cout << " ";
     }
    cout << endl;
}

Sam sobie popoprawiaj indeksy, bo nie będę dawał gotowca.

0
MarekR22 napisał(a)

to jest źle :

    while(!cin.eof())
    {
        getline(cin, s[i]);
        i++;
    }

Powinno być:

    while(getline(cin, s[i]))
        i++;

Wypisywanie jest przekombinowane. Najlepiej podczas wczytywania wyznaczyć maksymalną długość wierszy wejściowych i trzymać w "max".

for(int w=0; w<max ;++w)
{
     for(int k=0; k<i; ++k)
     {
          if (s[k].size()>w)
               cout << s[k].at(w);
          else
              cout << " ";
     }
    cout << endl;
}

Sam sobie popoprawiaj indeksy, bo nie będę dawał gotowca.

Dzięki. Co prawda uporałem się po swojemu. Ale + dla Ciebie za fatyge i lepsze rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1