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

Warunek który jest mało logiczny - pomoc w zrozumieniu.

Ostatnio zmodyfikowano 2014-09-12 14:25
Autor Wiadomość
plsbx
Temat założony przez niniejszego użytkownika
Warunek który jest mało logiczny - pomoc w zrozumieniu.
» 2014-09-12 14:17:54
Witam robiłem dzisiaj temat związany z wyszukiwaniem fraz i zrobiłem zadanie domowe, ale zrobiłem je trochę dziwnie. Wiem jak to działa, ale nie rozumiem dlaczego warunek if działa odwrotnie niż ja chce.
Chodzi o:
C/C++
if( znaleziona1 == std::string::npos && znaleziona2 == std::string::npos )
     return true;
Na logikę to nie powinno działać tak jak działa. Z tym zapisem program działa tak jak powinien, ale powinno być na odwrót.
Przez kilka minut się zastanawiałem co jest nie tak z
C/C++
if( znaleziona1 != std::string::npos && znaleziona2 != std::string::npos )
     return true;
Co jest dużo logiczniejsze. Jeśli dwa warunki nie są std::string::npos to powinno oddać true. Co według tego zdania: "Jeżeli fraza bądź znak nie został odnaleziony w przeszukiwanym tekście to wówczas metoda find zwraca wartość std::string::npos." - http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Wyszukiwanie-frazy-w-tekscie/352 Powinno działać. No, ale nawet jeśli to powinno mi to oddać odwrotne. Tym czasem są one poprawne.
Cały kod:
C/C++
#include <iostream>
#include <string>

bool szukaj( std::string & tekst, std::string wyraz1, std::string wyraz2 )
{
    size_t znaleziona1 = tekst.find( wyraz1 );
    if( znaleziona1 == std::string::npos )
         return false;
   
    do
    {
        znaleziona1 = tekst.find( wyraz1, znaleziona1 + wyraz1.size() );
    } while( znaleziona1 != std::string::npos );
   
    size_t znaleziona2 = tekst.find( wyraz2 );
    if( znaleziona2 == std::string::npos )
         return false;
   
    do
    {
        znaleziona2 = tekst.find( wyraz2, znaleziona2 + wyraz2.size() );
    } while( znaleziona2 != std::string::npos );
   
    if( znaleziona1 == std::string::npos && znaleziona2 == std::string::npos )
         return true;
   
    return false;
}

void wypiszWynik( bool czyZnaleziono )
{
    if( czyZnaleziono )
         std::cout << "Znaleziono" << std::endl;
    else
         std::cout << "Nie znaleziono" << std::endl;
   
}

int main()
{
    std::string napis = "Zadanie domowe z kursu C++ (http://cpp0x.pl) - najlepszy kurs C++ w Internecie!";
    wypiszWynik( szukaj( napis, "ada", "kurs" ) );
    wypiszWynik( szukaj( napis, "ada", "taki" ) );
    wypiszWynik( szukaj( napis, "C++", "cpp0x" ) );
    wypiszWynik( szukaj( napis, "C#", "cpp0x" ) );
    return 0;
}

Jeśli komuś udało się przeczytać ten chaotyczny post to proszę o napisanie dlaczego tak jest.
P-116919
pekfos
» 2014-09-12 14:25:16
Po co tu te pętle i tyle warunków? Masz tylko stwierdzić, czy obie frazy występują w tekście.
P-116920
« 1 »
  Strona 1 z 1