Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Program wypisujący wprowadzony z klawiatury tekst jak rozstrzelony

Ostatnio zmodyfikowano 2014-09-30 03:16
Autor Wiadomość
gienekmiecio
Temat założony przez niniejszego użytkownika
[C++] Program wypisujący wprowadzony z klawiatury tekst jak rozstrzelony
» 2014-09-29 20:15:46
Witam mam problem z dokładnością drugiej części pewnego zadania.
Zadanie:

Napisz program wypisujący wprowadzony z klawiatury tekst jak rozstrzelony w następujący sposób:
1) 2 znaki + 1 spacja
2) 3 znaki + 2 spacje (tekst czytany od końca)

PRZYKŁAD ROZWIĄZANIA:
Wpisany tekst>> "Ala ma kota."
Wypisany tekst w 1: "Al am ak ot a." Program daje spacje co 2 znaki.
Wypisany tekst w 2: "A lam ako ta." Program daje spacje od tyłu co 3 znaki.

Pierwszy podpunkt rozwiązałem, drugi w połowie. Dlaczego drugi w połowie? Program działa dobrze tylko na tekście wpisanym, którego ilość znaków jest podzielna przez 3 i nie oddaje reszty. Czyli dla tekstu "123456789" działa, ale już dla reszty dwa i jeden, "1234567" "12345678" występują błędy w odstępach. 
Jak to naprawić?

Napisałem program:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

int main() {
    cout << "Napisz krotkie zdanie:";
    string zdanie, x;
    int dlugosc = 0;
    getline( cin, zdanie );
    x = zdanie;
    dlugosc = x.length();
    cout << "Zdanie w postaci rozstrzelenia (2+spacja):" << endl;
    cout << ">>>";
    for( int i = 1; i < zdanie.length() + 1; i++ ) {
        if( zdanie[ i ] == ' ' ) {
            cout << "";
        }
        else {
           
            if( i % 3 == 2 ) {
                zdanie.insert( i, " " );
            } }
    }
    cout << zdanie;
    cout << "<<<" << endl;
    cout << "Zdanie w postaci rozstrzelenia (3+spacja od tylu):" << endl;
    cout << ">>>";
    int hhh = 0;
    for( int i = x.length() - 1; i >= 0; i-- ) {
        hhh = hhh +( dlugosc - 1 );
        if( zdanie[ i ] == ' ' ) {
            cout << "";
        }
        else {
            if( dlugosc - i == 3 ) {
                x.insert( i, " " );
            }
        }
    }
    for( int i = x.length() - 5; i >= 0; i-- ) {
        if( zdanie[ i ] == ' ' ) {
            cout << "";
        }
        else {
            if( i % 3 == 0 ) {
                x.insert( i, " " );
            }
            if( i % 3 == 1 ) {
                x.insert( i - 1, " " );
            }
            if( i % 3 == 2 ) {
                x.insert( i + 2, " " );
            }
           
        } }
    cout << x;
    cout << "<<<" << endl;
    return 0;
}



P-117761
stryku
» 2014-09-29 23:33:16
Nieważne. Można usuwać posty wgl?


P-117787
n3ssi
» 2014-09-30 03:16:45
Wykombinowałam coś takiego. Owszem działa, ale pewnie dałoby się zrobić to w lepszy sposób. Wklejam fragment kodu, może komuś się przyda.

 
C/C++
for( int i = 1; i < x.length() + 1; i++ ) {
    if( x[ i ] == ' ' ) {
        cout << "";
    }
    else {
        if( i % 4 == 3 ) { /*Tutaj zakladamy, ze co 3 znak wykona sie petla*/
            /*W 3 kolejnych ifach ustalamy reszte z podzialu dlugosci przez 3.
            Jest równa ilosci znakow przed pierwsza spacja. Wedlug zalozen tej petli,
            która wykonuje sie co 3 znaki - jestesmy obecnie na 3/6/9/12 itp. itd.
            znaku (zalezy od wielkosci zmiennej i.*/
            if(( dlugosc % 3 ) == 0 ) { /*reszta z dzielenia=ilosc znakow przed spacja=0*/
                x.insert( i, " " ); /*nie ma potrzeby wykonania przesuniecia*/
            }
            if(( dlugosc % 3 ) == 1 ) { /*reszta z dzielenia=ilosc znakow przed spacja=1*/
                x.insert( i - 2, " " ); /*domyslna ilosc znakow przed spacja=3, odejmujemy 2, by uzyskać 1 znak przed spacją*/
            }
            if(( dlugosc % 3 ) == 2 ) { /*reszta z dzielenia=ilosc znakow przed spacja=2*/
                x.insert( i - 1, " " ); /*domyslna ilosc znakow przed spacja=3, odejmujemy 1, by uzyskac 2 znaki przed spacja*/
            }
        }
    }
}
cout << x;
cout << "<<<" << endl;
return 0;
P-117791
« 1 »
  Strona 1 z 1