Forum Oficjalnego Klubu Mitsubishi - MitsuManiaki Strona Główna Forum Oficjalnego Klubu Mitsubishi - MitsuManiaki


FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum
 Ogłoszenie 


W myśl ustawy RODO, akceptując regulamin wyrażasz zgodę na gromadzenie i przetwarzanie swoich danych osobowych w celach związanych z przyznaniem dostępu do forum / wstąpieniem do klubu.
Administratorem danych jest Oficjalny Klub Mitsubishi - MitsuManiaki
Jeśli nie akceptujesz powyższych informacji, prosimy o kontakt z Administracją w celu usunięcia konta.

Poprzedni temat «» Następny temat
C++; ktoś się orientuje?
Autor Wiadomość
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 17-05-2012, 19:11   

Podbij jeszcze raz. :mrgreen:

Coś mnie olśniło. Boże, jakie debilne błędy zrobiłem z tym wywołaniem funkcji i samą funkcją... żałosne. :lol: Już działa jak w książce pisze. :wink:
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 17-05-2012, 22:39   

Jak już czepiamy szczegółów to staraj się unikać takiego zapisu.
Kod:
if (bmi>18,9 && bmi<25)
Jest on poprawny składniowo, ale dość nieczytelny i w przypadku bardziej rozbudowanego warunku może wprowadzać błędy przy analizie kodu. Lepiej to zapisać zamykająca warunki w nawiasy
Kod:
if ((bmi>18.9) && (bmi<25))
 
 
krzychu 
Mitsumaniak


Auto: Lancer 2.0 Int, Mazda CX-3
Zaproszone osoby: 1
Kraj/Country: Polska
Pomógł: 141 razy
Dołączył: 21 Kwi 2008
Posty: 12607
Skąd: Bielsko-Biała
Wysłany: 18-05-2012, 07:13   

elektryk napisał/a:
if ((bmi>18.9) && (bmi<25))


Nie zgodzę się, że to jest bardziej czytelne. Nawet powiem, że mniej szczególnie jak to będą np. funkcje zwracające wartość i pobierające argument. Wtedy to właśnie nawiasy zaburzają czytelność if-a....
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 18-05-2012, 09:20   

Krzychu, daj jakiś przykład, bo chyba Ciebie nie rozumiem.
 
 
krzychu 
Mitsumaniak


Auto: Lancer 2.0 Int, Mazda CX-3
Zaproszone osoby: 1
Kraj/Country: Polska
Pomógł: 141 razy
Dołączył: 21 Kwi 2008
Posty: 12607
Skąd: Bielsko-Biała
Wysłany: 18-05-2012, 09:33   

if (czy_kopia==ture && (czy_jest(Lista->IndexOf(Editbox->Test))==1 || Editbox->Test.Lenght()>1))

I teraz Twój sposób

if ((czy_kopia==ture) && ((czy_jest(Lista->IndexOf(Editbox->Test))==1) || (Editbox->Test.Lenght()>1)))

Które jest czytelniejsze?
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 18-05-2012, 10:51   

krzychu napisał/a:
Które jest czytelniejsze?
Śmiem twierdzić że ten drugi przykład jest czytelniejszy ale może jestem przyzwyczajony do warunków które bez nawiasów by wyglądąły:
Kod:
if (liczba1 & 0x01 || liczba2 & 0x02)
 
 
Krzyzak 
moderator mitsumaniak
uczestnik I Zlotu MM


Auto: E32, CR29, 5F, DCJ, 7N, Y2
Kraj/Country: Polska
Pomógł: 645 razy
Dołączył: 28 Kwi 2005
Posty: 24323
Skąd: był Malbork, teraz Gdańsk
Wysłany: 18-05-2012, 13:00   

elektryk - podałeś operacje bitowe i logiczne w jednej linii (no chyba, że to Java, to jeszcze inne jest znaczenie)
dla sprawnego programisty żaden zapis nie stanowi problemu w odczycie
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 04-12-2012, 16:04   

Witam po przerwie. :wink:

Muszę napisac program, który obliczy ile powierzchni kwadratowej zajmą koła o promieniu podanym przez użytkownika. Problem polega na tym, że podczas obliczania pola pojedynczego koła kod cały wyświetla wartośc = 3, niezależnie od podanych liczb. Mógłbym ktoś rzucic na to okiem?

Kod:

#include <cstdlib>
#include <iostream>


using namespace std;

struct T
{
    T* wsk;
    int b;
};


void funkcja (int wart, T* &pocz)
{
    T*pom=pocz;
    double pole = 0;

    if (pocz == NULL)
        {
    pocz = new T;
    pocz->b=wart;
    pocz->wsk=NULL;
    pole= 3,14 * (pom->b*pom->b);
    cout<<"pole wynosi: "<<pole<<endl;
}
    else
    {
    while (pom->wsk!=NULL)
    pom=pom->wsk;
   
    pom->wsk=new T;
    pom->wsk->b=wart;
    pom->wsk->wsk=NULL;
    pole= 3,14 * (pom->b*pom->b);
    cout<<"pole wynosi: "<<pole<<endl;
}
}


int main()
{
    int promien = 0;
    int suma = 0;
    int ile = 0;
   
    T* pocz=NULL;
    T* pom=NULL;


cout<<"Ile okregow?"<<endl;
cin>>ile;
cout<<endl;

       for (int i=0; i<ile;i++)
{
     cin>>promien;
     funkcja(promien, pocz);
}

    pom = pocz;
    while (pom!=NULL)
    {   
   
     suma+=pom->b;
     pom=pom->wsk;
     }
cout<<"suma elementow: "<<suma<<endl;

system("PAUSE");

}

_________________
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 04-12-2012, 19:00   

Zastanawiam się jak to może kompilator łykać, ale na pierwszy rzut rzuca się w oczy:
3,14. Powinna być kropka zamiast przecinka, a jeszcze lepiej w klasie Math powinno być jakieś gotowe PI o większej precyzji żeby podstawić zamiast liczby.

Zastanawia mnie też czemu sumujesz promienie zamiast pól.

A tak nawiasem to ten kod jest lekko nieczytelny i lekko sprzeczny z paradygmatem obiektowości. Nazywa pola tak żeby nazwa sugerowała że ma coś wspólnego z wartością pola, a skoro już używasz obiektowości to zrób konstruktory które inicjują parametry, a pola prywatne.
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 04-12-2012, 20:27   

elektryk napisał/a:
Zastanawiam się jak to może kompilator łykać, ale na pierwszy rzut rzuca się w oczy:
3,14. Powinna być kropka zamiast przecinka, a jeszcze lepiej w klasie Math powinno być jakieś gotowe PI o większej precyzji żeby podstawić zamiast liczby.

Zastanawia mnie też czemu sumujesz promienie zamiast pól.

A tak nawiasem to ten kod jest lekko nieczytelny i lekko sprzeczny z paradygmatem obiektowości. Nazywa pola tak żeby nazwa sugerowała że ma coś wspólnego z wartością pola, a skoro już używasz obiektowości to zrób konstruktory które inicjują parametry, a pola prywatne.


3.14 poprawiłem po napisaniu postu, ale po tym program się zawiesza. :wink: Sumowanie promieni jako odnośnik do tego, jak ma wyglądać sumowanie pól - program under construction.

Dodałem bibliotekę math.h, zamieniłem 3.14 na M_PI i wciąż się zawiesza... na Ideone kompiluje się ok. :roll:
_________________
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 04-12-2012, 21:18   

==13249== Memcheck, a memory error detector.
==13249== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==13249== Using LibVEX rev 1804, a library for dynamic binary translation.
==13249== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==13249== Using valgrind-3.3.0, a dynamic binary instrumentation framework.
==13249== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==13249== For more details, rerun with: -v
==13249==
Ile okregow?
1

1
==13249== Invalid read of size 4
==13249== at 0x80489E2: funkcja(int, T*&) (in /root/mitsu/a.out)
==13249== by 0x8048B73: main (in /root/mitsu/a.out)
==13249== Address 0x4 is not stack'd, malloc'd or (recently) free'd
==13249==
==13249== Process terminating with default action of signal 11 (SIGSEGV)
==13249== Access not within mapped region at address 0x4
==13249== at 0x80489E2: funkcja(int, T*&) (in /root/mitsu/a.out)
==13249== by 0x8048B73: main (in /root/mitsu/a.out)
==13249==
==13249== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 1)
==13249== malloc/free: in use at exit: 8 bytes in 1 blocks.
==13249== malloc/free: 1 allocs, 0 frees, 8 bytes allocated.
==13249== For counts of detected errors, rerun with: -v
==13249== searching for pointers to 1 not-freed blocks.
==13249== checked 97,012 bytes.
==13249==
==13249== LEAK SUMMARY:
==13249== definitely lost: 0 bytes in 0 blocks.
==13249== possibly lost: 0 bytes in 0 blocks.
==13249== still reachable: 8 bytes in 1 blocks.
==13249== suppressed: 0 bytes in 0 blocks.
==13249== Rerun with --leak-check=full to see details of leaked memory.


problem tkwi tutaj
Kod:
 pole= 3,14 * (pom->b*pom->b);
pom przy pierwszym wywołaniu funkcji jest NULL
 
 
krzychu 
Mitsumaniak


Auto: Lancer 2.0 Int, Mazda CX-3
Zaproszone osoby: 1
Kraj/Country: Polska
Pomógł: 141 razy
Dołączył: 21 Kwi 2008
Posty: 12607
Skąd: Bielsko-Biała
Wysłany: 05-12-2012, 09:50   

KowaliK - a musisz wykorzystywać te jakieś struktury, wskaźniki i pseudo listę jednokierunkową?

Skoro ma liczyć tylko pole to czemu nie sumujesz tego w jednej zmiennej?
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 05-12-2012, 16:22   

krzychu napisał/a:
KowaliK - a musisz wykorzystywać te jakieś struktury, wskaźniki i pseudo listę jednokierunkową?

Skoro ma liczyć tylko pole to czemu nie sumujesz tego w jednej zmiennej?


Niestety tak. Wiem, że bez tego byłoby milion razy prościej. :wink: Ostatecznie obliczanie pi wrzuciłem do jednego while'a razem z sumowaniem:

Kod:

...
while (pom!=NULL)
{
pole=pi * (pom->r * pom->r);
suma=suma+pole;
pom=pom->wsk;
}
...
_________________
 
 
jawlo 
Forumowicz

Auto: SS DiD mint silver
Kraj/Country: Polska
Pomógł: 17 razy
Dołączył: 09 Sty 2006
Posty: 1196
Skąd: Beskidy
Wysłany: 05-12-2012, 18:17   

Błąd był w funkcji funkcja:

Kod:
void funkcja (int wart, T* &pocz)
 {
     T*pom=pocz;
     double pole = 0;

     if (pocz == NULL) 
     {
           pocz = new T;
           pocz->b=wart;
           pocz->wsk=NULL;
           pole= 3.14 * (pocz->b*pocz->b);      // tutaj
           cout<<"pole wynosi: "<<pole<<endl;
     }
     else
     {
        while (pom->wsk!=NULL)
             pom=pom->wsk;
 
        pom->wsk=new T;
        pom->wsk->b=wart;
        pom->wsk->wsk=NULL;
        pole= 3.14 * (pom->wsk->b*pom->wsk->b);     // i tutaj
        cout<<"pole wynosi: "<<pole<<endl;
    }
 }
 
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 05-12-2012, 19:03   

KowaliK napisał/a:
Niestety tak. Wiem, że bez tego byłoby milion razy prościej. :wink: Ostatecznie obliczanie pi wrzuciłem do jednego while'a razem z sumowaniem:
A możesz następnym razem wrzucać wytyczne do zadania, bo z tym łatwiej pomagać.
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group

Ta strona używa ciasteczek (ang. cookies) w celu logowania oraz do badania oglądalności strony.
Aby dowiedzieć się czym są ciasteczka odwiedź stronę wszystkoociasteczkach.pl
Jeśli nie wyrażasz zgody na wykorzystywanie ciasteczek na tej stronie, zablokuj je w opcjach Twojej przeglądarki internetowej.