Podstawy informatyki Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne Rok akademicki 2006/2007 Wykład nr 1 (09.03.2007)
Wykład nr 1 2/34 Dane podstawowe dr inŝ. Jarosław aw Forenc Politechnika Białostocka, Wydział Elektryczny, Katedra Elektrotechniki Teoretycznej i Metrologii ul. Wiejska 45D, 15-351 Białystok WE-204 e-mail: jarekf@pb.edu.pl tel. (0-85) 746-93-97 http://we.pb.edu.pl/~jforenc konsultacje: Dydaktyka - slajdy prezentowane na wykładzie poniedziałek, godz. 9:00-10:00, WE-204 środa, godz. 10:00-11:00, WE-204 środa, godz. 16:00-17:00, WE-204 piątek, godz. 19:00-20:00, WE-204 (st. zaoczne) sobota, godz. 14:00-15:00, WE-204 (st. zaoczne, co 2-gi zjazd)
Wykład nr 1 3/34 Program wykładu 1. Tablice i wskaźniki w języku C. Dynamiczny przydział pamięci. 2. Pliki w języku C. Typy plików, operacje na plikach. 3. Wprowadzenie do metod numerycznych. Błędy w obliczeniach numerycznych. 4. Operacje na wektorach i macierzach. 5. Rozwiązywanie układów równań liniowych: metody dokładne i iteracyjne. 6. Metody poszukiwania pierwiastków funkcji nieliniowych: bisekcji, regula falsi, siecznych. 7. Metody całkowania numerycznego: prostokątów, trapezów, parabol. 8. Algorytmy stosowane w komputerowej analizie obwodów elektrycznych. Środowisko SPICE. 9. Ogólna struktura i zasada działania systemów komputerowych. Klasyfikacja komputerów. System operacyjny.
Wykład nr 1 4/34 Literatura (1/2) Język C/C++: 1. B.W. Kernighan, D.M. Ritchie: Język ANSI C. WNT, Warszawa, 2004. 2. A. Sopek: W głąb języka C. Helion, Gliwice, 1993 (http://helion.pl/online/wglab/wglab.zip) 3. J. Grębosz: Symfonia C++ standard. Wydawnictwo Edition 2000, Kraków, 2005. 4. K. Barteczko: Praktyczne wprowadzenie do programowania obiektowego w języku C++. Wydawnictwo Lupus, Warszawa, 1994. 5. A. Zalewski: Programowanie w językach C i C++ z wykorzystaniem pakietu Borland C++. Wydawnictwo Nakom, Poznań, 2000. 6. B. Stroustrup: Język C++. WNT, Warszawa, 2004.
Wykład nr 1 5/34 Literatura (2/2) Inne: 1. D. Kincaid, W. Cheney: Analiza numeryczna. WNT, Warszawa, 2006. 2. Z. Fortuna, B. Macukow, J. Wąsowski: Metody numeryczne. WNT, Warszawa, 2006. 3. B. Baron, Ł. Piątek: Metody numeryczne w C++Builder. Helion, Gliwice, 2004. 4. A. Dobrowolski: Pod maską SPICE a. Metody i algorytmy analizy układów elektronicznych. Wydawnictwo BTC, Warszawa, 2004. 5. J. Ogrodzki: Komputerowa analiza układów elektronicznych. Wydawnictwo Naukowe PWN, Warszawa, 1994. 6. L.O. Chua, Pen-Min Lin: Komputerowa analiza układów elektronicznych: algorytmy i metody obliczeniowe. WNT, Warszawa, 1981.
Wykład nr 1 6/34 Wykład a pracownia Wykład Pracownia 1 2 3 4 5 6 7 8 9 Tablice i wskaźniki w języku C. Dynamiczny przydział pamięci. Pliki w języku C. Typy plików, operacje na plikach. Wprowadzenie do metod numerycznych. Błędy w obliczeniach numerycznych Operacje na wektorach i macierzach. Rozwiązywanie układów równań liniowych: metody dokładne i iteracyjne. Metody poszukiwania pierwiastków funkcji nieliniowych: bisekcji, regula falsi, siecznych. Metody całkowania numerycznego: prostokątów, trapezów, parabol. Algorytmy stosowane w komputerowej analizie obwodów elektrycznych. Środowisko SPICE. Ogólna struktura i zasada działania systemów komputerowych. Klasyfikacja komputerów. System operacyjny. 1 2 3 4 5 6 7 8 9 Zajęcia organizacyjne. Środowisko DEV-C++, tworzenie analiza i uruchomianie programów w języku C. Typy, zmienne, stałe, operatory i wyraŝenia arytmetyczne. Operatory relacyjne i logiczne, instrukcje warunkowe oraz sterujące, funkcje w języku C. Typ strukturalny, konstruowanie struktur prostych oraz złoŝonych, dostęp do składowych, wskaźniki do struktur. Tablice jedno- i wielowymiarowe, wskaźniki, operacje na wskaźnikach, dynamiczny przydział pamięci - instrukcje: malloc(), calloc(), free(). Operacje na plikach tekstowych, instrukcje: fscanf(), fprintf(). Operacje na plikach binarnych, instrukcje: fread(), fwrite(). Metody poszukiwania miejsc zerowych funkcji. Metody całkowania numerycznego: metoda prostokątów, trapezów, parabol. Operacje na wektorach i macierzach. Metody rozwiązywania układów równań liniowych.
Wykład nr 1 7/34 Zaliczenie wykładu Kolokwium pisemne termin zostanie ustalony pod koniec semestru liczba podejść: min. 2
Wykład nr 1 8/34 Plan wykładu nr 1 Tablice w języku C - przypomnienie wiadomości Wskaźniki co to jest wskaźnik? deklaracja wskaźnika operacje na wskaźnikach Wskaźniki a tablice Dynamiczny przydział pamięci funkcje calloc, malloc i free operatory new i delete
Wykład nr 1 9/34 Tablice jednowymiarowe tablica jest to ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu int tab[5]; deklarując tablicę musimy podać: typ elementów tablicy, nazwę tablicy oraz liczbę elementów tablicy: średnik rozmiar tablicy nazwa tablicy typ elementów tablicy rozmiar tablicy musi być dodatnią stałą całkowitoliczbową, a ponadto musi to być wartość znana juŝ w fazie kompilacji (nie moŝe to być zmienna) powyŝsza deklaracja definiuje tablicę pięciu elementów typu int, jest to tablica jednowymiarowa, czyli tzw. wektor: kaŝdy element tablicy ma swój numer zwany indeksem, pierwszy element ma indeks 0 (zero), zaś ostatni N-1, gdzie N - rozmiar tablicy jako indeks moŝe występować wyraŝenie, ale w wyniku musi ono dawać liczbę całkowitą nazwa tablicy jest adresem jej pierwszego elementu (o indeksie 0) w pamięci komputera
Wykład nr 1 10/34 Tablice jednowymiarowe Odwołanie do elementów tablicy: odwołania do elementów tablicy (odczytanie lub zapisanie wartości) wykonuje się za pomocą dwuargumentowego operatora indeksowania [ ]: Przykład: tab[1]=5; - zapisanie do drugiego elementu tablicy tab wartości 5 x=tab[1]; - odczytanie drugiego elementu z tablicy tab i przypisanie jego wartości zmiennej x przy odwołaniach do elementów tablicy kompilator nie sprawdza, czy piszemy lub czytamy poza obszarem pamięci przydzielonej tablicy, np. int tab[5]; tab[5]=10; - deklaracja tablicy - błąd!!!, nie istnieje element o indeksie 5, ale kompilator nie zasygnalizuje błędu, tylko w obszarze za tablicą zapisze wartość 10
Wykład nr 1 11/34 Tablice dwuwymiarowe Deklaracja tablicy dwuwymiarowej: deklarując tablicę dwuwymiarową musimy podać: typ elementów tablicy, nazwę tablicy oraz liczbę wierszy i kolumn tablicy float tab[3][4]; przedstawiona deklaracja definiuje tablicę dwunastu elementów typu float, składającą się z trzech wierszy i czterech kolumn tablica dwuwymiarowa nazywana jest macierzą odwołując się do elementów tablicy dwuwymiarowej musimy podać dwa indeksy: numer wiersza i numer kolumny, na przecięciu których znajduje się dany element średnik liczba kolumn tablicy liczba wierszy tablicy nazwa tablicy typ elementów tablicy Przykład: tab[1][2]=10; x=tab[1][2]; - zapisanie wartości - odczytanie wartości
Wykład nr 1 12/34 Inicjalizacja elementów w tablicy po zadeklarowaniu tablicy wartość jej elementów jest nieokreślona inicjalizacja elementów tablicy jest to nadanie wartości jej elementom od razu przy deklaracji inicjalizacja taka polega na umieszczeniu w deklaracji po znaku równości, ujętej w nawiasy klamrowe, listy wartości kolejnych jej elementów, oddzielonych od siebie przecinkami (lista ta moŝe zawierać równieŝ wyraŝenia) Przykład: int a[3]={5,7,1}; int b[2][3]={{3,6,2},{4,1,0}}; int b[2][3]={3,6,2,4,1,0}; obie deklaracje tablicy b oznaczają dokładnie to samo poszczególne wiersze macierzy moŝna wyróŝnić dodatkowymi nawiasami klamrowymi (pierwsza postać)
Wykład nr 1 13/34 Inicjalizacja elementów w tablicy tablice moŝna inicjalizować tylko przy deklaracji jeśli wartości podanych w trakcie inicjalizacji jest mniej niŝ wynosi rozmiar tablicy, to pozostałe elementy tablicy wypełniane są zerami Przykład: int b[2][3]={3,6,2,4}; 0 1 0 1 2 3 6 2 4 0 0 elementy uzupełnione zerami int b[2][3]={0}; - wypełnienie całej tablicy zerami tablica zadeklarowana bez podania rozmiaru, a zainicjowana ma ilość elementów równą ilości inicjatorów: int a[]={2,3,1,4}; jest równowaŝne int a[4]={2,3,1,4};
ś ś Podstawy informatyki (st. niestacjonarne, 2006/2007) Wykład nr 1 14/34 Wskaźniki - gdzie juŝ występowa powały? Funkcja scanf: funkcja scanf wymaga podania adresów zmiennych pod którymi będą zapamiętane dane odczytane z klawiatury, np. int a, b; float c; char txt[10]; scanf( %d %d %f %s, &a, &b, &c, txt); Struktury: przy omawianiu struktur wspominane jest, Ŝe jeśli posługujemy się wskaźnikami na struktury, to do odwołania do pól struktury stosujemy operator pośredniego wyboru pola: -> struct punkt { int x, y; } p1, *p2; p2 = &p1; p1.x = 10; /* operator bezpo redniego wyboru pola */ p2->x = 10; /* operator po redniego wyboru pola */
Wykład nr 1 15/34 Co to jest wskaźnik? Wskaźnik jest zmienną mogącą zawierać adres obszaru pamięci, a w szczególności adres innej zmiennej (obiektu) Rozpatrzmy następujące deklaracje zmiennych i sposób przechowywania ich w pamięci komputera: int a; float b; char c, d; int tab[4]; int e; double f; wszystkie zmienne przechowywane są w pamięci komputera i zaleŝnie od typu zmiennej zajmują określoną liczbę bajtów kaŝda zmienna oprócz nazwy, której uŝywa programista, ma takŝe adres komputer nie posługuje się nazwami zmiennych tylko ich adresami
Wykład nr 1 16/34 Co to jest wskaźnik? Wskaźnik jest zmienną mogącą zawierać adres obszaru pamięci, a w szczególności adres innej zmiennej (obiektu) Rozpatrzmy następujące deklaracje zmiennych i sposób przechowywania ich w pamięci komputera: int a; float b; char c, d; int tab[4]; int e; double f; w powyŝszym przykładzie poszczególne zmienne mają następujące adresy: a 100 (int, 4 bajty) b 104 (float, 4 bajty) c 108 (char, 1 bajt) d 109 (char, 1 bajt) e 126 (int, 4 bajty) f 130 (double, 8 bajtów) tab 110 (tablica, int, 4 4 bajty)
Wykład nr 1 17/34 Wskaźniki Deklaracja wskaźnika: adres określa miejsce w pamięci, nie mówi natomiast nic na temat rozmiaru wskazywanego obiektu deklarując wskaźnik (zmienną wskazującą) musimy podać typ obiektu na jaki on wskazuje deklaracja zmiennej wskazującej wygląda tak samo jak deklaracja kaŝdej innej zmiennej, tylko Ŝe jej nazwa poprzedzona jest symbolem gwiazdki (*): typ *nazwa_zmiennej; lub typ* nazwa_zmiennej; Przykład: int *ptr; powyŝszy zapis oznacza deklarację zmiennej wskaźnikowej na typ int mówimy, Ŝe zmienna ptr jest typu: wskaźnik na zmienną typu int, a zatem moŝe przechowywać adresy zmiennych a i e typu int z wcześniejszego przykładu
Wykład nr 1 18/34 Wskaźniki do przechowywania adresu zmiennej f typu double trzeba zadeklarować zmienną typu: wskaźnik na zmienną typu double, czyli np. double *ptrd; moŝna konstruować wskaźniki na dane dowolnego typu łącznie z typami wskaźnik na... lub wskaźnik na wskaźnik na... char **wsk; w powyŝszym przykładzie wsk jest typu wskaźnik na wskaźnik na typ char moŝna deklarować tablice wskaźników Uwaga: deklaracja wskaźnika wydziela tylko obszar pamięci dla przechowywania wskaźnika, tj. adresu (dla komputerów PC są to 2 lub 4 bajty, zaleŝnie od tego czy adresy są bliskie - near, czy dalekie - far), nie jest natomiast przydzielany obszar dla danych, na które ma wskazywać wskaźnik
Wykład nr 1 19/34 Wskaźniki Przypisywanie wskaźnikom adresów innych zmiennych: adresy zmiennych, które moŝna przypisać wskaźnikom, tworzy się za pomocą jednoargumentowego operatora pobierania adresu & (znanego z funkcji scanf): int a = 10; - deklaracja zmiennej typu int i nadanie jej wartości 10 int *ptr; ptr = &a; - deklaracja wskaźnika na zmienną typu int - przypisanie zmiennej ptr adresu zmiennej a (od tej chwili zmienna ptr wskazuje na zmienną a; a - zmienna typu int, &a - adres zmiennej a) Odwołanie do zmiennej poprzez jej adres: mając adres zmiennej moŝna dostać się do jej wartości uŝywając tzw. operatora wyłuskania (odwołania pośredniego) oznaczanego przez gwiazdkę (*) *ptr = 20; - jest równowaŝne z tym, Ŝe zmiennej a z powyŝszego przykładu przypisujemy wartość 20
Wykład nr 1 20/34 Wskaźniki Odwołanie do zmiennej poprzez jej adres: jeśli ptr jest wskaźnikiem na jakiś obiekt, to *ptr jest obiektem (zawartością pamięci pod adresem zawartym w ptr, interpretowaną zgodnie z typem obiektu, na który wskazuje ptr) Przykład: int a = 10; /* a - zmienna typu int */ int *ptr = &a; /* ptr - wskaźnik na zmienną typu int */ int **ptr1 = &ptr; /* ptr1 - wskaźnik na wskaźnik na zmienną typu int */ a = 20; /* przypisanie zmiennej a wartości 20 */ *ptr = 20; /* j.w. */ *(*ptr1) = 20; /* j.w. */ efekt końcowy wykonania trzech ostatnich instrukcji jest taki sam
Wykład nr 1 21/34 Wskaźniki Uwaga: zmiennej wskaźnikowej moŝna nadać wartość zerową, co oznacza, Ŝe wskaźnik na nic nie wskazuje - naleŝy stosować wtedy stałą o nazwie NULL int *ptr; ptr = NULL;
Wykład nr 1 22/34 Wskaźniki - przykład #include <stdio.h> int main() { int a = 10; /* deklaracja Wartosc zmiennej zmiennej typu int a */ a = 20 int *ptr; /* deklaracja wskaznika na zmienna typu int */ printf("wartosc zmiennej a a = %d\n",a); printf("adres zmiennej a &a = %d\n",&a); ptr = &a; /* zmiennej ptr przypisujemy adres zmiennej a */ printf("adres zmiennej a ptr = %d\n",ptr); printf("wartosci zmiennej a *ptr = %d\n",*ptr); *ptr = 20; /* zmiana wartosci zmiennej a */ printf("wartosci zmiennej a *ptr = %d\n",*ptr); printf("wartosc zmiennej a a = %d\n",a); Wartosc zmiennej a a = 10 Adres zmiennej a &a = 2293644 Adres zmiennej a ptr = 2293644 Wartosci zmiennej a *ptr = 10 Wartosci zmiennej a *ptr = 20 } return 0; Przykładowe operacje na wskaźnikach
Wykład nr 1 23/34 Wskaźniki Operacje na wskaźnikach: na wskaźnikach dopuszczalne są następujące operacje: przypisywanie wartości innych wskaźników oraz zera (NULL) dodawanie do wartości wskaźnika liczb całkowitych obliczanie róŝnicy wskaźników porównywanie wartości wskaźnika z zerem (wartością stałej NULL) porównywanie wskaźników między sobą przekształcanie wskaźników (konwersje wskaźnikowe) dodanie do wskaźnika lub odjęcie wartości całkowitej 1 oznacza zwiększenie lub zmniejszenie adresu o wartość zaleŝną od tego na jaki typ wskazuje wskaźnik jeśli mamy zadeklarowany wskaźnik: typ *ptr; to wyraŝenie (ptr + n) wskazuje na obszar odległy o n * sizeof(typ) bajtów od adresu zawartego w ptr
Wykład nr 1 24/34 Wskaźniki a tablice nazwa tablicy jest adresem pierwszego elementu tablicy int tab[5] = {10,15,37,16,25}; tab - nazwa tablicy będąca adresem jej pierwszego elementu *tab - wartość pierwszego elementu tablicy (10) - równowaŝny zapis: tab[0] *(tab+1) - wartość drugiego elementu tablicy (15) - równowaŝny zapis: tab[1] *(tab+2) - wartość trzeciego elementu tablicy (37) - równowaŝny zapis: tab[2]... ogólnie: tab[i] jest równowaŝne: *(tab+i)
Wykład nr 1 25/34 Wskaźniki a tablice w zapisie *(tab+i) nawiasy są konieczne, gdyŝ operator * ma bardzo wysoki priorytet Przykład: int tab[5] = {10,15,37,16,25},x; x = *(tab+2); printf( x = %d,x); /* x = 37 */ x = *tab+2; printf( x = %d,x); /* x = 12 */ x = *(tab+2); jest równowaŝne x = tab[2]; x = *tab+2; jest równowaŝne x = tab[0] + 2;
Wykład nr 1 26/34 Dynamiczny przydział pamięci deklaracja tablicy w języku C wymaga, aby jej rozmiar był znany juŝ na etapie kompilacji programu w przypadku, gdy rozmiar tablicy będzie znany dopiero podczas wykonania programu, pamięć naleŝy przydzielić dynamicznie do tego celu słuŝą funkcje dynamicznego przydziału pamięci: calloc malloc i zwalniania pamięci: free działanie powyŝszych funkcji polega na przydzielaniu i zwalnianiu bloków pamięci w obszarze stosu zmiennych dynamicznych
Wykład nr 1 27/34 Dynamiczny przydział pamięci CALLOC void *calloc(size_t n, size_t size); stdlib.h funkcja calloc przydziela blok pamięci o rozmiarze n*size (czyli blok pamięci mogący pomieścić tablicę n-elementów podanego rozmiaru size) i zwraca wskaźnik do tego bloku jeśli pamięci nie moŝna przydzielić, to funkcja zwraca wartość NULL przydzielona pamięć jest inicjowana zerami MALLOC void *malloc(size_t size); stdlib.h funkcja malloc przydziela blok pamięci o rozmiarze określonym parametrem size i zwraca wskaźnik do tego bloku jeśli pamięci nie moŝna przydzielić, to funkcja zwraca wartość NULL przydzielona pamięć nie jest inicjowana
Wykład nr 1 28/34 Dynamiczny przydział pamięci zwracaną przez funkcje calloc i malloc wartość wskaźnika naleŝy rzutować na właściwy typ, np. przydział pamięci na 10 elementową tablicę elementów typu int: int *tab; tab = (int *) calloc(10,sizeof(int)); /*... */ free(tab); do elementów takiej tablicy odwołujemy się tak samo jak do elementów zwykłej tablicy (ale tylko w przypadku tablic jednowymiarowych!!!) przydzieloną pamięć naleŝy po wykorzystaniu zwolnić funkcją free FREE void *free(void *ptr); stdlib.h funkcja free zwalnia blok pamięci wskazywany parametrem ptr wartość ptr musi być wynikiem wcześniejszego wywołania funkcji calloc lub malloc
Wykład nr 1 29/34 Dynamiczny przydział pamięci - przykład Podaj ilosc liczb: 5 #include <stdio.h> #include <stdlib.h> Podaj liczbe nr 1: 1 Podaj liczbe nr 2: 2 int main() Podaj liczbe nr 3: 3 { int *tab, i, n, x; Podaj liczbe nr 4: 4 float suma = 0.0; Podaj liczbe nr 5: 5 Srednia 5 liczb wynosi 3.000000 printf("podaj ilosc liczb: "); scanf("%d",&n); tab = (int *) calloc(n,sizeof(int)); if (tab == NULL) { printf("nie mozna przydzielic pamieci.\n"); exit(-1); } for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",&x); tab[i] = x; } for (i=0; i<n; i++) suma = suma + tab[i]; printf("srednia %d liczb wynosi %f\n",n,suma/n); } free(tab); return 0; Przydział pamięci na n-liczb typu int, wczytanie liczb, obliczenie średniej
Wykład nr 1 30/34 Dynamiczny przydział pamięci w programie z poprzedniego slajdu moŝna zrezygnować ze zmiennej x i liczby wczytywać bezpośrednio do tablicy tab - pętla wczytująca liczby będzie miała wtedy postać: for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); } wczytywanie liczb moŝna zapisać jeszcze w inny sposób ((tab+i) jest adresem i-tego elementu tablicy): for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",(tab+i)); }
Wykład nr 1 31/34 Operatory new i delete (C++) Operator new: w najprostszym przypadku zastosowanie operatora new ma postać: typ *ptr = new typ; operator ten alokuje obszar pamięci niezbędny dla przechowywania obiektu typu typ i zwraca wskaźnik na początek tego obszaru jeśli alokacja pamięci nie jest moŝliwa, to zwracana jest wartość NULL typ wskaźnika jest odpowiednio dopasowany do typu obiektu, więc nie są konieczne Ŝadne konwersje wskaźnikowe pamięć przydzielona przez operator new istnieje do zakończenia programu lub do chwili zwolnienia tej pamięci za pomocą operatora delete Operator delete: w najprostszym przypadku operator delete ma postać: delete ptr; gdzie ptr jest wskaźnikiem wskazującym na obiekt stworzony przez new
Wykład nr 1 32/34 Operatory new i delete (C++) - przykład #include <stdio.h> *ptr = 10 int main() { int *ptr; ptr = new int; if (ptr == NULL) { printf("blad przydzialu pamieci.\n"); return 1; } *ptr = 10; printf("*ptr = %d\n",*ptr); delete ptr; } return 0; Przydział pamięci operatorem new i zwolnienie operatorem delete
Wykład nr 1 33/34 Operatory new i delete (C++) operatory new i delete stosuje się zazwyczaj przy tworzeniu dynamicznych tablic oraz przy tworzeniu dynamicznych struktur danych (stos, kolejka, lista) utworzenie tablicy n elementów typu typ ma postać: typ *ptr = new typ[n] wartością powyŝszego wyraŝenia jest wskaźnik na typ (a nie na tablicę elementów typu typ) jako rozmiar tablicy n moŝna podać dowolne wyraŝenie, a nie tylko wyraŝenie stałe niestety nie moŝna w ten sposób tworzyć dynamicznych tablic wielowymiarowych usuwając tablicę, trzeba podać, Ŝe chodzi o tablicę, a nie o pojedynczy element: delete [] ptr; gdzie ptr jest wskaźnikiem zwróconym przez operator new podczas tworzenia dynamicznej tablicy
Wykład nr 1 34/34 Operatory new i delete (C++) - przykład Podaj ilosc liczb: 5 #include <stdio.h> #include <stdlib.h> Podaj liczbe nr 1: 1 Podaj liczbe nr 2: 2 int main() Podaj liczbe nr 3: 3 { int *tab, i, n; Podaj liczbe nr 4: 4 float suma = 0.0; Podaj liczbe nr 5: 5 Srednia 5 liczb wynosi 3.000000 printf("podaj ilosc liczb: "); scanf("%d",&n); tab = new int[n]; if (tab == NULL) { printf("nie mozna przydzielic pamieci.\n"); exit(-1); } for (i=0; i<n; i++) /* wczytanie liczb */ { printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); } for (i=0; i<n; i++) suma = suma + tab[i]; printf("srednia %d liczb wynosi %f\n",n,suma/n); } delete [] tab; return 0; Przydział pamięci na n-liczb typu int, wczytanie liczb, obliczenie średniej