[c++] opętlanie programu


(pain3hp) #1
#include 

#include 


using namespace std;


int main(int argc, char *argv[])

{

    float a;

    float b;

    float wynik; 

    char znak;


    cout<<"podaj pierwsza liczbe: "; 

    cin>>a;

    cout<<"podaj druga liczbe: ";

    cin>>b; 

    cout<<"--------------------------"<
    cout<<"podaj znak dzialania: "<
    cout<<""<
    cout<<"+ | dodawanie"<
    cout<<"- | odejmowanie"<
    cout<<"* | mnozenie"<
    cout<<"/ | dzielenie"<
    cout<<""<
    cout<<"twoj wybor: "; 

    cin>>znak;


    switch (znak) {


           //dodawanie 

                  case '+':

                       wynik=a+b;


                       if (b<0) {

                       cout<<"twoj wynik: "<
                       break; }


                       if (a<0) {

                       cout<<"twoj wynik: "<<"("<
                       break; }


                       cout<<"twoj wynik: "<
                       break;

           //odejmowanie            

                  case '-':

                       wynik=a-b;


                       if (b<0) {

                       cout<<"twoj wynik: "<
                       break; }


                       if (a<0) {

                       cout<<"twoj wynik: "<<"("<
                       break; }


                       cout<<"twoj wynik: "<
                       break;

           //mnozenie             

                  case '*':


                       if (b<0) {

                       cout<<"twoj wynik: "<
                       break; }


                       if (a<0) {

                       cout<<"twoj wynik: "<<"("<
                       break; }


                       wynik=a*b;

                       cout<<"twoj wynik: "<
                       break;


           //dzielenie             

                  case '/':

                       if (b==0) {

                       cout<<"nie dzieli sie przez 0!"<
                       break; }


                       if (b<0) {

                       cout<<"twoj wynik: "<
                       break; }


                       if (a<0) {

                       cout<<"twoj wynik: "<<"("<
                       break; }


                       wynik=a/b;

                       cout<<"twoj wynik: "<
                       break;

                       }


    system("PAUSE");

    return EXIT_SUCCESS;

}[/code]

jak zrobić żeby po caseach czyli po załamaniu instrukcji wyboru przez "break" wywołać opcję "czy chcesz liczyć dalej?" która to przeniesie na górę i zacznie od wprowadzania na nowo danych a i b?

myślałem żeby obrać to w do () {}while.. ale wtedy musiałbym definiować zmienną do while na samym początku a to ma być po pierwszym przeprowadzonym liczeniu.. może ktoś ma pomysł ??


([alex]) #2
while(true)

(boger) #3
char znak, koniec;

do{

    cout<<"podaj pierwsza liczbe: ";

   ......

    wynik=a/b;

    cout<<"twoj wynik: "<
    break;

     }

     cout<<"koniec t/n"

     char koniec; //jak juz koniecznie musi byc po liczeniu

     cin>>koniec;

while(koniec!="t")[/code]




albo

[code]char znak; do{ cout<<"podaj pierwsza liczbe: "; ...... wynik=a/b; cout<<"twoj wynik: "< break; } cout<<"koniec t/n" while(getch()!='t')


([alex]) #4

Jak nie potrafisz pisać bez błędów to sprawdzaj zanim coś umieścisz.


(pain3hp) #5

a da sie zrobić dla pętli:

do {

  działania..... }

while (warunek) lub warunek???

czy mozna do tego while na końcu wstawić dwa warunki np odp!='n' oraz odp!='t' ??


(Asterisk) #6

Zapoznaj się proszę z tą stroną i zmień tytuł na

konkretny. Inaczej temat poleci do śmietnika.


([alex]) #7

Oczywiście że można

while(odp!='n' && odp!='t') - z tym że taka pętla skończy się kiedy naciśniesz 't' lub 'n', ale chyba ci nie o to chodzi

while(odp!='n' || odp!='t') - ten warunek zawsze się spełni, ale chyba ci nie o to chodzi

Można stworzyć dodatkową pętle (lub nawet specjalną funkcje) dla odczytania odpowiedzi:

while(true)  {   //dzialania   char odp=0;   while(odp!='t'  odp!='n')      {       while(cin.get()!='\n') {} // wywalić wszystko co jest w buforze       odp=tolower(cin.get());      }   if(odp!='t') break;  } [/code]Z tym że to niezbyt udany pomysł w trybie konsolowym.



Rozważ zastosowanie "inteligentnego" wczytywania, coś w rodzaju:
[code=php]int main()  {   while(true)     {      cout"Podaj wyrazenie liczba operacja liczba, np 3+6 (!-koniec):";      int a,b;      char c;      cinacb; // wczytujemy liczba znak liczba      if(cin) // jeżeli się udało        {         if(c=='-') cout"Wprowadzono "a" - "bendl;         else if(c=='+') cout"Wprowadzono "a" + "bendl;         else if(c=='*') cout"Wprowadzono "a" * "bendl;         else if(c=='/') cout"Wprowadzono "a" / "bendl;         else cout"Nieznana operacja"endl;        }      else // jeżeli wprowadzenie się nie powiodło        {         cin.clear(); // przywrócić stan ios::good dla cin         if(cin.get()=='!') return 0; // jeżeli nie powidło się ponieważ użytkownik chce skończyć         cout"Blad wprowadzania"endl;        }      while(cin.get()!='\n') {} // wyczyść bufor klawiatury      coutendl;     }  } To ma kilka dodatkowych zalet:



123*345

2+3

!
niż:
123

345

*

t

2

3

+

n


[*:28hpj2qm]Jeżeli zamiast liczby użytkownik wpisze:
dwa
to program się nie wywali.




Aby ten kawałek był całkiem durnieodporny to trzeba tu jeszcze to i owo dodać :D

(pain3hp) #8

chodzi o to że to jest moje zadanie do szkoły i warunek jest taki że nie mam wejść w strefę programowania strukturalnego, czyli bez żadnych funkcji, generalnie tylko różnorakie typy pętli

-- Dodane 23.09.2009 (Śr) 18:27 --

kolejne pytanie:

definiuję zmienną char i nazywam powt

char powt;

jak sprawić aby program wstawił za powt obojętnie jaką wartość, np dfsdfs

nie wiem jak to fachowo nazwać ale jeśli użytkownik wprowadzi "t" to żeby to "t" w następnej pętli się zmazało czyli żeby wprowadzać od nowa...


([alex]) #9

W czystym trybie konsolowym nie jest to możliwe.


(matiit) #10

Na linuksie można użyć naprzykład biblioteki ncursses do czegoś takiego.


(Ryan) #11

Na początku pętli wyzeruj zmienną.