Struktura, wczytywanie napisu funkcją getline

0

Witam, problem polega na tym że przy dodawaniu nowej książki, przy wpisywaniu tytułu program działa gdy wpisuje się jedno słowo, natomiast kiedy chcę wpisać więcej program wpisuje drugie słowo jako następną daną. W którym miejscu w kodzie muszę umieścić funkcję getline aby wpisywany tekst był przypisywany tylko do tytułu a nie do imienia również.


// dodawanie, usuwanie oraz wyswietlanie utowrzonych przez nas ksiazek

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

struct book // towrzenie pojedynczej struktury book
{
    string tytul;        // wypisanie wszystkich potrzebnych danych
    string imie;
    string nazwisko;
    int dzien,miesiac,rok,ilosc_stron;

    book *nastepny;    // tworzenie wskaznika na nastepny element listy

    book() // konstruktor ktory wywolamy przy tworzeniu obiektu
    {
      // wczytujemy potrzebne dane
        cout << "Podaj Tytul Ksiazki: "; cin>>tytul;
        cout << "Podaj Imie Autora: ";cin>>imie;
        cout << "Podaj Nazwisko Autora: ";cin>>nazwisko;
        cout << "\n";
        cout << "Data Wydania ( DD/MM/RRRR) oraz ilosc stron:\n";
        cout << "\n";
        cout << "Podaj Dzien: "; cin>>dzien;
        cout << "Podaj Miesiac: "; cin>>miesiac;
        cout << "Podaj Rok: "; cin>>rok;
        cout << "Podaj ilosc stron: "; cin>>ilosc_stron;
        cout << "\n";
        // ustawiamy wskaznik na NULL
        nastepny=NULL;
    }
    void pokaz() // funckja wyswietlajaca ksiazke
    {
        cout<<"Tytul: "<<tytul<<"\nAutor: "<<imie<<" "<<nazwisko<<"\nData Wydania: "<<dzien<<"."<<miesiac<<"."<<rok<<"\nStron: "<<ilosc_stron<<"\n"; // nr indeksu 241839.
    }

};

void dodaj_ksiazke(book **wskaznik)
{
    book *nowa=new book;  // utworzenie nowej ksiazki
    book *pomoc = (*wskaznik), *pomoc1 = NULL;  // wskazniki ulatwiajace okreslenie poczatku listy

   if ((*wskaznik) == NULL) // nowa ksiazka bedzie wskaznikiem listy
   {
       nowa->nastepny = (*wskaznik);
       (*wskaznik) = nowa;
   }
   else // ustawiamy wskaznik na poczatek lub  srodek listy
   {
       pomoc1->nastepny = nowa;
       nowa->nastepny = pomoc;
   }

}

void wyswietl(book *wskaznik) // wyswietlanie wszystkich ksiazek
{
    cout<<"Dostepne w Bibliotece: \n";

    while (wskaznik != NULL) // jezeli wskaznik ksiazek jest rozny od zera wyswietli nasze ksiazki
    {
        wskaznik->pokaz();  // wyswietlenie listy
        wskaznik=wskaznik->nastepny; // wyswietlanie kolejnych elementow
    }
}

bool usun_ksiazke(book **wskaznik, string) // usuniecie wybranej ksiazki
{
    book *pomoc = (*wskaznik), *pomoc1 = NULL;

     if (pomoc == NULL) // jezeli lista jest pusta
     return false;

     else if (pomoc == (*wskaznik)) // w przeciwnym wypadku usuwamy koniec
{
        (*wskaznik) = (*wskaznik)->nastepny;
        delete pomoc;


}
     else // usuwamy element ze srodka lub konca listy
{
         pomoc1->nastepny = pomoc->nastepny;
         delete pomoc;
}
return true;
}


int main()
{
    book *wskaznik=NULL; // *wskaznik jest wskaznikiem na pierwszy element
    int opcja;
    string tytul;

    for(;;) // wywolanie nieskonczonej petli do wyswietlania menu
    {


    // wyswietlanie menu naszej bliblioteki
    cout << "            Biblioteka\n";
    cout << "1) Dodaj Ksiazke.\n";
    cout << "2) Usun Ksiazke.\n";
    cout << "3) Wyswietl Wszystkie Ksiazki.\n";
    cout << "4) Wyjscie.\n";
    cout << "\n";

    cout << "Opcja: "; cin>>opcja;
    // funkcja pozwalajaca wybierac opcje pod ktorymi sa nasze wczesniej stworzone funkcje
    switch (opcja)
    {
    case 1:
        dodaj_ksiazke(&wskaznik);
        break;

    case 2:

        cout << "Podaj tytul ksiazki: "; cin>>tytul;


        if (!usun_ksiazke(&wskaznik, tytul)) // podajemy tytul ksiazki ktora chcemy usunac
            cout << "Nie odnaleziono podanej ksiazki\n";


            else
                cout << "Ksiazka zostala usunieta\n";
        break;

    case 3:
        wyswietl(wskaznik);
        break;

    case 4:
        exit(0);

    default:
        cout << "Wybierz Opcje 1,2,3 lub 4";
        cout << "\n \n";
    }
    }
    return 0;
}
3
  1. wprowadzanie danych w konstruktorze - a fuj!
  2. mieszanie getline i operatorow należy wykonywać ostrożnie: http://kaczus.ppa.pl/art/Skrzynia_porad,18.html#getline
0
  1. Poradź mi kolego, gdzie najlepiej wprowadzać dane, i jak w takim razie powinien wyglądać dobry konstruktor?
  2. getline mam wstawić do funkcji main() w switch'u czy do konstruktora który wczytuje dane?
0

Podaj treść zadania, bo póki co to mamy wesołe korzystanie z dobrodziejstw C++: string i iostream połączone z surowymi tablicami C w akompaniamencie new i delete.

0
  1. utworzyć strukturę przechowującą informacje o książce (tytuł (napis), datę wydania (liczba), ilość stron (liczba), imię (napis) i nazwisko (napis) autora)
  2. przygotować tablicę lub listę do przechowywania informacji o posiadanych książkach
  3. napisać funkcję umożliwiającą dodawanie i usuwanie książek
  4. napisać funkcję wyświetlającą informację o wszystkich posiadanych książkach
  5. przygotować menu umożliwiające pracę z programem (dodawanie książek, usuwanie i wyświetlanie informacji o aktualnej zawartości zbioru)
0
  1. W konstruktorze przypisujesz wartosci. Przecież dane mogą być z pliku, bazy danych, internetu, wprowadzone bezpośrednio z kodu. Takie informacje nie powinny być obsługiwane w konstruktorze, bo to bez sensu, czemu ma być wprowadzanie akurat z konsoli? Teraz piszesz z konsoli, jutro bedziesz potrzebował te dane wprowadzić z innego miejsca, dlatego takie rzeczy rozdziela sie.
  2. getline wstaw tam, gdzie chcesz wczytać linię danych. Tylko właśnie z mieszaniem getline i formatowanymi danymi trzeba uważać, podałem link.

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