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

[C++][Statyczna tablica] Podwójne wypisanie pierwszego znaku po spacji

Ostatnio zmodyfikowano 2016-12-26 19:25
Autor Wiadomość
eXhaustedPL
Temat założony przez niniejszego użytkownika
[C++][Statyczna tablica] Podwójne wypisanie pierwszego znaku po spacji
» 2016-12-26 18:35:37
Witam Was wszystkich w ostatnim dniu świąt!

Otóż rozwiązuję sobie różne problemy w języku C++, jednak nie mogę sobie poradzić z jednym, zapewne banalnym problemem. Mianowicie jak wprowadzam jakieś zdanie, to mam to zdanie sformatować tak, że mają być wszystkie litery wielkie, mam wyświetlić pewien przedział liter zdania, zamienić jedno słowo na inne i każda pierwsza litera słowa (po spacji) ma być pisana majuskułą. I właśnie z tą majuskułą mam pewien problem, gdyż program mi wypisuje poprawnie pierwszą dużą literę słowa, a potem ją powtarza, tylko, że jest mała. Dajmy na to przykład:

Wpisuję: "JeSTem pioTReK i lubiEEE DZEM", a wychodzi: "Jestem Ppiotrek Ii Llubieee Ddzem".

Oto mój kod programu:

C/C++
#include <iostream>
#include <cstring>

using namespace std;

char przedzial( char zdanie[ 100 ], int P, int K )
{
    cout << "Od ktorej do ktorej litery ma byc wydrukowane zdanie? Wprowadz kolejno numery liter: ";
    cin >> P >> K;
    cout << endl << endl;
    cout << "To jest fragment zdania: ";
   
    for( int i = P - 1; i <= K - 1; i++ )
    {
        cout << zdanie[ i ];
    }
    return 0;
}

void zamiana_slowa( char * zdanie, char * do_zamiany, char * inne_slowo )

{
    char * wskaznik = zdanie;
   
    cout << "Jakie slowo chcialbys zmienic we wprowadzonym zdaniu?\nPodaj je, zachowujac pierwotna wielkosc liter: ";
    cin >> do_zamiany;
    cout << "Wprowadz nowe slowo, na ktore ma byc zastapione stare: ";
    cin >> inne_slowo;
   
    int dlugosc_starego = strlen( do_zamiany );
    int dlugosc_nowego = strlen( inne_slowo );
    do
    {
        wskaznik = strstr( zdanie, do_zamiany );
        if( wskaznik )
        {
            memmove( wskaznik + dlugosc_nowego, wskaznik + dlugosc_starego, strlen( wskaznik + dlugosc_starego ) + 1 );
            memcpy( wskaznik, inne_slowo, dlugosc_nowego );
        }
    }
   
    while( wskaznik );
   
}

char pierwsza_jest_wielka( char zdanie[ 100 ] )
{
    cout << "Teraz wypisze dla Ciebie to samo zdanie, ale tylko pierwsze litery kazdego slowa sa wielkie:" << endl;
   
    if( zdanie[ 0 ] >= 97 && zdanie[ 0 ] <= 122 )
    {
        zdanie[ 0 ] = toupper( zdanie[ 0 ] );
        cout << zdanie[ 0 ];
    }
    else cout << zdanie[ 0 ];
   
    for( int j = 1; j < strlen( zdanie ); j++ )
    {
        if( zdanie[ j ] == 32 && zdanie[ j + 1 ] >= 97 && zdanie[ j + 1 ] <= 122 )
        {
            zdanie[ j ] = zdanie[ j + 1 ];
            zdanie[ j ] = toupper( zdanie[ j ] );
            cout << " " << zdanie[ j ];
           
        }
        else if( zdanie[ j ] == 32 && zdanie[ j + 1 ] >= 65 && zdanie[ j + 1 ] <= 90 )
        {
            cout << " " << zdanie[ j + 1 ];
        }
        else if( zdanie[ j ] >= 97 && zdanie[ j ] <= 122 ) cout << zdanie[ j ];
       
        else if( zdanie[ j ] >= 65 && zdanie[ j ] <= 90 )
        {
            zdanie[ j ] = tolower( zdanie[ j ] );
            cout << zdanie[ j ];
        }
        else cout << zdanie[ j ];
       
    }
   
    return 0;
}

char tylko_wielkimi( char zdanie[ 100 ] )
{
    cout << "Natomiast to jest wprowadzone przez Ciebie zdanie, tylko, ze z duzych liter:" << endl;
    for( int i = 0; i < strlen( zdanie ); i++ )
    {
        if( zdanie[ i ] >= 65 && zdanie[ i ] <= 90 ) cout << zdanie[ i ];
        else if( zdanie[ i ] >= 97 && zdanie[ i ] <= 122 )
        {
            zdanie[ i ] = zdanie[ i ] - 32;
            cout << zdanie[ i ];
        }
        else cout << zdanie[ i ];
       
    }
   
    return 0;
}



main()
{
    cout << "Program, ktory drukuje tekst od numeru znaku P do numeru znaku K," << endl;
    cout << "zastepuje wszystkie male literki wielkimi, zastepujacy takze" << endl;
    cout << "pierwsze litery wszystkich slow takze wielkimi literami oraz" << endl;
    cout << "pozwalajacy zastapic wskazane slowo innym" << endl << endl;
   
    char zdanie[ 100 ], do_zamiany[ 30 ], inne_slowo[ 30 ];
    int P, K;
   
    cout << "Podaj zdanie: ";
    cin.getline( zdanie, 100 );
   
    cout << endl;
   
    cout << przedzial( zdanie, P, K );
   
    cout << endl << endl;
   
    zamiana_slowa( zdanie, do_zamiany, inne_slowo );
   
    cout << "A oto nowo powstale zdanie: ";
   
    cout << zdanie;
   
    cout << endl << endl;
   
    cout << tylko_wielkimi( zdanie );
   
    cout << endl << endl;
   
    cout << pierwsza_jest_wielka( zdanie );
   
    cout << endl;
   
    cin.get();
    return 0;
   
}

Natomiast to jest funkcja, odpowiadająca za pierwszą dużą literę słowa:

C/C++
char pierwsza_jest_wielka( char zdanie[ 100 ] )
{
    cout << "Teraz wypisze dla Ciebie to samo zdanie, ale tylko pierwsze litery kazdego slowa sa wielkie:" << endl;
   
    if( zdanie[ 0 ] >= 97 && zdanie[ 0 ] <= 122 )
    {
        zdanie[ 0 ] = toupper( zdanie[ 0 ] );
        cout << zdanie[ 0 ];
    }
    else cout << zdanie[ 0 ];
   
    for( int j = 1; j < strlen( zdanie ); j++ )
    {
        if( zdanie[ j ] == 32 && zdanie[ j + 1 ] >= 97 && zdanie[ j + 1 ] <= 122 )
        {
            zdanie[ j ] = zdanie[ j + 1 ];
            zdanie[ j ] = toupper( zdanie[ j ] );
            cout << " " << zdanie[ j ];
           
        }
        else if( zdanie[ j ] == 32 && zdanie[ j + 1 ] >= 65 && zdanie[ j + 1 ] <= 90 )
        {
            cout << " " << zdanie[ j + 1 ];
        }
        else if( zdanie[ j ] >= 97 && zdanie[ j ] <= 122 ) cout << zdanie[ j ];
       
        else if( zdanie[ j ] >= 65 && zdanie[ j ] <= 90 )
        {
            zdanie[ j ] = tolower( zdanie[ j ] );
            cout << zdanie[ j ];
        }
        else cout << zdanie[ j ];
       
    }
   
    return 0;
}

Najlepsze, że w tym wszystkim wiem, że w pętli odwołuję się do j-tego elementu tablicy i j+1-elementu oraz je wypisuję. Jednak kompletnie nie mam już pomysłu co mógłbym zrobić by "przeskoczyć" o jeden znak dalej w tablicy, nie badając go ponownie. Czy mam tutaj jakąś dodatkową pętle w pętli zamieścić, czy jakoś odpowiednio rozbudować warunek? Próbowałem wszystkiego, co mi przyszło do głowy, niestety jednak z marnym skutkiem.

Z góry dziękuję Wam za pomoc! :)
P-155458
mokrowski
» 2016-12-26 19:06:31
Wbrew pozorom pytania nie są złośliwe.
Stosujesz cstring bo:
1. Tak chcesz i nie wiesz że można inaczej
2. Tak kazali.
3. Takie są wymagania aplikacji.

W zależności od tego co odpowiesz, inna będzie sugestia :-)
P-155460
j23
» 2016-12-26 19:25:29
1. Co to za "magiczne liczby" w warunkach?
2. strlen w warunku pętli to zuo!
3. Do rozwiązywania takich problemów idealnie nadaje się debugger.
4. Przekombinowałeś. Twojego kodu nawet nie analizowałem, ale funkcję można zredukować do:
C/C++
size_t n = strlen( zdanie );

char ch = 0;

for( size_t i = 0; i < n; ++i )
{
    if( ch == ' ' || ch == 0 ) ch = toupper( zdanie[ i ] );
    else ch = tolower( zdanie[ i ] );
   
    std::cout << ch;
}
P-155461
« 1 »
  Strona 1 z 1