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

Problem C++ : Nie działający if.

VPS Starter Arubacloud
0 głosów
538 wizyt
pytanie zadane 24 sierpnia 2017 w C i C++ przez Jarver Użytkownik (820 p.)

Cześć, mam pewien problem, a mianowicie, problem z dzialaniem ifa w programie... Program ma na celu jedynie przećwiczenie pewnych umiejętności (czyt. zapis do pliku), więc może nie ma większego sensu, no ale mimo wszystko nie otrzymuje porządanego efektu. Oto kod

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <stdio.h>
#include <fstream>
#include <conio.h>

using namespace std;

int month, first[31], sec[30], thrd[28], choose;


int main()
{
    start:
    cout<<"Podaj numer miesiaca: ";
    if(!(cin>>month))
    {
        cerr<<"TO NIE JEST LICZBA!";
        getchar();getchar();//stdio.h
        system("cls");
        goto start;
    }
    switch(month)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        {
            cout<<endl<<"Wybrales 31-dniowy miesiac, wpisz teraz calkowite wartosci temp  wystepujace przez kolejne 31 dni: ";
            for (int i=0; i<=30; i++)
            {
                cout<<"\n"<<i+1<<". ";
                cin>>first[i];
            }
            fstream plik;
            plik.open("miesiac31",ios::out|ios::app);
            plik<<"\nMiesiac: "<<month<<endl;
            for (int i=0; i<=30; i++)
            {
                plik<<"\nDzien "<<i+1<<": "<<first[i];
            }
            plik.close();
            cout<<"Zapisywanie danych...";
            Sleep(1000);
        }
    break;
    case 4:
    case 6:
    case 9:
    case 11:
        {
            cout<<endl<<"Wybrales 30-dniowy miesiac, wpisz teraz calkowite wartosci temp wystepujace przez kolejne 30 dni: ";
            for (int i=0; i<30; i++)
            {
                cout<<"\n"<<i+1<<". ";
                cin>>sec[i];
            }
            fstream plik2;
            plik2.open("miesiac30", ios::out|ios::app);
            plik2<<"\nMiesiac: "<<month<<endl;
            for (int i=0; i<30; i++)
            {
                plik2<<"\nDzien "<<i+1<<": "<<sec[i];
            }
            plik2.close();
            cout<<"Zapisywanie danych...";
            Sleep(1000);
        }
    break;
    case 2:
        {
            errorr:
            cout<<endl<<"Wybrales 28/29-dniowy miesiac, zdecyduj ile dni ma miesiac w tym roku: \n1.28 dni\n2.29 dni";
            choose=getch(); //conio.h
                if(choose=='1')
                {
                    cout<<"\n\nWypisz teraz temp wystepujace przez kolejne 28 dni: ";
                    for (int i=0; i<28; i++)
                    {
                        cout<<"\n"<<i+1<<". ";
                        cin>>thrd[i];
                    }
                }
                else if(choose=='2')
                {
                    cout<<"\n\nWYpisz teraz temp wystepujace przez kolejne 29 dni: ";
                    for (int i=0; i<29; i++)
                    {
                        cout<<"\n"<<i+1<<". ";
                        cin>> thrd[i];
                    }
                }
                else
                {
                    cout<< "\n\nBŁEDNY ZNAK!";
                    getchar();getchar();
                    system("cls");
                    goto errorr;
                }
        }
        fstream plik3;
        plik3.open("miesiac2829", ios::out|ios::app);
        plik3<<"\nMiesiac: "<<month<<endl;
        if(choose=='1')
        {
            for (int i=0; i<28; i++)
            {
                plik3<<"\nDzien "<<i+1<<": "<<thrd[i];
            }

        }
        else if(choose=='2')
        {
            for (int i=0; i<29; i++)
            {
                plik3<<"\nDzien "<<i+1<<": "<<thrd[i];
            }
        }
        cout<<"Zapisywanie danych...";
        Sleep(1000);
        break;

    }
    return 0;
}

Ok  a teraz problem, chodzi o ostatniego ifa: a mianowicie o to ze przy wpisaniu powyżej 2 (w przypadku 29 dni) program nie zapisuje danych dotyczących temperatur. Jezeli wpisalismy 1 dane sa zapisywane... Dla czego? :(

Prosiłbym o odpowiedź, radę, cokolwiek. Za wszelakie zainteresowanie dziękuje i pozdrawiam! :)

komentarz 24 sierpnia 2017 przez maciek061 Gaduła (4,490 p.)

W 19 linii masz cerr zamiast cout

komentarz 24 sierpnia 2017 przez Jarver Użytkownik (820 p.)
A w jaki sposób to jest źle? Cerr wyświetla komunikat błedu przecież... Hmn, mógłbyś mi wytłumaczyć jaki sens i cel ma zmienienie cerr na cout?
komentarz 25 sierpnia 2017 przez maciek061 Gaduła (4,490 p.)

Aha, spoko. Tak się złożyło, że nigdy w życiu nie spotkałem się z cerr. Pozdrawiam. 

2 odpowiedzi

+1 głos
odpowiedź 24 sierpnia 2017 przez Snejki Stary wyjadacz (14,520 p.)
wybrane 24 sierpnia 2017 przez Jarver
 
Najlepsza
Nie mam jak teraz sprawdzić, ale w drugim przypadku próbujesz wpisać, a potem odczytać 29 elementów, z tablicy, która jest 28 elementowa
komentarz 24 sierpnia 2017 przez Jarver Użytkownik (820 p.)

Senjki, dzięki problem leżał w tym że zapomniałem o wielkości tablicy jaką ustawiłem... Już wszystko śmiga tak jak chciałem. Pozdrawiam i dziękuję Ci za pomoc!laugh

+1 głos
odpowiedź 24 sierpnia 2017 przez 10kw10 Pasjonat (22,880 p.)
edycja 24 sierpnia 2017 przez 10kw10

1. Skoro masz juz jednego ifa ktory sprawdza if(choose=='1')  to po co robisz kolejnego do zapisu zamiast w tym zapisac dane ?

2. Korzystaj z funkcji i unikaj powtorzen, zapis do pliku i zapis do tablicy to powinna byc osobna funckja

3. Zmienne globalne to zly nawyk

Podsumowując:

cout<<endl<<"Wybrales 28/29-dniowy miesiac, zdecyduj ile dni ma miesiac w tym roku: \n1.28 dni\n2.29 dni";
            choose=getch(); //conio.h
                if(choose=='1')
                {
                    cout<<"\n\nWypisz teraz temp wystepujace przez kolejne 28 dni: ";
                    for (int i=0; i<28; i++)
                    {
                        cout<<"\n"<<i+1<<". ";
                        cin>>thrd[i];
                    }
                    // zapis do pliku
                }

 

 

komentarz 24 sierpnia 2017 przez Jarver Użytkownik (820 p.)
Ok, rozumeim co zrobiłeś 10kw10, masz rację Twoje rozwiązanie jest o wiele, prostsze i przystępniejsze. Nie wpadłem na początku, aby zrobić to w ten sposób. Wielkie dzięki! Co do korzystania z funkcji i unikania zapisu do pliku i tablicy jako jednej funkcji nie do konca wiem co masz na myśli, ale mam nadzieje że w miarę gdy bedę się rozwijał dojdzie do mnie o co chodziło bo póki co nie łapie (brak mi chyba słownictwa i zrozumienia jeszcze)  ;(. No i dzięki za rade z tymi zmiennymi globalnymi, tylko czemu uwazasz że to zły nawyk? Pozdrawiam.

Ps. Program nie zapisywał danych bo tablica miała, za mało miejsc albo tak przynajmniej mi się wydaje bo po zwiększeniu wielkości tablicy dane byly zapisywane do pliku normalnie :)

Podobne pytania

0 głosów
2 odpowiedzi 244 wizyt
pytanie zadane 26 lutego 2019 w C i C++ przez de1vee Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 1,721 wizyt
pytanie zadane 4 października 2016 w C i C++ przez Tymek Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 120 wizyt
pytanie zadane 19 kwietnia 2016 w C i C++ przez AjSiak Początkujący (250 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 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!

...