4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Podobne dokumenty
iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wskaźniki. Informatyka

Lab 9 Podstawy Programowania

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Języki i paradygmaty programowania 1 studia niestacjonarne 2018/19

Część 4 życie programu

Podstawy programowania komputerów

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Stałe, tablice dynamiczne i wielowymiarowe

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Tablice (jedno i wielowymiarowe), łańcuchy znaków

ZASADY PROGRAMOWANIA KOMPUTERÓW

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Języki programowania obiektowego Nieobiektowe elementy języka C++

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Argumenty wywołania programu, operacje na plikach

Wskaźniki w C. Anna Gogolińska

Uzupełnienie dot. przekazywania argumentów

Wskaźniki. Programowanie Proceduralne 1

KURS C/C++ WYKŁAD 6. Wskaźniki

Tablice, funkcje - wprowadzenie

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Struktury czyli rekordy w C/C++

Podstawy programowania w języku C++

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

int f(); //f - funkcja zwracająca wartość typu int int (*f)(); //f - wskaźnik do funkcji zwracającej wartość typu int

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Podstawy programowania

Programowanie w językach wysokiego poziomu

Pliki. Informacje ogólne. Obsługa plików w języku C

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Podstawy programowania w języku C++

Język ANSI C tablice wielowymiarowe

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

tablica: dane_liczbowe

Programowanie obiektowe W3

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Stałe i zmienne znakowe. Stała znakowa: znak

Zajęcia 6 wskaźniki i tablice dynamiczne

Podstawy programowania 1

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Pliki. Informacje ogólne. Obsługa plików w języku C

Zmienne i struktury dynamiczne

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Wstęp do programowania

Wstęp do programowania

Tablice, funkcje, wskaźniki - wprowadzenie

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Języki programowania. Karolina Mikulska-Rumińska Pokój 573, tel Konsultacje wtorek 9-10.

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Podstawy programowania w języku C++

Wstęp do programowania

I - Microsoft Visual Studio C++

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Programowanie w języku C++

Wykład 3 Składnia języka C# (cz. 2)

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Programowanie Proceduralne

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Języki i metodyka programowania. Wskaźniki i tablice.

Wykład 1: Wskaźniki i zmienne dynamiczne

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Transkrypt:

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19 Lab 6. Tablice znakowe o dwóch indeksach, przekazywanie tablic do funkcji cd., dynamiczna alokacja pamięci, funkcje przetwarzające ciągi znakowe. Projekt nr 2. 1. Zapoznaj się z pojęciami stos, sterta, alokacja pamięci (statyczna i dynamiczna), przepełnienie stosu, przepełnienie sterty (Wikipedia). 2. Tablice możemy deklarować na kilka sposobów. W przypadku alokacji statycznej możemy je zadeklarować m.in. następująco: int tab1[5]; int tab2[5] = 2, 5, 3, 2, 5 ; int tab3[5] = 2, 2, 1 ; int tab4[5] = 0; int tab5[] = 1, 2, 3, 4, 5 ; Czym różnią (jeśli się różnią) powyższe sposoby? Zadeklaruj tablicę statyczną (bez inicjalizacji jej wartości - pierwszy sposób), podobnie tablicę globalną - jakie wartości przyjmują poszczególne elementy tablicy? Język C pozwala w sposób analogiczny na deklarację tablic wielowymiarowych. Przykłady tablic dwuwymiarowych: int matrix1[2][2]; int matrix2[2][2] = 1, 2, 3, 4 ; int matrix3[2][2] = 0; Czym jest nazwa tablicy - jaką przyjmuje wartość? Udowodnij swoją odpowiedź krótkim przykładem. 3. Tablice mogą być przekazywane do funkcji na dwa sposoby: poprzez referencję lub poprzez wskaźnik. Oznacza to, że przekazując tablicę nie jest tworzona jej kopia, a działania są wykonywane bezpośrednio na oryginalnej tablicy. Przekazywanie przez wartość jest niemożliwe. void myfun(int *tab) void myfun(int tab[]) 4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu. char d[200][256]; rezerwuje miejsce w pamięci dla 200*256 zmiennych typu char; identyfikator d jest stałą o wartości równej adresowi elementu d[0][0]; wartość d[0] wskazuje na element d[0][0], wartość d[1] wskazuje na element d[1][0], itd.; wartości d, d[0], &d[0][0] są takie same. d, d[0], d[1], d[2], są stałymi nie wolno zmieniać ich wartości. Przykład: //Liczba słów w wielu liniach tekstu (1) - tablice o dwóch indeksach #pragma warning (disable: 4996) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE 256 #define MAX_LINES 200 FILE *fd = NULL; int ile_slow(char *); int main() Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 1

char d[max_lines][max_line]; int i, l; if (!(fd = fopen("dane.txt", "r"))) printf("blad otwarcia zbioru\n"); exit(2); l = 0; while (i < MAX_LINES && fgets(d[i], MAX_LINE, fd)!= (char*)null) l += ile_slow(d[i]); fclose(fd); fd = NULL; printf("%d\n", l); system("pause"); /* TU funkcja ile_slow */ int ile_slow(char *te) char p, b = ' '; while (p = b, b = *te++) if (b!= ' ' && p == ' ') l++; return(l); 5. Funkcja fgets() czyta kolejne znaki ze strumienia stream i umieszcza je w tablicy znakowej wskazywanej przez str. Czytanie przerywa, gdy przeczyta size - 1 znaków, natrafi na koniec pliku lub znak końca linii (znak ten jest zapisywany do str). Na końcu fgets() dopisuje znak '\0'. W przypadku błędu lub natrafienia na koniec pliku wartością funkcji jest NULL. Deklaracja: char *fgets(char *str, int size, FILE *stream); 6. Dynamiczna alokacja pamięci - tworząc aplikacje zazwyczaj nie znamy z góry rozmiarów tablic jakie będą nam potrzebne. Często pamięć zarezerwowana przez stos jest niewystarczająca. Możemy wtedy skorzystać z dynamicznej alokacji pamięci. Język C dostarcza w tym celu funkcję malloc, która jako argument przyjmuje rozmiar bloku pamięci, który ma zaalokować, natomiast zwraca wskaźnik do zaalokowanej pamięci lub NULL w przypadku błędu. Przykładowo alokację 10 elementowej tablicy typu double możemy zapisać następująco: double *tab; tab = (double *)malloc(sizeof(double) * 10); if (!tab) //błąd alokacji Język C nie posiada mechanizmów automatycznego "odśmiecania pamięci" (tzw. garbage collecting). Procedura zarówno alokacji jak i dealokacji spoczywa na programiście. W celu zwolnienia pamięci korzystamy w funkcji free. Zwolnienie może być wykonane tylko raz. Pamiętajmy, aby po każdym użyciu funkcji free "zniszczyć" wskaźnik poprzez przypisanie wartości NULL. Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 2

if (tab) free(tab); tab = NULL; 7. W przypadku tablic wielowymiarowych ich przekazywanie do funkcji znacznie się komplikuje. Aby przekazać tablicę wielowymiarową w sposób podobny do tablic jednowymiarowych musimy z góry znać stały rozmiar tablicy: void myfun(int tab[2][2]) void myfun(int (*tab)[2]) Rozwiązaniem powyższego problemu może być zapis tablicy dwuwymiarowej w jednym wymiarze - jednak nie zawsze jest to pożądane rozwiązanie. 8. Dynamiczna alokacja pamięci dla tablic wielowymiarowych - cały proces wygląda analogicznie do alokacji tablic jednowymiarowych - należy jedynie pamiętać, że musimy zaalokować każdy wiersz z osobna (podobnie w przypadku zwalniania pamięci). Przykładowa tablica 10x5 o elementach typu double: double **tab; tab = (double **)malloc(sizeof(double) * 10); if (!tab) //błąd alokacji for (int i < 10; i++) tab[i] = (double *)malloc(sizeof(double) * 5); if (!tab[i]) //błąd alokacji if (tab) for (int i < 10; i++) if (tab[i]) free(tab[i]); free(tab); tab = NULL; 9. Przykład dla tablic tekstowych: //Liczba słów w wielu liniach tekstu (2) - alokacja pamięci #pragma warning (disable: 4996) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE 256 #define MAX_LINES 200 FILE *fd = NULL; int ile_slow(char *); int main() Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 3

/* Ile slow w wielu liniach tekstu, alokacja pamieci */ char *d[max_lines], bufor[max_line]; int len, i, l; if (!(fd = fopen("dane.txt", "r"))) printf("blad otwarcia zbioru\n"); exit(2); l = 0; while (i < MAX_LINES && fgets(bufor, MAX_LINE, fd)) len = strlen(bufor); bufor[len - 1] = '\0'; if ((d[i] = (char *)malloc((unsigned)len)) == (char*)null) printf("brak pamieci\n"); exit(3); strcpy(d[i], bufor); l += ile_slow(d[i]); fclose(fd); fd = NULL; printf("%d\n", l); system("pause"); /* Tekst w pamięci, tablica d przechowuje wskaźniki do linii tekstu */ int ile_slow(char *te) char p, b = ' '; while (p = b, b = *te++) if (b!= ' ' && p == ' ') l++; return(l); 10. Czym różnią się funkcje: malloc, calloc, realloc? 11. Korzystając z funkcji fgets napisz program, który będzie zaczytywał linia po linii tekst zapisany w pliku tekstowym, a następnie wyświetlał numer linii, liczbę dużych liter, liczbę małych liter i liczbę pozostałych znaków. Dla uproszczenia załóżmy, że tekst nie zawiera polskich znaków oraz maksymalna liczba znaków w pojedynczej linii wynosi 256. 12. Biblioteka stdlib.h dostarcza funkcji konwertujących ciąg znaków na liczbę (atoi, atof, atol, atoll) oraz liczby na ciąg znaków (itoa, _ecvt, _fcvt) - więcej informacji w dokumentacji MSDN oraz na wykładzie. 13. Tablice dwuwymiarowe w argumentach funkcji. Zmodyfikuj program z przykładu nr 10 tak, by algorytm liczenia liczby słów nie był zapisany w funkcji main() ale w funkcji o nazwie licz_slowa_1. W której zostanie wykorzystana funkcja ile_slow. Do funkcji licz_slowa_1 winien być przekazany cały przeczytany tekst przekażemy jedynie tablice wskaźników do poszczególnych linii tekstu. //Liczba słów w wielu liniach tekstu (3) - tablice 2-indeksowe w argumentach - argumenty funkcji main() #pragma warning (disable: 4996) #include <stdio.h> Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 4

#include <stdlib.h> #include <string.h> #define MAX_LINE 256 #define MAX_LINES 200 FILE *fd; int ile_slow(char *), licz_slowa(char **), licz_slowa_1(char **); int main(int argc, char **argv) /* Ile slow w ielu liniach tekstu */ char *d[max_lines], bufor[max_line]; int len, i, l; if (argc!= 2) printf("zła liczba argumentów\n"); exit(1); if (!(fd = fopen(argv[1], "r"))) printf("blad otwarcia zbioru\n"); exit(2); l = 0; while (i < MAX_LINES && fgets(bufor, MAX_LINE, fd)) len = strlen(bufor); bufor[len - 1] = '\0'; if (!(d[i] = (char*)malloc((unsigned)len))) printf("brak pamieci\n"); exit(3); strcpy(d[i], bufor); d[i] = (char *)0; //znacznik końca tablicy wskaźników l = licz_slowa_1(d); printf("%d\n", l); system("pause"); /* Tekst w pamieci, tablica d - wskazniki do linii tekstu */ /* Tu funkcja ile_slow */ int ile_slow(char *te) char p, b = ' '; while (p = b, b = *te++) if (b!= ' ' && p == ' ') l++; return(l); int licz_slowa_1(char *te[]) int i, l = 0; while (te[i]!= (char *)0) Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 5

return l; l += ile_slow(te[i]); 14. Przekazywanie tablic dwuindeksowych sprowadza się do przekazywania jednoindeksowej tablicy wskaźników do jej wierszy, czyli adresu początkowego elementu tablicy wskaźników. Poniższa funkcja licz_slowa jest modyfikacją funkcji licz_slowa_1. Deklaracje identyfikatora te w obu wersjach funkcji są w pełni równoważne. Bez względu na sposób deklarowania można odwoływać się do tekstów przez elementy tablic lub przez wskazanie pośrednie. int licz_slowa(char **te) while (*te) l += ile_slow(*te++); return l; 15. Zamień miejscami tekst z dwóch wybranych linii. 16. Wybierz z tekstu składającego się z wielu linii te linie, w których na początku znajduje się wybrany tekst. 17. Wstaw jedną linię teksu po linii o numerze n. 18. Wybierz z teksu słowo o podanej pozycji. Załóż, że ogranicznikiem słowa jest dwukropek. 19. Napisz program kodujący i dekodujący dowolne teksty posługując się alfabetem Morse a. W rozwiązaniu możesz wykorzystać poniższe tablice. char litery[] = 'a',165,'b','c',134,'d','e',169,'f','g','h','i','j','k','l',136, 'm','n',228,'o',162,'p','q','r','s',152,'t','u','v','w','x','y','z',190,1 71,'A',164,'B','C',143,'D','E',168,'F','G','H','I','J','K','L',157,'M','N ',227,'O',224,'P','Q','R','S',151,'T','U','V','W','X','Y','Z',189,141,' ','.',',','?',':','-','0','1','2','3','4','5','6','7','8','9','!','\0' ; char *mors[] = ".-",".-.-","-...","-.-.","-.-..","-..",".","..-..","..-.","--.","...","..",".---","-.-",".-..",".-..-","--","-.","--.--","---","---.",".--.","--.-",".-.","...","...-...","-","..-","...-",".--","-..-","-.- -","--..","--..-","--",".-",".-.-","-...","-.-.","-.-..","-..",".","..-..","..-.","--.","...","..",".---","-.-",".-..",".-..-","--","-.","--.-- ","---","---.",".--.","--.-",".-.", "...","...-...","-","..-","...-",".-- ","-..-","-.--","--..","--..-","--"," ",".-.-.-","--..--","..--..","---...","-...-","-----",".----","..---","...--","...-","...","-...","--...","---..","----.","!",0 ; 20. Przeanalizuj w trybie pracy krokowej następujące przykłady do wykładu 6: http://torus.uck.pk.edu.pl/~fialko/text/cc/przykl/ww6_1.pdf http://torus.uck.pk.edu.pl/~fialko/text/cc/przykl/ww6_2.pdf http://torus.uck.pk.edu.pl/~fialko/text/cc/przykl/ww6_3.pdf Wszystkie przykłady dostępne pod adresem: http://torus.uck.pk.edu.pl/~fialko/text/cc/przykl/ *Treści oznaczone kursywą pochodzą z różnych źródeł internetowych. Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 6