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

C++ nietypowy błąd - Code Blocks

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

Hejka. Chciałabym się Was zapytać, co jest zrobione nie tak w kodzie, że wpisując pesel do konsoli, który powinien mieć 11 znaków, wyświetla komunikat "Błąd" i dodatkowo program wraca do początku z błędem "Niepoprawna plec!". A jeśli wpiszę długość peselu różną od 11 to wyskakuje komunikat "Błędu" i wraca do początku do "switcha" poprawnie.
Funkcja błędu:
 

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);

}
}

 

1 odpowiedź

0 głosów
odpowiedź 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
long pesel; // deklarujesz tutaj zmienną pesel
std::string pesel_length_as_text = std::to_string (pesel); // zamieniasz int na string, pomimo,
                                                         // że int nie ma wczytanej wartości
 
int pesel_length = pesel_length_as_text.length();           // określasz długość zmiennej zawierającej losową wartość
cout << "Podaj swoj PESEL(powinien miec 11 cyfr): ";
cin >> pesel;                 // tu dopiero wczytujesz
 
if(pesel_length != 11)
{
    std::cout<<"Blad!";
    Sleep(3000);
    return;
}
else {
    std::cout<<"11";

Prześledź komentarze, które dopisałem do twojego kodu.

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

Hmm... rozumiem :) Spróbowałam zrobić w ten sposób jeszcze, jednak rezultat otrzymałam taki sam:
 

cout << "Podaj swoj PESEL(powinien miec 11 cyfr): ";
    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<<"11";

 

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Zmień "long pesel" na "string pesel".

Skoro i tak od razu to chcesz zamienić na string.

A tak poza tym, maksymalna wartość long wynosi tyle samo co int, czyli 2,147,483,647.

Jeżeli chcesz używać większych wartości to używaj "long long".

Jednak żaden z powyższych typów zmiennych nie przechowa 11 cyfrowej liczby.
komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Wtedy program wyrzuca błąd w tej linijce:
 

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

O treści:
no matching function for call 'to_string(std::__cxxll::string&)'

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Nie deklaruj zmiennej pesel jako zmienną liczbową tylko od razu jako string, wtedy nie będziesz musiała w ogóle konwertować tej zmiennej.
komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)

Nie wiem, czy dobrze zrozumiałam. Masz na myśli to?
 

string pesel_length = pesel.length();
    if(pesel_length != 11)
    {
        std::cout<<"Blad!";
        Sleep(3000);
        return;
    }

 

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Nie. Chodzi mi o piątą linijkę twojego kodu.
komentarz 4 stycznia 2019 przez j23 Mędrzec (194,920 p.)

length nie zwraca wartości typu std::string. Tak zrób:

if(pesel.length() != 11) { ... }

 

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

Zrobiłam w ten sposób:
 

cout << "Podaj swoj PESEL(powinien miec 11 cyfr): ";
    cin >> pesel;
    if(pesel.length() != 11)
        {
            std::cout<<"Blad!";
            Sleep(3000);
            return;
        }       
    else {
    std::cout<<"11";

Teraz jest dobrze. :) A tak zapytam, jak sprawić, żeby te dane, które wpisałam, zapisały się tak, jak je wpisałam, a nie w postaci liczb? Chodzi o to, żeby pojawiło się na ekranie:
Kobieta - Anna Kowalska - 01-01-1950 - PESEL: 50010102345
A wyskakuje coś takiego:
76
52
3578532
2382
I tak dalej :P

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
cout << plec << " - ";
cout << imie << " " << nazwisko << " - ";
cout << dzien << " - " << [reszta daty...];
cout << "PESEL: " <<  pesel;

 

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

Hmm... oki :) A czy to nie będzie kolidowało z tym?
 

    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.length());

 

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
lista_systemu to lista z bliblioteki <list> ?

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

Dokładnie tak. :)
 

#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;

Tylko właśnie tutaj jest <int>, a dane są mieszane, jak można zabrać się za taki problem?

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)

Dlaczego lista jest typu int, skoro chcesz tam przechowywać ciągi znaków?

Poza tym, jaki cel jest w wpisaniu w listę tych danych? Nie lepiej to zrobić jako struct?

lista_systemu.push_front(imie[30]); // dlaczego imie[30] ?

komentarz 4 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Tak tylko dodam, ze wzialem i przepisalem troche kodu.

https://pastebin.com/4Bww9YQH

Jak chcesz mozesz go edytowac, bo ten wedlug mnie ma wiekszy porzadek itd. Ale jak uwazasz. Musialem wyciac wszytsko co jest windowsowe, bo by mi sie nie kompilowalo. A co do reszty, to jak juz to musisz zrobic liste typu string a nie int, a najlepiej to strukture, w ktorej to przechowywac bedziesz. Pamietaj, ze uzywajac bibliothek windowsowych, odpalisz kod tylko na windowsie.
komentarz 4 stycznia 2019 przez j23 Mędrzec (194,920 p.)

@gorgonek, użyj struktury:

struct wpis
{
	std::string imie;
	std::string nazwisko;
	std::string plec;
	uint8_t dzien;
	uint8_t miesiac;
	uint16_t rok_urodzenia;
	std::string pesel;
};



std::list<wpis>lista_systemu; 
...


wpis w;

std::cout << "Podaj imie: ";
std::cin >> w.imie;
std::cout << "Podaj nazwisko: ";
std::cin >> w.nazwisko;
std::cout << "Podaj dzien urodzenia: ";
std::cin >> w.dzien;
...


lista_systemu.push_back(w);

 

komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Hmm początkowo pomysł był taki, żeby przechowywała zmienne, które będą się dodawać. Mam na myśli numerowanie. Pewnie byłoby lepiej w strukturze, jednak... nigdy nie robiłam jej w C++, a w C to jest zmora wskaźników... Hmm chyba muszę Ciebie spytać wprost, czy istnieje jakiś sposób, aby zrobić ten projekt w 19 dni, mając wiedzę na poziomie bardzo podstawowym?
PS. imie[30] miało służyć temu, żeby ktoś nie zrobił spamu liter dowolnych i nie zajmował wiele pamięci, a czy to ma jakiś większy sens? Pewnie nie jest to potrzebne w tym wypadku, po prostu uznałam, że kod jest na tyle "łysy", że coś jednak w nim musi być :P
komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)

Struktury w C++ są dość łatwe (nie wiem jak to wygląda w przypadku C).

Przykład:

struct Nazwa {

int jakasLiczba;
string jakisString;
char znak;
}

int funkcja() {

Nazwa x;
x.jakasLiczba = 5;
x.jakisString = "abc";

cout << x.jakasLiczba;
}

 

1
komentarz 4 stycznia 2019 przez j23 Mędrzec (194,920 p.)

początkowo pomysł był taki, żeby przechowywała zmienne

Problem w tym, że zmienne są różnego typu, a kontener jest homogeniczny i nie możesz dodawać do niego wartości różnych typów. Użycie struktury/klasy jest najbardziej racjonalne.

 

nie wiem jak to wygląda w przypadku C

Dokładnie tak samo :) C++ odziedziczyło struktury po C.

komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Zwykle uczyłam się na pamięć tych wszystkich struktur, bo nie rozumiałam tych gwiazdek i ampersandów, a też jak wiadomo, żeby zrozumieć nawet te najprostsze rzeczy, czasem wystarczy kilka skondensowanych słów, które trafią do użytkownika. Nie ukrywam, że mniej więcej połowa lub więcej rzeczy, o które pytacie, to sama nie wiem dokładnie o co pytacie, ale cóż... trzeba to przebrnąć :P
Spróbuję przekształcić cały kod na strukturę stosu i może coś z tego wyjdzie... i jak tylko skończę to wrzucę go tutaj niebawem :)
komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Spróbuj napisać co umiesz, a w razie problemów wrzuć kod, to pomożemy :)

Jak czegoś nie wiesz to pytaj.
komentarz 4 stycznia 2019 przez gorgonkowa Obywatel (1,810 p.)
Heh dziękuję :)) Hmm... tak teraz się zastanawiam... czy żeby uniknąć przekształcania całego kodu, nie można by było zawrzeć całej struktury w tą listę? Czyli tam zamiast inta, tak jak tutaj ktoś z Was napisał: <wpis>.
komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Oczywiście, że można. Wystarczy, że zamienisz typ listy z int na nazwę twojej struktury (w tym przypadku <wpis>)
komentarz 4 stycznia 2019 przez j23 Mędrzec (194,920 p.)

@gorgonek,  przecież pokazałem Ci, jak to może wyglądać.

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

Hmm... to ciekawe. Gdy przekształciłam kod w taki sposób:
 

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

using namespace std;

struct wpis
{
	std::string imie;
	std::string nazwisko;
	std::string plec;
	int dzien;
	int miesiac;
	int rok_urodzenia;
	std::string pesel;
};

wpis w;

list<wpis>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<wpis>::iterator w=lista_systemu.begin(); w!=lista_systemu.end(); ++w)
    {
        cout << *w << " ";

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

    }
}

To jest jeszcze ta wersja windowsowa (ponieważ może być uruchamiana z tego komputera :P). Tutaj pokazuje błąd przy linijce 32:
cout << *w << " ";
A opis błędu mówi:
Error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}') and 'wpis'

komentarz 4 stycznia 2019 przez j23 Mędrzec (194,920 p.)
cout << w->imie << ' ' << w->nazwisko << ' '  << /* itd. */;

 

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Ale w tym przypadku "w" nie jest wskaźnikiem, więc odwołanie chyba jest za pomocą kropki?
komentarz 4 stycznia 2019 przez j23 Mędrzec (194,920 p.)

W pętli w jest iteratorem.

komentarz 4 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)

A faktycznie, zasugerowałem się tą linijką:

wpis w;

 

Podobne pytania

0 głosów
1 odpowiedź 1,112 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Coroys Początkujący (370 p.)
0 głosów
1 odpowiedź 208 wizyt
0 głosów
0 odpowiedzi 601 wizyt
pytanie zadane 29 marca 2019 w C i C++ przez Milo Obywatel (1,180 p.)

92,578 zapytań

141,426 odpowiedzi

319,653 komentarzy

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

...