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.
Coś mnie olśniło. Boże, jakie debilne błędy zrobiłem z tym wywołaniem funkcji i samą funkcją... żałosne. Już działa jak w książce pisze. |
|
|
|
 |
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.
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. 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. |
_________________
 |
|
|
|
 |
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. 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. 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ć. |
|
|
|
 |
|