• 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
442 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 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 154 wizyt
0 głosów
0 odpowiedzi 215 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,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 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!

...