Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Insidek

[C++]Opinia prostego programu.

Rekomendowane odpowiedzi

Witam, jestem uczniem klasy 2 technikum informatycznego. W pierwszej klasie miałem pascala, teraz mam c++ jako, że wiąże w przyszłości duże nadzieje z programowaniem zakupiłem książke "Thinking in C++"(doszedłem do strony 100, jak na razie nie mam problemów z jej zrozumieniem), mam też podręcznik szkolny "Programowanie strukturalne i obiektowe" Przemysława Domka i Małgorzaty Łokińskiej(Mam co do niej mieszane uczucia). Napisałem dzisiaj bardzo prosto program do potęgowania liczb. Chciałbym poznać na jego temat waszą opinię, a także usłyszeć od doświadczonych programistów w jakim kierunku powinienem zdobywać wiedzę i na co powinienem zwrócić szczególną uwagę. Aktualnie nie wiem w czym chciałbym programować, na razie chcę nauczyć się C++, a potem może JAV'y.

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int a, double b, double c, int d)
{
    cout << "Podaj liczbe do spotegowania: ";
   cin >> b;

   cout << "Oblicz " << b << " do potegi: ";
    cin >> a;

     d=a;
    c=b;

      if(a > 0) 
     for(int i = 1; i < a; i++)
    b=b*c;

    if(a < 0)
     b=1/b;

     if(a < 0)
    a=a*(-1);

    if(d < 0)
     for(int i = 1; i < a; i++)
      b=b*1/c;

    if(a == 0)
     b=1;

   cout << "Liczba " << c << " do " 
        << d << " potegi wynosi: " << b <<endl;


   system("PAUSE");
   return EXIT_SUCCESS;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Brzydkie formatowanie kodu.

 

#include <cstdlib>

Zbędne.

 

 

Dlaczego deklarujesz a,b,c,d w nawiasach main?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak na pierwszy rzut oka coś z logiczną stroną programu jest skopane chyba. Sprawdzałeś jego działanie ? Zwłaszcza chodzi mi o potęgowanie gdzie wykładnik nie jest liczbą naturalną. Bo skoro przyjmujesz typ double to można sądzić że porogram pozwala na liczbę inną niż naturalna jako wykładnik, z kolei po kodzie nie widać żeby był w stanie coś takiego obsłużyć(tak na pierwszy rzut oka).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Właściwie myślałem, że w takim programie nie ma co oceniać, ale jest - złe formatowanie, zmienne przekazywane w taki sposób do funkcji main. Zacznij czytać tę książkę od początku.

No i jeszcze ++i zamiast i++, ale kompilator to zoptymalizuje, poza tym nie wiem, czy przy typach prostych to ma jakieś znaczenie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chodzi o liczby to nie muszą być naturalne, mogą być każde ujemne, po przecinku itp.

Pisało w książkach o małej różnicy w zapisach ++i, i++, ale w każdym przedstawionym tam kodzie było i++, nie było podane dokładnie jaka jest różnica, ponieważ na tym etapie to bez znaczenia.

Zaś poprawne liczenie programu sprawdzałem z obliczeniami z google.

Generalnie nie wiem co mam czytać od nowa ponieważ 70 stron to była czysta teoria, więc właściwie i tak jestem na samym początku.

Jeśli rozumieć złe formatowanie jako zapis kodu to w sumie nie wiele wiem o tym, jak go zapisać by był czytelny/poprawny.

Zdeklarowałem zmienne w nawiasach main, ponieważ nie mam pojęcia czym się to różni, a działa, nigdzie nie było jescze o tym wzmianki.

Biblioteka csdlib została dodana z automatu przez Dev-cpp i po prostu jej nie usuwałem.

 

#include <iostream>

using namespace std;

int main()
{
   int a,d; 
   double b,c;

   cout << "Podaj liczbe do spotegowania: ";
    cin >> b;
   cout << "Oblicz " << b << " do potegi: ";
    cin >> a;  
    d=a;
    c=b;
   if(a > 0) 
    for(int i = 1; i < a; i++)
     b=b*c;
   if(a < 0)
   {
          b=1/b;
          a=a*(-1);
   }       
   if(d < 0)
    for(int i = 1; i < a; i++)
     b=b*1/c;
   if(a == 0)
    b=1;
   cout << "Liczba " << c << " do " 
        << d << " potegi wynosi: " << b <<endl;
   system("PAUSE");
   return EXIT_SUCCESS;
}

 

Może takie formatowanie będzie lepsze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jak inni:

1. formatowanie

2. int main(int a, double b, double c, int d) - WTF?

 

oraz coś czego inni nie zauważyli (shameeee :E)

3. jak wpiszesz b=0 to zaliczysz division by zero exception ;)

 

Biblioteka csdlib została dodana z automatu przez Dev-cpp i po prostu jej nie usuwałem.

 

btw - nie używaj tego - z darmowych code::blocks jest znacznie lepszy, ciągle rozwijany i nie ma tylu bugów co DevCPP

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po wpisaniu 0 wyskakuje ci błąd?

U siebie z takim czymś się nie spotkałem.

 

PS.Jak według waszej opinii kod wygląda teraz.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dobra, to tak na szybko:

1. Popraw składnie. Kompilatorowi to wszystko jedno jak piszesz, inni mogą mieć problem. Ten program akurat jest prosty, ale już coś opartego na obiektach,wskaźnikach, kilku klasach i już mamy burdel.

2. W związku z punktem 1. naucz się stosować KOMENTARZE. Ciebie to nic nie kosztuje, a innym czytajacym kod będzie łatwiej.

3. <cstdlib> niepotrzebne.

4. Nie deklarujesz zmiennych w argumentach metody głównej main. Dojdziesz do metod to zrozumiesz dlaczego, ale głównie wiąże się to z pkt.1.

5.

 d=a;
    c=b;

 

Na wuj to? Co chciałeś tym osiągnąć? Wczytałeś sobie a i b, to na nich pracuj. Niepotrzebne zajmowanie pamięci. Wiem, że to głupie w przypadku 2 zmiennych, ale w poważniejszym

 

6. W przypadku instrukcji warunkowych, jak i pętli ZAWSZE stosuj nawiasy klamrowe {}. Potem to prowadzi do głupich błędów, które ciężko wyłapać, szczególnie początkującemu programiście.

7. Zapoznaj się z instrukcją else if, klepanie kolejnych pojedynczych ifów może być niezrozumiałe.

8. Ostatni endl jest niepotrzebny, nic nie robi na dobrą sprawę. No chyba, że lubisz patrzeć na migającą tyldę w kolejnej linijce...

9. Zmień książkę. Nie czytałem Thinking in C++, ale jak jest tak samo napisana jak Thinking in JAVA to ja bym podziękował. Symfonii Grębosza nie było?

 

To tak na szybko, kodu nie kompilowałem, więc nie wiem czy sa bledy logiczne, etc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

w zasadzie ++i i i++ to różnica... z tym, że kompilator przeważnie radzi sobie z tym sam...

problem pojawi się gdy będziesz miał bardziej skomplikowane obliczenia i wtedy sposób doboru inkrementacji ma znaczenie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Aktualnie kod wygląda tak.

 

#include <iostream>

using namespace std;

int main()
{
   int a,d; 
   double b,c;

   cout << "Podaj liczbe do spotegowania: ";
   cin >> b;
   cout << "Oblicz " << b << " do potegi: ";
   cin >> a;  
    d=a;
    c=b;
   if(a > 0) 
   {
     for(int i = 1; i < a; i++)
     b=b*c;
   }
   if(a < 0)
   {
      b=1/b;
      a=a*(-1);
      for(int i = 1; i < a; i++)
      b=b*1/c;
   } 
   if(a == 0)
    b=1;
   cout << "Liczba " << c << " do " 
        << d << " potegi wynosi: " << b <<endl;
   system("PAUSE");
   return EXIT_SUCCESS;
}

 

Zaś jeśli chodzi o to, że kopiuje zmienne nie wiem jak inaczej na końcu programu wydrukować b z wartością pierwotną, a c wykorzystuje w obliczeniach tylko raz z powodu tego, że jak już ją mam to czemu jej nie wykorzystać jak jest łatwiej. Wersje z komentarzami napisze jutro dzisiaj już nie mam czasu.

Ostatni endl powoduje, że napis "Wciśnij dowolny klawisz aby zakończyć blabla bla..." jest pod spodem, a nie w tej samej lini co wynik.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po wpisaniu 0 wyskakuje ci błąd?

 

kwestia ustawień kompilatora - można wymusić brak NaN, Inf w obliczeniach FP (domyślnie włączone)

 

teraz jest np. tak

 

Podaj liczbe do spotegowania: 0

Oblicz 0 do potegi: -2

Liczba 0 do -1 potegi wynosi: inf

 

co jest błędne bo nie powinno być opcji, że dopuszcza 0 w mianowniku

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Akurat to też mam, ale nie wiem w czym jest problem ;/ bo pokazuje dobrze 1 ale nie wiem skad to .#inf.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tam u mnie miało być

albo

 

Podaj liczbe do spotegowania: 0
Oblicz 0 do potegi: -2
Liczba 0 do -2 potegi wynosi: inf

 

albo

 

Podaj liczbe do spotegowania: 0
Oblicz 0 do potegi: -1
Liczba 0 do -1 potegi wynosi: inf

 

kilka razy puszczałem i źle przekleiłem ;)

 

nie masz "inf"? co dostajesz?

widzisz sam co się dzieje jak dzielisz przez zero :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chyba doszedłem do rozwiązania teraz kod wygląda tak(podczas kąpieli xD).

 

#include <iostream>

using namespace std;

int main()
{
   int a,d; 
   double b,c;

   cout << "Podaj liczbe do spotegowania: ";
   cin >> b;
   cout << "Oblicz " << b << " do potegi: ";
   cin >> a;  
    d=a;
    c=b;
   if(a > 0) 
   {
     for(int i = 1; i < a; i++)
     b=b*c;
   }
   if((a < 0) && (b != 0))
   {
      b=1/b;
      a=a*(-1);
      for(int i = 1; i < a; i++)
      b=b*1/c;
   } 
   if(a == 0)
   {
     b=1;
   }
   if((a < 0) && (b == 0))
   {
        cout << "Liczba " << c << " do " 
             << d << " potegi: nie istnieje" <<endl;     
   }
   else
   {
        cout << "Liczba " << c << " do " 
             << d << " potegi wynosi: " << b <<endl;
   }
   system("PAUSE");
   return EXIT_SUCCESS;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jest juz sporo lepiej, ale:

- nie uwzględniasz przypadków specjalych: o0 oraz 0 do potęgi ujemnej (o tym właśnie pisał BlackBishop).

- wiele rzeczy można uprościć np.

a*1/b to to samo co a/b ;)

jeżeli sprawdzasz wykluczające się warunki, np. a>0, a==0, a<0 uzywaj else, nie ma sensu, żeby komputer sprawdzał kolejny warunek gdy wiadomo, że już pierwszy był prawdziwy

- z wcięciami jest dużo lepiej, ale różna liczba spacji w różnych linijkach troche psuje efekt

- no i ogólnie cały ten algorytm można by krócej zapisać, jeżeli się parę rzeczy sprytnie zamieni miejscami, ale to może potem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pogram jak najbardziej uwzględnia 0 do potęgi 0 i 0 do potęgi ujemnej.

 

#include <iostream>

using namespace std;

int main()
{
   int a,d; 
   double b,c;

   cout << "Podaj liczbe do spotegowania: ";
   cin >> b;
   cout << "Oblicz " << b << " do potegi: ";
   cin >> a;  
   d=a;
   c=b;
   if((a < 0) && (b != 0))
   {
        b=1/b;
        a=a*(-1);
        for(int i = 1; i < a; i++)
        b=b*1/c;
   } 
   else
   {
        for(int i = 1; i < a; i++)
        b=b*c;
   }
   if(a == 0)
   {
        b=1;
   }
   if((a < 0) && (b == 0))
   {
        cout << "Liczba " << c << " do " 
             << d << " potegi: nie istnieje" <<endl;     
   }
   else
   {
        cout << "Liczba " << c << " do " 
             << d << " potegi wynosi: " << b <<endl;
   }
   system("PAUSE");
   return EXIT_SUCCESS;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...