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

Problem z funkcją zwracającą wartość

Object Storage Arubacloud
0 głosów
208 wizyt
pytanie zadane 19 grudnia 2015 w C i C++ przez Barus Stary wyjadacz (14,120 p.)

Witam.

Mam następujący problem :
Otóż w programie głównym wywołuję kilka funkcji bool(które mają wyświetlić tekst użytkownikowi na podstawie słów kluczowych i zwrócić true lub false do main()), a następnie w programie głównym dałem if, który sprawdza czy wszystkie funkcję są różne od true, a następnie wyświetla inny tekst("nie mogę zrozumieć, powtórz"). I wszystko byłoby ok, gdyby nie to, że gdy funkcja znajdzie słowo kluczowe to wyświetla użytkownikowi odpowiedź 2 razy. Oto skrócony kod, bez pozostałych funkcji :

#include <iostream>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <cstdlib>

using namespace std;

string tekst;

bool jakSieCzujesz(string napis);
void wypisz_pierwszy();
void nieRozumie();

int main()
{
    cout<<"Program | Witaj, Jestem Robot. Powiedz, co sie stalo ?";

    for(;;)
    {
        cout<<endl<<endl;
        cout<<"Ty      | ";
        getline(cin,tekst);
        transform(tekst.begin(),tekst.end(),tekst.begin(),::tolower);

        jakSieCzujesz(tekst);

        if(jakSieCzujesz(tekst)==false)
        {
            nieRozumie();
        }
    }

    return 0;
}

bool jakSieCzujesz(string napis)
{
    int licznik=0;
    string slowo[4];
    slowo[0]="dobrze";
    slowo[1]="idealnie";
    slowo[2]="super";
    slowo[3]="pozytywnie";

    while(licznik<=3)
    {
        size_t szukajPozycji=napis.find(slowo[licznik]);
        if(szukajPozycji!=string::npos)
        {
            wypisz_pierwszy();
            return true;
        }
        licznik++;
    }
}

void wypisz_pierwszy()
{
    int x;
    cout<<endl;

    srand(time(NULL));
    x=rand()%3+1;

    switch(x)
    {
        case 1:
        {
            Sleep(1500);
            cout<<"Program | Bardzo sie ciesze :)";
        }break;

        case 2:
        {
            Sleep(1500);
            cout<<"Program | To swietnie :)";
        }break;

        case 3:
        {
            Sleep(1500);
            cout<<"Program | Ciesze sie :P";
        }break;
    }

}

void nieRozumie()
{
    int x;
    cout<<endl;

    srand(time(NULL));
    x=rand()%2+1;

    switch(x)
    {
        case 1:
        {
            Sleep(1500);
           cout<<"Program | Wybacz, nie rozumiem...";
        }break;

        case 2:
        {
            Sleep(1500);
            cout<<"Program | Moglbys powtorzyc ? Nie zrozumialem.";
        }break;
    }
}

Kiedy program wyświetla funkcję "nieRozumie();" to wyświetla tekst tylko raz, a gdy wyświetla funkcję "wypisz_pierwszy();", która jest w funkcji "jakSieCzujesz()" to wyświetla tekst 2 razy. Proszę o odpowiedź dlaczego tak jest i jak to można zmienić oraz ewentualną refaktoryzację :)

Z góry bardzo dziękuję za odpowiedzi !

3 odpowiedzi

+2 głosów
odpowiedź 19 grudnia 2015 przez Radfler VIP (101,030 p.)
jakSieCzujesz(tekst);
 
if(jakSieCzujesz(tekst)==false)
{
  nieRozumie();
}

Wywołujesz funkcję dwa razy, więc nie ma co się dziwić. Po prostu usuń pierwsze wywołanie i wszystko będzie w porządku.

#EDIT Dodatkowo na końcu funkcji jakSieCzujesz przydałoby się zwrócić jakąś wartość, gdyż bez tego mamy niezidentyfikowane zachowanie.

komentarz 19 grudnia 2015 przez Barus Stary wyjadacz (14,120 p.)
Bardzo Ci dziękuję, pomogło !!! :) Gdybyś mógł to napisz proszę co mógłbym zwrócić na końcu funkcji.

Dziękuję jeszcze raz, pozdrawiam !
komentarz 19 grudnia 2015 przez Radfler VIP (101,030 p.)

Mógłbyś zwrócić false, co oznaczałoby późniejsze wywołanie funkcji nieRozumie.

komentarz 19 grudnia 2015 przez Barus Stary wyjadacz (14,120 p.)
bool jakSieCzujesz(string napis)
{
    int licznik=0;
    string slowo[4];
    slowo[0]="dobrze";
    slowo[1]="idealnie";
    slowo[2]="super";
    slowo[3]="pozytywnie";
 
    while(licznik<=3)
    {
        size_t szukajPozycji=napis.find(slowo[licznik]);
        if(szukajPozycji!=string::npos)
        {
            wypisz_pierwszy();
            return true;
        }
        licznik++;
    }
            return false;
}

Czy teraz jest dobrze ? :) 

komentarz 19 grudnia 2015 przez Radfler VIP (101,030 p.)
Pewnie! Spróbuj może tą funkcję uprościć. Przy dobrym pomyśle może ona zajmować 3 linijki ;)
komentarz 19 grudnia 2015 przez Barus Stary wyjadacz (14,120 p.)
Też o tym myślałem :) Na pewno postawię 3 tablice w jednej linii :P Dziękuje Ci bardzo za pomoc, teraz wszystko działa jak powinno ! :)

Pozdrawiam serdecznie !
+1 głos
odpowiedź 19 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Jak dobrze pamiętam, instrukcja switch ma taką postać:

switch(zmienna)
{
	case wartosc_1:
		// Kod
		break;
	case wartosc_2:
		// Kod
		break;
	//...
}

 

komentarz 19 grudnia 2015 przez niezalogowany
Klamry w case mogą być jeśli o to chodzi.
komentarz 19 grudnia 2015 przez Barus Stary wyjadacz (14,120 p.)
W funkcjach, w których jest switch case najpierw wywołuję liczby pseudolosowe aby za każdym razem wyświetlało trochę inny tekst, jeśli o to Ci chodzi ;)
+1 głos
odpowiedź 19 grudnia 2015 przez damianeqe Gaduła (4,380 p.)
Wywołujesz 2 razy funkcję w 28 i 30 linii :)
komentarz 19 grudnia 2015 przez Barus Stary wyjadacz (14,120 p.)
Wielkie dzięki za pomoc :) !!!

Pozdrawiam !

Podobne pytania

+1 głos
1 odpowiedź 113 wizyt
0 głosów
1 odpowiedź 95 wizyt
pytanie zadane 30 marca 2020 w JavaScript przez aoper Nowicjusz (170 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 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!

...