Skocz do zawartości

Dodawanie Tablic W C/C++


Miszcz

Rekomendowane odpowiedzi

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

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

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

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

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

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

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 ;)

  • Upvote 1
Odnośnik do komentarza
Udostępnij na innych stronach

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

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

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

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ę
×
×
  • Dodaj nową pozycję...