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

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

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

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

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

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

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Lab 9 Podstawy Programowania

Uzupełnienie dot. przekazywania argumentów

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

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

Podstawy programowania komputerów

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

Część 4 życie programu

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

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

Stałe, tablice dynamiczne i wielowymiarowe

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

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

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Wskaźniki. Informatyka

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

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Wykład Wskaźniki a tablice jednowymiarowe Arytmetyka wskaźników Dostęp do elementów tablic

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

ŁAŃCUCHY W JĘZYKU C/C++

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

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

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

1 Podstawy c++ w pigułce.

tablica: dane_liczbowe

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

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

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

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

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

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

Język C, tablice i funkcje (laboratorium)

Wskaźniki. Programowanie Proceduralne 1

Podstawy Programowania C++

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

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

Język ANSI C tablice wielowymiarowe

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

DYNAMICZNE PRZYDZIELANIE PAMIECI

Wstęp do programowania

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:

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

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

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

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Pobieranie argumentów wiersza polecenia

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

Wstęp do wskaźników w języku ANSI C

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

2 Przygotował: mgr inż. Maciej Lasota

Tablice, funkcje - wprowadzenie

Zadania z podstaw programowania obiektowego

Zajęcia 6 wskaźniki i tablice dynamiczne

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

Język C, tablice i funkcje (laboratorium, EE1-DI)

Tablice deklaracja, reprezentacja wewnętrzna

C++ wprowadzanie zmiennych

Programowanie obiektowe W3

x szereg(x)

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

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

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

1 Podstawy c++ w pigułce.

Języki i metodyka programowania. Wprowadzenie do języka C

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

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.

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

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

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Podstawy programowania w języku C++

Programowanie Proceduralne

Podstawy Programowania

Zmienne i struktury dynamiczne

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

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

IX. Wskaźniki.(3 godz.)

I - Microsoft Visual Studio C++

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

Programowanie - wykład 4

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Język C zajęcia nr 11. Funkcje

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

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

Wprowadzenie do programowania w języku C

Transkrypt:

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19 Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe. 1. Wektory i macierze: a. Przykład 1. Przechowywanie macierzy (tablicy jednowymiarowej) wiersz po wierszu. i numer wiersza, j numer kolumny, kolejność indeksowania: for( i = 0; i < n; i++) for(j=0; j < n ; j++) b. Przykład 2. Przechowywanie macierzy (tablicy jednowymiarowej) kolumna po kolumnie. i numer wiersza, j numer kolumny, kolejność indeksowania: for(j=0; j < n ; j++) for( i = 0; i < n; i++) c. Przykład 3. Mnożenie macierzy przez macierz c ij=σk a ik b kj metodą: i. klasyczną, czyli wiersz po wierszu : for (i = 0; i < M; i++) for (j = 0; j < N; j++) for (k = 0; k < K; k++) C ij = C ij + A ik * B kj Element macierzy C w pętli wewnętrznej nie zależy od indeksu k. Pobieranie elementów macierzy A następuje ciągle, bez skoków, natomiast elementy macierzy B pobierane są ze skokami. W związku z tym metoda ta nie jest skuteczna. ii. Przyspieszoną for (i = 0; i < M; i++) for (k = 0; k < K; k++) for (j = 0; j < N; j++) C ij = C ij + A ik * B kj Elementy macierzy A w pętli wewnętrznej nie zależy od indeksu j. Pobieranie elementów macierzy C następuje ciągle, bez skoków, natomiast elementy macierzy B pobierane są ze skokami. W związku z tym metoda ta jest lepsza od poprzedniej. 2. Funkcje memcpy, memmove, memset znajdują się w bibliotece. Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 1

void *memcpy(void *dest, const void *src, size_t count); funkcja kopiuje count bajtów z src do dest. Jako wynik zwraca wskaźnik do dest. Jeśli obszar pamięci src i dest pokrywa się działanie funkcji jest nieprzewidywalne. void *memmove(void *dest, const void *src, size_t count); funkcja kopiuje count bajtów z src do dest. Jeśli jakiś obszar pamięci src i dest pokrywa się funkcji gwarantuje, że bajty źródłowe w pokrywającym się regionie zostaną skopiowane zanim zostaną przepisane. void *memset(void *dest, int c, size_t count); Przypisuje symbol c pierwszym count symbolom tablicy dest. Zwraca wskaźnik do dest. 3. Utwórz nowy projekt, a następnie skopiuj i przeanalizuj poniższe przykłady użycia funkcji memcpy, memmove, memset. a) Przykład 1. #include <string.h> char str1[7] = "aabbcc"; printf("the string: %s\n", str1); //Pokrywający się region! Kopiowanie może nie być poprawne memcpy(str1 + 2, str1, 4); printf("new string: %s\n", str1); strcpy_s(str1, sizeof(str1), "aabbcc"); // reset string printf("the string: %s\n", str1); //Pokrywający się region! Kopiowanie poprawne memmove(str1 + 2, str1, 4); printf("new string: %s\n", str1); b) Przykład 2. char buffer[] = "This is a test of the memset function"; printf("before: %s\n", buffer); memset(buffer, '*', 4); printf("after: %s\n", buffer); Wynik działania: Before: This is a test of the memset function After : **** is a test of the memset function c) Przykład 3. char str[256]; double aa[200]; double cc[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; double dd[5] = 20, 30, 40, 50, 60 ; memset((void *)str, 0, 256 * sizeof(char)); //OK memset((void *)str, ' ', 256 * sizeof(char)); //!OK pisanie po pamięci memset((void *)str, ' ', 255 * sizeof(char)); //OK Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 2

memset((void *)aa, 0, 200 * sizeof(double)); //OK memcpy((void *)&cc[3], (const void *)&dd[2], 2 * sizeof(double)); Wynik działania: cc: 1 2 3 40 50 6 7 8 9 10 4. Opracować program, który utworzy dynamicznie (za pomocą funkcji malloc) dwie tablice t1 i t2 liczb całkowitych o rozmiarze n wczytywanym z klawiatury. Jeżeli operacja przydziału pamięci dla t1 i t2 zakończyła się pomyślnie (wskaźniki t1 i t2 są różne od NULL), to zainicjuj tablicę t1 losowymi liczbami. Napisz procedurę, która korzystając z funkcji: srand, time, rand oraz operatora dzielenia modulo uzupełni przekazaną do niej tablicę typu int o losowe liczby z zakresu od 0 do 99. Tablica niech będzie przekazywana przez wskaźnik. Znaleźć minimalny i maksymalny element w tablicy oraz jego położenie. Wyprowadzić na ekran zawartość tablicy t1, a także znalezione wartości i położenie (indeksy) minimum i maksimum. Przekopiować tablicę t1 do t2 wykorzystując standardową funkcję memmove lub memcpy. Wyprowadzić zawartość tablicy t2 na ekran. Przed zakończeniem programu zwolnić pamięć przydzieloną t1 i t2. 5. Przykład. Napisz program, który dla danych dwóch wektorów, policzy: a) Sumę tych wektorów: = + ; b) Iloczyn skalarny wektorów: = ; c) Maksymalną współrzędną wektorów, //==============================PLIK_1=================================== #pragma warning (disable:4996) #include<stdio.h> #include<stdlib.h> #define LL 200 extern void error(int, char *); void argumenty(int, char **); int main(int argc, char *argv[]) double x[ll], y[ll], z[ll], s, mx, my; FILE *fw, *fd; int n, k; argumenty(argc, argv); if (!(fd = fopen(argv[1], "r"))) error(2, "dane"); if (!(fw = fopen(argv[2], "w"))) error(2, "wyniki"); fscanf(fd, "%d", &n); fscanf(fd, "%lf", &x[k]); fscanf(fd, "%lf", &y[k]); s = 0; mx = x[0]; my = y[0]; z[k] = x[k] + y[k]; mx = x[k] > mx? x[k] : mx; my = y[k] > my? y[k] : my; s += x[k] * y[k]; fprintf(fw, "%lf ", z[k]); Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 3

if (!((k + 1) % 5)) fprintf(fw, "\n"); fprintf(fw, "\nilocz.skal=%lf mx=%lf my=%lf\n", s, mx, my); void argumenty(int argc, char *argv[]) int len; char *usage; if (argc!= 3) len = strlen(argv[0]) + 19; if (!(usage = (char*)malloc((unsigned)len * sizeof(char)))) error(3, "tablica usage"); strcpy(usage, argv[0]); strcat(usage, " file_in file_out"); error(4, usage); /**************** plik util_1.c ******************************/ #include<stdio.h> #define MAX_ERR 5 static char *p[] = "", " zle dane", " otwarcie pliku", " brak pamieci", " Usage : ", " nieznany ", ; void error(int nr, char *str) int k; k = nr >= MAX_ERR? MAX_ERR : nr; fprintf(stderr, "Blad(%d) - %s %s\n", nr, p[k], str); system("pause"); exit(nr); 6. Wyrażenie warunkowe przyjmuje postać: wyrażenie1? wyrażenie2 : wyrażenie3 wartością wyrażenia warunkowego jest: Wartość wyrażenia2, o ile wyrażenie1 jest różne od zera, Wartość wyrażenia3, o ile wyrażenie1 jest równe zero. Operator pytajnik, dwukropek (?:) jest prawostronnie łączny i ma priorytet wyższy jedynie od operatorów przypisania i operatora przecinkowego. 7. Zmodyfikuj program z powyższego przykładu tak aby: Zamiast tablic zdefiniować zmienne typu double *; Zarezerwować dokładnie n miejsc na zmienne typu double (alokacja pamięci), np.: x = (double*)malloc((unsigned)n * sizeof(double)) 8. Algorytm z pkt.7 podziel na kilka funkcji: a) Alokacja pamięci dla tablicy: double *DajWekt(int n) b) Czytanie elementów tablicy z pliku: void CzytWekt(FILE *fd, double *we, int n) c) Pisanie elementów tablicy do pliku: void PiszWekt(FILE *fw, double *we, int n) d) Obliczanie sumy dwóch wektorów: void DodWekt(double *w1, double *w2, double *w3, int n) Wydział Fizyki, Matematyki i Informatyki Politechniki Krakowskiej 4

e) Obliczanie iloczynu skalarnego: double IloczynSkal(double *w1,double *w2,int n) f) Obliczanie maksymalnej współrzędnej wektora: double MaxElem(double *w, int n) Funkcje realizujące zadania a), b), c) zapisz w pliku util_2.cpp. Funkcje realizujące zadania d), e), f) zapisz w pliku util_3.cpp. 9. Przeanalizuj w trybie pracy krokowej przykłady do wykładu 8: 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 5