• 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

VPS Starter Arubacloud
+1 głos
187 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 (155,140 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 (255,800 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ź 403 wizyt
pytanie zadane 22 października 2020 w C i C++ przez Reshian77 Nowicjusz (150 p.)
0 głosów
4 odpowiedzi 812 wizyt
0 głosów
0 odpowiedzi 645 wizyt
pytanie zadane 9 lutego 2022 w C i C++ przez CheF123 Początkujący (450 p.)

92,979 zapytań

141,941 odpowiedzi

321,185 komentarzy

62,304 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...