Zadania c++ - proszę o sprawdzenie

0

Dzień dobry,

Nazywam się Piotrek i od jakiegoś czasu podjąłem naukę C++. Obecnie przegladam filmy Pana Mirosława Zelenta jak i książkę obecnie: "Przewodnik dla początkujących C+" Alex Allain.

Aktualnie przerobiłem 4 rozdział tej książki i próbuję robić zadania, które znajdują się na końcu tego rozdziału.

Moje pytanie brzmi: Czy ktoś mógłby rzucić okiem i skomentować moje kody na zadania z tego z rozdziału?

Poniżej wklejam moje kody i treści tych zadań.

Rozdział opiera się na instrukcjach warunkowych if, dlatego zadania te opierałem właśnie na tej wiedzy.

  1. Poproś użytkownika o podanie wieku dwóch osób i wskaż, która z nich jest starsza. Jeśli obie osoby mają powyżej 100lat, program powinien zachować się w szczególnych sposób.
#include<iostream>

using namespace std;

int wiek1;
int wiek2;

int main()
{
    cout<<"Podaj wiek pierwszej osoby: ";
    cin>>wiek1;
    cout<<"Podaj wiek drugiej osoby: ";
    cin>>wiek2;

 if(wiek1>=100&&wiek2>=100)
        {
            cout<<"OSOBY MAJA POWYZEJ 100 LAT GRATULACJE!!!"<<endl;
        }
    if(wiek1>wiek2)
    {
        cout<<"Pierwsza osoba jest starsza";
    }
    else if(wiek1<wiek2)
    {
        cout<<"Druga osoba jest starsza";
    }
    else
    {
        cout<<"Osoby sa w tym samym wieku";
    }

    cin.ignore();
    cin.get();
    return 0;
}
  1. Zaimplementuj prosty system weryfikacji haseł, który pobiera hasła w postaci liczb. Ważne powinno być jedno z dwóch haseł, ale w celu ich sprawdzenia użyj tylko jednej instrukcji warunkowej if.
#include<iostream>

using namespace std;

string haslo;
string haslo2;

int main()
{

    cout<<"system weryfikacji hasel!!!"<<endl;
    cout<<"Podaj haslo 1 w celu weryfikacji: ";
    cin>>haslo;
    cout<<"Podaj haslo 2 w celu weryfikacji: ";
    cin>>haslo2;

    if(haslo=="1234"||haslo2=="4567")
    {
        cout<<"Weryfikacja poprawna";
    }

    cin.ignore();
    cin.get();

    return 0;
}
  1. Napisz niewielki kalkulator, który pobiera na wejściu jeden z operatorów arytmetycznych oraz dwa argumenty, po czym wyświetla wynik obliczeń otrzymany na podstawie tych danych.
#include<iostream>

using namespace std;

string znak;
double a;
double b;

int main()
{
 cout<<"Prosze podac znak arytmetyczny +,-,*,/: ";
 cin>>znak;
 cout<<"Prosze podac pierwsza liczbe: ";
 cin>>a;
 cout<<"Prosze podac druga liczbe: ";
 cin>>b;

 if(znak=="+")
 {
     cout<<"Suma liczb a i b wynosi: "<<a+b<<endl;
 }
 else if(znak=="-")
 {
     cout<<"Roznica liczb a i b wynosi: "<<a-b<<endl;
 }
 else if(znak=="*")
 {
     cout<<"Iloczyn liczb a i b wynosi: "<<a*b<<endl;
 }
 else
 {
     cout<<"Iloraz liczb a i b wynosi: "<<a/b<<endl;
 }

 cin.ignore();
 cin.get();
 return 0;

}
4

Jest całkiem spoko.

Kilka uwag:

  1. nie używaj zmiennych globalnych. Zawsze maksymalnie ograniczaj zasięg zmiennej.
  2. popracuj nad formatowaniem
  3. wyposaż się w IDE które będzie łapać konsolę zamiast bawić się w cin.ignore(); cin.get();. Jeśli spojrzysz w kalendarz mamy 2016. rok :​)
  4. jeśli miałeś wczytać w zad. 3 znak - to użyj znaku, a nie stringa
  5. w zad. 3 dużo lepiej by się spisał switch
8
  1. nazwy po angielsku
  2. formatuj kod
  3. jeżeli masz stałe to zapisuje je jako stałe a nie zaszywasz coś takiego w środku kodu: "1234"
  4. nie rób wszystkich zmiennych globalnych
    Ale generalnie ok.
0

Dziękuję za odpowiedzi, są bardzo pomocne. Oczywiście kilku rzeczy jeszcze nie miałem jak np. switch aczkolwiek rozumiem o co chodzi. Wraz z następnym rozdziałem oczywiście poszerzę swoją wiedzę o kolejne możliwości w kodowaniu i sukcesywnie będzie je wdrażać.

Szarotka:

  1. Nazwy po angielsku - chodzi o nazwy zmiennych i teksty, które umieszczam w kodzie?
  2. Nie wiedziałem właśnie jak sformatować poprawnie pod C++ ale już wszystko wyszukałem. Następny będzie już poprawnie sformatowany. Dziękuję za uwagę.
1

Nazwy zmiennych i funkcji. Interakcja z użytkownikiem to zupełnie inna sprawa i nie musi być po angielsku. Teoretycznie mógłbyś się bawić w translacje, ale to nie ten poziom.

0

Kolejne zadanie z rozdziału 4:

  1. Rozszerz program kontrolujący hasła który został zamieszczony tym rozdziale, w taki sposób, aby akceptował wielu użytkowników, z których każdy ma swoje hasło. Poniżej kod z rozdziału:
#include<iostream>
#include<string>

using namespace std;

int main()
{
   string nazwa;
   string haslo;

   cout<<Podaj nazwe uzytkownika: ";
   getline(cin, nazwa, '\n');

   cout<<"Podaj haslo: ";
   getline(cin, haslo, '\n');

    if(nazwa=="admin"&&haslo=="xyzzy")
    {
        cout<<"Dostep przyznany!";
    }

    else
    {
        cout<<"Niepoprawna nazwa uzytkownika lub haslo.Odmowa dostepu"<<endl;
        return 0;
    }
    
}

Zagwarantuj, aby właściwe hasła były przypisane właściwym użytkownikom. Udostępnij możliwość ponownego zalogowania użytkownika, jeśli pierwsza próba nie powiodła się. Zastanów się, jak łatwo(albo trudno) można zrealizować taką funkcjonalność w przypadku dużej liczby użytkowników i haseł.

A oto moje rozwiązanie do zadania:

#include<iostream>
#include<string>

using namespace std;

int main()
{
   string user;
   string password;

   cout<<"USER: ";
   getline(cin, user, '\n');
   cout<<"PASSWORD: ";
   getline(cin, password, '\n');

    if(user=="max"&&password=="qaz")
    {
        cout<<"Access Granted!";
    }
    else if(user=="claw"&&password=="qwer")
    {
        cout<<"Access Granted!";
    }
    else if(user=="code"&&password=="cup")
    {
        cout<<"Access Granted!";
    }
    else
    {
        cout<<"ERROR, incorrect username or password"<<endl;
        cout<<"USER: ";
        getline(cin, user, '\n');
        cout<<"PASSWORD: ";
        getline(cin, password, '\n');
    }
    return 0;
}

Nie jestem pewien co do ponownego logowania w kroku "else" ponieważ przy drugim wpisaniu poprawnego loginu i hasła nie zwraca napisu "Access Granted" jak w przypadku pierwszych kroków IF. Nie wiem jak inaczej mogę to napisać wykorzystując funkcję IF.

Jakieś uwagi ?

0

Skonsolidowałem tylko poprzedni kod i poprawiłem ponowne logowanie ale nadal nie wiem jak dodać użytkownika :)

#include<iostream>
#include<string>

using namespace std;

int main()
{
   string user;
   string password;

   cout<<"USER: ";
   getline(cin, user, '\n');
   cout<<"PASSWORD: ";
   getline(cin, password, '\n');

    if((user=="max"&&password=="qaz")||(user=="claw"&&password=="qwer")||(user=="code"&&password=="cup"))
    {
        cout<<"Access Granted!";
    }
    else
    {
        cout<<"ERROR, incorrect username or password"<<endl;
        cout<<"USER: ";
        getline(cin, user, '\n');
        cout<<"PASSWORD: ";
        getline(cin, password, '\n');

        if((user=="max"&&password=="qaz")||(user=="claw"&&password=="qwer")||(user=="code"&&password=="cup"))
        {
        cout<<"Access Granted!";
        }
    }
    return 0;
}
0

Niestety na tym etapie jeszcze nie wiem jak zrobić wprowadzanie użytkowników w zadaniu 4. Wrócę do tego zadania później jak poznam odpowiednią funkcję.

0

Słowo-klucz: kontenery (możesz to zrobić na tablicy (na upartego), wektorze (tak powinieneś), albo ewentualnie (jak poniżej) na mapie)

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

int main() {
	using login_type = string;
	using password_type = string;
	using users_type = unordered_map<login_type, password_type>;
	
	users_type users = {
		{ "ktostam", "jakisfajnyhash" },
		{ "ktosinny", "jakisinnyhash" }
	};
	
	users["patrz, wlasnie dodalem kogos nowego"] = "z jakims fajnym haslem";
	
	for(auto login_password_pair: users) {
		cout << "login: \"" << login_password_pair.first << "\", password: \"" << login_password_pair.second << "\"\n";
	}
	return 0;
}
1

Ewentualnie możesz to tak zorganizować (gdybyś zastanawiał się jak wygląda C++ w pełnej swojej okazałości1):

//repository.hpp
#pragma once
#include <functional>
#include <optional>
#include <vector>

template<typename T>
struct repository {
    using unary_predicate = std::function<bool(T const &)>;
    virtual ~repository() = default;
    
    virtual std::optional<T> get(unary_predicate pred) const = 0;
    virtual std::vector<T> find(unary_predicate pred) const = 0;
    virtual void add(T &&t) = 0;
    //update, remove etc.
};
//mem_repository.hpp
#pragma once
#include <algorithm>
#include <iterator>
#include <vector>
#include "repository.hpp"

template<typename T>
struct mem_repository: repository<T> {
    using typename repository<T>::unary_predicate;
    
    virtual std::optional<T> get(unary_predicate pred) const override {
        auto it = std::find_if(std::begin(data), std::end(data), pred);
        if(it != std::end(data)) {
            return *it;
        }
        return {};
    };
    
    virtual std::vector<T> const &all() const {
        return data;
    }
    
    virtual std::vector<T> find(unary_predicate pred) const override {
        std::vector<T> result;
        std::copy_if(std::begin(data), std::end(data), std::back_inserter(result), pred);
        return result;
    };
    
    virtual void add(T &&t) override {
        data.push_back(t);
    };
    
protected:
    std::vector<T> data;
};
//user.hpp
#pragma once
#include <string>
namespace model {
    struct user {
        std::string login, password;
    };
}
//users_repository.hpp; notka: powinno zostac z tego wyciagniety plik .cpp z definicja funkcji sie tu znajdujacej
#pragma once
#include "mem_repository.hpp"
#include "user.hpp"

using users_repository = mem_repository<model::user>;
namespace find_user_by {
    users_repository::unary_predicate login(std::string const &login) {
        return [&](model::user const &user) {
            return user.login == login;
        };
    }
};

i twój main wtedy może wyglądać tak:

#include "users_repository.hpp"

#include <iostream>

int main() {
    using namespace std;
    
    namespace by = find_user_by;
    users_repository users;
    users.add(model::user {
        "maniek", "jakiesolonehaslo"
    });
   
    users.add(model::user {
        "franiek", "jakiesolonehaslo2"
    });
    
    if(auto user = users.get(by::login("maniek"))) {
        cout << "mamy manka!" << endl;
    }
    
    if(auto user = users.get(by::login("spartanPAGE"))); else {
        cout << "nie mamy spartana :c" << endl;
    }
    
    cout << "uzytkownicy: " << endl;
    for(auto &&user: users.all()) {
        cout << user.login << " ";
    }
}

http://melpon.org/wandbox/permlink/anHdQmuhrnwLrkJr
1- oj, gdyby tutaj napluć jeszcze jakimś konkretnym metapgoramowaniem...

0

Dziękuję za wskazówki, ale na etapie na którym się obecnie znajduje to zbyt skomplikowane :) na pewno do tego wrócę, kiedy tylko zakres mojej wiedzy będzie trochę większy :) lecę do następnego rozdziału 5 czyli pętle :) wciągnęła mnie ta nauka C++

0

Kolejne zadanie. Rozdział 5 - pętle:

Zad. 1 Napisz program, który wypisze pełny tekst 99 Bottles of Beer.

#include<iostream>

using namespace std;

int main()
{
    for(int x=99; x>=1; x--)
    {
        cout<<x<<" bottles of beer on the wall, "<<x<<" bottles of beer. "<<endl;
        cout<<" Take one down and pass it around - "<<x-1<<" bottles of beer on the wall."<<endl;
    }

    cout<<"No bottle of beer on the wall, No bottle of beer.";

return 0;

}
0

Kolejne zadanie z rozdz.5

Zadanie 2. Napisz program udostępniający menu, które pozwala użytkownikowi dokonać wyboru spośród różnych opcji. Jeśli odpowiedź udzielona przez użytkownika nie jest zgodna z żadną z opcji, wyświetl menu jeszcze raz.

Moje rozwiązanie

#include<iostream>

using namespace std;

int main()
{
    char option1;

    cout<<"MENU - wybierz interesujaca Cie opcje"<<endl;
    cout<<"[1] Wyswietli imie"<<endl;
    cout<<"[2] Wyswietli nazwisko"<<endl;
    cout<<"[3] Wyswietli wiek"<<endl;
    cin>>option1;

while(option1!='1'&&option1!='2'&&option1!='3')
{
    cout<<"MENU - wybierz interesujaca Cie opcje"<<endl;
    cout<<"[1] Wyswietli imie"<<endl;
    cout<<"[2] Wyswietli nazwisko"<<endl;
    cout<<"[3] Wyswietli wiek"<<endl;
    cin>>option1;
}
    if(option1=='1')
    {
    cout<<"Jan"<<endl;
    }
        else if(option1=='2')
        {
        cout<<"Kowalski"<<endl;
        }
        else if(option1=='3')
        {
        cout<<"28 lat"<<endl;
        }

            return 0;
}

Czy macie jakieś uwagi do mojego rozwiązania?

0
string option1; 

Jeśli używasz jednego znaku, korzystaj z typu char.

Do przechowania danych osobowych przydałaby się struktura.

Powtarzające się fragmenty kodu wydziel do funkcji.

0

Kolejne zadanie.

Zadanie 3.
Napisz program obliczający sumę narastającą liczb wprowadzanych przez użytkownika, który zakończy swoje działanie, gdy użytkownik wprowadzi 0.

Moje rozwiązanie:

#include<iostream>

using namespace std;

int main()
{
    double figure;
    double sum=0;
    while(figure!=0)
    {
        cout<<"Podaj liczbe: ";
        cin>>figure;
        sum=sum+figure;
    }
if(figure==0)
    {
    cout<<"suma: "<<sum;
    }

return 0;
}

Proszę o jakieś uwagi, wskazówki odnośnie mojego rozwiązania :)

0

Nie wydaje się Wam, że zadania do rozwiązania w tej książce (Alex Allain - "C++ - przewodnik dla początkujących") niezupełnie odpowiadają treści rozdziału, w którym są zamieszczane? Ja odnoszę wrażenie, że zadania dotyczą rozdziałów późniejszych, a więc nie bardzo możliwych do rozwiązania na aktualnym etapie nauki. Moim zdaniem nie jest to prawidłowe.

1
  1. Do porównania liczb zmiennoprzecinkowych się nie używa == lub !=: http://eduinf.waw.pl/inf/utils/001_2008/0119.php
  2. Używasz niezainicjalizowanej zmiennej, czyli undefined behaviour
double figure;
while(figure!=0)
  1. Niepotrzebny if (dlaczego pozostawiam jako krótkie ćwiczenie)
if(figure==0)
0

Mam jeszcze jedną uwagę: o ile w książce tej są zamieszczone rozwiązania testów (Sprawdź się), to nie ma rozwiązań zadań praktycznych, o których pisałem poprzednio. Jest to moim zdaniem kolejny błąd tej publikacji. A może te rozwiązania są gdzieś w internecie? Szukałem, nie znalazłem. W razie czego mile widziane będą jakieś namiary. Z góry dzięki.
Oczywiście chodzi mi tylko o sprawdzenie, czy moje rozwiązanie danego zadania jest właściwe, a nie o bezmyślne kopiowanie.

0

Instrukcja IF niepotrzebna gdyż po niespełnieniu warunku liczby!=0 program samoczynnie przejdzie do poleceniu policz sumę.

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