Problem Początkującego - instrukcja if się nie wykonuje poprawnie

0

Witajcie! Mam problem a mianowicie z instrukcją warunkową if. Robiłem encyklopedię o kotach xD i gdy włączyłem program i wpisałem nazwę kota - wyskoczyły wszystkie opisy, nie tylko kota którego chciałem - ale wszystkie!
Powiedzcie mi proszę co robiłem źle.

  • Aleks
    A oto skrypty:
#include <iostream>
#include <windows.h>

using namespace std;

string Rasa;

int main()
{
    cout << "Witamy w Kociej wyszukiwarce!  Wpisz rase kota o ktorej chcesz poczytac!" << endl;
    cin >> Rasa;
    system( "cls" );
    if(Rasa=="Kot Brytyjski"||"Brytyjski"||"Brytyjczyk"||"kot brytyjski"||"kot Brytyjski"||"brytyjski");
        cout << "Kot brytyjski krótkowłosy – rasa kota, której początki wywodzą od kotów sprowadzonych na Wyspy Brytyjskie przez legiony rzymskie, wykorzystujące je do walki ze szczurami. Legendy tej nie udało się jednak udowodnić. Faktem jest, że rasa wywodzi się od kotów domowych zamieszkujących Wielką Brytanię." << endl;
    if(Rasa=="Kot Perski"||"kot Perski"||"kot perski"||"Perski"||"perski");
        cout << "Kot perski – stara rasa kota, zaliczana do grupy długowłosych. W Europie pojawiła się w XVII wieku. Waga dorosłego kota 2,5–6 kg Liczba kociąt w miocie 3–4 Usposobienie spokojne, miłe, łagodne, niewielkie talenty łowcze, mało towarzyskie. Woli wylegiwać się na kanapie, niż grasować w krzakach Umaszczenie" << endl;
    if (Rasa=="Kot Bengalski"||"Bengalski"||"bengalski"||"kot Bengalski"||"Kot bengalski");
    cout << "Kot bengalski, bengal, leopardeta – rasa kota pochodząca ze Stanów Zjednoczonych, powstała w wyniku skrzyżowania dzikiego kota bengalskiego z kotem domowym. Jest zaliczana do grupy kotów orientalnych." << endl;
    if(Rasa=="Syberyjski"||"syberyjski"||"Kot Syberyjski"||"Kot syberyjski"||"kot Syberyjski");
        cout << "Kot syberyjski – rasa kota, zaliczana do ras półdługowłosych, pochodząca z Syberii. Zarejestrowana w FIFe dopiero w 1998 roku. Panuje przekonanie, że koty tej rasy nie uczulają ludzi tak jak koty innych ras, ponieważ ich ślina zawiera mniej białka fel d1." << endl;
    if(Rasa=="Ragdoll"||"ragdoll"||"Kot Ragdoll"||"Kot ragdoll"||"kot Ragdoll");
        cout << "Ragdoll – rasa kota zaliczana do kotów półdługowłosych. Nazwa rasy wynika z opinii, według której gdy ragdolla weźmie się na ręce, kot odpręża się, rozluźnia mięśnie i staje się uległy w stopniu przewyższającym inne rasy kotów. W celu popularyzacji rasy rozpowszechniano też mit o rzekomej odporności ragdolli na ból." << endl;

    return 0;
}
2

Masz coś takiego:

if(Rasa=="Kot Brytyjski"||"Brytyjski"||"Brytyjczyk"||"kot brytyjski"||"kot Brytyjski"||"brytyjski");
        cout << "Kot brytyjsk"; // i tak dalej

I tam masz średnik na końcu tej linijki z if. On powoduje, że instrukcje poniżej ifa do niego nie "należą". To raz. Konkretnie, to on powoduje, że jeśli warunek jest spełniony to odpala się instrukcja, która nic nie robi.

Dwa, niestety, ale nie można tak "łatwo" sprawdzić wielu alternatyw, musisz za każdym razem pisać jaka zmienna ma być równa.

Używaj klamerek, to wszystko będzie jaśniejsze, co "należy" do twojej instrukcji warunkowej, na przykład:

if (Rasa == "Kot Brytyjski" || Rasa == "Brytyjski" || Rasa == "Brytyjczyk" || Rasa == "kot brytyjski" || Rasa=="kot Brytyjski" || Rasa=="brytyjski") {
        cout << "Kot brytyjsk"; // i tak dalej - wszystko wewnątrz klamerek jest wykonywane tylko jeśli if jest prawdą
}

(3 - możesz użyć funkcji, która zamienia wszystkie litery w łańcuchu znaków na małe i wtedy nie musisz przejmować się, czy ktoś wpisze "kot brytyjski" czy "KOT bryTYjsKi", i tak porównanie zadziała)

2

To porównanie jest nieoprawidłowe

 if(Rasa=="Kot Brytyjski"||"Brytyjski"||"Brytyjczyk"||"kot brytyjski"||"kot Brytyjski"||"brytyjski");

Z dwóch i pół względów,

  • po pierwsze || nie działa tak jak myślisz, Niestety w C/C++ jest to łykane przez kompilator (rzeczy z najdawniejszych czasów C, i przez kompatybilność nie można ich zmienić), ale działa zupełnie inaczej
  • po drugie średnik na końcu zabija tę ideę.
  • po trzecie, gdybyś formatował automatycznie a nie ręcznie, problem nr 2 by się sam pokazał przed oczy

Prawidłowy zapis wygląda mniej więcej tak:

 if(Rasa=="Kot Brytyjski" || Rasa=="Brytyjski" || Rasa=="Brytyjczyk" || Rasa=="kot brytyjski" || Rasa=="kot Brytyjski" || Rasa=="brytyjski") .....

2

Zdaję sobie sprawę, że jesteś początkujący, ale zauważ ile tutaj się naklepałeś, żeby sprawdzić tę rasę. Warto listę fraz trzymać osobno, i tylko ją przeszukiwać:

std::vector<std::string> bryt {
    "Kot Brytyjski", "Brytyjski", "Brytyjczyk", "kot brytyjski", "kot Brytyjski", "brytyjski"
};
if(std::find(bryt.cbegin(), bryt.cend(), Rasa) != bryt.cend()) {
}

lub

std::unordered_set<std::string> bryt {
    "Kot Brytyjski", "Brytyjski", "Brytyjczyk", "kot brytyjski", "kot Brytyjski", "brytyjski"
};
if(bryt.find(Rasa) != bryt.cend()) {
}

(pisane na kolanie, zamiast unordered_set, można użyć set)

Tutaj dodanie, odjęcie lub przesunięcie jest trywialne, a w przypadku większej liczby fraz wersja z unordered_set będzie miała wydajniejsze wyszukiwanie. No i można wczytać te frazy z np. pliku lub bazy danych.

1

Masz jeszcze jeden problem, cin >> Rasa przestanie wczytywać po spacji, a więc jak piszesz Kot brytyjski, w zmiennej Rasa znajdzie się tylko "Kot". Możesz użyć funkcji getline (https://en.cppreference.com/w/cpp/string/basic_string/getline ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1