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

Problem z programem switch case

VPS Starter Arubacloud
0 głosów
216 wizyt
pytanie zadane 29 października 2018 w C i C++ przez xBartosz4x Nowicjusz (140 p.)

Mam napisany program i jeżeli rozpatruje go osobno, czyli, np wybiorę 3,potem wyjdę wybiorę 1 itd... wszystko działa ok. Jednak jak program idzie po kolei tak jak ma iść czyli case(1),case(2),case(3),case(4).Wywala mi krzaki na trzecim case. 

Ciekawostka, jeżeli usunę case(3), to mam krzaki w case(4)

#include<iostream>
using namespace std;
int main()
{
    int tablica[1000], n, wybor, k;
    char napis[100];
    cout << "MENU" << endl;
    cout << "1.Pobieranie liczby elementow" << endl;
    cout << "2.Wyswietlanie dodatnich elementow" << endl;
    cout << "3.Wyswietla napis az do 0" << endl;
    cout << "4.Liczenie spacji" << endl;
    cin >> wybor;
    cin.ignore();
    switch (wybor)
    {
    case(1):
    
    cout << "Podaj liczbe elementow";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cout << "Podaj " << i+1 << " element tablicy";
        cin >> tablica[i];
    }
    case(2):
        for (int i = 0; i < n; i++)
        {
            if (tablica[i] > 0) {
                cout << endl;
                cout << tablica[i] << endl;
            }
        }
    case(3):
        cout << "Wpisz linie tekstu";
        cin.getline(napis, 100);
        for (int i = 0; napis[i] != '0'; i++)
        {
            cout << napis[i];
        }
    case(4):
        int spacja = 0;
        cout << "Wpisz linie tekstu";
        cin.getline(napis, 100);
        for (int i = 0; i<100; i++)
        {
            if (napis[i] == ' ') {
                spacja = spacja + 1;
            }
        }
        cout << endl;
        cout << spacja;

    }
        system("pause");
        return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 29 października 2018 przez Poczprogramista123 Bywalec (2,900 p.)
Krzaczki masz dlatego bo wpewnym momencie zaczynasz wypisywac z tablicy rzeczy ktorych nie ma bo nie zostaly tam zapisane(sa tam smieci czyli twoje krzaczki). Popracuj nad petla wypisujaca tablice typu char. I to jest bledem wielkim  napis[i]!='0'(w przykladzie jaki pokazales)
0 głosów
odpowiedź 30 października 2018 przez Huberti Gaduła (4,500 p.)
for (int i = 0; napis[i] != '0'; i++)

Powinno być:

for (int i = 0; napis[i] != '\0'; i++)

Zastanów się również nad używaniem string, zamiast łańcuchów w stylu C. Dzięki temu mógłbyś napisać to dużo prościej:

#include <iostream>
#include <cstdlib>//to do system("pause"), ale lepiej skorzystac z cin.get()
#include <string>

using namespace std;

int main()
{
	int tablica[1000], rozmiar, wybor;
	string napis;
	cout << "MENU" << endl;
	cout << "1. Pobieranie liczby elementow" << endl;
	cout << "2. Wyswietlanie dodatnich elementow" << endl;
	cout << "3. Wyswietla napis az do 0" << endl;
	cout << "4. Liczenie spacji" << endl;
	cin >> wybor;
	cin.ignore();
	switch (wybor)
	{
	case 1:
		cout << "Podaj liczbe elementow (maksymalnie 1000): ";
		cin >> rozmiar;
		for (int i = 0; i < rozmiar; i++)
		{
			cout << "Podaj " << i + 1 << " element tablicy";
			cin >> tablica[i];
		}
	case 2:
		for (int i = 0; i < rozmiar; i++)
		{
			if (tablica[i] > 0) {
				cout << endl << tablica[i] << endl;
			}
		}
	case 3:
		cout << "Wpisz linie tekstu ";
		getline(cin, napis);//pobierz linie tekstu z konsoli i zapisz ja w napis
		cout << "Twoj tekst: " << napis << endl;
	case 4:
		int spacja = 0;
		cout << "Wpisz linie tekstu";
		getline(cin, napis);//pobierz linie tekstu z konsoli i zapisz ja w napis
		for (size_t i = 0; i < napis.size(); i++)//napis.size() reprezentuje obecna dlugosc napisu 
		{
			if (napis[i] == ' ') {
				spacja++;//inkrementacja, czyli dodanie 1 do aktualnej wartosci zmiennej
			}
		}
		cout << "Liczba spacji w Twoim tekscie: " << spacja << endl;
	}
	system("pause");
}

Generalnie to menu nie ma większego sensu, bo i tak trzeba najpierw skorzystać z opcji numer 1, aby móc skorzystać z opcji numer 2 (inaczej wartości będą niezainicjalizowane) oraz bez względu na wybór użytkownika będą wykonywane pozostałe opcje case np. użytkownik podaje 3, a wykonywane są 3 i 4 (to ze względu na brak instrukcji break; przed następnym case).

 

 

komentarz 30 października 2018 przez xBartosz4x Nowicjusz (140 p.)
Wpisanie w for (!='\0') nie pomogło ale jak wstawiłem break i pętle while(1) case(3) trzeba wybrać i nie następuje po case(1) i case(2) dlatego nie wywala mi błędu. Dzięki za pomoc. Będę pewnie jeszcze odzywał się na forum.

Podobne pytania

0 głosów
1 odpowiedź 531 wizyt
pytanie zadane 30 maja 2018 w C i C++ przez Virius Początkujący (490 p.)
0 głosów
0 odpowiedzi 186 wizyt
pytanie zadane 30 maja 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
+3 głosów
1 odpowiedź 340 wizyt
pytanie zadane 22 października 2021 w C i C++ przez CrisGoldmann Nowicjusz (200 p.)

92,452 zapytań

141,262 odpowiedzi

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

...