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

[c++] Program oparty na C-stringach, z wykorzystaniem wskaźników.

Ostatnio zmodyfikowano 2013-06-26 14:14
Autor Wiadomość
Nindix
Temat założony przez niniejszego użytkownika
[c++] Program oparty na C-stringach, z wykorzystaniem wskaźników.
» 2013-06-25 22:44:55
Witam. Mam pewien problem.
Posiadam program który wykonuje 3 rzeczy :
- przeplatanie C-stringu wybranym przez użytkownika znakiem,
- usuwanie z C-stringu samogłosek,
- usuwanie z C-stringu spółgłosek.

Mój problem polega na tym że ta ostatnia rzecz nie działa do końca poprawnie, ponieważ usuwa wszystkie spółgłoski prócz 'r'. Zdołałem zauważyć także, że w ostatnim wyrazie mojego C-stringu spółgłoska 'r' została usunięta poprawnie. Jest ona umieszczona na początku wyrazu, może to dlatego. Proszę o pomoc.

C/C++
// tekster.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void f_Share( char * tablica, char znak );
void f_Remove_vowel( char * tablica, char * tablica2 );
void f_Remove_consonant( char * tablica, char * tablica2 );
char vowel[ 14 ] = { "aeyuioAEYUIO" };
char consonant[ 42 ] = { "rqwtpsdfghjklzxcvbnmQWRTPSDFGHJKLZXCVBNM" };
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

int _tmain( int argc, _TCHAR * argv[] )
{
   
    char napis[ 80 ] = { "Maly program mojej roboty" };
    char znak;
    cout << "Jakimi znakami chcesz przedzielic moj napis ? - : ";
    cin >> znak;
   
    f_Share( napis, znak );
    f_Remove_vowel( napis, vowel );
    f_Remove_consonant( napis, consonant );
    cout << endl;
    system( "pause" );
    return 0;
}
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void f_Share( char * tablica, char znak )
{
    cout << endl;
   
    while( * tablica )
    {
        cout << *( tablica++ ) << znak;
    }
   
    cout << endl;
   
}
void f_Remove_vowel( char * tablica, char * tablica2 )
{
    cout << endl;
   
    while( * tablica )
    {
        int i;
        for( i = 0; i < 14; i++ )
        {
            if( * tablica == * tablica2++ )
            {
                * tablica++;
            }
        }
        tablica2 = & vowel[ 0 ];
        cout << *( tablica++ );
    }
   
    cout << endl;
}

void f_Remove_consonant( char * tablica, char * tablica2 )
{
    cout << endl;
   
    while( * tablica )
    {
        int i;
        for( i = 0; i < 42; i++ )
        {
            if( * tablica == * tablica2++ )
            {
                * tablica++;
            }
        }
        tablica2 = & consonant[ 0 ];
        cout << *( tablica++ );
    }
   
    cout << endl;
}
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
P-86187
pekfos
» 2013-06-26 13:03:09
Funkcja f_Remove_consonant jest źle napisana, bo może wyświetlać znaki, które powinna usunąć, bo po przejściu całej tablicy spółgłosek i tak wyświetlasz znak.
Najlepiej użyj funkcji strchr() z biblioteki standardowej, do sprawdzania, czy dany znak należy do c-stringa ze spółgłoskami.
» standard Cstrchr
P-86196
Nindix
Temat założony przez niniejszego użytkownika
» 2013-06-26 14:14:30
Miałeś racje, ta funkcja i tak wyświetlała te znaki. O ile w pierwszej funkcji było to poprawne ponieważ spółgłoski się przeplatały ze samogłoskami, to o tyle tu już to nie mogło działać. Dzięki za pomoc. Wolałem jednak nie stosować tej funkcji bibliotecznej. A tak to wyszło :
C/C++
// tekster.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void f_Share( char * tablica, char znak );
void f_Remove_vowel( char * tablica, char * tablica2 );
void f_Remove_consonant( char * tablica, char * tablica2 );
char vowel[ 14 ] = { "aeyuioAEYUIO" };
char consonant[ 42 ] = { "rqwtpsdfghjklzxcvbnmQWRTPSDFGHJKLZXCVBNM" };
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

int _tmain( int argc, _TCHAR * argv[] )
{
   
    char napis[ 80 ] = { "Maly program mojej roboty" };
    char znak;
    cout << "Jakimi znakami chcesz przedzielic moj napis ? - : ";
    cin >> znak;
   
    f_Share( napis, znak );
    f_Remove_vowel( napis, vowel );
    f_Remove_consonant( napis, consonant );
    cout << endl;
    system( "pause" );
    return 0;
}
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void f_Share( char * tablica, char znak )
{
    cout << endl;
   
    while( * tablica )
    {
        cout << *( tablica++ ) << znak;
    }
   
    cout << endl;
   
}
void f_Remove_vowel( char * tablica, char * tablica2 )
{
    cout << endl;
   
    while( * tablica )
    {
        bool nst = false;
        int i;
        for( i = 0; i < 14; i++ )
        {
            if( * tablica == * tablica2++ )
            {
                * tablica++;
                nst = true;
            }
        }
        tablica2 = & vowel[ 0 ];
        if( !nst ) cout << *( tablica++ );
       
    }
   
    cout << endl;
}

void f_Remove_consonant( char * tablica, char * tablica2 )
{
    cout << endl;
   
    while( * tablica )
    {
        bool nst = false;
        int i;
        for( i = 0; i < 42; i++ )
        {
            if( * tablica == * tablica2++ )
            {
                * tablica++;
                nst = true;
            }
           
        }
        tablica2 = & consonant[ 0 ];
        if( !nst ) cout << *( tablica++ );
       
    }
   
    cout << endl;
}
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
P-86210
« 1 »
  Strona 1 z 1