Wątek przeniesiony 2015-10-26 14:26 z C/C++ przez ŁF.

Powrót do menu?

0

Cześć,
Jestem laikiem w programowaniu, dopiero raczkuje (albo raczej leżę) w tym temacie.

Potrzebuje aby po skończonej operacji program czyścił ekran i wyświetlał ponownie menu.
W moim programie po skończonym "case" program wraca do menu, ale nie wiem gdzie umiejscowić system("cls"), kombinowałem w różnych miejscach, ale wtedy program nie wypisuje wyniku tylko wraca do MENU.

Code z Dev-Cpp


#include <iostream>
#include <math.h>
using namespace std;

void menu()
{
	cout <<endl;
    cout << "MENU GLOWNE" <<endl;
    cout << "--------------" <<endl;
    cout << "P = Pole powierzchni walca" <<endl;
    cout << "O = Objetosc walca" <<endl;
    cout << "E = EXIT" <<endl;
}
int main()
{
	unsigned int r, h, v, p;
	char wybor;
	
	cout <<"Podaj r= ";
	cin >> r;
	cout <<"Podaj h= ";
	cin >> h;
	
	MENU:
    menu();
    cout << "Wybierz= ";
    cin >> wybor;
    
    switch(wybor)
    {
    	case 'p':
    	case 'P':
    		p = 2*M_PI*r*(r+h);
    		cout <<"Pole powierzchni walca= " <<p;
    		break;
    	case 'o':
    	case 'O':
    		v = M_PI*pow(r, 2)*h;
    		cout <<"Objetosc walca= " <<v;
    		break;
    	case 'e':
    	case 'E':
    		cout <<"EXIT" <<endl; 
			break;
    	default: cout << "Wcisnales zly przycisk" <<endl <<endl;
    	 
	
    }	
    	
   		goto MENU;
    	return 0;
}
 
2

zmien dev-cpp na code::blocks

  1. nie uzywa sie goto
  2. inicjalizuj zmienne (bo niezainicjalizowane posiadaja smieci)
  3. endl nie sluzy do nowej liini. Od tego jest "\n"
  4. tu masz kod +- ktory chcesz (ja bym nad nim wiecej popracowal, ale sadze, ze Tobie wystarczy by stworzyc to co chcesz)
  5. nie uzywa sie char tylko string (klasy string)
#include <iostream>
#include <math.h>
using namespace std;

void menu()
{
    cout <<endl;
    cout << "MENU GLOWNE" <<endl;
    cout << "--------------" <<endl;
    cout << "P = Pole powierzchni walca" <<endl;
    cout << "O = Objetosc walca" <<endl;
    cout << "E = EXIT" <<endl;
}

int main()
{
    unsigned int r, h, v, p;
    char wybor;
    bool running = true;
    
    cout <<"Podaj r= ";
    cin >> r;
    cout <<"Podaj h= ";
    cin >> h;
   
    while (running)
    {
        menu();
        cout << "Wybierz= ";
        cin >> wybor;
        switch(wybor)
        {
            case 'p':
            case 'P':
                p = 2*M_PI*r*(r+h);
                cout <<"Pole powierzchni walca= " <<p;
                break;
            case 'o':
            case 'O':
                v = M_PI*pow(r, 2)*h;
                cout <<"Objetosc walca= " <<v;
                break;
            case 'e':
            case 'E':
                cout <<"EXIT" <<endl;
                running = false;
                break;
            default: 
                cout << "Wcisnales zly przycisk" <<endl <<endl;
        }
        char temp;
        cout << "Nacisnij przycisk by przejsc do poczatku menun";
        cin >> temp;
        system("cls")
    }
    return 0;
}
0

Dziękuje wszystkim za pomoc, ale dalej jest mały problem bo faktycznie program po wykonaniu case i wpisaniu obojętnie jakiego znaku wraca do menu, tylko podając E lub e nie zamyka programu. Przepraszam, za takie lakoniczne pytania, ale w programowaniu jestem totalną świeżynką.

Co do inicjalizacji zmiennych to linijkę " unsigned int r, h, v, p;" mam zamienić na " unsigned int r=0, h=0, v=0, p=0;"?

2

Prostując nieco dogmatyczny post kolegi fasadina (odmieniać? nie odmieniać?) dodam trochę informacji od siebie.

zmien dev-cpp na code::blocks
Dodajmy może użyteczną dla OP informację - że jeżeli używa Bloodshed Dev-C++ to używa starego IDE oraz najpewniej też wersji GCC, która również jest stara jak jasny pieron. :P (3.4.5? no w każdym razie coś z 2005/6 roku)
Jeżeli używa wxDev-C++ lub Orwell's Dev-C++ to już nie jest tak źle, bo to aktywne projekty. OP - dobrze by było gdybyś rozejrzał się za świeższą wersją GCC (http://tdm-gcc.tdragon.net/download ew. http://nuwen.net/mingw.html są godne polecenia) i być może świeższym IDE - QtCreator, NetBeans C/C++, Code::Blocks (jeśli zainstalujesz jedną z powyższych dystrybucji GCC/MinGW to nie potrzebujesz już wersji dołączonej do C::B), etc. Jest też, o zgrozo, Visual Studio Community Edition. :P

  1. nie uzywa sie goto
  • goto w języku jest i raczej z niego nie wyleci. Sytuacja z goto jest jednak taka, że zwykle sprawia, że kod staje się mniej czytelny, może się zrobić "spaghetti" i można nieźle namieszać... Chociaż C++ przed najgorszym nas tu akurat chroni. Strzelić sobie w stopę używając goto ciągle możemy, ale już odrąbać nogi niekoniecznie, bo nie przeskoczymy inicjalizacji zmiennych, ani nie poskaczemy między funkcjami.

Samo goto w C++ nie jest jakieś diaboliczne, raczej po prostu zwykle niepotrzebne, a nadużywanie go przez początkującego programistę jest większym problemem niż sam fakt jego użycia.

Więc taka generalna zasada powinna brzmieć nie tyle "goto nie używamy", co raczej "jeżeli nie potrafisz dobrze uargumentować dlaczego goto w tym przypadku jest przydatne - to pewnie nie powinieneś go tu używać". Jednym z wybaczalnych przypadków może być szybkie wyskoczenie z bardzo głębokiego zagnieżdżenia.
Jest jeszcze przynajmniej jedna okazja do użycia goto, które byłoby nie tylko wybaczalne, ale wręcz pożądane... Ale taka sytuacja, możliwa do napotkania w C, w C++ może być rozwiązana za pomocą lepszych sposobów - mianowicie RAII.

  1. inicjalizuj zmienne (bo niezainicjalizowane posiadaja smieci)

Generalnie dobra rada. Oczywiście w tym przypadku niewiele to zmienia, bo nie używasz tych śmieciowych wartości, ale generalnie się zgadzam. Może być sytuacja, gdzie śmieci na ten przykład w dużej tablicy Ci w ogóle nie przeszkadzają, bo wiesz, że nadpiszesz te wartości czymś sensownym. Nawet w takiej sytuacji jednak, jeżeli inicjalizacja nie jest wielce kosztowna - radzę się nią zainteresować. ;)

  1. endl nie sluzy do nowej liini. Od tego jest "\n"

Wszystko super, poza tym, że jak byk każdy newbie Ci zademonstruje, że std::endl "do nowej linii służy". :P Problem jest w tym, że std::endl poza wrzuceniem ostream::widen('\n') do strumienia odpali również ostream::flush(), co w tym momencie nie ma znaczenia, ale już gdybyśmy wyrzucali sporo danych w pętli, to częste flushowanie mogłoby srogo spowolnić nasz program. Dlatego dobrym rozwiązaniem byłoby po prostu używać std::endl tam, gdzie chcemy do strumienia wrzucić nową linię, oraz go od razu "spłukać". ;) W innym przypadku, dodanie '\n' to raczej lepsze wyjście. Szczególnie tutaj:

cout << "Wcisnales zly przycisk" <<endl <<endl; 

Po co się tak męczyć, jak można po prostu:

cout << "Wcisnales zly przycisk\n\n"; 
5) nie uzywa sie char tylko string (klasy string) 

A to już nie ma sensu. char używa się tam, gdzie nam potrzebny char, a std::string gdzie nam potrzebny std::string. Jasne, powinieneś się zainteresować klasą std::string, bo choć nie jakaś z nieba zrzucona, to jednak znacznie ułatwia pracę z ciągami znaków w C++. Pierwsza rzucająca się w oczy sprawa to po prostu zdolność stringa do dynamicznej zmiany rozmiaru. Nie musisz już ręcznie realloc wołać bo Ci się bufor skończył. ;)

Ale co to ma wspólnego z char per se? ;)

Poza tym, z małych rzeczy - w C++ mamy <cmath> zamiast <math.h>. Czyszczenie ekranu bym sobie kompletnie odpuścił (dlaczego usuwasz użytkownikowi sprzed oczu przydatną informację?), ale jeśli nalegasz - to po cin >> temp; z powyższego kodu dodaj cin.ignore(...), żeby pozbyć się ewentualnych śmieci z bufora.

0

@Xupicor
jezeli chodzi o srodowisko dev-cpp

  • nowi ludzie w programowaniu przewaznie uzywaja starych czesci. Niestety nadal to sie zdarza, ze jezeli dev-cpp to przewaznie stara i nieaktualna wersja
  1. Zgadzam sie, jednak dla poczatkujacego to i tak bedzie za duzo informacji ktore (zapewne) mu sie nie przydadza przez najblizsze tygodnie
  2. Troszke lapanie za slowka. Wiec napisze pelnym precyzyjnym zdaniem

Zapewne autor gdy bedzie chcial wczytac napis bedzie uzywal char[] co jest w miare fajne do nauki, ale dopoki nie jest to C to powinien uczyc sie wczytywania "tego nowszego" C++ (czyli string). Dzieki temu nie bedzie bil glowa o mur tylko ruszy z nauka dalej i nie bedzie musial sie przejmowac (wielu poczatkujacych ma problem z kopiowaniem jednego napisu char[] do drugiego[] a to im sie nie przyda w C++ bo zapewne nigdy z tego nie beda musieli korzystac [wyjatkiem jest gdyby pracowali przy module z C... ale watpie])

Tak wiec char tutaj pasuje i jest odpowiednim narzedziem (male, proste, przejrzyste), ale autor zapewne gdyby znal std::string to by go tutaj wykorzystal do rozbudowania menu :)

fajnie ze wywiazala sie z czegos takiego dyskusja :) szkoda tylko, ze malo poczatkujacych ja przeczyta

1 użytkowników online, w tym zalogowanych: 0, gości: 1