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

Program nie chce się zapętlić..dlaczego?

Object Storage Arubacloud
0 głosów
412 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam

Proszę o podpowiedź, wprowadziłem pętle do programu chcąc kilku krotnie wypisać dane jednak program kończy się po wpisaniu ilości prób jakie mają być.

 

#include <iostream>

struct wspaniali
{
    char nazwiska[200];
    double wplaty[50];
};//struktura wspaniali

int main()
{
    int licz;
    wspaniali * ps = new wspaniali; // alokacja dynamiczna na strukture wspaniali
    std::cout << "Podaj nazwisko i kwote (Zatwierdz \"Enter\")\n";
    std::cin >> licz;
    for(int i=0; i<licz;i++)t
    {
        std::cin.get(ps->nazwiska, 200);
        std::cin >> ps->wplaty[50];
        if (ps->wplaty[50] >= 10000)
        {
            //if((ps->nazwiska[200] >= 'a' && ps->nazwiska[200] <= 'z') || (ps->nazwiska[200] >= 'A' && ps->nazwiska[200] <= 'Z'))
               // std::cout << "brak";
            std::cout << "Nasi Wspaniali Sponsorzy\n" << ps->nazwiska << "\t" << ps->wplaty[50];
        }//if
        else if (ps->wplaty[50] < 10000)
        {
            //if((ps->nazwiska[200] >= 'a' && ps->nazwiska[200]<= 'z') || (ps->nazwiska[200] >= 'A' && ps->nazwiska[200] <= 'Z'))
                //std::cout << "brak";
            std::cout << "Nasi Sponsorzy\n" << ps->nazwiska << "\t" << ps->wplaty[50];
        }//else if
        else
            std::cout << "Zle dane!";//else
        std::cin.get(ps->nazwiska, 200);
        std::cin >> ps->wplaty[50];
    }//while


    std::cout << "\n\n\t\tKoniec programu.";
    return 0;
}

 

komentarz 21 listopada 2017 przez Dexterim Dyskutant (8,370 p.)
To Ci sie w ogóle kompiluje? Masz literkę t za pętlą + widać brak znajomości tablic
komentarz 21 listopada 2017 przez Sic Dyskutant (8,510 p.)
Serio .... literka powstała przypadkiem oczywiste jest że to nie główny powód błędu!
1
komentarz 21 listopada 2017 przez Dexterim Dyskutant (8,370 p.)
serio ... napisalem przyjrzyj sie tablicom
komentarz 22 listopada 2017 przez Sic Dyskutant (8,510 p.)

Dzięki pomogło, jednak gdy dodaje pętle program zaczyna szaleć

#include <iostream>

struct wspaniali
{
    char nazwiska[200];
    double wplaty;
};//struktura wspaniali

int main()
{
    int licz;
    wspaniali * ps = new wspaniali; // alokacja dynamiczna na strukture wspaniali
    std::cout << "Podaj nazwisko i kwote (Zatwierdz \"Enter\")\n";
        std::cin.get(ps->nazwiska, 200);
        std::cin >> ps->wplaty;

        if (ps->wplaty >= 10000)
        {
            //if((ps->nazwiska[200] >= 'a' && ps->nazwiska[200] <= 'z') || (ps->nazwiska[200] >= 'A' && ps->nazwiska[200] <= 'Z'))
               // std::cout << "brak";
            std::cout << "Nasi Wspaniali Sponsorzy\n" << ps->nazwiska << "\t" << ps->wplaty;
        }//if
        else if (ps->wplaty < 10000)
        {
            //if((ps->nazwiska[200] >= 'a' && ps->nazwiska[200]<= 'z') || (ps->nazwiska[200] >= 'A' && ps->nazwiska[200] <= 'Z'))
                //std::cout << "brak";
            std::cout << "Nasi Sponsorzy\n" << ps->nazwiska << "\t" << ps->wplaty;
        }//else if
        else
            std::cout << "Zle dane!";//else
    std::cout << "\n\n\t\tKoniec programu.";
    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 22 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Chyba nie potrafisz korzystać z tablic. Element tablica[200] znajduje się poza tablicą. Jeśli chcesz sprawdzić warunek dla pierwszej literki, użyj tablica[0].

Poza tym nie wiem, co tak właściwie chcesz zrobić. Czemu nie używasz std::string tylko tablice znaków w stylu C?
0 głosów
odpowiedź 22 listopada 2017 przez Emil Kob Bywalec (2,640 p.)
Warunek pętli for masz uzależniony od zmiennej licz, która zostaje wprowadzona przez użytkownika jako znak lub wyraz lub kilka wyrazów. Nie wiem dokładnie co w takim wypadku dostaje się do zmiennej licz, ale jest to reprezentacja liczbowa jakiegoś znaku. Zgodnie z liczbą w zmiennej licz tyle razy wykona się pętla.
komentarz 22 listopada 2017 przez Sic Dyskutant (8,510 p.)

Dzięki w sumie wykorzystanie obiektu klasy string jest lepszym rozwiązaniem, jeżeli chodzi o pętle znam ich działanie i jak z nich korzystać. Problem polega na tym, ze gdy korzystam z pętli for i ustawiam warunek:

std::cin >> licz;
for(int cos=0; cos < licz; cos++)

po wpisaniu wartości licz, program sam wykonuje resztę czynności dodatkowo modyfikuje program w nietypowy sposób.

komentarz 22 listopada 2017 przez Emil Kob Bywalec (2,640 p.)
Spróbuj może sprawdzić w debuggerze co tam się dzieje. Ogólnie obsługa debuggera jest bardzo przydatna w bardziej awansowanych programach.

Ja sprawdziłem, i jeżeli na początku podam na przekład 5 to pętla wykonuje się 5 razy. Problem jest z tymi tablicami.
komentarz 22 listopada 2017 przez Sic Dyskutant (8,510 p.)
edycja 22 listopada 2017 przez Sic

Oto rozwiązanie problemu pętli:

#include <iostream>
#include <cstring>
struct wspaniali
{
    std::string nazwiska[200];
    double wplaty[50];
};//struktura wspaniali

int main()
{
    int licz, i ;
    wspaniali * ps = new wspaniali; // alokacja dynamiczna na strukture wspaniali
    std::cout << "Podaj nazwisko i kwote (Zatwierdz \"Enter\")\n";
    std::cin >> licz;

    for(i=0; i < licz; i++)
    {
        std::cin.ignore(1);
        std::getline(std::cin, ps->nazwiska[i]);
        std::cin >> ps->wplaty[i];
    }
    for(int j=0; j < licz; j++)
    {
        std::cout << std::endl;
        if (ps->wplaty[j] >= 10000)
            {
                std::cout << "Nasi Wspaniali Sponsorzy\n" << ps->nazwiska[j] << "\t" << ps->wplaty[j] << "\n";
            }//if
        else if (ps->wplaty[j] < 10000)
            {
                std::cout << "Nasi Sponsorzy\n" << ps->nazwiska[j] << "\t" << ps->wplaty[j] << "\n";
            }// else if
        else std::cout << "Zle dane!";//else
    }
    std::cout << "\n\n\t\tKoniec programu.";
    return 0;
}

 

 

Podobne pytania

0 głosów
1 odpowiedź 301 wizyt
0 głosów
1 odpowiedź 149 wizyt
–2 głosów
3 odpowiedzi 219 wizyt
pytanie zadane 26 lutego 2019 w C i C++ przez Jakub Michalik Użytkownik (850 p.)

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

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

...