Funkcje w C++ - jak powiązać je z main?

Odpowiedz Nowy wątek
2015-06-28 19:38
0

Cześć!

Uczę się programować w C++ i napisałem program, którego zadaniem jest sprawdzanie czy wprowadzane przez użytkownika hasło jest poprawne. O ile umiem to zrobić za pomocą funkcji if to o chciałem to zrobić za pomocą osobnej funkcji (poza mainem). Niestety tutaj pojawia się problem, ponieważ nie wiem jak powiązać osobną funkcję z tą zależnością w main.

Naprowadzicie mnie na to co jest źle i jak to zrobić poprawnie?

int wynik;

string sprawdzaniehasel (string wynik);

int main()
{
    haslo = "polska";
    cout << "\nPODAJ SWOJE HASLO\n";
    cin >> userpassword;
    cin >> sprawdzaniehasel(wynik);
    if (wynik == ok)
    {
    cout << "Haslo poprawne\n";
  //  return 0;
    }
    else {cout << "Haslo niepoprawne\n";}
}

string sprawdzaniehasel (string wynik)
{
if (userpassword == haslo)
    {
        return 1;
    }
    else
    {
        return 0;
    }
 //   return 0;
}

Pozostało 580 znaków

2015-06-28 19:41
5
  1. if (wynik == ok) w użytym kontekście nie istnieje nic takiego jak ok
  2. string sprawdzaniehasel (string wynik)
    {
    if (userpassword == haslo)
    {
        return 1;
    }
    else
    {
        return 0;
    }
    //   return 0;
    }

    Ogłaszasz, że zwrócisz string, po czym zwracasz wartość logiczną aka book.

  3. haslo = "polska"; haslo w użytym kontekście nie istnieje nic takiego jak haslo
  4. Nie używaj zmiennych globalnych.
  5. cin >> sprawdzaniehasel(wynik); wprowadzasz wartość do obiektu, który się zaraz po tym ulatnia. Not clever.
  6. 
    #include <iostream>
    #include <string>
    using namespace std;

bool isValidPassword(const string &input){
const string password = "banana apes";
return input == password;
}

int main(){
string userInput;
cout << "Enter password: " << endl;
getline(cin, userInput);

bool result = isValidPassword(userInput);
cout << "The password is " << (result?"":"in") << "valid." << endl;
return 0;

}

http://ideone.com/2zfBnU

```javascript
In: "banana apes"
Simplified out: "The password is valid."
In: "Foo or something..."
Simplified out: "The password is invalid."

Spróbujmy jeszcze zabawić się w kompilator.

int wynik;

string sprawdzaniehasel (string wynik); //brr, przekazywanie potencjalnie dużych obiektów przez wartość

int main() //main, lecimy
{
    haslo = "polska"; //Co to jest haslo? Nic takiego sobie nie przypominam
    cout << "\nPODAJ SWOJE HASLO\n"; //Co to jest cout? Czy nie zapomniałeś o jakimś nagłówku?
    cin >> userpassword; //Co to jest userpassword? Co to jest cin? Czy nie zapomnialeś o jakimś nagłówku?
    cin >> sprawdzaniehasel(wynik); //Co to jest cin? Uwaga, wprowadzasz wartość do tymczasowego obiektu! Ale ok, analizujemy sprawdzaniehasel;
    if (wynik == ok) //Z tego co mi wiadomo, nic nie zmodyfikowało tej paskudnej zmiennej globalnej wynik
    {
    cout << "Haslo poprawne\n"; //Co to jest cout? Nie zapomniałeś o jakimś nagłówku albo przestrzeni nazw?
  //  return 0;
    }
    else {cout << "Haslo niepoprawne\n";}
}

string sprawdzaniehasel (string wynik)
{
if (userpassword == haslo) //co to jest userpassword? Nic takiego sobie nie przypominam; 
    {
        return 1; //Jak ja właściwie mam zamienić jedynkę na ciąg znaków?
    }
    else
    {
        return 0; //Jak ja właściwie mam zamienić zero na ciąg znaków?
    } //Brr, to było strasznie niepotrzebne rozwleczenie warunku
 //   return 0;
}
edytowany 12x, ostatnio: spartanPAGE, 2015-06-28 22:23
niezainicjowana zmienna globalna - technicznie rzecz biorąc, wiemy jaką ma wartość. przekazywanie potencjalnie dużych obiektów przez wartość - nie musi być takie złe w C++11. Oczywiście to już czepianie się, ale skoro 11 razy poprawiłeś post :D - twonek 2015-06-28 20:35
Załóżmy, że bawimy się w kompilator niezgodny ze standardem >:| - spartanPAGE 2015-06-28 21:11
Globalna zmienna wynik będzie miała w tym wypadku wartość 0. To jest absolutnie gwarantowane. Rozważanie "co by było, gdyby" nie ma większego sensu. - Endrju 2015-06-28 21:54

Pozostało 580 znaków

2015-06-28 19:51
2
cin >> sprawdzaniehasel(wynik);

Ten kawałek kodu pokazuje, że najlepiej dla Ciebie będzie jak przeczytasz jakiś rozdział książki lub tutoriala o funkcjach zanim zaczniesz pisać kod z funkcjami. W tej chwili opisanie co jest źle jest równoznacznie z napisaniem tutoriala o funkcjach.

Pozostało 580 znaków

2015-06-29 11:47
0

Czytałem, czytałem. Uczę się z podręcznika Przewodnik dla początkujących C++, tylko prostu ten fragment najmniej rozumiem. Wiem jak zrobić np. kalkulator, który wykonuje obliczenia rozbite w różnych funkcjach, ale gdy chodzi o takie coś, to po prostu nie wiem jak zmusić kompilator do odczytywania wartości z funkcji sprawdzaniehasla. Dlatego dzięki za Wasze rady.

PS. Nie wiem czemu wrzuciła się, robocza wersja kodu. Ta jest ostateczna, niestety dalej niedziałająca:

#include <iostream>
#include <string>

using namespace std;

string haslo, userpassword;
int wynik;

string sprawdzaniehasel (string wynik);

int main()
{
    haslo == "polska";
    cout << "UWAGA! HASLO ZOSTALO ZDEFINIOWANE W KODZIE \nPODAJ SWOJE HASLO\n";
    cin >> userpassword;
    cin >> sprawdzaniehasel(wynik);
    if (wynik == ok)
    {
    cout << "Haslo poprawne\n";
  //  return 0;
    }
    if (haslo == nieok)
    {
        cout << "Haslo niepoprawne\n";
    }
}

string sprawdzaniehasel (string wynik)
{
if (userpassword == haslo)
    {
        return ok;
    }
    else
    {
        return nieok;
    }
 //   return 0;
}

Domyślam się, że problem jest z tą linijką:

    cin >> sprawdzaniehasel(wynik);

Tylko, że nie wiem, w jaki inny sposób kompilator miałby odczytywać wartość z innej funkcji.

edytowany 1x, ostatnio: dwx14513, 2015-06-29 11:51

Pozostało 580 znaków

2015-06-29 11:54
2

ręcę opadają...

PRZECIEZ @spartanPAGE napisał Ci dokładnie w czym problem.
Czym jest ok czy nieok w Twojej funkcji? Jaki typ danych ma?

Czemu nie czytasz błędów od kompilatora? Tylko bezmyślnie przychodzisz na forum i krzyczysz, że nie działa?

edytowany 1x, ostatnio: fasadin, 2015-06-29 11:54

Pozostało 580 znaków

2015-06-29 11:56
0

Wczytaj do zmiennych i przekaż do funkcji jako argumenty.

Pozostało 580 znaków

2015-06-29 11:59
2

Powtórzę to co @spartanPAGE napisał, ale może uda mi się innymi słowami wyjaśnić:

string sprawdzaniehasel(string wynik)

Ta linia mówi 3 rzeczy:
1) funkcja się nazywa sprawdzaniehasel
2) funkcja zwraca obiekt typu string
3) funkcja przyjmuje 1 parametr typu string o nazwie wynik
Czyli masz podać do parametru wynik to hasło do sprawdzenia (widać, że nazwa nie pasuje), a potem zwrócić wynik tego sprawdzenia poprzez return (widać, że typ string nie pasuje jako wynik tego sprawdzenia).

Poprawna funkcja powinna wyglądać mniej więcej tak:

// nie przejmuj sie na razie tym const &, to jest "prawie" to samo co "string haslo"
bool sprawdzHaslo(const string& haslo) 
{
    if (...)   // haslo pasuje
        return true;
    else               // else jest tutaj zbedny, ale dla symetrii
        return false;
}
return ok;
....
return nieok;

co to jest ok i nieok?

edytowany 3x, ostatnio: twonek, 2015-06-29 12:03
jest wiecej wtf, haslo jest == wiec haslo jest niezdefiniowane etc etc... - fasadin 2015-06-29 12:00
haslo jest zdefiniowane ;) - twonek 2015-06-29 12:22
ok jest zdefiniowane ale nie jest ustawione na zadna wartosc. haslo == "polska"; - fasadin 2015-06-29 12:25
no jest pustym stringiem, ale jest zdefiniowane xD </troll> - twonek 2015-06-29 12:28

Pozostało 580 znaków

2015-06-29 12:26
2
twonek napisał(a):
if (...)   // haslo pasuje
return true;
else               // else jest tutaj zbedny, ale dla symetrii
return false;

Przecież w takim przypadku wystarczy:

return ...;

gdzie ... to to, co było pod if-em.

edytowany 1x, ostatnio: Azarien, 2015-06-29 12:27
Lubię dawać łapki - spartanPAGE 2015-06-29 12:29
prawda, ale w tym przypadku wolałem jak najjaśniej, najbardziej podobne do pierwotnego return ok return nieok - twonek 2015-06-29 12:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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