• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ocena ogólna mojego pierwszego projektu na studia i pomoc w moich zagwostkach.

VPS Starter Arubacloud
0 głosów
166 wizyt
pytanie zadane 21 grudnia 2022 w C i C++ przez Robertoo999 Nowicjusz (160 p.)

Cześć! Możecie poradzić co można zrobić lepiej w tej początkowej fazie mojego pierwszego większego projektu? Robię system wspomagający biblioteką. 

1. Dlaczego pierwszy getline jest ignorowany, a drugi działa. ?

2. Jaka jest komenda aby zakończyc program? exit(0) nie  działa

3. Jak mogę wrócić do np. menu ale bym chciał żeby było coś innego na górze napisane.

4. Jak mogę zrobić aby zmienna była zapamiętana po wyjściu z programu, żeby były ponumerowane w pliku po kolei numery, która to jest z kolei książka w pliku?

Z góry dziękuję.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>

using namespace std;
struct ksiazka
{
    string tytul;
    string autor;
    int data;
};

void wprowadz();

void menu()
{
    system("chcp 1250>>NULL");
    int wybor;


    cout<<"Witaj w bibliotece. "<<endl;
    cout<<"(1) WprowadŸ ksi¹¿kê do biblioteki."<<endl;
    cout<<"(2) Poka¿ jakie s¹ obecnie ksi¹¿ki w bibliotce."<<endl;
    cout<<"(3) Wypo¿ycz ksi¹¿kê z biblioteki."<<endl;
    cout<<"(4) Usuñ ksi¹¿kê z biblioteki."<<endl;
    cout<<"(5) Wyjœcie."<<endl;
    cout<<"Co chcesz zrobiæ? Wpisz cyfrê: "<<endl;
    cin>>wybor;
    if(wybor<1||wybor>5)
    {
        cout<<"WprowadŸ poprawn¹ liczbê (od 1 do 5)."<<endl<<endl;;;
        menu();
    }
    switch(wybor)
    {
    case 1:
        wprowadz();
        break;

    }


}

void wprowadz()
{
    int n;
    int z;
    int liczba_ksiazek=0;
    ksiazka baza[100];
    cout<<"Podaj iloœæ ksi¹¿ek jak¹ chcesz wprowadziæ do biblioteki: ";
    cin>>n;

    for(int i=0; i<n; i++)
    {
        cout<<"Podaj tytu³ ksi¹¿ki: ";
        getline(cin,baza[liczba_ksiazek].tytul);
        cout<<"Podaj imiê i nazwisko autora ksi¹¿ki: ";
        getline(cin,baza[liczba_ksiazek].autor);
        cout<<"Podaj datê powstania ksi¹¿ki: ";
        cin>>baza[i].data;

        fstream plik;
        plik.open("Biblioteka.txt",ios::out | ios::app);
        plik<<"Dane "<<liczba_ksiazek+1<<" ksi¹¿ki:"<<endl;
        plik<<"Tytu³: "<<baza[liczba_ksiazek].tytul<<endl;
        plik<<"Autor: "<<baza[liczba_ksiazek].autor<<endl;
        plik<<"Data powstania: "<<baza[liczba_ksiazek].data<<endl<<endl;
        plik.close();

        liczba_ksiazek++;

    }
    cout<<"Czy chcesz coś jeszcze zrobić (1) lub czy chcesz zakończyć (2)?";
    cin>>z;
    if(z=1)
        menu();
    else if(z=2)
        exit(0);
}

int main()
{

    menu();

    return 0;
}

 

komentarz 22 grudnia 2022 przez j23 Mędrzec (194,920 p.)

1. Dlaczego pierwszy getline jest ignorowany, a drugi działa. ?

Dlatego, że wcześniej czytasz liczbę operatorem >>, który zostawia znak końca linii w strumieniu wejściowym. Ten znak zostanie ściągnięty przez wywołanie std::getline. Rzecz w tym, że linia została już przeczytana w całości i poza znakiem końca linii nic w niej nie ma, i dlatego std::getline czyta pustą linię.

Najprościej można ten problem rozwiązać używając manipulatora std::ws:

std::getline (std::cin >> std::ws, ...);

 

komentarz 22 grudnia 2022 przez TOWaD Mądrala (5,700 p.)
edycja 22 grudnia 2022 przez TOWaD

Wczoraj tak fajnie odpowiedział @Oscar, że wstyd było to dodawać. Ale może coś się z tego przyda.

exit wyjście;

edit: i chciałem dodać link , bo pierwszy raz widzę system("chcp 1250>>NULL") , i mnie zastanowiło.

2 odpowiedzi

0 głosów
odpowiedź 21 grudnia 2022 przez Robertoo999 Nowicjusz (160 p.)
juz z exitem rozwiązałem problem:)
0 głosów
odpowiedź 21 grudnia 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 22 grudnia 2022 przez Oscar

Zmień strukture programu. Funkcja menu() powinna tylko wyświetlić menu, pobrać wybór  i zwrócić go. To main() ma zawierać ten główny switch (oczywiściue w pętli), który wywołuje poszczególne funkcje wykonujące polecenia. Tak jak teraz to coraz głębiej wchodzisz w zagłębienie funkcji - z menu() wołasz wprowadz() a z wprowadz() menu(). To taka rekurencja, tylko nigdy z niej nie wychodzisz. Program będzie działał ileś operacji i się wysypie po przepełnieniu stosu.

Stronę kodową też wystarczy ustawić raz na początku (w main). A najlepiej nie rób tego - przygotowanie środowiska to nie zadanie twojego programu.

Lista książek typowej biblioteki to tysiące pozycji. W dzisiejszych komputerach zmieści się w pamięci - wczytuj ja z dysku na początku i zapisuj na dysk po jakiejś zmianie lub na żądanie. Najlepiej byłoby użyć bazy danych, ale nie wiadomo czy znasz temat.

Uzupełnij strukturę książka o informacje, co się z książką aktualnie dzieje - jest w bibliotece, wypożyczona (komu) itp. Można to trzymać oddzielnie, ale chyba najprościej mieć w jednym miejscu. To też trzeba zapamiętywać na trwale, więc razem z tabelką książek zostanie zapisane. W zasadzie to potrzeba jeszcze tabelki czytelników i to też warto dodać. Zależność jest taka, że jeden czytelnik może mieć wiele (klika) książek, ale książka może być tylko u jednego czytelnika (albo w bibliotece). I jeszcze uzupełnij strukturę o jakieś unikalne ID - tak by pomimo przebudowy tabelki dana książka miała stały, unikalny identyfikator.

Dobrze przemyśl struktury ksiażka i czytelnik, zarówno w programie, jak i na dysku - sposób zapisu.

 

To dla ciebie wstęp do analizy zadania - w pracy programisty będziesz często musiał poznać jak coś pracuje i to odwzorować w programie. Nie będziesz dostawał zadań szczegółowych co do instrukcji, bo wtedy zamiast pisać zadanie można by od razu napisać program.

Podobne pytania

+1 głos
1 odpowiedź 174 wizyt
pytanie zadane 20 grudnia 2019 w Nasze projekty przez xFanti Obywatel (1,350 p.)
+4 głosów
0 odpowiedzi 128 wizyt
0 głosów
2 odpowiedzi 699 wizyt
pytanie zadane 23 grudnia 2019 w C i C++ przez _Kuba_ Początkujący (250 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...