Symfonia C++ Problem z jednym programem

Na pewno :slight_smile:

Złączono Posta : 21.08.2007 (Wto) 23:06

Chcę zrobić taki program

Na ekranie wyświetla się czy co chcę obliczyć i mam do wyboru:

Obliczyć pole figury

Objętość figury

Za pomocą instrukcji switch wybieram np. Obliczyć pole figury

Następnie mam znowu do wyboru co chcę obliczyć:

Kwadrat

Prostokąt

I znowu za pomocą instrukcji wybieram np.Obliczyć pole kwadratu

I podaje wymiary i program mi wyświetla wynik.

Trochę to zagmatwane

Zrobiłem coś takiego. Ale jestem początkujący więc zrobiłem parę błędów i nie wiem co to za błędy a tym bardziej jak je poprawić

O to kod programu

#include 

#include 

int main()

{

    int menu1, menu01, menu02, pole, objetosc, wysokosc, bok_a, bok_b ;


    cout "Wybierz dzialanie ktore chcesz wykonac " 

          "01. Obliczyc pole" 

          "02. Obliczyc objetosc"  


    cin >> menu1 ;

    switch(menu1)

    {

                 case 01:

                 {

                      cout << "Wybierz figure ktorej chcesz obliczyc pole" 

                            "11. Kwadrat" 

                            "12. Prostokat" ;


                           cin >> menu01;


                           switch(menu01)

                           {

                                         case 11:

                                         cout << "Podaj bok a";

                                         cin >>bok_a;


                                         pole= bok_a * bok_a ;


                                         cout << "Kwadrat o boku "

                                              <
                                              << " ma pole rowne "

                                              <
                                              break;


                                         case 12:

                                         cout << "Podaj bok a";

                                         cin >>bok_a;

                                         cout <<"Podaj bok b";

                                         cin >>bok_b;


                                         pole= bok_a * bok_b;


                                         cout << "Kwadrat o bokach "

                                              <
                                              << " i "

                                              <
                                              << " ma pole rowne "

                                              <
                                              break;

                           }


                 }


                 case 02:

                 {

                      cout << "Wybierz figure której chcesz obliczyc objetosc"

                            "21. Prostopadloscian" ;

                            "22. Szescian" <

                      cin >> menu02;

                      switch(menu02)

                      {

                                    case 21:

                                    cout <<"Podaj bok a" <
                                    cin >>bok_a;

                                    cout <<"Podaj bok b" 
                                    cin >>bok_b;

                                    cout <<"Podaj wysokosc prosopadloscianu"<
                                    cin >>wysokosc;


                                    objetosc= bok_a * bok_b * wysokosc ;

                                    cout <<"Prostopadloscian o boku "

                                         <
                                         <<" i "

                                         <
                                         <<" oraz wysokosci "

                                         <
                                         " ma objetosc rowna ";

                                         <
                                         break;


                                    case 22:

                                    cout <<"Podaj bok a" <
                                    cin >>bok_a ;


                                    objetosc= bok_a * bok_a * bok_a ;

                                    cout <<"Szescian o boku "

                                    <
                                    <<" Posiada objetosc rowna "

                                    <
                                    break;


                      }


                      getch();


}

}

}

Dla was na pewno są to błędy prostackie. Ale tak jak już wspominałem jestem początkujący wiec proszę o wyrozumiałość. :stuck_out_tongue:

Złączono Posta : 21.08.2007 (Wto) 23:12

a o to LOG

Kompilator: Default compiler

Building Makefile: “C:\Dev-Cpp\projekt\2\Makefile.win”

Wykonywanie make…

make.exe -f “C:\Dev-Cpp\projekt\2\Makefile.win” all

g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

main.cpp: In function `int main()’:

main.cpp:11: error: `cout’ undeclared (first use this function)

main.cpp:11: error: (Each undeclared identifier is reported only once for each function it appears in.)

main.cpp:11: error: expected `;’ before string constant

main.cpp:20: error: `cin’ undeclared (first use this function)

main.cpp:59: error: `endl’ undeclared (first use this function)

main.cpp:80: error: expected primary-expression before ‘<<’ token

make.exe: *** [main.o] Error 1

Wykonanie zakończone

A przetłumacz te błędy :wink:

Wyraźnie jest napisane że:

cout jest niezadeklarowane.

brak ‘;’ przed stringiem(to z błędu poprzedniego)

cin niezadeklarowane.

endl niezadeklarowane.

A rozwiązanie jest bardzo proste. Spójrz na pierwszą linijkę, widzisz błąd?

Jeśli nie to powiem Ci. Nie ma czegoś takiego jak cout jest std::cout itp. itd. Nie użyłeś przestrzeni nazw.

A więc zmień na albo dodaj przed funkcją main using namespace std;

Dzięki nie widziałem tego błędu w 1 linijce. :oops:

Poprawiłem już wszystkie, oprócz jednego.

main.cpp:80: error: expected primary-expression before ‘<<’ token

Nie wiem o co w tym chodzi. :roll:

W kodzie zauważyłem o wiele więcej błędów. Nazwę je “literówkami”, gdyż polegają na tym, że gdzieś zapomniałeś dać dwóch “>”, średniki stawiasz w nieodpowiednim miejscu itp.

Na pewno sam je znajdziesz :wink:

Doczepiłbym się do Twojej nieestetyczności. Twój kod nie jest w ogóle czytelny. Chociaż przy tak prostym programie nie rzuca się to tak mocno na oczy, ale jak wiadomo - czym skorupka za młodu nasiąknie itd :wink:

Spójrz, to Twój kod:

Zastanów się czy nie lepiej wyglądałby w ten sposób:

TO tylko moja sugestia. Pisz tak, aby Ci było wygodniej, żebyś się nie pogubił we własnym kodzie.

To dobre słowa. Dla mnie bardziej jest czytelny zapis który ja stosuje. :slight_smile:

Dla wielu na pewno jest odwrotnie.

Poprawiłem prawie wszystkie błędy. Jeden błąd logiczny mi został a mianowicie. Gdy wybiorę w pierwszym wyborze “Oblicz pole” (case :01) a w drugim “Kwadrat” **(case : 11)**i jak podam bok ‘a’ to drukuje wynik i wszystko jest OK. Ale gdy nacisnę Enter program powinien zakończyć działanie. Ale niestety przechodzi on do “Oblicz objętość” (case :02). I moje pytanie co zrobić żeby program zakończył działanie, a nie przechodził do “Oblicz objętość” (case :02).

I moje drugie pytanie. W Symfonii C++ doszedłem do takiego działu “Operacje bitowe”, jak to czytam to wydaje mi się że to raczej mi nie będzie potrzebne. Więc może ominąć ten dział i powrócić do niego gdy będę przerabiał książkę drugi raz.

Po zakończeniu case dodaj break;

Mi też się tak wydawało(przeczytałem tak pobieżnie). A ostatnio mi się przestało tak wydawać.

Heh, powiem tak - nie mam zamiaru ani ochoty na poprawianie tego programu (wolałbym go napisać od początku). Na pewno uda Ci się samemu to zrobić.

Mogę dodać informację, która powinna Ci pomóc.

Trzeba zrozumieć, że program przetwarza kod linijka po linijce.

Przydałby Ci się jednak C++ Builder, gdyż posiada on doskonały Debugger, dzięki któremu zrozumiesz jak działają programy i dlaczego Twój program się nie kończy tylko oblicza objętość.

P.S.

Pamiętaj, że dobry program powinien być czytelny nie tylko dla Ciebie, ale dla innych, którzy będą w przyszłości Twój kod wykorzystywać.

Już poprawiłem. Programik działa jak należy.

Musze jeszcze popracować nad czytelnością programików. :oops:

Jedna drobna sugestia: nie pisz kilkunastu-kilkudziesięciu linii w nadziei, że zadziałają, jeśli problemy masz z co czwartą. Pisząc program podziel go na mniejsze części i sprawdzaj, czy każda z nich działa poprawnie. Np. tworzysz szkielet:

#include 

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

{

  cout << "To jest program" << endl;

  return 0;

}

kompilujesz. Działa? Jedziesz dalej.

#include 

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

{

  int wybor = 0;

  cout << "To jest program" << endl;

  cout << "Chcesz pole (1) czy obwód (2)?" << endl;

  cin >> wybor;

  cout << "Wybrales: " << wybor << endl;

  return 0;

}

kompilujesz. Działa? Świetnie. A co jeśli podasz błędną wartość (nie 1 i nie 2)? Wypada przetestować. Dojdziesz do wniosku, że musisz czekać na poprawny klawisz:

#include 

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

{

  int wybor = 0;

  cout << "To jest program" << endl;

  cout << "Chcesz pole (1) czy obwód (2)?" << endl;

  while (true)

  {

    cin >> wybor;

    cout << "Wybrales: " << wybor << endl;

    if ((wybor == 1) || (wybor == 2))

      break;

    cout << "To nie jest poprawna wartosc. Sprobuj ponownie." << endl;

    cout << "Chcesz pole (1) czy obwód (2)?" << endl;

  }

  return 0;

}

komilujesz. Działa? Świetnie! A co jeśli użytkownik chce zrezygnować?

#include 

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

{

  int wybor = 0;

  cout << "To jest program" << endl;

  cout << "Chcesz pole (1) czy obwód (2)? 3 - koniec" << endl;

  while (true)

  {

    cin >> wybor;

    cout << "Wybrales: " << wybor << endl;

    if ((wybor >= 1) && (wybor <= 3))

      break;

    cout << "To nie jest poprawna wartosc. Sprobuj ponownie." << endl;

    cout << "Chcesz pole (1) czy obwód (2)? 3 - koniec" << endl;

  }

  return 0;

}

I tak dalej. Pisząc tak jak piszesz nie zrozumiesz wielu naczelnych rzeczy. Jakie błędy najczęściej popełniasz i czego powinieneś unikać? W którym momencie program jest podatny na błędy? Jak poprawnie interpretować to, co podaje użytkownik? Jest wiele pytań na które musisz odpowiedzieć dodając tylko jedną linijkę kodu. Popiszesz kilka lat to zaczniesz to robić w większości wypadków w locie. Póki co powinieneś dobrze przemyśleć, skompilować i wypróbować każdą, niewielką nawet zmianę w kodzie, każdy logiczny ciąg 1-5 linii kodu. Inaczej program, który pisze się minutę będziesz pisał tydzień.

Ryan dzięki za to co napisałeś. Na pewno będę to stosował. Dzięki temu na pewno skrócę czas pisania programów.

Złączono Posta : 22.08.2007 (Sro) 18:21

Jeszcze mam pytanie czy istnieje jakieś szybsze potęgowanie liczb

Do kwadratu chyba sie podnosi takim znakiem ^.

A czy można podnieść liczbę do sześcianu innym sposobem niż

x = a * a * a

Możesz użyć funkcji, która dokładnie to zrobi, ale to żaden zysk. Znak ^ to alternatywa wykluczająca a nie potęga. W programowaniu jest różnica między lub a albo.

Lub:

Umyj się lub idź spać.

Możesz się umyć i na tym koniec. Możesz iść spać bez mycia i na tym koniec. Możesz się umyć i iść spać. Nie możesz nie wykonać żadnej z czynności.

Albo:

Umyj się albo idź spać.

Możesz się umyć i na tym koniec. Możesz iść spać bez mycia i na tym koniec. Nie możesz się umyć i iść spać. Nie możesz nie wykonać żadnej z czynności.

Albo oznacza się jako ^ (czy raczej: ^^), np:

A B A^^B

0 0 0

0 1 1

1 0 1

1 1 0


A B A||B

0 0 0

0 1 1

1 0 1

1 1 1


A B A&&B (dla porównania)

0 0 0

0 1 0

1 0 0

1 1 1

Albo to alternatywa wykluczająca: albo to albo to, nigdy oba.

Można też zastosować pętle (moje ulubione :-))

Na tak życiowym przykładzie zrozumiałem różnice między lub a albo. Z funkcjami i pętlą to odpada bo zbyt długo, więc najlepszym dla mnie bo najkrótszym i najłatwiejszym jest pozostanie przy :

x = a * a * a

Pętla to nie jest najlepszy pomysł. Poza tym przypadku potęg wyższych od 3 jest szansa na optymalizację. Wystarczy zauważyć, że Power(x, y) (x do potęgi y) dla y = 4 to (x*x) do kwadratu. Można zatem podnieść liczbę do 4 potęgi dwoma mnożeniami zamiast 3. Mnożenie to kosztowna operacja (trwa kilkukrotnie wolniej niż np. dodawanie - na starszych komputerach 8 do 16 razy wolniej). Można zrobić sporo ciekawych sztuczek obserwując bity w potędze albo definicję potęgi w ogóle. Ale powiedzmy, że nie ma w tym momencie sensu się rozdrabniać. :wink:

A napotkałem się w Symfonii na taki program :stuck_out_tongue:

#include 

#include 


long potega( int stopien, long liczba) ;


main()

{

      int pocz, koniec ;


          cout << "Program na obliczanie poteg liczb calkowitych \n"

               << "z zadanego przedziału \n"

               << "Podaj poczatek przedzialu \n" ;

          cin >> pocz ;

          cout << "Podaj koniec przedzialu\n" ;

          cin >> koniec ;


          // pętla drkujaca wynik danego przedzialu


          for(int i = pocz ; i <= koniec ; i++)

          {

                  cout << i

                       <<" do kwadratu = "

                       << potega (2, i) // wywolanie funkcji

                       << " a do szescianu = "

                       << potega (3, i) // wywolanie funkcji

                       << endl;

          }

}

long potega(int stopien, long liczba)

{

     long wynik = liczba ;

          for(int i = 1; i < stopien ; i++)

          {

                  wynik = wynik * liczba ;


          }


          return wynik ;


}

I czytam ten kod z góry do dołu, z dołu do góry nawet wspak :stuck_out_tongue: i nie mogę zrozumieć tych fragmentów.

potega (3, i)

potega (2, i)

Wywołuję funkcję potega (u dołu programu) z parametrem 2 lub 3 i parametrem i.

Przykładowo jeśli i wyniesie 5 to dla potega(2,i) wywoła potega(2, 5). Funkcja potega działa w sposób bardzo prosty:

long potega(int stopien, long liczba) 

{ 

     long wynik = liczba ; 

          for(int i = 1; i < stopien ; i++) 

          { 

                  wynik = wynik * liczba ; 


          } 


          return wynik ; 


}

Jeśli potega druga (2) to pomnozy liczba przez siebie i zapisze w wyniku. Potega 3 - pomnozy jeszcze raz. I tak dalej.

Aha, kapuje.

wynik = wynik * liczba ;

Ta linijka dzięki funkcji ma takie znaczenie.

wynik = liczba * liczba

np.

potega(x, 4)

Podstawiając za x dowolną liczbę, możemy otrzymać dowolną potęgę liczby 4. Więc to jest chyba odpowiedź na moje pytanie.

Vion proponuję najpierw nauczyć się pętli, potem zaś funkcji. Zresztą jak pojmiesz pętle to funkcje same wejdą :wink:

Niby dlaczego? Koncepcja zupełnie różna, nie ma zależności łatwiejsze-trudniejsze ani to wcześniej-to później.