• 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?

VPS Starter Arubacloud
0 głosów
381 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ź 298 wizyt
0 głosów
1 odpowiedź 147 wizyt
–2 głosów
3 odpowiedzi 217 wizyt
pytanie zadane 26 lutego 2019 w C i C++ przez Jakub Michalik Użytkownik (850 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...