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

dwa łanuchy znaków-zamiana

Ostatnio zmodyfikowano 2014-01-07 05:20
Autor Wiadomość
mateuszq
Temat założony przez niniejszego użytkownika
dwa łanuchy znaków-zamiana
» 2014-01-06 00:35:47
Witam,
pisze program który wczytuje dwa łańcuchy znaków a następnie tworzy trzeci który powstaje poprzez wstawienie na przemian znakow z dwóch łańcuchów wpisanych. napisałem funkcje jednak sprawdza sie ona tylko wtedy kiedy wpisane łanuchy sa równe, kiedy jeden jest dluzszy do trzeciego łanucha są wstawiane białe znaki. Może macie jakis pomysł jak temu zaradzić? Poniżej kod

C/C++
#include <iostream>
#include <conio.h>
#include<windows.h>

using namespace std;

const int n = 50;
char wyraz1[ n ], wyraz2[ n ], wyraz3[ n ];
int dlugosc1 = 0, dlugosc2 = 0;

void WprowadzZnaki();
void WyswietlZnaki();
void Sprawdzdlugosc();
void Zamiana();

void WprowadzZnaki() {
   
    cout << "Podaj wyraz pierwszy: ";
    cin.getline( wyraz1, n );
    cout << "Podaj wyraz drugi: ";
    cin.getline( wyraz2, n );
}

void WyswietlZnaki() {
   
   
    cout << "\nPierwszy podany wyraz:\t" << wyraz1 << endl;
    cout << "Drugi podany wyraz:\t" << wyraz2;
}

void Sprawdzdlugosc() {
   
    dlugosc1 = strlen( wyraz1 );
    dlugosc2 = strlen( wyraz2 );
   
    cout << "\n\nDlugosc wyrazu: " << wyraz1 << " wynosi:\t" << dlugosc1 << endl;
    cout << "Dlugosc wyrazu: " << wyraz2 << " wynosi:\t" << dlugosc2 << endl;
}

void Zamiana() {
   
    int suma = dlugosc1 + dlugosc2;
    int roznica = abs( dlugosc2 - dlugosc1 );
    int krotszy;
   
    cout << "\n\nSuma dlugosci wyrazow:\t" << suma;
    cout << "\nRoznica dlugosci wyraziw:\t" << roznica;
   
    if( dlugosc1 > dlugosc2 ) {
        krotszy = dlugosc2;
    }
    else {
        krotszy = dlugosc1;
    }
    for( int i = 0, k = 0; k < suma; i += 2, k++ ) {
        wyraz3[ i ] = wyraz1[ k ];
        wyraz3[ i + 1 ] = wyraz2[ k ];
    }
   
    cout << "\n\nWyraz trzeci po zamianie:\t";
    for( int i = 0; i < suma; i++ ) {
       
        cout << wyraz3[ i ];
       
    }
   
}



int main()
{
    WprowadzZnaki();
    WyswietlZnaki();
    Sprawdzdlugosc();
    Zamiana();
    getch();
    return 0;
}

Jeszcze jedno pytanie, dlaczego tak sie dzieje: Przypuścmy wprowadzam znaki do jednej z tablic np "wyraz1[n]" potem chce ją wyswietlić robie to poprostu w ten sposób
cout << wyraz1;
 w tym momencie wszystko jest ok łancuch znaków sie wyswietla.
Jednak kiedy przypisze już  znaki do tablicy powstałej z zamiany czyli "wyraz3" musze do wyświetlenia użyc np pętli for a nie zwykłego
cout << wyraz3;
 Dlaczego tak sie dzieje? Odpowiedz zapewne jest prosta a jednak nie wiem o co tu chodzi..
P-101321
alixir
» 2014-01-06 08:18:29
Po 1: zmienne globalne - katastrofa! Używaj parametrów funkcji.

Po 2:
int krotszy;
 zmienna poza przypisaniem jej wartości nie służy do niczego.

Po 3:
C/C++
const int n = 50;
char wyraz1[ n ], wyraz2[ n ], wyraz3[ n ];

int suma = dlugosc1 + dlugosc2;

for( int i = 0, k = 0; k < suma; i += 2, k++ ) {
    wyraz3[ i ] = wyraz1[ k ];
    wyraz3[ i + 1 ] = wyraz2[ k ];
}
jeśli wprowadzisz dwa łańcuchy o łącznej długości większej niż 50 znaków to wyjedziesz poza zakres trzeciego łańcucha!

Po 4: pętla uzyskuje dostęp do łańcuchów aż do znaku o numerze "suma" (chyba trochę za daleko). Może tu chciałeś użyć zmiennej "krotszy", a resztę dłuższego łańcucha dopisać poza pętlą.


Poprawiony kod (pewnie da się lepiej, ale też dopiero powtarzam sobie wiedzę)

C/C++
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

void WprowadzZnaki( std::string * wyrazy ) {
    cout << "Podaj wyraz pierwszy: ";
    getline( cin, wyrazy[ 0 ] );
    cout << "Podaj wyraz drugi: ";
    getline( cin, wyrazy[ 1 ] );
}

void WyswietlZnaki( std::string * wyrazy ) {
    cout << endl << "Pierwszy podany wyraz:\t" << wyrazy[ 0 ] << endl;
    cout << "Drugi podany wyraz:\t" << wyrazy[ 1 ] << endl;
}

int Sprawdzdlugosc( std::string * wyrazy ) {
    cout << endl << "Dlugosc pierwszego wyrazu wynosi:\t" << wyrazy[ 0 ].length() << endl;
    cout << "Dlugosc drugiego wyrazu wynosi:\t" << wyrazy[ 1 ].length() << endl;
    return( wyrazy[ 0 ].length() > wyrazy[ 1 ].length() ? 1
        : 0 );
}

void Zamiana( std::string * wyrazy, int krotszy ) {
    cout << endl << "Suma dlugosci wyrazow:\t" << wyrazy[ 0 ].length() + wyrazy[ 1 ].length() << endl;
    cout << "Roznica dlugosci wyrazow:\t" << abs( wyrazy[ 0 ].length() - wyrazy[ 1 ].length() ) << endl;
   
    std::string wyraz3 = "";
    int i;
    for( i = 0; i < wyrazy[ krotszy ].length(); i++ ) {
        wyraz3 += wyrazy[ 0 ][ i ];
        wyraz3 += wyrazy[ 1 ][ i ];
    }
    wyraz3.insert( i * 2, wyrazy[ abs( krotszy - 1 ) ], i, wyrazy[ abs( krotszy - 1 ) ].length() - i );
   
    cout << endl << "Wyraz trzeci po zamianie:\t" << wyraz3;
}

int main()
{
    std::string tWyrazy[ 2 ];
   
    WprowadzZnaki( tWyrazy );
    WyswietlZnaki( tWyrazy );
    Zamiana( tWyrazy, Sprawdzdlugosc( tWyrazy ) );
    getch();
    return 0;
}
P-101331
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-01-07 05:20:55
Wielkie dzięki za pomoc, konkretny komentarz :) Zgadzam się co do tego aby nie używać zmiennych globalnych, jednak zapomniałem dopisać ze program miał być bez użycia wskaźników i biblioteki string. Jeżeli chodzi o wyraz3, fakt tutaj omyłkowo nie zauważyłem pownienem dac stałą równa 100. Tak czy inaczej pomocny komenentarz poradziłem sobie :)
P-101491
« 1 »
  Strona 1 z 1