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:
#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 :)?