• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Duże na małe || Małe na duże

Object Storage Arubacloud
0 głosów
683 wizyt
pytanie zadane 13 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

Cześć

Mam problem z zadaniem o następującej treści:

Napisz funkcję, która będzie zamieniała wszystkie litery w przekazanym tekście na małe lub duże. Do zamiany litery na małą użyj funkcji to_lower, a na dużą to_upper - jeżeli modyfikacja nie będzie możliwa, funkcje powinny zwrócić przekazaną wartość.

Funkcje powinny mieć następujące prototypy:

char* change_letter_size(char *txt, enum letter_changer_t c)
char to_lower(char);
char to_upper(char);
Parametry:

txt - wskaźnik na tablicę znaków, której litery mają zostać zmodyfikowane,
c - wybór opcji modyfikacji tekstu (może przyjmować dwie wartości wyliczeniowe: TO_UPPER lub TO_LOWER).
Wartość zwracana:

Funkcja zwraca wskaźnik na txt w przypadku powodzenia lub
NULL w przeciwnym przypadku.
Napisz program, który pobierze od użytkownika tekst (nie więcej niż 1000 pierwszych znaków), a następnie informację (w formie jednego znaku) na jakie litery mają zostać zamienione wszystkie znaki w tekście wejściowym. Podanie litery B/b spowoduje zamianę liter na duże, podczas gdy podane podanie S/s spowoduje zamianę liter w tekście na małe.

W przypadku podania przez użytkownika błędnego znaku program powinien wyświetlić komunikat Incorrect input i poczekać na kolejny znak. Po wprowadzeniu poprawnego symbolu program powinien zmodyfikować wprowadzony tekst, wykorzystując przygotowaną wcześniej funkcję, zgodnie z wyborem użytkownika.

Tekst, po dokonanej modyfikacji, powinien zostać wyświetlony na ekranie.

Uwagi

Nie korzystaj z bibliotek ctype, stdlib oraz string oraz z funkcji w nich zawartych.
Nie korzystaj z funkcji z rodziny scanf, za wyjątkiem samej funkcji scanf.
W programie nie wolno używać operatora [] oprócz deklaracji tablicy.
W programie nie wolno używać cyfr, oprócz cyf 0 i 1.
W programie nie wolno używać magicznych liczb.
Deklaracje wszystkich funkcji oraz definicja typu wyliczeniowego powinna być zamieszczona w pliku letter_changer.h, a definicje funkcji w pliku letter_changer.c.
Tekst powinien zostać wyświetlony bez zbędnych białych znaków przed i po właściwym tekście (znak nowej linii to też biały znak).
Przykładowa interakcja z programem -- sukces:

Podaj tekst:
Przykladowy tekst.
Podaj rodzaj modyfikacji:
B⏎
PRZYKLADOWY TEKST.
Wpisz cos:⏎
ALA ma KoTa ⏎
Jesli wielkie wcisnij: B, male: S⏎
x⏎
Incorrect input⏎
Jesli wielkie wcisnij: B, male: S⏎
^⏎
Incorrect input⏎
Jesli wielkie wcisnij: B, male: S⏎
m⏎
Incorrect input⏎
Jesli wielkie wcisnij: B, male: S⏎
F⏎
Incorrect input⏎
Jesli wielkie wcisnij: B, male: S⏎
s⏎
ala ma kota ⏎

Rozpisałem swój kod. Definicje funkcji w pliku letter... .c :

#include <stdio.h>
#include "letter_changer.h"

char* change_letter_size(char *txt, enum letter_changer_t c)
{
    if( txt == NULL || (c<0 || c>1) )
    {

        return NULL;
    }
    int i = 0;
    while( *(txt + i) != '\0' )
    {
        if( c == 1)
        {

            if( *(txt + i)>='A' && *(txt + i)<='Z' )
            {
                *(txt + i) = to_lower( *(txt + i));
            }
        }
        if( c == 0)
        {

            if( *(txt + i)>='a' && *(txt + i)<='z' )
            {
                int a;
                a = to_upper( *(txt + i));
                *(txt + i) = a;
            }
        }
        i++;
    }
    return txt;


}
char to_lower(char a)
{
    if(a>='A' && a<='Z')
    {
        a += ' ';
    }
    return a;
}
char to_upper(char a)
{
    if(a>='a' && a<='z')
    {
        a -= ' ';
    }
    return a;
}

, a tutaj w main-ie:

#include <stdio.h>
#include "letter_changer.h"
//#include "letter_changer.c"

char * removing_starting_spaces(char * txt);
int main()
{
    printf("Podaj tekst:\n");
    char table[1001]={0};
    fgets(table,1001,stdin);
    enum letter_changer_t wybor;

    char znak;
    printf("Podaj rodzaj modyfikacji:\n");
    int i = 0;
    do
    {
        if( i != 0)
        {
            printf("Incorrect input\n");
            printf("Podaj rodzaj modyfikacji:\n");
        }
        scanf(" %c",&znak);
        i++;
    }while( znak!='B' && znak!='b' && znak!='s' && znak!='S' );
    if( znak == 'b' || znak == 'B')
    {
        wybor = 0;
    }
    if( znak == 's' || znak == 'S')
    {
        wybor = 1;
    }
    change_letter_size(table,wybor);
    char * pointer_on_b_spaces;
    pointer_on_b_spaces = removing_starting_spaces(table);
    printf("%s",pointer_on_b_spaces);


    return 0;
}
char * removing_starting_spaces(char * txt)
{
    while( *txt != '\0')
    {
        if( *txt  == ' ')
        {

        }
        else
        {
            break;
        }
        txt++;
    }
    return txt;
}

Problem występuje na sprawdzeniu całego programu. Oto co się dzieje:

Podaj tekst:⏎
What you do makes a difference, and you have to decide what kind of difference you want to make. - Jane Goodall "It has become appallingly obvious that our technology has exceeded our humanity."  - Albert Einstein "Technology... the knack of so arranging the world that we don't have to experience it."  - Max Frisch Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live - John Woods There is no reason and no way that a human mind can keep up with an artificial intelligence machine by 2035. - Gray Scott Object-oriented programming offers a sustainable way to write spaghetti code. It lets you accrete programs as a series of patches. - Paul Graham "Talk is cheap. Show me the code." - Linus Torvalds You've baked a really lovely cake, but then you've used dog shit for frosting. - Steve Jobs Insanity is doing the same thing, over and over again, but expecting different results. - Narcotics Anonymous I am not pretty. I am not beautiful. I am as radiant as the sun. - Suzanne Collins Jobs offshoring began with manufacturing, but the rise of the high-speed Internet made it possible to move offshore tradable professional skills, such as software engineering, information technology, various forms of engineering, architecture, accounting, and even the medical reading of MRIs and CT-Scans. - Paul Craig Roberts Tell the truth, or someone will tell it for you. - Stephanie Klein "Walking on water and developing software from a specification are easy if both are frozen." - Edward V Berard I am not pretty. I am not beautiful. I am as radiant as the sun. - Suzanne Collins Just because something doesn't do what you planned it to do doesn't mean it's useless.-Thomas Edison I have been wildly enthused about gaming since I was younger, and a career path I chose not to go down but did really consider was getting into programming and game design. - Trent Reznor "I don't care if it works on your machine! We are not shipping your machine!" - Vidiu Platon. When we love, we always strive to become better than we are. When we strive to become better than we are, everything around us becomes better too. - Paulo Coelho ⏎
Podaj rodzaj modyfikacji:⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
what you do makes a difference, and you have to decide what kind of difference you want to make. - jane goodall "it has become appallingly obvious that our technology has exceeded our humanity."  - albert einstein "technology... the knack of so arranging the world that we don't have to experience it."  - max frisch always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live - john woods there is no reason and no way that a human mind can keep up with an artificial intelligence machine by 2035. - gray scott object-oriented programming offers a sustainable way to write spaghetti code. it lets you accrete programs as a series of patches. - paul graham "talk is cheap. show me the code." - linus torvalds you've baked a really lovely cake, but then you've used dog shit for frosting. - steve jobs insanity is doing the same thing, over and over again, but expecting different results. - narcotics anonymous i am not pretty. i am not beautifulC⏎

"Test został przerwany; Liczba linii wyświetlianych przez program jest nieprawidłowa; powinny być dwie."

Ta literka końcowa:

C

powinna chyba być wyżej po rodzaju modyfikacji. Co więc się tutaj dzieje? I jak mogę to naprawić?

P.S W jaki sposób mogę się pozbyć spacji końcowych? Za cenną radę z góry dziękuję.  :)

 

komentarz 13 kwietnia 2020 przez Hubertius Bywalec (2,970 p.)

Jeszcze taki mały odnośnik wobec tego co się dzieje: Próbowałem rozwiązać problem za pomocą fflush-a:

do
    {
        if( i!= 0)
        {
            printf("Incorrect input\n");
            printf("Podaj rodzaj modyfikacji:\n");
        }
        scanf("%c",&znak);
        fflush(stdin);
        i++;
    }while( znak!='B' && znak!='b' && znak!='s' && znak!='S' );

I o ile w moim programie to się sprawdza, o tyle na testach wychodzi coś... takiego:

Podaj tekst:⏎
I'm not a great programmer; I'm just a good programmer with great habits. - Kent Beck⏎
Podaj rodzaj modyfikacji:⏎
L⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
Incorrect input⏎
Podaj rodzaj modyfikacji:⏎
Program przerwany; kod błędu=137 (Sygnał SIGKILL)

Test został przerwany; Liczba linii wyświetlianych przez program jest nieprawidłowa; powinny być dwie
komentarz 14 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
            if( *(txt + i)>='A' && *(txt + i)<='Z' )
            {
                *(txt + i) = to_lower( *(txt + i));
            }
        }

 
            if( *(txt + i)>='a' && *(txt + i)<='z' )
            {
                int a;
                a = to_upper( *(txt + i));
                *(txt + i) = a;
            }

Po co te ify, przecież obie funkcje sprawdzają zakresy?

1 odpowiedź

0 głosów
odpowiedź 14 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
wybrane 14 kwietnia 2020 przez Hubertius
 
Najlepsza
    while(printf("Podaj rodzaj modyfikacji:\n"), scanf(" %c",&znak), 
            znak!='B' && znak!='b' && znak!='s' && znak!='S' ) {
        printf("Incorrect input\n");
    }

 

fgets czyta razem ze znakiem końca linii, być może stąd zła ilość linii. Zresztą chyba nie możesz użyć tej funkcji. Użyj scanf("%[^\n]", table);

 

change_letter_size  możesz zredukować do:

char* change_letter_size(char* txt, enum letter_changer_t c)
{
    if (txt == NULL || (c < 0 || c > 1)) {
        return NULL;
    }

    char* p = txt;

    if (c == 0) {
        while (*p) { *p = to_upper(*p); ++p; }
    } else {
        while (*p) { *p = to_lower(*p); ++p; }
    }

    return txt;
}

 

komentarz 14 kwietnia 2020 przez Hubertius Bywalec (2,970 p.)

Zadanie udało mi się rozwiązać już wczoraj. Problemem nie był jednak ten fgets tylko to co się działo w pętli do while. Osobiście zamiast scanf-a posłużyłem się getchar-em:

while((type = get_type(getchar())) == UNDEFINED)
    {
     printf("Incorrect input\n");
     printf("Jesli wielkie wcisnij: B, male: S\n");
     getchar();


    }

Funkcja get_type w instrukcji while-a, której przekazuje znak, który podam za pomocą funkcji getchar() ma za zadanie zwrócić mi prawidłowego enum-a ( oprócz upper i lower jest teraz ponadto undefined, który będzie wartością dla enum-a w przypadku podawania przez użytkownika innych znaków niż B/b i s/s. Kolejny getchar() tam później w while-u jest po to, aby pozbyć się tego \n, który zawsze zostaje w buforze.

Podobne pytania

0 głosów
0 odpowiedzi 465 wizyt
pytanie zadane 26 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 336 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
2 odpowiedzi 320 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...