Program wykorzystujący trzy funkcje - sprawdzenie kodu

0

Witam,
Przerabiam książkę Stephena Prata "Język C++", jedno z ćwiczeń podsumowujących rozdział brzmi:

Napisz program wykorzystujący trzy funkcje (z czego jedna main) dający wynik:
entliczek pentliczek
czerwony stoliczek

Poniższy kod teoretycznie działa, tzn wyświetla to co trzeba z tym że zmiana argumentów funkcji np
"string pentliczek(string blalblalbakls)" kompletnie nic nie zmienia mimo że taka zmienna nie istnieje, o co chodzi?
Dlaczego program i tak wyświetla dany teks?

#include <iostream>
#include <conio.h>

using namespace std;
string entliczek(string);
string pentliczek(string);

string x, y, c, v;

main()
{
	c = entliczek(x);
	cout << c << endl;
	v = pentliczek(y);
	cout << v << endl;
	
	getch();
	return 0;
}

string entliczek(string x)
{
	x = "Entliczek pentliczek";
	return(x);
}

string pentliczek(string y)
{
	y = "Czerwony stoliczek";
	return(y);
}

usunięcie zbędnych pustych linii - fp

2

Bo działasz na globalach, ot cała tajemnica. Zmieniając nazwę argumentu funkcji działasz na zmiennej widocznej w szerszym zasięgu.
Chcąc się odwołać do szerszego zasięgu, np. zamiast do kopii wartości y przekazanej do funkcji, to do zmiennej globalnej o tej samej nazwie, używasz operatora zasięgu np. ::y.

2

Tu wypadałoby napisać jak to powinno wyglądać i co tu jest źle:

  1. argumenty funkcji są przekazywane przez wartość, więc działasz na ich kopii - zmienianie ich w funkcji nie będzie widoczne poza nią.
  2. W C++ nie ma czegoś takiego jak domyślny typ zwracany przez funkcję(w przeciwieństwie do C), więc main() {...} jest błędem. W C++ musi być int main() {...}
  3. używanie zmiennych globalnych jest złą praktyką i w tym wypadku na pewno nie jest dobrym rozwiązaniem.
  4. moim zdaniem dodawanie przestrzeni nazw std też nie jest najlepszym rozwiązaniem - tyle, że przy takich małych kodach/projektach nie ma to znaczenia
  5. zatrzymywanie okna konsoli w ten sposób też nie jest dobre - powinno to za Ciebie zrobić IDE. Gotowy program nie powinien zatrzymywać konsoli, jak ktoś tego nie chce to powinien go uruchamiać z konsoli. Jeżeli IDE, którego używasz nie ma opcji zatrzymywania konsoli po wykonaniu programu to zmień je na coś sensowniejszego.
  6. Używanie endl tylko i wyłącznie w celu przejścia do nowej linii jest złym rozwiązaniem, ponieważ oprócz przejścia powoduje flush na strumieniu.

Kod powinien wyglądać tak:

#include <iostream>

std::string entliczek();
std::string pentliczek();

int main()
{
    std::string ent, pen;

    ent = entliczek();
    std::cout << ent << "\n";

    pen = pentliczek();
    std::cout << pen << std::endl;

  return 0;
}

std::string entliczek()
{
    std::string out = "Entliczek pentliczek";
    return out;

  //wystarczy samo return "Entliczek pentliczek";
}

std::string pentliczek()
{
    std::string out = "Czerwony stoliczek";
    return out;
   //j.w.
}

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