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

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;
}
 
5
  1. if (wynik == ok) w użytym kontekście nie istnieje nic takiego jak ok
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

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;
}
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.

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.

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?

0

Wczytaj do zmiennych i przekaż do funkcji jako argumenty.

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?

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.

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