1 Podstawy programowania w języku C i C++Podstawy programowania w języku C i C++. Temat: Tablice: definicja, numery elementów, tablica jednowymiarowa, dwuwymiarowa, tablice wielowymiarowe, bez wymiarów. Inicjacja tablicy. Tablica znakowa. Łańcuch znakowy Cele nauczania: Podstawowe zasady programowania. Praktyczna znajomość elementów programowania w języku C/C++ Docelowo : Opracowanie algorytmu wybranego zadania geodezyjnego i przedstawienie go w postaci schematu blokowego. Opracowanie programu w wybranym języku programowania Wykonanie dokumentacji programu . Szczegółowe dla lekcji: Zapoznanie się z pojęciem tablicy, definiowaniem, inicjalizacją. Zastosowanie w programach. Cele operacyjne lub szczegółowe cele kształcenia Po zakończeniu lekcji uczeń będzie umiał: tworzyć i stosować tablice w programach C i C+
2 Część merytoryczna Część wstępnaCzęść wstępna - organizacyjna: przywitanie, sprawdzenie obecności, wpisanie tematu lekcji. Część merytoryczna Ogniwo 1. Uświadomienie uczniom celów – pogadanka Celem zajęć jest zapoznanie się z pojęciem tablicy i jej zastosowaniem. Po 2 lekcjach : wpisuje i uruchamia programy, z zastosowaniem tablic
3 Ogniwo 2 Poznanie nowych faktów – pogadankaW języku C i C++ można stosować tablice Tablica to jednorodna struktura danych składająca się z elementów tego samego typu. Inaczej tablica to uporządkowany zbiór wielu zmiennych jednego typu. Typ tych zmiennych określa typ tablicy. Np. jeśli w tablicy będziemy przechowywać liczby typu int, to tablica też jest typu int. Uporządkowanie tablicy oznacza, że każdy element ma swoje kolejne miejsce. Tablice mogą być jednowymiarowe lub wielowymiarowe. Odpowiednikiem tablic jednowymiarowych jest w matematyce wektor a tablic dwuwymiarowych macierz. Elementy tablicy wskazujemy za pomocą indeksów. W języku C elementy tablicy numerujemy od zera.
4 Ogniwo 3. Kształtowanie pojęć, poznawanie, systematyzowanie wiedzy -Tablica to jednorodna struktura danych składająca się z elementów tego samego typu. Tablice mogą być jednowymiarowe lub wielowymiarowe. Odpowiednikiem tablic jednowymiarowych jest w matematyce wektor a tablic dwuwymiarowych macierz. Tablicę jednowymiarową nap. x o wymiarze n można przedstawić jako zestaw elementów x[0] x[1] … x[i] … x[n-2] x[n-1] Elementy tablicy wskazujemy za pomocą indeksów. W języku C elementy tablicy numerujemy od zera. Tablicę 2-wymiarową można przestawić jako zestaw m tablic 1-wymiarowych, w którym każdy element ma 2 indeksy: nr wiersza „i” oraz numer kolumny „j” - element x[i][j]. x[0][0] x[0][1] … x[0][i] … x[0][n-2] x[0][n-1] x[1][0] x[1][1] … x[1][i] … x[1][n-2] x[1][n-1] .. x[i][0] x[i][1] … x[i][i] … x[i][n-2] x[i][n-1] … x[m-1][0] x[m-1][1] … x[m-1][i] … x[m-1][n-2] x[m-1][n-1] Tablicę 3-wymiarową można traktować jako zestaw tablic 2-wymiarowych, posiadających 3 indeksy: wiersz, kolumna, warstwa: element x[i][j][k]
5 Deklarowanie tablic i inicjacja tablicJednowymiarowe tablice w języku C deklarujemy podając: typ danych (specyfikator typu) , nazwę (identyfikator) tablicy oraz rozmiar tablicy wewnątrz nawiasów prostokątnych. typ_danych nazwa_tablicy [rozmiar]; Np. int t[10]; double tab[100]; char c1[5]; lub ewentualnie typ_danych nazwa_tablicy [rozmiar] = {lista_wartości}; // przypisanie wartości początkowych w deklaracji – inicjacja tablic Przykłady: int liczby[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // liczby[0]=1; liczby[1]=2; … liczby[9]=10; float x[8] = {1.27, 0.24, 0, -0.66, 23.45}; // pozostałe przyjmą 0 char kolor[] = „bury”; // kolor[0]=’b’; kolor[1]=’u’; kolor[2]=’r’; kolor[3]=’y’; kolor[4]=’\0’;
6 Rozmiar tablicy Rozmiar tablicy może być wyrażeniem, ale w tym wyrażeniu nie może wystąpić zmienna. Wartość takiego wyrażenia musi być określona już w etapie kompilacji. Przykład tablicy, gdzie rozmiar tablicy jest wyrażeniem: np. const NMAX =10; int a[NMAX}; int b[NMAX*NMAX] Tablice 2-wymiarowe i wielowymiarowe deklarujemy podając listę rozmiarów, a każdy rozmiar podajemy wewnątrz osobnej pary nawiasów: typ_danych nazwa_tablicy [lista_rozmiarów]; np. int t[10][10]; typ_danych nazwa_tablicy [lista_rozmiarów] = {lista_wartosci}; np. int t[2][4]= { {11, 12, 13, 14}, {21, 22, 23, 24} };
7 Dostęp do elementów tablicyDostęp do elementów tablicy uzyskuje się przez podanie nazwy tablicy oraz wartości indeksu (indeksów). Są 2 rodzaje dostępu: Pobranie wartości elementu, np. x=a[i][j]; Nadanie wartości elementowi, np. a[i][k+2]=u; Dostęp do elementów tablicy nazywamy swobodnym, bo wszystkie składowe mogą być wybrane w dowolnej kolejności i są jednakowo dostępne.
8 Program tablica1.c /* Program tablica1.c - tablica 5 liczb typu int */#include
9 Inicjacja tablicy - przykład// inicj1.cpp - Inicjacja tablicy #include
10 Zmiana elementów tablicy, elementy poza tablicą!// wymtabl.cpp rozmiar tablicy, zmiana elementu #include
11 Przykładowe programy: Program oceny1.cpp// program oceny1.cpp Tablica int oceny[5]; Dev C++ #include
12 Program oceny1a.cpp // oceny1a.cpp - 2 tablice: int oceny[5]; char przedm[5][20]; #include
13 Potęgi liczby 2 WYNIKI Potegi liczby 2 2 do potegi 0 wynosi 1// Potegi2.cpp - potęgi liczby 2 #include
14 Tablica 2-wymiarowa WYNIKI Tablica 2-wymiarowa 3 wiersze, 4 kolumny// tabl2w.cpp - tablica 2 wymiarowa 3 wiersze, 4 kolumny #include
15 Tablice znaków Napisy - tablice znakow Napis1 ==> Komputer SWIAT// Napisy1.cpp - tablice znaków #include
16 Podsumowanie – tabliceDefinicja tablicy: Tablica jest zbiorem elementów jednego typu. Wszystkie elementy tablicy są umieszczane w pamięci komputera w jednym miejscu. W nawiasach kwadratowych wpisuje się rozmiar tablicy i element tablicy. Do każdego elementu można się odwołać posługując się nazwą tablicy i indeksem, np. tab1[0], tab2[1][2]; Elementy tablicy są numerowane od 0. Indeks 0 dotyczy pierwszego elementu. Wartości tablicy można wpisać też podczas deklaracji – wartości kolejnych elementów tablicy w nawiasach klamrowych, oddzielone przecinkami, np. int oceny[6]={1, 2, 3, 4, 5, 6}; // oceny[0]=1; oceny[1]=2; … oceny[5]=6; Kompilator może samodzielnie przydzielić tylko jeden wymiar tablicy. np. int tabl[][2]={ { 1, 2}, {3, 4}};
17 Łańcuch znakowy w cudzysłowach i tablica znakowa/* Napisy1a.cpp - łańcuch znakowy i tablica znakowa */ #include
18 Odczytanie długości łańcucha znaków – strlen (lancuch)/* dluglanc.c – strlen() */ #include
19 Funkcje strlen – długość łańcucha znaków i strcat – łączenie łańcuchów/* dllanc1.c strlen ()- długość łańcucha znaków, strcat() - łączenie znaków* / #include
20 Inne funkcje operujące na łańcuchach: strlwr, strupr, strcat, strrv, streset – z biblioteki string.hstrcat() - łączy dwa łańcuchy, strcmp() - porównuje dwa łańcuchy rozróżniając małe i duże litery, strlwr() i strupr() - zamienia w danym łańcuchu duże litery na małe i odwrotnie, strrev() - odwraca kolejność znaków w łańcuchu, strset() - wypełnia łańcuch danym znakiem. printf("\nZmieniamy male litery na duze: \n"); strupr(lancuch2); printf("Lancuch2 wyglada teraz tak: %s \n",lancuch2); printf("\nLaczymy dwa lancuchy: \n" ); lancuch3=strcat(lancuch1,lancuch2); printf("Lancuch3 wyglada teraz tak: %s \n",lancuch3); printf("\nOdwracamy kolejnosc znakow w lancuchu: \n" ); strrev(lancuch3); printf("\nWypelniamy lancuch znakiem 'x':\n" ); strset(lancuch3,znakwyp); getch(); return 0 ; } /* znaki5.c - operacje na tekstach */ #include
21 Typ danych string do napisów// Program string1.cpp #include
22 Podsumowanie - znaki, łańcuchy znakówDeklaracja zmiennej znakowej: char znak; a zmiennej łańcuchowej: char *slowo; Wartość zmiennej znakowej można przypisać w programie poprzez umieszczenie znaku w apostrofach lub przez napisanie jego kodu. Wartość zmiennej łańcuchowej można przypisać w programie poprzez umieszczenie napisu w cudzysłowie. Zmienne znakowe i łańcuchowe można wczytywać z klawiatury używając funkcji scanf() i odpowiednich wzorców konwersji: %s dla ciągu znaków i %c dla pojedynczego znaku. Każdy znak posiada swój kod ASCII. Kod ASCII mają również znaki nie przedstawione na klawiaturze komputera. np. ß, ö. Łańcuch, który wygląda jak liczba nie jest liczbą. Istnieją funkcje, które potrafią przekonwertować łańcuch liczbowy do postaci liczby. Mając dany łańcuch, możemy odczytać dowolny jego znak używając nawiasów kwadratowych. Pierwszy wpisany znak ma numer 0, a nie 1. Każdy ciąg znaków kończy znak '\0'. Długość łańcucha można ograniczyć przy deklaracji, np.: char slowo[10]; Łańcuchy można ze sobą porównywać, łączyć, odwracać w nich kolejność liter, zmieniać małe litery na duże i odwrotnie, a także przeszukiwać, kopiować na siebie itp. Nazwy funkcji, które to wykonują zawsze zaczynają się na 'str' (z angielskiego: string). Do oznaczania końca łańcucha znakowego służy znak zerowy \0 np. char napis[]={‘K’,’o’,’t’,’\n’} lub char napis1[]=”Kot”; // do napisu automatyczne dopisany znak \0 na końcu. char imie[10]; // rozmiar tablicy 10 znaków łącznie ze znakiem \0, czyli 9 na właściwy napis (imię) Używając typu string nie trzeba się martwić o przydział pamięci. Zmienna typu string zajmuje mniej miejsca niż tablica znaków. Jest możliwość korzystania z dodatkowych funkcji, np. Łączenia napisów, porównywania, wyszukiwania itp..Ukrywa ona niewygodne aspekty używania napisów w stylu C: zarządzanie pamięcią, określanie długości, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisie. Dodatkowo pozbyto się problemu znaku kończącego - znak o kodzie \0.
23 Rozmiar typów danych, ilość bajtów zajmowanych przez obiekt// sizeof1.cpp - rozmiar typów danych #include
24 Rekordy W praktyce zdarza się jednak często, że potrzebujemy przechować w pamięci dane różnych typów, jednakże w wielu egzemplarzach. Na przykład tworzymy bazę danych z informacjami na temat uczniów w jakiejś klasie. O każdej osobie potrzebujemy zapamiętać jego imię, nazwisko, numer w dzienniku i średnią. Dane te nie są jednego typu: imię i nazwisko - typ char*; numer - typ int; średnia - typ float. Można stworzyć cztery tablice określonych typów, i w każdej z nich przechowywać określone informacje, np. w pierwszej imiona, w drugiej nazwiska itp. Nie jest to jednak zbyt praktyczne, ponieważ łatwo pomieszać informacje o każdej z osób. Do rozwiązania tego problemu służą rekordy. Zbierają one w całość informacje różnych typów. Rekord to powiązanie kilku zmiennych różnego typu w jedną całość. Możemy tworzyć tablice, które jako swoje elementy przechowują rekordy. Przy odwołaniu do elementu takiej tablicy należy sprecyzować konkretne pole rekordu.
25 Deklaracja rekordu Rekord deklarujemy jak każdą inną zmienną. Deklarację rekordu rozpoczynamy słówkiem struct. Następnie między nawiasami klamrowymi deklarujemy zmienne wchodzące w skład rekordu. Nazywa się to polami rekordu. Po zamknięciu nawiasu klamrowego piszemy nazwę rekordu. Pojedynczy rekord może być np. postaci: struct { int zmienna1; float zmienna2; char zmienna3; } nazwa; Takich rekordów możemy zadeklarować kilka lub też utworzyć zbiór takich samych rekordów w postaci tablicy (tak, jak w przykładzie). Pojedynczy rekord jest więc traktowany jako pojedyncza zmienna. Ta zmienna mówi nam jednak o wiele więcej niż pojedyncza zmienna typu np. int. Rekordy zebrane w tablicy deklaruje się na zasadzie: struct { int zmienna1; float zmienna2; char zmienna3; } nazwa[ilosc_pol];
26 Program rekordy1.c /* Program rekordy1.c */#include
27 Podsumowanie – tablica, napisy, rekordyDefinicja tablicy: Tablica jest zbiorem elementów jednego typu. Wszystkie elementy tablicy są umieszczane w pamięci komputera w jednym miejscu. W nawiasach kwadratowych wpisuje się rozmiar tablicy i element tablicy. Do każdego elementu można się odwołać posługując się nazwą tablicy i indeksem, np. tab1[0], tab2[1][2]; Elementy tablicy są numerowane od 0. Indeks 0 dotyczy pierwszego elementu. Wartości tablicy można wpisać też podczas deklaracji – wartości kolejnych elementów tablicy w nawiasach klamrowych, oddzielone przecinkami, np. int oceny[6]={1, 2, 3, 4, 5, 6}; // oceny[0]=1; oceny[1]=2; … oceny[5]=6; Kompilator może samodzielnie przydzielić tylko jeden wymiar tablicy. Np. int tabl[][2]={ { 1, 2}, {3, 4}}; Do oznaczania końca łańcucha znakowego służy znak zerowy \0 np. char napis[]={‘K’,’o’,’t’,’\n’} lub char napis1[]=”Kot”; // do napisu automatyczne dopisany znak \0 na końcu. char imie[10]; // rozmiar tablicy 10 znaków łącznie ze znakiem \0, czyli 9 na właściwy napis (imię) Używając typu string nie trzeba się martwić o przydział pamięci. Zmienna typu string zajmuje mniej miejsca niż tablica znaków. Jest możliwość korzystania z dodatkowych funkcji, np. łączenia napisów, porównywania, wyszukiwania itp..Ukrywa ona niewygodne aspekty używania napisów w stylu C: zarządzanie pamięcią, określanie długości, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisie. Dodatkowo pozbyto się problemu znaku kończącego - znak o kodzie \0. Rekord to powiązanie kilku zmiennych różnego typu w jedną całość. Możemy tworzyć tablice, które jako swoje elementy przechowują rekordy. Przy odwołaniu do elementu takiej tablicy należy sprecyzować konkretne pole rekordu.