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

Pętla do while kończy działanie po 1 przejściu

Object Storage Arubacloud
+1 głos
171 wizyt
pytanie zadane 29 stycznia 2021 w C i C++ przez Irish Nowicjusz (130 p.)

Cześć wszystkim,

mam drobny problem z programem i nie mogę go rozwiązać a nie ukrywam już trochę szukałem i się poddałem. Program jest tak naprawdę kalkulatorem oblicza energię, mam problem z pętlą do while, nie wiem dlaczego pętla wykonuje się jedynie raz a powinna dopiero po wpisaniu 3 lub 5. 

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

using namespace std;
int zmienna, zmienna2;
float m, V, E;

float zapisD()
{
    ofstream zapis("dane.txt");
    zapis.close();
    zapis.open("dane.txt", ios_base::app);
    zapis << E << endl;
    if (zapis) cout << "Zapisano wynik do pliku dane.txt\n";
    else {
        cout << "Blad zapisu wyniku \n";
        system("pause");
        return 0;
    }
    zapis.close();
}

int main()
{
    do 
    {
        cout << "Program oblicza energie pocisku na podstawie predkosci i masy.\n";
        cout << "Wybierz opcje obliczania: \n";
        cout << "[1] Wlasne dane predkosci i masy. \n";
        cout << "[2] Wlasne dane predkosci, masy standardowe do wyboru.\n";
        cout << "[3] Wyjscie.\n";
        cout << "Wybieram: ";
        cin >> zmienna;
        switch (zmienna)
        {
        case 1:
            cout << "Podaj mase pocisku w [grain]: ";
            cin >> m;
            cout << "Podaj predkosc pocisku w [m/s]: ";
            cin >> V;
            E = static_cast<float>(((m * 6.479891 * pow(10, -5)) * pow(V, 2)) / 2);
            cout << "Wartosc energii pocisku: " << E << " J" << '\n';
            zapisD();
            break;
        case 2:
            cout << "Masy do wyboru: \n";
            cout << "[1] 5.56x45mm     61 grain \n";
            cout << "[2] 7.62x51mm    140 grain \n";
            cout << "[3] 12,7x99 mm  1790 grain \n";
            cout << "[4] .308         150 grain \n";
            cout << "[5] Wyjscie. \n";
            cout << "Wybieram: ";
            cin >> zmienna2;
            switch (zmienna2)
            {
            case 1:
                cout << "5.56x45mm 61 grain \n";
                cout << "Podaj predkosc pocisku w [m/s]: ";
                cin >> V;
                E = static_cast<float>((61 * pow(V, 2)) / 2);
                cout << "Wartosc energii pocisku: " << E << " J" << '\n';
                zapisD();
                break;
            case 2:
                cout << "7.62x51mm 140 grain \n";
                cout << "Podaj predkosc pocisku w [m/s]: ";
                cin >> V;
                E = static_cast<float>((140 * pow(V, 2)) / 2);
                cout << "Wartosc energii pocisku: " << E << " J" << '\n';
                zapisD();
                break;
            case 3:
                cout << "12,7x99mm 1 790 grain \n";
                cout << "Podaj predkosc pocisku w [m/s]: ";
                cin >> V;
                E = static_cast<float>((1790 * pow(V, 2)) / 2);
                cout << "Wartosc energii pocisku: " << E << " J" << '\n';
                zapisD();
                break;
            case 4:
                cout << ".308 150 grain \n";
                cout << "Podaj predkosc pocisku w [m/s]: ";
                cin >> V;
                E = static_cast<float>((150 * pow(V, 2)) / 2);
                cout << "Wartosc energii pocisku: " << E << " J" << '\n';
                zapisD();
                break;
            default:
                cout << "Zly wybor.\n";
                break;
            }
            break;
        default:
            cout << "Zly wybor.\n";
            break;

        }
        
    } while (zmienna<!3 || zmienna2<!5);

    return(0);
}

 

2 odpowiedzi

0 głosów
odpowiedź 29 stycznia 2021 przez tangarr Mędrzec (154,860 p.)

Napisy !3 i !5 dają wartość false, która jest następnie niejawnie rzutowana na zero.
Finalnie warunek pętli jest następujący

while (zmienna<0 || zmienna2<0)


 

0 głosów
odpowiedź 30 stycznia 2021 przez VBService Ekspert (253,340 p.)
edycja 30 stycznia 2021 przez VBService

Zapis: różne od, to: != wink no i chyba lepiej użyć w tym przypadku AND (&&)

} while (zmienna<!3 || zmienna2<!5);

na 

} while (zmienna != 3 && zmienna2 != 5);

Staraj się nie "deklarować" zmiennych poza główną funkcją main()  (Difference between Local and Global Variable)


. . .


int main()
{
    int zmienna, zmienna2;
    float m, V, E;

    do
    {

        . . .


     } while (zmienna != 3 && zmienna2 != 5);
 
    return(0);
}

wtedy


. . .

void zapisD(float E)
{

    . . .
    else {
         cout << "Blad zapisu wyniku \n";
         system("pause");
    }
    zapis.close();
}

int main()
{
    int zmienna, zmienna2;
    float m, V, E;

    do
    {

        . . .
        zapisD(E);

        . . .


     } while (zmienna != 3 && zmienna2 != 5);
 
    return(0);
}

no i tu dopisać dla 3 i 5 bo pokazuje "zły wybór" wink np.


. . .

void zapisD(float E)
{

    . . .

}

int main()
{
    int zmienna, zmienna2;
    float m, V, E;

    do
    {

        . . .
        zapisD(E);

        . . .
        switch (zmienna)
        {

        . . .

            switch (zmienna2)
            {

            . . .

            case 5:
                cout << "[5] Wyjscie. \n";
                break;
            default:
                cout << "Zly wybor.\n";
                break;
            }
            break;
        case 3:
            cout << "[3] Wyjscie. \n";
            break;
        default:
            cout << "Zly wybor.\n";
            break; 
        }
         
    } while (zmienna != 3 && zmienna2 != 5);
 
    return(0);
}

Moja propozycja skrócenia kodu dla:   switch (zmienna2)


...

        case 2:
            cout << "Masy do wyboru: \n";
            cout << "[1] 5.56x45mm     61 grain \n";
            cout << "[2] 7.62x51mm    140 grain \n";
            cout << "[3] 12,7x99 mm  1790 grain \n";
            cout << "[4] .308         150 grain \n";
            cout << "[5] Wyjscie. \n";
            cout << "Wybieram: ";
            cin >> zmienna2;
            m = 0;
            switch (zmienna2)
            {
            case 1:
                cout << "5.56x45mm";
                m = 61;
                break;
            case 2:
                cout << "7.62x51mm";
                m = 140;
                break;
            case 3:
                cout << "12,7x99mm";
                m = 1790;                
                break;
            case 4:
                cout << ".308";
                m = 150; 
                break;
            case 5:
                cout << "[5] Wyjscie. \n";
                break;
            default:
                cout << "Zly wybor.\n";
                break;
            }
            
            if (m != 0)
            {
                cout << " " << m << " grain \n";
                cout << "Podaj predkosc pocisku w [m/s]: ";
                cin >> V;
                
                E = static_cast<float>((m * pow(V, 2)) / 2);
                cout << "Wartosc energii pocisku: " << E << " J" << '\n';
                zapisD(E);
            }
            break;

...

 

Podobne pytania

0 głosów
1 odpowiedź 364 wizyt
pytanie zadane 22 października 2020 w C i C++ przez Reshian77 Nowicjusz (150 p.)
0 głosów
4 odpowiedzi 667 wizyt
0 głosów
0 odpowiedzi 484 wizyt
pytanie zadane 9 lutego 2022 w C i C++ przez CheF123 Początkujący (450 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

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

...