1 / 4
Jan 2018

Witam zaczynam pisac programy i natknąłem sie na na problem z pętlą.Rzecz w tym że nie wiem czemu mi nie działa.
Jeśli ktos mógłby zapisac ten skrypt zeby aplikacja nie wylaczala sie po jednym uzyciu i zeby pod przełącznikiem(switchem) “3” bylo wyjscie bylbym wdzięczny.Oto ten skrypt:

#include<iostream>

using namespace std;
float metry;

int wybor;
string cm;
float ile_cali(float m)
{
return m*39.37;
}

float ile_centymetrow(float c)
{
return c*100;
}
float ile_km(float km)

{
return km/1000;
}

float ile_dm(float d)
{

return d*10;
}

float ile_mm(float mm)
{
return mm*1000;

}

int main()
{

cout << "Wybierz" << endl;
cout << "1.Jednostki dlugosci" << endl;
cout << "2.Jednostki czasu" << endl;
cin>>wybor;
switch(wybor)
{

    for(;;)
case 1:
cout<<“Podaj metry”<<endl;
cin>>metry;
cout<<“Na Cale: “<<ile_cali(metry)<<endl;
cout<<“Na CM:”<<ile_centymetrow(metry)<<” cm”<<endl;
cout<<“Na KM:”<<ile_km(metry)<<" km"<<endl;
cout<<“Na MM:”<<ile_mm(metry)<<" mm"<<endl;

    break;


case 2:
cout<<“Podaj mi”<<endl;
break;

case 3:

    break;
}

return 0;
}
  • created

    Jan '18
  • last reply

    Jan '18
  • 3

    replies

  • 874

    views

  • 4

    users

  • 1

    like

Widzę, że to prosty kalkulator jednostek. Jeśli chcesz zapętlić całe menu to umiejscowienie twojej pętli jest błędne. Ponadto twoja pętla działa, tylko w tym stanie będzie wykonywać się w nieskończoność. Możesz korzystać z pętli ‘for’ jednak zwykle w takiej sytuacji stosuje się ‘do … while’ lub ‘while’. Najbezpieczniej jest korzystać z do … while, ponieważ zawsze przynajmniej raz zobaczysz na ekranie twoje menu. Rozwiązań jest wiele:

  1. #include<stdlib.h>
    // … pomijam deklarację funkcji i zmiennych
    int main()
    {
    for(;;)// … jeśli musisz użyć for lub możesz też użyć while()
    {
    // … twój kod
    switch(wybor)
    {
    case 1: // … instrukcje; break;
    case 2: // … instrukcje; break;
    case 3: exit(0); break;
    }
    }
    return 0;
    }

Jeśli nie chcesz oddawać nowej biblioteki to możesz zrobić to tak:

  1. bool bZakoncz=false;
    // … pomijam deklarację funkcji i zmiennych
    int main()
    {
    do
    {
    // … twój kod
    switch(wybor)
    {
    case 1: // … instrukcje; break;
    case 2: // … instrukcje; break;
    case 3: bZakoncz=true; break;
    }
    while(bZakoncz==false)
    }
    return 0;
    }

Jak już napisałem możliwości jest wiele. Mam nadzieję, że pomogłem. Pozdrawiam.

//Jak tylko cwiczysz i juz wiesz / czujesz co robi to include to zapoznaj sie z #include <bits/stdc++.h>
#include <iostream>

//Oczywiscie using namespace ograniczamy do prostych rzeczy robionych na szybko / na SPOJa
//W realnym swiecie std::
using namespace std;

//Nie uzywaj float, o ile nie ma to jakiegos szczegolnego uzasadnienia. Uzywaj double
float ile_cali(float m)
{
  //Czy napiszesz liczba * zmienna czy odwrotnie - nikt na to nie zwroci uwagi
  //Ale spacje i wciecia sa juz bardzo wazne
  return 39.37 * m;
}

float ile_centymetrow(float c)
{
  //Dlaczego c * 100 jest zle, a c * 100.0 dobrze? 
  //Na ogol kwestia stylu, ale czasami mozesz sie przejechac nie uwzgledniajac typow stalych ;)
  /*
    DOWOD:
  
    //Ta czesc kodu wymysl sam tak, aby main sie skompilowal    

    int main() {
      int x = 3;
      cout << x / 2 << endl;
      cout << x / 2.0 << endl;
      return 0;
    }
  */
  //Po prostu fajnie jest widziec, ze wynik bedzie liczba zmiennoprzecinkowa bez patrzenia na deklaracje funkcji
  //Zwlaszcza, ze cialo funkcji moze byc rozbudowane (choc nie zaleca sie > 60 znakow, zycie weryfikuje to bolesnie)
  //Uwaga ta dotyczy nade wszystko obiektowki, gdzie latwo mozna sie przejechac przy zlozonych metodach
  return c * 100.0;
}

//Wspolczesnie kompilator ma raczej w powazaniu inline, ale warto wiedziec, ze cos takiego istnieje
//Istnieja jezyki programowania, gdzie inline pomaga tworzyc czytelny kod, np. z rodziny xBase Harbour i xHarbour
inline float ile_km(float km)
{
  return km / 1000.0;
}

float ile_dm(float d)
{
  return d * 10.0;
}

float ile_mm(float mm)
{
  return mm * 1000.0;
}

int main()
{
  //Nie uzywaj zmiennych globalnych, o ile nie musisz
  //Na SPOJu zmienne globalne moga byc pomocne, ale tutaj wolalem profesjonalne podejscie ;)
  double metry;
  int wybor;
  string cm;
  bool kontynuuj = true;

  //Event loop to taka madra nazwa tej dosc logicznej konstrukcji przydatnej chyba wszedzie ;)
  //Rozni ludzie koduja to inaczej, np. while(!zakoncz) 
  while(kontynuuj) {
    //Zalecam uzywanie tych spacji...
    cout << "Wybierz" << endl;
    cout << "1. Jednostki dlugosci" << endl;
    cout << "2. Jednostki czasu" << endl;

    cin>>wybor;

    switch(wybor) {

      case 1:
        cout<<"Podaj metry"<<endl;
        cin>>metry;
        cout<<"Na Cale: "<<ile_cali(metry)<<endl;
        cout<<"Na CM: "<<ile_centymetrow(metry)<<" cm"<<endl;
        cout<<"Na KM: "<<ile_km(metry)<<" km"<<endl;
        cout<<"Na MM: "<<ile_mm(metry)<<" mm"<<endl;
        break;
      case 2:
        cout<<"Podaj mi"<<endl;
        break;
      //Zapoznaj sie z default
      default:
        break;
    }
  }

  return 0;
}

Oczywiście prawda tylko w takich prostych przypadkach, gdzie chcesz choć raz coś zobaczyć bo po prostu bawisz się kodem. W realnym świecie rozwiązanie z do … while jest nieprawidłowe - wykonasz kod nawet dla kontynuuj = false, które może tak zostać ustawione np. w konstruktorze klasy gdy z jakiegoś powodu typu brak pliku csv z danymi chcesz wyłączyć program.

W żadnym przypadku nie musisz dodawać nowej biblioteki.

EDIT
A co mi tam. Też wkleję w kolorze :wink:

@pamix04 Aby osiągnąć tylko to o co pytasz, wystarczy tylko kilka, drobnych zmian.

  1. Pętla for ( ; ; ) jest w złym miejscu i brakuje nawiasów :
int main() {
    .....
     for (;;) { 
         cin >> wybor;
         swich (wybor) {
           case 1: 
           .........
           case 3:
           default:
                cout << "The END! [To już jest koniec, nie ma już nic, 
                               jesteśmy wolni, możemy iść!] \n";
                return 0;
          }
     }
}
  1. Używanie double zamiast float i unikanie zmiennych globalnych też jest ważne.
  2. Pomyśl, aby program [menu] działał po naciśnięciu tylko klawisza cyfry [bez entera]
  3. Pomyśl o “znikającym”, po wprowadzeniu dużej ilości danych, twoim menu. A więc np każdorazowe [w tej samej pętli for(;;)] czyszczenie ekranu i drukowanie na nowo menu?.
  4. No i do menu mógłbyś dopisać poz:
    3. Lub dowolny inny od 1, 2, wyjście [zakończenie] programu.