Miszcz Napisano Marzec 12, 2011 Zgłoszenie Share Napisano Marzec 12, 2011 Witam mam taki program w C++: #include <iostream> #include <stdio.h> using namespace std; int main() { int tab[10] = {1,2,3,4,5,6,7,8,9,10}; int tab2[10] = {1,2,3,4,5,6,7,8,9,10}; int tab3[10]; int i; //int j = 9; for (i = 0; i <= 9; i++){ tab3 [i] = tab[i] + tab2[9-i]; printf("\n%d",tab3[i]); } return 0; } Ogólnie chodzi tu, zeby dodac 1-szy element tablicy1 z ostatnim elementem tablicy2 itd. w dól, czyli ogólnie latwizna... Tyle, ze mam problem bo program nie chce mi sumowac tych dwóch tablic i wynik w tablicy 3 jest caly czas taki sam. O dziwo odejmowanie, mnozenie, i dzielenie dziala tak jak powinno ;] Co zrobic, zeby sumowalo poprawnie? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Mikołaj Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 podstaw inne liczby ;] 10+1=11, 9+2=11 .... itd ;] Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Miszcz Napisano Marzec 13, 2011 Autor Zgłoszenie Share Napisano Marzec 13, 2011 podstaw inne liczby ;] 10+1=11, 9+2=11 .... itd ;] Ja piernicze faktycznie nie zauważyłem tego... Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
thof Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 Ten zapis kodu nie jest najlepszy. Zapisany w ten sposób wyglada troche lepiej: #include <iostream> #include <stdio.h> using namespace std; int main() { int tab[10] = {1,2,3,4,5,6,7,8,9,10}; int tab2[10] = {1,2,3,4,5,6,7,8,9,10}; int tab3[10]; int i, j; for (i = 0, j = sizeof(tab2)-1; i < sizeof(tab); i++, j--){ tab3 [i] = tab[i] + tab2[j]; printf("\n%d",tab3[i]); } return 0; } No i niestety w c++ nie ma takich wygód jak ArrayOutOfBound Exceptions, wiec trzeba samemu sie ubezpieczac sprawdzajac rozmiary tablic przed lub w petli. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Mikołaj Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 thof, muszę Cię poprawić, twój przykład nie zadziała poprawnie, bo sizeof(tab) da wynik sizeof(int)*ilosc_elementow_tablicy takie coś będzie działało: #include <iostream> #include <stdio.h> using namespace std; int main() { int tab[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int tab2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int tab3[10]; int i, j; printf("\n%d", sizeof (tab2)); printf("\n%d", sizeof (int)); for (i = 0, j = (sizeof (tab2) / sizeof (int)) - 1; i < sizeof (tab) / sizeof (int); i++, j--) { tab3 [i] = tab[i] + tab2[j]; printf("\n%d", tab3[i]); } return 0; } o ile Miszcz chce pisać w C++ (z wykorzystaniem mechanizmów jakie posiada), to: printf -> cout stdio.h -> cstdio int i, j; for (i = 0, j = (sizeof (tab2) ... -> for (int i = 0, int j = (sizeof (tab2) ... // o ile zmienne "i" i "j" są potrze tylko w pętli przy statycznych tablicach wykorzystujemy #define rozmiar_tablicy x // gdzie x jest ilością elenentów pozbywamy się w ten sposób Magic Numbers i nie musimy w forze takich cudów stosować z sizeof(tablica)/sizeof(typ_zmiennej) ponadto sizeof nie zadziała poprawnie dla tablic dynamicznych Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
thof Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 No, no jasne Za dużo tych języków czy frameworków na co dzień i zapominam. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Miszcz Napisano Marzec 13, 2011 Autor Zgłoszenie Share Napisano Marzec 13, 2011 Dzięki wszystkim za rady, na pewno się przydadzą zwłaszcza, że dopiero zaczynam przygodę z C/C++ i nic nie wiem co jest do czego. Sizeof trochę tu dziwnie działa i jak rozumiem mnoży liczbę elementów tablicy przez rozmiar bajtów typu do której one należą? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Mikołaj Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 no sizeof mniej więcej tak działa. Jednak lepszą definicją byłoby: "zwraca rozmiar argumentu". Argument może być typem lub zmienną. Jakie są różnice/problemy dowiesz się przy dynamicznej alokacji pamięci. jeżeli dopiero zaczynasz to możesz zajrzeć na te strony: podstawy, po polsku 4programmers.net // tu trzeba uważać bo czasem dziwne rzeczy piszą, ale przeważnie artykuły są skomentowane http://www.intercon.pl/~sektor/cbx/ manual c++ inny manual c+ Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
thof Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 Sizeof trochę tu dziwnie działa i jak rozumiem mnoży liczbę elementów tablicy przez rozmiar bajtów typu do której one należą? Sprawdź sobie jak działa malloc (alokacja pamięci) to będziesz wiedział dlaczego akurat to zwraca sizeof. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
esail Napisano Marzec 13, 2011 Zgłoszenie Share Napisano Marzec 13, 2011 Jeśli mogę wtrącić swoje trzy grosze. 1) Jeżeli piszesz program w C++ to nie inkluduj nagłówka z czystego C tylko po to żeby użyć jednej funkcji z C, czyli printf. Lepszym wyjściem będzie użycie strumieni, czyli w tym przypadku cout, który też można ładnie formatować. 2) Klamrę otwierającą dany blok dawaj w nowej linii, nawyk klarmy w tej samej linii co polecenie daje nieczytelny (moim zdaniem) kod i jest nawykiem autorów książek. Wiadomo jedna linia na tylko jeden znak to marnotrawstwo miejsca - co przekłada się na cenę. Zamiast tak: if (cos) { instr1; instr2; } Tak: if (cos) { instr1; instr2; } 3) W przypadku określania stałych w programie nie używa się (nie jest to zalecane) dyrektywy DEFINE, tylko const. Używanie define niepotrzebnie prędzej czy później zemści się błędami które będą bardzo trudne do znalezienia. Zamiast: #define ROZMIAR 10 Zrób tak: const int ROZMIAR = 10; 4) Zmienne w przypadku C++ nie muszą być deklarowane na początku programu (jak w C czy Pascalu) tylko w miejscu użycia, unikasz wtedy niepotrzebnego zajmowania pamięci. Zamiast: int i; ... ... ... for (i = 0; i < costam; i++) Zrób tak: for (int i = 0; i < costam; i++) 5) Wcięcia, komentarze itd. Dbaj o kod, odwdzięczy Ci się: #include <iostream> using namespace std; const int ROZMIAR = 10; int main() { int tab[ROZMIAR] = {1,2,3,4,5,6,7,8,9,10}; int tab2[ROZMIAR] = {1,2,3,4,5,6,7,8,9,10}; int tab3[ROZMIAR]; for (int i = 0; i < ROZMIAR; i++) { tab3[i] = tab[i] + tab2[(ROZMIAR - 1) - i]; cout << tab3[i] << ", "; cout << endl; } return 0; } To w sumie tyle 1 Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Miszcz Napisano Marzec 13, 2011 Autor Zgłoszenie Share Napisano Marzec 13, 2011 Jeśli mogę wtrącić swoje trzy grosze. 1) Jeżeli piszesz program w C++ to nie inkluduj nagłówka z czystego C tylko po to żeby użyć jednej funkcji z C, czyli printf. Lepszym wyjściem będzie użycie strumieni, czyli w tym przypadku cout, który też można ładnie formatować. Szczerze mówiąc nie za bardzo wiem, które nagłówki należą do C a które do C++, i do czego konkretnie służą, dlatego je mieszam. A printf używam tylko dla tego, że teoretycznie programuje w C pomimo, że projekt ma rozszerzenie cpp. Takie widzimisię prowadzącego, dla którego poza Visualem nie istnieje inne ide. 3) W przypadku określania stałych w programie nie używa się (nie jest to zalecane) dyrektywy DEFINE, tylko const. Używanie define niepotrzebnie prędzej czy później zemści się błędami które będą bardzo trudne do znalezienia. Zamiast: #define ROZMIAR 10 Zrób tak: const int ROZMIAR = 10; W takim razie do czego używa się define? 4) Zmienne w przypadku C++ nie muszą być deklarowane na początku programu (jak w C czy Pascalu) tylko w miejscu użycia, unikasz wtedy niepotrzebnego zajmowania pamięci. for (i = 0; i < costam; i++) Fajna sprawa, nie miałem pojęcia, że tak można. 5) Wcięcia, komentarze itd. Dbaj o kod, odwdzięczy Ci się: Są jakieś spisane reguły co do tego? Czy to jest tak jakie ma widzimisię twórca programu. Zresztą tu u mnie na studiach nieprzeszkadzania wykładowca nawet jak kod jest zupełnie "prosty". Teraz pytanie z innej beczki, zacząłem używać do pisania Eclipse i ciekawi mnie do czego służy opcja przy tworzeniu nowego projektu cross-compiled-program -> cross gcc. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
esail Napisano Marzec 14, 2011 Zgłoszenie Share Napisano Marzec 14, 2011 Co do Twoich pytań: Dyrektywy define stosuje się między innymi do definiowania symboli pomagających przy kompilacji warunkowej, na przykład masz kod który chcesz kompilować pod windą i linuxem. Kod ten w sumie wygląda tak samo z wyjątkiem jednej funkcji, która ma inną implementację dla windy a inną dla linuxa wtedy: #define LINUX #ifndef LINUX //tu funkcja w implementacji dla windowsa //ponieważ zdefiniowaliśmy symbol linux to nie zostanie ona włączona do kodu #else //tu funkcja w implementacji dla linuxa //ona zostanie włączona do kodu wychodzącego z preprocesora #endif Co do standardów kodowania czyli komentarzy, wcięć, nazywania zmiennych i innych takich to są różne szkoły. W zasadzie co firma to ma jakieś swoje standardy. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Fallen Napisano Marzec 14, 2011 Zgłoszenie Share Napisano Marzec 14, 2011 W takim razie do czego używa się define? Const w C jest mimo wszystko zmienną której nie da się zminić Define działa tak że zamienia etykiete na podana wartosc textowa. Nie musi to byc wclale pojedyńcza wartość - możesz np zrobić coś takiego: Define x for(i = 0; i < 10; i++)printf("\n"); i w kazdym miejscu wystapienia x zostanie wklejony ten fragmet funkcji. Żeby było wszystko jasne praktyczny przykład 1* #define x 8 2* const int x = 8; 1* int y = 2*x; to jest dokładnie int y = 2*8; 2* int y = 2*x; to jest dokładnie int y = 2* *&x; Jak to ma się na działanie programu: 1* ponieważ w trakcie kompilacji mamy 2*8 to wykonywana jest wyłącznie jedna instrukcja procesora: przesuwanie bitowe trwająca tylko jeden cykl procesora (nawet wtedy kiedy masz wyłączone wszystkie opotymalizacje). w drugim przypadku mamy kilka wariantów których nie zawsze jesteśmy w stanie przewidzieć w zależności od użytych parametrów kompilacji (poziomów optymalizacji) bez optymalizacji wygląda to tak że: y = 2* *&x czyli nasze x jest adresem zmiennej więc kod wynikowy wygląd następująco: czekaj na dostęp do pamięci(różnie trwa), kopiowanie z pamięci do rejestru(różnie trwa), wykonywanie mnożenia (ponieważ mnożona jest wartość przez zmienną wykonywane jest powolne mnożenie trwające kilkanascie/kilkadziesiąt cykli zegara zależnie od procesora). Z kolei jeżeli mamy jakiś poziom optymalizacji włączony podczas kompilacji - operacja może wykonać się jak w pierwszym przypadku ale wcale nie musi. Mam nadzieję że jasno to przedstawiłem. A o const w C można się rozpisywać bo to nie koniecznie działa jak powinno Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Marzec 14, 2011 Zgłoszenie Share Napisano Marzec 14, 2011 * a to w ansi C jest "const" w ogóle ? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Fallen Napisano Marzec 14, 2011 Zgłoszenie Share Napisano Marzec 14, 2011 Jest Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się