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

Coś namieszałem z funkcjami i wskaźnikami

Ostatnio zmodyfikowano 2016-12-09 21:02
Autor Wiadomość
Przems
Temat założony przez niniejszego użytkownika
Coś namieszałem z funkcjami i wskaźnikami
» 2016-12-09 17:14:37
Witam, dostałem do zrobienia takie oto zadanie:

"Program uruchamiamy z jednym parametrem, którym jest napis składający się wyłącznie z liter. Jeżeli użytkownik uruchomi program,
podając inną ilość parametrów, lub podany jako parametr napis zawiera znaki inne niż litery – należy wypisać odpowiedni komunikat i
zakończyć działanie programu.
Po uruchomieniu programu, na ekranie ma się pojawić menu zawierające podane niżej pozycje oraz zachętę do wybrania jednej z opcji:
1 – Zamiana wszystkich znaków w napisie na duże litery przykład: MojNapis  MOJNAPIS
2 – Zamiana wszystkich znaków w napisie na małe litery przykład: MojNapis  mojnapis
3 – Zamiana małych liter napisu na duże, a dużych na małe przykład: MojNapis  mOJnAPIS
4 – Lustrzane odbicie napisu przykład: MojNapis  sipaNjoM
5 – Pozostawienie napisu bez zmian przykład: MojNapis  MojNapis
Menu wraz z zachętą do podania opcji ma się pojawiać tak długo, aż użytkownik wybierze jedną z dostępnych opcji (jeśli źle wybierze
opcję – ponowne wyświetlamy menu i zachętę).
Zaimplementować 5 funkcji, które wykonują zadania 1-5. Każda z funkcji otrzymuje wskaźnik do analizowanego ciągu znaków oraz
zwraca wskaźnik do ciągu wynikowego. Deklaracja każdej z funkcji ma zatem postać: char* Funkcja(const char*);. W
zależności od wybranej przez użytkownika opcji – w programie głównym ma być wywoływana jedna z pięciu funkcji, a następnie
wyświetlany jest zwrócony przez wywołaną funkcję napis."

A oto moja realizacja tego programu:

C/C++
#include <stdio.h>
#include <stdlib.h>
#define MAX 20

char * duze( char * wyraz ) {
    int i;
    for( i = 0; i < dlugosc( wyraz ); i++ )
    if( wyraz[ i ] >= 97 && wyraz[ i ] <= 122 )
         wyraz[ i ] -= 32;
   
    return wyraz;
}

char * male( char * wyraz ) {
    int i;
    for( i = 0; i < dlugosc( wyraz ); i++ )
    if( wyraz[ i ] >= 65 && wyraz[ i ] <= 90 )
         wyraz[ i ] += 32;
   
    return wyraz;
}

char * nawzajem( char * wyraz ) {
    int i;
    for( i = 0; i < dlugosc( wyraz ); i++ ) {
        if( wyraz[ i ] >= 65 && wyraz[ i ] <= 90 )
             wyraz[ i ] += 32;
        else wyraz[ i ] -= 32;
       
    }
    return wyraz;
}

char * lustro( char * wyraz ) {
    int i, tmp;
    for( i = 0; i < dlugosc( wyraz ) / 2; i++ ) {
        tmp = wyraz[ i ];
        wyraz[ i ] = wyraz[ dlugosc( wyraz ) - i - 1 ];
        wyraz[ dlugosc( wyraz ) - i - 1 ] = tmp;
    }
    return wyraz;
}

int dlugosc( char * wyraz ) {
    int i;
    for( i = 0;; i++ )
    if( wyraz[ i ] == '\0' )
         break;
   
    return i;
}

int SprawdzamZnaki( char * wyraz ) {
    int i, a;
    for( i = 0; i < dlugosc( wyraz ); i++ ) {
        if((( int ) wyraz[ i ] >= 65 &&( int ) wyraz[ i ] <= 90 ) ||(( int ) wyraz[ i ] >= 97 &&( int ) wyraz[ i ] <= 122 ) )
             a = 1;
        else {
            a = 0;
            break;
        }
    }
    return a;
}

int Wybor( char * wyraz ) {
    int b;
    int * zwrocduze = duze( wyraz );
    int * zwrocmale = male( wyraz );
    int * zwrocnawzajem = nawzajem( wyraz );
    int * zwroclustro = lustro( wyraz );
    printf( "Co bys chcial zrobic?\n\n" );
    printf( "1 - Zamiana wszystkich znakow w napisie na duze litery (przyklad: MojNapis -> MOJNAPIS)\n" );
    printf( "2 - Zamiana wszystkich znakow w napisie na male litery (przyklad: MojNapis -> mojnapis)\n" );
    printf( "3 - Zamiana malych liter napisu na duze, a duzych na male (przyklad: MojNapis -> mOJnAPIS)\n" );
    printf( "4 - Lustrzane odbicie napisu (przyklad: MojNapis -> sipaNjoM)\n" );
    printf( "5 - Pozostawienie napisu bez zmian (przyklad: MojNapis -> MojNapis\n" );
    scanf( "%d", & b );
    switch( b )
    {
    case 1:
        printf( "%s", zwrocduze );
        break;
       
    case 2:
        printf( "%s", zwrocmale );
        break;
       
    case 3:
        printf( "%s", zwrocnawzajem );
        break;
       
    case 4:
        printf( "%s", zwroclustro );
        break;
       
    case 5:
       
        break;
       
    default:
       
        break;
    }
    return 0;
}

int main()
{
    char wyraz[ MAX + 1 ];
    printf( "Podaj wyraz (max %d znakow): ", MAX );
    scanf( "%20s", wyraz );
    if( SprawdzamZnaki( wyraz ) == 1 ) {
        Wybor( wyraz );
    }
    else {
        printf( "Podany ciag nie sklada sie z samych liter. ZEGNAM" );
        exit( 0 );
    }
    return 0;
}

Funkcja nr 4 (Lustrzane odbicie) działa po wyłączeniu dwóch pierwszych funkcji, w przeciwnym wypadku zwraca zamienione miejscami litery, ale np są one duże. Coś tu jest namieszane i za bardzo nie potrafię dojść co. Ktoś pomoże :)?
P-154685
mateczek
» 2016-12-09 17:56:13
kod wklejaj znaczniki
[cpp][/cpp][code]
co za sens ma pisanie "wybór" skoro nic nie robi. poza wyświetleniem napisu ??
P-154686
Przems
Temat założony przez niniejszego użytkownika
» 2016-12-09 18:13:22
Chciałem żeby to przejrzyściej w main wyglądało, ogólnie kod jeszcze jest do refaktoryzacji, ale narazie zaciąłem się z tym problemem który opisałem :/
P-154689
mateczek
» 2016-12-09 18:22:15
Tak osobiście to mnie do case coś odrzuca !!! Zwyczajnie nie lubię tej składni.

poprawiłem trochę kod
C/C++
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int dlugosc( char * wyraz ) {
    int i;
    for( i = 0;; i++ )
    if( wyraz[ i ] == '\0' )
         break;
   
    return i;
}

void duze( char * wyraz ) {
    int i;
    for( i = 0; i < dlugosc( wyraz ); i++ )
    if( wyraz[ i ] >= 97 && wyraz[ i ] <= 122 )
         wyraz[ i ] -= 32;
   
}

void male( char * wyraz ) {
    int i;
    for( i = 0; i < dlugosc( wyraz ); i++ )
    if( wyraz[ i ] >= 65 && wyraz[ i ] <= 90 )
         wyraz[ i ] += 32;
   
}

void nawzajem( char * wyraz ) {
    int i;
    for( i = 0; i < dlugosc( wyraz ); i++ ) {
        if( wyraz[ i ] >= 65 && wyraz[ i ] <= 90 )
             wyraz[ i ] += 32;
        else wyraz[ i ] -= 32;
       
    }
}

void lustro( char * wyraz ) {
    int i, tmp;
    for( i = 0; i < dlugosc( wyraz ) / 2; i++ ) {
        tmp = wyraz[ i ];
        wyraz[ i ] = wyraz[ dlugosc( wyraz ) - i - 1 ];
        wyraz[ dlugosc( wyraz ) - i - 1 ] = tmp;
    }
}


int SprawdzamZnaki( char * wyraz ) {
    int i, a;
    for( i = 0; i < dlugosc( wyraz ); i++ ) {
        if((( int ) wyraz[ i ] >= 65 &&( int ) wyraz[ i ] <= 90 ) ||(( int ) wyraz[ i ] >= 97 &&( int ) wyraz[ i ] <= 122 ) )
             a = 1;
        else {
            a = 0;
            break;
        }
    }
    return a;
}

void Wybor( char * wyraz ) {
    int b;
    printf( "Co bys chcial zrobic?\n\n" );
    printf( "1 - Zamiana wszystkich znakow w napisie na duze litery (przyklad: MojNapis -> MOJNAPIS)\n" );
    printf( "2 - Zamiana wszystkich znakow w napisie na male litery (przyklad: MojNapis -> mojnapis)\n" );
    printf( "3 - Zamiana malych liter napisu na duze, a duzych na male (przyklad: MojNapis -> mOJnAPIS)\n" );
    printf( "4 - Lustrzane odbicie napisu (przyklad: MojNapis -> sipaNjoM)\n" );
    printf( "5 - Pozostawienie napisu bez zmian (przyklad: MojNapis -> MojNapis\n" );
    scanf( "%d", & b );
    switch( b )
    {
    case 1:
        duze( wyraz );
        break;
       
    case 2:
        male( wyraz );
        break;
       
    case 3:
        nawzajem( wyraz );
        break;
       
    case 4:
        lustro( wyraz );
        break;
       
    case 5:
       
        break;
       
    default:
       
        break;
    }
    printf( "%s", wyraz );
}

int main()
{
    char wyraz[ MAX + 1 ];
    printf( "Podaj wyraz (max %d znakow): ", MAX );
    scanf( "%20s", wyraz );
    if( SprawdzamZnaki( wyraz ) == 1 ) {
        Wybor( wyraz );
    }
    else {
        printf( "Podany ciag nie sklada sie z samych liter. ZEGNAM" );
        exit( 0 );
    }
    return 0;
}
P-154690
Przems
Temat założony przez niniejszego użytkownika
» 2016-12-09 18:54:38
Dzięki :) działa świetnie, wiesz może na czym polegał konkretnie mój błąd? Coś było źle z tym że chciałem zwrócić wartość z funkcji?
P-154692
mateczek
» 2016-12-09 21:02:06
wywoływałeś wszystkie funkcje po kolei  i wszystkie na tej samej zmiennej
C/C++
int Wybor( char * wyraz ) {
    int b;
    int * zwrocduze = duze( wyraz ); // tu wyraz przerobiło na wielkie    
    int * zwrocmale = male( wyraz ); // tu wyraz przerobiło na małe  
    int * zwrocnawzajem = nawzajem( wyraz ); // ta funkcja dołożyła swoje
    int * zwroclustro = lustro( wyraz ); // i wynik działania tych trzech był wypisany od tyłu [/code]



i jeszcze taka propozycja  nie trzeba liczyć długości string co iterację. A zamiast liczb określających litery możesz tak
C/C++
void male( char * wyraz ) {
    int dif = 'a' - 'A';
    for( int i = 0; wyraz[ i ]; i++ ) {
        if( wyraz[ i ] >= 'A' && wyraz[ i ] <= 'Z' )
             wyraz[ i ] += dif;
       
    }
}
P-154701
« 1 »
  Strona 1 z 1