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

C++ błąd programu

Object Storage Arubacloud
0 głosów
445 wizyt
pytanie zadane 3 stycznia 2019 w C i C++ przez gorgonkowa Obywatel (1,810 p.)

Hejka. Chciałabym się Was poradzić, co można zrobić w tym kodzie, aby pozbyć się błędu i sprawić, żeby funkcja liczyła długość wprowadzonych znaków (chodzi o PESEL).
Kod programu:
 

#include <list>
#include <iostream>
#include <windows.h>
#include <string>

using namespace std;

list<int>lista_systemu; //utworzenie listy, która przechowuje liczby całkowite
int funkcja;

void Wyswietl_Dane()
{
    system("CLS");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
    cout << "SYSTEM ZARZADZANIA OBIEGIEM INFORMACJI: " << endl;
    cout <<"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-" << endl;
    for(list<int>::iterator w=lista_systemu.begin(); w!=lista_systemu.end(); ++w)
    {
        cout << *w << " ";

        cout << endl;
        cout << "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-" << endl << endl;
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);

    }
}

void push_front()
{
    string imie, nazwisko, plec, floor;
    int dzien, miesiac, rok_urodzenia, nr_PESEL, dlugosc_PESEL, wynik;
    cout << "WSTAWIANIE DANYCH NA POCZATEK LISTY" << endl;
    cout << "Podaj plec(Kobieta/Mezczyzna): ";
    cin >> plec;
    if(plec!="Kobieta" && plec!="Mezczyzna")
    {
        printf("Niepoprawna plec!");
        Sleep(3000);
        return;
    }
    cout << "Podaj imie: ";
    cin >> imie;
    cout << "Podaj nazwisko: ";
    cin >> nazwisko;
    cout << "Podaj dzien urodzenia: ";
    cin >> dzien;
    if(dzien>31 || dzien<1)
    {
        printf("Nieprawidlowy dzien! Sprobuj od nowa.");
        Sleep(3000);
        return;
    }
    cout << "Podaj miesiac urodzenia: ";
    cin >> miesiac;
    if(miesiac>12 || miesiac<1)
    {
        printf("Nieprawidlowy miesiac! Sprobuj ponownie.");
        Sleep(3000);
        return;
    }
    cout << "Podaj rok urodzenia: ";
    cin >> rok_urodzenia;
    if(rok_urodzenia>2019 || rok_urodzenia<1900)
    {
        printf("Nieprawidlowy rok! Sprobuj wypelnic dane jeszcze raz.");
        Sleep(3000);
        return;
    }
    cout << "Podaj numer PESEL: ";
    cin >> nr_PESEL;
    double temp = dlugosc_PESEL;
    while(floor(dlugosc_PESEL) < dlugosc_PESEL)
    {
        dlugosc_PESEL *= 10;
        wynik++;
    }

    while(temp >= 1)
    {
        temp /= 10;
        wynik++;
    }

    lista_systemu.push_front(plec[10]);
    lista_systemu.push_front(imie[30]);
    lista_systemu.push_front(nazwisko[30]);
    lista_systemu.push_front(dzien);
    lista_systemu.push_front(miesiac);
    lista_systemu.push_front(rok_urodzenia);
    lista_systemu.push_front(nr_PESEL);
}

void push_back()
{
    string imie, nazwisko, plec;
    int dzien, miesiac, rok_urodzenia, nr_PESEL;
    cout << "WSTAWIANIE DANYCH NA KONIEC LISTY" << endl;
    cout << "Podaj plec(Kobieta/Mezczyzna): " << endl;
    cin >> plec;
    if(plec!="Kobieta" && plec!="Mezczyzna")
    {
        printf("Niepoprawna plec!");
        return;
    }
    cout << "Podaj imie: ";
    cin >> imie;
    cout << "Podaj nazwisko: ";
    cin >> nazwisko;
    cout << "Podaj dzien urodzenia: ";
    cin >> dzien;
    cout << "Podaj miesiac urodzenia: ";
    cin >> miesiac;
    cout << "Podaj rok urodzenia: ";
    cin >> rok_urodzenia;
    cout << "Podaj numer PESEL: ";
    cin >> nr_PESEL;


    lista_systemu.push_front(plec[10]);
    lista_systemu.push_front(imie[30]);
    lista_systemu.push_front(nazwisko[30]);
    lista_systemu.push_front(dzien);
    lista_systemu.push_front(miesiac);
    lista_systemu.push_front(rok_urodzenia);
    lista_systemu.push_front(nr_PESEL);
}

void pop_front()
{
   printf("Za chwile nastapi usuniecie osoby, ktora jest na poczatku listy...");
   Sleep(3000);
   lista_systemu.pop_front();
}

void pop_back()
{
    printf("Za chwile nastapi usuniecie osoby, ktora jest na koncu listy...");
    Sleep(3000);
    lista_systemu.pop_back();
}

void size()
{
    cout << "Na liscie jest: " << lista_systemu.size() << "osob.";
    Sleep(3000);
}

void max_size()
{
    cout << "Maksymalna ilosc osob, ktora mozna przechowac to: " << lista_systemu.max_size();
}

void empty()
{
    cout << "Czy lista systemu jest pusta? Sprawdzmy... -------> ";
    if(lista_systemu.empty()==1)
    {
        cout << "Lista w systemie jest pusta.";
    }
    else cout << "Lista w systemie nie jest pusta.";
    Sleep(3000);
}

void remove()
{
    int nr_PESEL ;
    cout << "Usuwanie pozycji o tym samym PESELU: ";
    cin >> nr_PESEL;
    Sleep(3000);
}

void sort()
{
    cout <<"Za chwile nastapi posortowanie listy wedlug identyfikatora: ";
    lista_systemu.sort();
    Sleep(3000);
}

void reverse()
{
    cout <<"Za chwile nastapi posortowanie listy w odwrotnej kolejnosci: ";
    lista_systemu.reverse();
    Sleep(3000);
}

void exit()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
    cout << "Za chwile nastapi zamkniecie programu! Zapraszamy ponownie.";
    Sleep(3500);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0);
}

int main()
{

do
{
    Wyswietl_Dane();

    cout << "MENU GLOWNE LISTY SYSTEMU: " << endl;
    cout << "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-" << endl;
    cout << "1. push_front - dodawanie na poczatku listy" << endl;
    cout << "2. push_back - dodawanie na koncu listy" << endl;
    cout << "3. pop_front - usuwanie na poczatku listy" << endl;
    cout << "4. pop_back - usuwanie na koncu listy" << endl;
    cout << "5. size - sprawdzenie ilosci elementow na liscie" << endl;
    cout << "6. max_size - sprawdzenie maksymalnej ilosci elementow na liscie" << endl;
    cout << "7. empty - sprawdzenie, czy lista jest pusta" << endl;
    cout << "8. remove - usuniecie osoby o takim samym numerze PESEL" << endl;
    cout << "9. sort - sortowanie listy systemu rosnaco" << endl;
    cout << "10. reverse - sortowanie listy w odwrotnej kolejnosci" << endl;
    cout << "11. exit - wyjscie z programu" << endl;
    cout << "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-" << endl;
    cout << "Wybor funkcji: ";
    cin >> funkcja;

        switch(funkcja)
        {
            case 1: push_front(); break;
            case 2: push_back(); break;
            case 3: pop_front(); break;
            case 4: pop_back(); break;
            case 5: size(); break;
            case 6: max_size(); break;
            case 7: empty(); break;
            case 8: remove(); break;
            case 9: sort(); break;
            case 10: reverse(); break;
            case 11: exit(); break;

        default:
            cout << "Ups! Cos poszlo nie tak!";
            Sleep(3000);
            break;
        }

}
while(funkcja!=11);

    return 0;
}

Błąd pojawia się w linijce 72:
 

while(floor(dlugosc_PESEL) < dlugosc_PESEL)

Błąd brzmi:
Error: no match for call to (std::__cxxll::string {aka std::__cxxll::basic_string<char>}) (int&)'

Byłabym ogromnie wdzięczna za pomoc. :)

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Czy floor nie jest do zaokraglania i zarezerwowana nazwa zmiennej w jezyku c++?
komentarz 3 stycznia 2019 przez Velta Maniak (52,370 p.)

Nr PESEL to ciąg 11 cyfr, a maksymalna wartość liczby całkowitej ma ich 10. Nie prościej będzie dla niego przyjąć typ ciągu znaków? Możesz wtedy sprawdzić długość za pomocą string::length.

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
A w razie potrzeby przykonwektorowac na typ long long
komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

@Velta,
 Dziękuję za sugestię. :) Spróbowałam zamienić floor na string::length, jednak nie wiem, czy poprawnie, ponieważ błąd nadal się utrzymuje:
 

while(string::length(dlugosc_PESEL) < dlugosc_PESEL)

 

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
A zmieniles typ danych na string?
komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Masz na myśli tą linijkę?
 

double temp = dlugosc_PESEL;

Próbowałam tutaj różne typy danych wstawiać, jednak również błąd się utrzymuje...

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)

Bo ta linijka musi byc zrobiona tak:

double temp = string::length(dlugosc_PESEL)

Co zwroci dlugosc numeru pesel

komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Hmm... tak jeszcze nie próbowałam, a co ciekawe, błąd dalej występuje w kodzie i wskazuje tą samą linijkę... :/
komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Pokaz kod od linijki 60 do 80
komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Linijki 61-82:
cout << "Podaj rok urodzenia: ";
    cin >> rok_urodzenia;
    if(rok_urodzenia>2019 || rok_urodzenia<1900)
    {
        printf("Nieprawidlowy rok! Sprobuj wypelnic dane jeszcze raz.");
        Sleep(3000);
        return;
    }
    cout << "Podaj numer PESEL: ";
    cin >> nr_PESEL;
    double temp = string::length(dlugosc_PESEL);
    while(string::length(dlugosc_PESEL) < string::length(dlugosc_PESEL))
    {
        dlugosc_PESEL *= 10;
        wynik++;
    }

    while(temp >= 1)
    {
        temp /= 10;
        wynik++;
    }

 

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
while(string::length(dlugosc_PESEL) < string::length(dlugosc_PESEL))
    {
        dlugosc_PESEL *= 10;
        wynik++;
    }

Ta petla jest troche bez sensu. Powtarzaj dopoki dlugosc peselu jest krotsza od numer peselu, ale porownujesz, tzn zestawiasz ze soba 2 takie same wartosci. Moze powiedz co ta petla ma robic

komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Generalnie chodziło mi o to, żeby liczyć długość znaków, a w zależności od długości znaków żeby wyświetlała stosowny komunikat... Em... Czyli powinien być tutaj if?
komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)

Dlugosc znakow, liczysz za pomoca string::length(), tzn liczy ilosc znakow w Twoim stringu. I teraz jezeli chcesz wyswietlic dany komunikat w zaleznosci od ilosci znakow sa 2 metody:

if () {
} else if () {
} else if () {
}
...
else{
}

i 2 ladniejsza:

switch () 
{
   case '1':
       break;
   case '2':
       break;
   case '3':
       break;
    default
        break;
}

Tylko to jest bez sensu, bo  pesel powinnien miec 11 cyfr, jak ktos wyzej wspomnial, wiec wsyraczy sprawdzic, czy jest krotszy od 11 i wyrzucic blad na ekran. Chyba, ze chcesz za kazdym razem podac ile znakow brakuje

komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Hmm... pomysł całkiem ciekawy :) Zrobiłam w ten sposób, jednak nadal chyba o czymś zapominam:
 

    cout << "Podaj numer PESEL: ";
    cin >> nr_PESEL;
    double temp = string::length(dlugosc_PESEL);
    if(string::length(dlugosc_PESEL) < 11 || string::length(dlugosc_PESEL) > 11)
    {
        cout << "Nieprawidlowa dlugosc PESELU. Sprobuj ponownie."
        Sleep(3000);
        return;
    }
    else {

    lista_systemu.push_front(plec[10]);
    lista_systemu.push_front(imie[30]);
    lista_systemu.push_front(nazwisko[30]);
    lista_systemu.push_front(dzien);
    lista_systemu.push_front(miesiac);
    lista_systemu.push_front(rok_urodzenia);
    lista_systemu.push_front(nr_PESEL);
    }

 

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Tylko czy program sie nie skonczy, gdy wpiszesz za duza ilosc cyfr lub za malo?
komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Jak na razie walczę cały czas z tym błędem, a program powinien się skończyć, bo analogicznie zrobiłam "return;", co powinno powodować koniec tego zapytania odnośnie Peselu. Jednak ten błąd coś nie ustępuje, pokazuje tą linijkę w dalszym ciągu:
 

double temp = string::length(dlugosc_PESEL);

 

komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Próbowałam jeszcze zrobić w ten sposób, może po prostu błąd jest gdzieś indziej... :P
A tutaj jest cały kod na pastebin:
https://pastebin.com/UFgtHPUY
komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)

nie skompiluje, bo ma bibliotke windowsowa. Ale

unsigned char temp = std::string(dlugosc_PESEL);

gdzie dlugosc_PESEL = 0 lub randomowa wartosc, bo nei widze nigdzie zebys jej przypisal.

https://pastebin.com/KjUVe4sa

cin >> nr_PESEL;
    unsigned char temp = std::string(nr_PESEL);
    if(temp < 11 || temp > 11)
    {
        cout << "Nieprawidlowa dlugosc PESELU. Sprobuj ponownie."
        Sleep(3000);
        return;
    }

 

komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Hmm... masz rację, już zostało to poprawione. Teraz komunikat dalej pokazuje tą samą linijkę, ale zmienił się error.
Error: Candidate expects 3 arguments, 1 provided.
Tylko... tam jest w stringu sam numer pesel, tam również powinny być dwa inne argumenty jakieś? Pokazuje na linijkę:
 

unsigned char temp = std::string(nr_PESEL);

 

komentarz 3 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
unsigned char temp = nr_PESEL.length();

 

komentarz 3 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Hmm.. Teraz już został ostatni error, warningów jest zero. Error jest związany właśnie z tą linijką:
 

unsigned char temp = nr_PESEL.length();

Request for member 'length' in 'nr_PESEL', which is of non-class type 'int'

komentarz 3 stycznia 2019 przez adrian17 Ekspert (344,860 p.)

@DragonCoder czy Ty próbujesz po omacku? Bo większość Twoich sugestii, w tym ostatnia, nie mają sensu.

Pytanie brzmi, jak policzyć długość tekstu PESEL?

Zakładając że jest liczbą, to

int pesel;
std::cin >> pesel;
std::string pesel_as_text = std::to_string(pesel);
int pesel_length = pesel_as_text.length();

 

komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Już zrozumiałam, o co w tym chodzi. Dziękuję bardzo za pomoc. :) To mały kroczek, ale w końcu od czegoś trzeba zacząć. Jeszcze raz ślicznie dziękuję i spokojnej nocki życzę. :)
komentarz 4 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Nie, tylko ze zalozylismy, ze nr_PESEL bedzie stringiem. A .length() zwraca dlugosc slowa, dlatego to zasugerowalem. Zreszta, nie wiem czy to takie po omacku, bo na poczatku wyszedlem z innego zalozenia, pozniej okazalo sie, ze ma byc tam if, a nie petla, pozniej zauwazylem, ze nie przypisal do zmiennej dlugosc_pesel, zadnej wartosci
komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Hmm... a jeszcze tak dopytując... mając taką postać:
 

int pesel;
    std::cin >> pesel;
    std::string pesel_as_text = std::to_string(pesel);
    int pesel_length = pesel_as_text.length();

    if(pesel_length>11 && pesel_length<11)
    {
        printf("Blad!");
        Sleep(3000);
        return;
    }

Próbowałam na różne sposoby sprawdzić walidację tego kodu. Mając taki kod, program przy tym zapytaniu pomija całkiem ten warunek i próbuje dodać wszystkie dane w postaci jakiejś liczby. Więc, czy wpisze się 3-cyfrowy pesel, czy 5-cyfrowy, czy 11-cyfrowy lub większy to mimo wszystko i tak przechodzi dalej. Z drugiej jednak strony, gdy zmienię je na inne, na przykład:
 

if(pesel_as_text.length()>11 && pesel_as_text.length()<11)

Lub jeszcze na inne, to wówczas po wpisaniu jakiejkolwiek długości, program pokazuje za każdym razem błąd, po czym wraca (jeszcze nie wiem czemu) do "Podaj płeć" i z marszu wypisuje błąd związany z płcią(jednak to już inny temat).
Hmm... ciężki orzeszek do zgryzienia... :P

komentarz 4 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)

Tu z uzyciem stringa

std::string pesel;
    std::cin>>pesel;

    int pesel_length = pesel.length();

    std::cout<<pesel_length;

    if(pesel_length != 11)
    {
        std::cout<<"blad";
    }
    else {
        std::cout<<"";
    }

Pesel jest chyba troche za dlugi, jak na integera

A tu tak jak napisal @adrian17, tylko ze zmiana typu na long i mala zmiana w if

int main()
{
    long pesel;
    std::cin>>pesel;
    std::string pesel_length_as_text = std::to_string (pesel);

    int pesel_length = pesel_length_as_text.length();

    if(pesel_length != 11)
    {
        std::cout<<"wrong";
    }
    else {
        std::cout<<"idealne 11";
    }

    return 0;
}

 

komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Hmm wypróbowałam oba sposoby. Co jest ciekawe, teraz kompilator jakby przeniósł się dalej na kolejną funkcję, a tą push_front już zostawia. Co tym razem się pokazuje? Błąd wydaje się być błahy, ponieważ wskazuje na jakąś klamerkę, która jest na samym początku funkcji, a raczej wszystkie mają zakończenie, sprawdzałam kilka razy. Dodatkowo błąd ukazuje się też na samym końcu programu.
Pierwszy błąd jest w tym miejscu:

void push_back()
{

Dokładnie wskazuje na tą klamerkę błąd, który mówi:
Error: a function-definition is not allowed here before '{' token.

Cała funkcja do pierwszego błędu to:

void push_back()
{
    string imie, nazwisko, plec;
    int dzien, miesiac, rok_urodzenia, nr_PESEL;
    cout << "WSTAWIANIE DANYCH NA KONIEC LISTY" << endl;
    cout << "Podaj plec(Kobieta/Mezczyzna): ";
    cin >> plec;
    if(plec!="Kobieta" && plec!="Mezczyzna")
    {
        printf("Niepoprawna plec!");
        Sleep(3000);
        return;
    }
    cout << "Podaj imie: ";
    cin >> imie;
    cout << "Podaj nazwisko: ";
    cin >> nazwisko;
    cout << "Podaj dzien urodzenia: ";
    cin >> dzien;
    if(dzien>31 || dzien<1)
    {
        printf("Nieprawidlowy dzien! Sprobuj od nowa.");
        Sleep(3000);
        return;
    }
    cout << "Podaj miesiac urodzenia: ";
    cin >> miesiac;
    if(miesiac>12 || miesiac<1)
    {
        printf("Nieprawidlowy miesiac! Sprobuj ponownie.");
        Sleep(3000);
        return;
    }
    cout << "Podaj rok urodzenia: ";
    cin >> rok_urodzenia;
    if(rok_urodzenia>2019 || rok_urodzenia<1900)
    {
        printf("Nieprawidlowy rok! Sprobuj wypelnic dane jeszcze raz.");
        Sleep(3000);
        return;
    }
    long pesel;
    std::cin>>pesel;
    std::string pesel_length_as_text = std::to_string (pesel);

    int pesel_length = pesel_length_as_text.length();

    if(pesel_length != 11)
    {
        std::cout<<"Blad!";
        Sleep(3000);
        return;
    }
    else
        {
        std::cout<<"Zgadza sie";
        Sleep(3000);
        return;
        }


    lista_systemu.push_back(plec[10]);
    lista_systemu.push_back(imie[30]);
    lista_systemu.push_back(nazwisko[30]);
    lista_systemu.push_back(dzien);
    lista_systemu.push_back(miesiac);
    lista_systemu.push_back(rok_urodzenia);
    lista_systemu.push_back(nr_PESEL);

}

Drugi błąd pokazuje się w funkcji int main(), dokładnie wskazując na ostatnią klamerkę. Brzmi:
Error: Expected '}' at the end of input.

Funkcja int main():

int main()
{

do
{
    Wyswietl_Dane();

    cout << "MENU GLOWNE LISTY SYSTEMU: " << endl;
    cout << "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-" << endl;
    cout << "1. push_front - dodawanie na poczatku listy" << endl;
    cout << "2. push_back - dodawanie na koncu listy" << endl;
    cout << "3. pop_front - usuwanie na poczatku listy" << endl;
    cout << "4. pop_back - usuwanie na koncu listy" << endl;
    cout << "5. size - sprawdzenie ilosci elementow na liscie" << endl;
    cout << "6. max_size - sprawdzenie maksymalnej ilosci elementow na liscie" << endl;
    cout << "7. empty - sprawdzenie, czy lista jest pusta" << endl;
    cout << "8. remove - usuniecie osoby o takim samym numerze PESEL" << endl;
    cout << "9. sort - sortowanie listy systemu rosnaco" << endl;
    cout << "10. reverse - sortowanie listy w odwrotnej kolejnosci" << endl;
    cout << "11. exit - wyjscie z programu" << endl;
    cout << "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-" << endl;
    cout << "Wybor funkcji: ";
    cin >> funkcja;

        switch(funkcja)
        {
            case 1: push_front(); break;
            case 2: push_back(); break;
            case 3: pop_front(); break;
            case 4: pop_back(); break;
            case 5: size(); break;
            case 6: max_size(); break;
            case 7: empty(); break;
            case 8: remove(); break;
            case 9: sort(); break;
            case 10: reverse(); break;
            case 11: exit(); break;

        default:
            cout << "Ups! Cos poszlo nie tak!";
            Sleep(3000);
            break;
        }

}
        while(funkcja!=11)
        {
            return 0;
        }
}


 

komentarz 4 stycznia 2019 przez adrian17 Ekspert (344,860 p.)
Na oko, to masz pomieszane klamry/wcięcia/średniki w main(). Może też w innych miejscach.
komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Już zauważyłam błąd, znalazł się we wcześniejszej funkcji (tej, o którą ciągle męczę - z góry przepraszam za moją inkoherencję :P). Tak naprawdę, program się teraz kompiluje bez błędów i warningów, jednak... tak jakby nie sprawdzał długości, ponieważ jeśli wpiszę pesel o długości 11 znaków to wyskakuje błąd, a jeśli wpiszę inną długość niż 11 to nic się nie dzieje w programie i przeskakuje do nowej linii, a dopisując jakąkolwiek ilość cyfr w nowej linii, dopiero wtedy wyskakuje błąd, który mówi, że jest nieprawidłowa płeć :P
Wydaje mi się, że troszkę namieszałam ze zmiennymi w tym miejscu:
 

cout << "Podaj swoj PESEL(powinien miec 11 cyfr): ";
    cin >> nr_PESEL;
    long pesel;
    std::cin>>pesel;
    std::string pesel_length_as_text = std::to_string (pesel);

    int pesel_length = pesel_length_as_text.length();

    if(pesel_length != 11)
    {
        std::cout<<"Blad!";
    }
    else {
        std::cout<<"11";

    lista_systemu.push_front(plec[10]);
    lista_systemu.push_front(imie[30]);
    lista_systemu.push_front(nazwisko[30]);
    lista_systemu.push_front(dzien);
    lista_systemu.push_front(miesiac);
    lista_systemu.push_front(rok_urodzenia);
    lista_systemu.push_front(nr_PESEL);

}

 

komentarz 4 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)

Czemu 2 razy chcesz zeby user podal pesel?

cin >> nr_PESEL;
    long pesel;
    std::cin>>pesel;

 

komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Rzeczywiście :) Zmieniłam troszkę kolejność w funkcji, teraz jest tak... Jeśli użytkownik wprowadzi pesel poprawnie (11 cyfr) wyskakuje komunikat "Błąd", a następnie wraca do wyboru funkcji i z automatu wyskakuje komunikat "Niepoprawna plec!". A jeśli wprowadzi się błędnie pesel, czyli ilość różną od 11 to zachowuje się prawidłowo, czyli wyskakuje komunikat "Błąd", a następnie wraca do wyboru funkcji bez innych komunikatów.
Na ten moment funkcja wygląda tak:
 

void push_front()
{
    string imie, nazwisko, plec;
    int dzien, miesiac, rok_urodzenia;
    long pesel;
    cout << "WSTAWIANIE DANYCH NA POCZATEK LISTY" << endl;
    cout << "Podaj plec(Kobieta/Mezczyzna): ";
    cin >> plec;
    if(plec!="Kobieta" && plec!="Mezczyzna")
    {
        printf("Niepoprawna plec!");
        Sleep(3000);
        return;
    }
    cout << "Podaj imie: ";
    cin >> imie;
    cout << "Podaj nazwisko: ";
    cin >> nazwisko;
    cout << "Podaj dzien urodzenia: ";
    cin >> dzien;
    if(dzien>31 || dzien<1)
    {
        printf("Nieprawidlowy dzien! Sprobuj od nowa.");
        Sleep(3000);
        return;
    }
    cout << "Podaj miesiac urodzenia: ";
    cin >> miesiac;
    if(miesiac>12 || miesiac<1)
    {
        printf("Nieprawidlowy miesiac! Sprobuj ponownie.");
        Sleep(3000);
        return;
    }
    cout << "Podaj rok urodzenia: ";
    cin >> rok_urodzenia;
    if(rok_urodzenia>2019 || rok_urodzenia<1900)
    {
        printf("Nieprawidlowy rok! Sprobuj wypelnic dane jeszcze raz.");
        Sleep(3000);
        return;
    }
    std::string pesel_length_as_text = std::to_string (pesel);

    int pesel_length = pesel_length_as_text.length();
    cout << "Podaj swoj PESEL(powinien miec 11 cyfr): ";
    cin >> pesel;

    if(pesel_length != 11)
    {
        std::cout<<"Blad!";
        Sleep(3000);
        return;
    }
    else {
        std::cout<<"11";

    lista_systemu.push_front(plec[10]);
    lista_systemu.push_front(imie[30]);
    lista_systemu.push_front(nazwisko[30]);
    lista_systemu.push_front(dzien);
    lista_systemu.push_front(miesiac);
    lista_systemu.push_front(rok_urodzenia);
    lista_systemu.push_front(pesel);

}
}

 

komentarz 4 stycznia 2019 przez michulo Obywatel (1,240 p.)
edycja 4 stycznia 2019 przez michulo

tu:

   
    std::string pesel_length_as_text = std::to_string (pesel);

    int pesel_length = pesel_length_as_text.length();
    cout << "Podaj swoj PESEL(powinien miec 11 cyfr): ";
    cin >> pesel;

    if(pesel_length != 11)
    {
        std::cout<<"Blad!";
        Sleep(30000);
        return;
    }
  • jak dla mnie to inicjujesz string pesel_length_as_text potem przypisujesz jego długość do int pesel_length co ma sens ale żeby nie było za łatwo robisz to zanim użytkownik poda Ci pesel.
  • co z ludźmi urodzonymi w latach 1900-1909 i 2000-2019 ? Ich pesel zaczyna się od 0 jeśli zaczytasz do longa obetniesz pierwszą cyfrę.
  • jeśli 2 częściach programu wykonujesz te same czynności to bym zrobił z tego funkcje a w ty momencie w push_bask i push_forward masz 2 razy oprogramowane to samo tylko z innym zestawem błędów ;)
  • Odmawiam dalszych testów do czasu umożliwienia wybierania płci z listy, zwłaszcza że "Kobieta" != "kobieta"

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 155 wizyt
0 głosów
0 odpowiedzi 217 wizyt
pytanie zadane 28 września 2022 w Urządzenia mobilne przez mikołaj17 Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 401 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez Programeł Gaduła (3,500 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...