Spis treści JĘZYK C - TABLICE JEDNOWYMIAROWE, ŁAŃCUCHY ZNAKÓW. Metodyki i techniki programowania. Instrukcja do pracowni specjalistycznej z przedmiotu



Podobne dokumenty
Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF10Z

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF22

Spis treści JĘZYK C - TABLICE JEDNOWYMIAROWE. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF05Z

Spis treści JĘZYK C - TABLICE JEDNOWYMIAROWE, ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

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

Spis treści JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

JĘZYK C - TABLICE DWUWYMIAROWE,

Spis treści JĘZYK C - ZAGNIEŻDŻANIE IF-ELSE, OPERATOR WARUNKOWY. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści JĘZYK C - TABLICE DWUWYMIAROWE, OPERACJE NA TABLICACH. Metodyki i techniki programowania

Spis treści JĘZYK C - ZAGNIEŻDŻANIE IF-ELSE, OPERATOR WARUNKOWY. Metodyki i techniki programowania

Spis treści JĘZYK C - ZAGNIEŻDŻANIE IF-ELSE, OPERATOR WARUNKOWY. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści JĘZYK C - INSTRUKCJA WARUNKOWA IF, OPERATORY RELACYJNE I LOGICZNE, WYRAŻENIA LOGICZNE. Informatyka 1

Spis treści JĘZYK C - TABLICE DWU- I WIELOWYMIAROWE, OPERACJE NA TABLICACH. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści JĘZYK C - TABLICE DWUWYMIAROWE, OPERACJE NA TABLICACH. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Spis treści JĘZYK C - OPERATORY BITOWE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

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

BHP JĘZYK C - INSTRUKCJE ITERACYJNE

Spis treści JĘZYK C - INSTRUKCJA SWITCH, OPERATORY BITOWE. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF05

Spis treści JĘZYK C - INSTRUKCJA WARUNKOWA IF, OPERATORY RELACYJNE I LOGICZNE, WYRAŻENIA LOGICZNE. Metodyki i techniki programowania

Spis treści JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Spis treści JĘZYK C - OPERATORY RELACYJNE I LOGICZNE, WYRAŻENIA LOGICZNE, INSTRUKCJA WARUNKOWA IF. Informatyka 1

Spis treści JĘZYK C - PLIKI BINARNE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF30

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Spis treści JĘZYK C - ŚLEDZENIE WYKONANIA PROGRAMU, DEBUGGER. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści JĘZYK C - FUNKCJE. Metodyki i techniki programowania. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia MITP10

dr inż. Jarosław Forenc

Spis treści JĘZYK C - INSTRUKCJE ITERACYJNE FOR, WHILE I DO WHILE, ZAGNIEŻDŻANIE PĘTLI FOR, INSTRUKCJE CONTINUE, BREAK, I GOTO.

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

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

2 Przygotował: mgr inż. Maciej Lasota

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

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

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

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

13 JĘZYK C - OPERATOR WARUNKOWY,

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

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 7- sem.iii. M. Czyżak

Spis treści JĘZYK C - INSTRUKCJA WARUNKOWA IF, OPERATORY RELACYJNE I LOGICZNE, WYRAŻENIA LOGICZNE, ZAGNIEŻDŻANIE IF-ELSE.

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

Podstawy programowania

Spis treści JĘZYK C - INSTRUKCJA SWITCH, OPERATORY BITOWE. Metodyki i techniki programowania. Instrukcja do pracowni specjalistycznej z przedmiotu

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

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

Programowanie strukturalne i obiektowe

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

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

lekcja 8a Gry komputerowe MasterMind

Język C, tablice i funkcje (laboratorium)

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania w języku C++

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

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

Tablice deklaracja, reprezentacja wewnętrzna

JĘZYK C - TABLICE DWUWYMIAROWE,

1 Podstawy c++ w pigułce.

Podstawy Programowania C++

Tablice, funkcje - wprowadzenie

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Spis treści PROGRAMOWANIE OBIEKTOWE W JĘZYKU C++: FUNKCJE ZAPRZYJAŹNIONE Z KLASĄ, PRZEŁADOWANIE OPERATORÓW. Informatyka 2

Lab 9 Podstawy Programowania

Spis treści OPERACJE WEJŚCIA-WYJŚCIA W JĘZYKU C++. STEROWANIE FORMATEM, MANIPULATORY. Informatyka 2

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Inicjacja tablicy jednowymiarowej

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

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

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

Programowanie w języku Python. Grażyna Koba

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

tablica: dane_liczbowe

Warsztaty dla nauczycieli

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

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

Część 4 życie programu

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

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

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

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

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

do instrukcja while (wyrażenie);

Podstawy programowania skrót z wykładów:

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

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

1 Podstawy c++ w pigułce.

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

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Zmienne i struktury dynamiczne

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

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

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

1. Wprowadzanie danych z klawiatury funkcja scanf

Podstawy programowania 1

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

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

Transkrypt:

Politechnika Białostocka Wydział Elektryczny Katedra Elektrotechniki Teoretycznej i Metrologii Instrukcja do pracowni specjalistycznej z przedmiotu Metodyki i techniki programowania Kod przedmiotu: TS1C200 009 (studia stacjonarne) JĘZYK C - TABLICE JEDNOWYMIAROWE, ŁAŃCUCHY ZNAKÓW Numer ćwiczenia MITP08 Spis treści 1. Opis stanowiska... 3 1.1. Stosowana aparatura... 3 1.2. Oprogramowanie... 3 2. Wiadomości teoretyczne... 3 2.1. Tablica elementów... 3 2.2. Tablica jednowymiarowa (wektor)... 4 2.3. Generowanie pseudolosowe elementów tablicy... 11 2.4. Inicjalizacja elementów tablicy... 13 2.5. Łańcuchy znaków... 15 2.6. Inicjalizacja łańcucha znaków... 16 2.7. Stała znakowa... 17 2.8. Funkcje do wyprowadzania i wprowadzania znaków... 19 2.9. Funkcje z pliku nagłówkowego string.h... 21 3. Przebieg ćwiczenia... 23 4. Literatura... 26 5. Zagadnienia na zaliczenie... 26 6. Wymagania BHP... 27 Materiały dydaktyczne przeznaczone dla studentów Wydziału Elektrycznego PB. Autor: dr inż. Jarosław Forenc Białystok 2013 Wydział Elektryczny, Politechnika Białostocka, 2013 (wersja 1.4) Wszelkie prawa zastrzeżone. Żadna część tej publikacji nie może być kopiowana i odtwarzana w jakiejkolwiek formie i przy użyciu jakichkolwiek środków bez zgody posiadacza praw autorskich. Metodyki i techniki programowania 2 z 28 Instrukcja MITP08

1. Opis stanowiska 1.1. Stosowana aparatura Podczas zajęć wykorzystywany jest komputer klasy PC z systemem operacyjnym Microsoft Windows (XP/Vista/7). 1.2. Oprogramowanie Na komputerach zainstalowane jest środowisko programistyczne Microsoft Visual Studio 2008 Standard Edition lub Microsoft Visual Studio 2008 Express Edition zawierające kompilator Microsoft Visual C++ 2008. 2. Wiadomości teoretyczne 2.1. Tablica elementów Tablica elementów jest ciągłym obszarem pamięci, w którym te elementy są umieszczone. W tablicy mogą znajdować się elementy tylko jednego typu. Wyróżnia się tablice jednowymiarowe (wektory), dwuwymiarowe (macierze) i tablice o większej liczbie wymiarów (Rys. 1). 2.2. Tablica jednowymiarowa (wektor) Deklarując tablicę jednowymiarową należy podać: typ elementów, nazwę tablicy i liczbę jej elementów, np. int tab[5]; średnik rozmiar tablicy nazwa tablicy typ elementów tablicy Wyrażenie podane w nawiasach kwadratowych, określające rozmiar tablicy, musi dawać w wyniku dodatnią stałą całkowitoliczbową. Ponadto musi to być wartość znana już w fazie kompilacji (nie może to być zmienna). Jako rozmiar tablicy można podać nazwę stałej zdefiniowanej dyrektywą preprocesora #define lub z użyciem słowa kluczowego const. int tab[5]; #define N 5 int tab[n]; const int n = 5; int tab[n]; Powyższe deklaracje definiują tablicę pięciu elementów typu int (Rys. 2). Jest to tablica jednowymiarowa, czyli tzw. wektor. Rys. 2. Wektor 5-elementowy Rys. 1. Tablice elementów w języku C Głównym celem stosowania tablic jest zastąpienie wielu zmiennych tego samego typu jedną tablicą. Każdy element tablicy ma swój numer zwany indeksem, element zerowy (znajdujący się na początku tablicy) ma indeks 0 (zero), zaś ostatni N-1, gdzie N - rozmiar tablicy. Wartość indeksu pokazuje o ile elementów jest dany element odległy od początku tablicy. Nazwa tablicy jest adresem jej zerowego elementu (o indeksie 0) w pamięci komputera. Metodyki i techniki programowania 3 z 28 Instrukcja MITP08 Metodyki i techniki programowania 4 z 28 Instrukcja MITP08

Odwołania do elementów tablicy (odczytanie lub zapisanie wartości) wykonuje się za pomocą dwuargumentowego operatora indeksowania [ ], np. tab[1] - odwołanie do elementu tablicy o indeksie 1 indeks elementu (drugi argument operatora indeksowania) nazwa tablicy (pierwszy argument operatora indeksowania) Odwołania do kolejnych elementów tablicy tab mają postać pokazaną na Rys. 3. Kompilator nie zasygnalizuje błędu, tylko w obszarze pamięci za tablicą zapisze wartość 10. Operacje na tablicach wykonywane są najczęściej przy wykorzystaniu pętli for. Załóżmy, że do wszystkich elementów tablicy tab należy zapisać wartość 10. Kod realizujący taką operację może mieć następującą postać: int tab[5]; tab[0] = 10; tab[1] = 10; tab[2] = 10; tab[3] = 10; tab[4] = 10; Rys. 3. Odwołania do elementów tablicy Zapisanie wartości 5 do elementu tablicy tab o indeksie 1 oraz odczytanie tego elementu i przypisanie jego wartości zmiennej o nazwie x: tab[1] = 5; x = tab[1]; Jako indeks może występować: - stała liczbowa, np. 0, 1, 5; - nazwa zmiennej przechowującej liczbę całkowitą, np. i, idx; - wyrażenie dające w wyniku liczbę całkowitą, np. i * j + 5; Przy odwołaniach do elementów tablicy kompilator nie sprawdza, czy zapis lub odczyt odbywa się poza obszarem pamięci przydzielonym na tablicę, np. int tab[5]; tab[5] = 10; W powyższym fragmencie programu zadeklarowano 5-elementową tablicę o nazwie tab. Odwołanie tab[5] jest błędne, gdyż nie istnieje element o indeksie 5. Można to samo zrobić znacznie prościej, stosując pętlę for: int tab[5], i; for (i=0; i<5; i++) tab[i] = 10; Zmienna i przyjmuje wartości od 0 do 4, czyli takie same jak kolejne indeksy elementów tablicy. W poniższym programie przedstawiono najczęściej wykonywane operacje na tablicy jednowymiarowej (wektorze) przechowującej liczby całkowite. Program wykonujący wybrane operacje na wektorze liczb całkowitych. #include <stdio.h> #define N 10 int main(void) int tab[n]; int i, j, min, max, suma = 0, tmp; float srednia; Metodyki i techniki programowania 5 z 28 Instrukcja MITP08 Metodyki i techniki programowania 6 z 28 Instrukcja MITP08

/* wczytanie elementow tablicy */ printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); /* wyswietlenie elementow tablicy */ printf("\nelementy tablicy:\n"); printf("%d ",tab[i]); printf("\n\n"); /* wyswietlenie tablicy w odwrotnej kolejnosci */ printf("tablica w odwrotnej kolejnosci:\n"); for (i=n-1; i>=0; i--) printf("%d ",tab[i]); printf("\n\n"); /* wyszukanie elementu o najmniejszej wartosci */ min = tab[0]; for (i=1; i<n; i++) if (tab[i]<min) min = tab[i]; printf("wartosc elementu najmniejszego: %d\n",min); /* indeksy elementow o najmniejszej wartosci */ printf("indeksy elementu najmniejszego: "); if (tab[i]==min) printf("%d ",i); printf("\n\n"); /* suma i srednia arytmetyczna elementow tablicy */ suma = suma + tab[i]; srednia = (float) suma/n; printf("suma: %d, srednia: %f\n\n",suma,srednia); /* sortowanie i wyswietlenie elementow tablicy */ for (i=0; i<n-1; i++) for (j=i+1; j<n; j++) if (tab[i] > tab[j]) tmp = tab[i]; tab[i] = tab[j]; tab[j] = tmp; printf("elementy tablicy po sortowaniu:\n"); printf("%d ",tab[i]); printf("\n"); return 0; Przykładowy wynik uruchomienia programu: Podaj liczbe nr 2: 6 Podaj liczbe nr 3: 4 Podaj liczbe nr 4: 2 Podaj liczbe nr 5: 1 Podaj liczbe nr 6: 7 Podaj liczbe nr 7: 4 Podaj liczbe nr 8: 6 Podaj liczbe nr 9: 3 Podaj liczbe nr 10: 5 Elementy tablicy: 3 6 4 2 1 7 4 6 3 5 Tablica w odwrotnej kolejnosci: 5 3 6 4 7 1 2 4 6 3 Wartosc elementu najmniejszego: 1 Indeksy elementu najmniejszego: 4 Suma: 41, srednia: 4.100000 Elementy tablicy po sortowaniu: 1 2 3 3 4 4 5 6 6 7 Metodyki i techniki programowania 7 z 28 Instrukcja MITP08 Metodyki i techniki programowania 8 z 28 Instrukcja MITP08

Rozmiar tablicy określony został przy użyciu dyrektywy preprocesora #define. #define N 10 Dzięki temu zmiana rozmiaru tablicy będzie wymagała tylko zmiany wartości w dyrektywie #define, a nie w każdym innym miejscu programu, gdzie pojawia się on. Dotyczy to zwłaszcza warunków w pętlach for. W programie wykonywane są następujące operacje na tablicy: - wczytanie elementów tablicy - w pętli for wyświetlamy komunikat Podaj liczbę nr, a następnie funkcją scanf() wczytujemy liczbę: dotychczasowego najmniejszego (min), to element ten staje się najmniejszym (min = tab[i]): min = tab[0]; for (i=1; i<n; i++) if (tab[i]<min) min = tab[i]; printf("wartosc elementu najmniejszego: %d\n",min); - wyszukanie indeksów elementu o najmniejszej wartości - przeglądamy tablicę poszukując elementów równych najmniejszemu (tab[i]==min); po znalezieniu takiego elementu wyświetlamy jego indeks czyli wartość zmiennej i: printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); printf("indeksy elementu najmniejszego: "); if (tab[i]==min) printf("%d ",i); printf("\n"); - wyświetlenie elementów tablicy w jednym wierszu: printf("elementy wektora:\n"); printf("%d ", tab[i]); - wyświetlenie elementów tablicy w odwrotnej kolejności - zmieniamy wyrażenia w pętli for, zmienna i będzie przyjmowała wartości od N-1 (ostatni element tablicy) do 0 (zerowy element tablicy): printf("tablica w odwrotnej kolejnosci:\n"); for (i=n-1; i>=0; i--) printf("%d ", tab[i]); - wyszukanie elementu o najmniejszej wartości - zakładamy, że zerowy element tablicy jest najmniejszy (min = tab[0]); przeglądamy pozostałe elementy tablicy; jeśli kolejny z elementów tablicy (tab[i]) jest mniejszy od - obliczenie sumy i średniej arytmetycznej elementów tablicy - w pętli for dodajemy kolejne elementy tablicy do zmiennej suma (przed pętlą zmienna ta musi być wyzerowana); następnie obliczamy średnią arytmetyczną dzieląc sumę przez ilość elementów (N); ponieważ suma i N są całkowite, to w celu uniknięcia dzielenia liczb całkowitych, wymuszamy zmianę typu zmiennej suma na typ float: (float) suma: suma = suma + tab[i]; srednia = (float) suma/n; printf("suma: %d, srednia: %f\n",suma,srednia); - sortowanie elementów tablicy w kolejności od najmniejszego do największego - pętla zewnętrzna określa indeks elementu (i), którego wartość jest porównywana z wartościami pozostałych elementów w tablicy (o indeksach i+1,i+2,,n-1) określanych w pętli wewnętrznej; jeśli kolejność elementów Metodyki i techniki programowania 9 z 28 Instrukcja MITP08 Metodyki i techniki programowania 10 z 28 Instrukcja MITP08

jest nieprawidłowa (tzn. tab[i] > tab[j]), to elementy te zamieniane są miejscami (tmp = tab[i]; tab[i] = tab[j]; tab[j] = tmp;): return 0; for (i=0; i<n-1; i++) for (j=i+1; j<n; j++) if (tab[i] > tab[j]) tmp = tab[i]; tab[i] = tab[j]; tab[j] = tmp; Po zakończeniu sortowania elementy tablicy są ponownie wyświetlane: printf("elementy tablicy po sortowaniu:\n"); printf("%d ",tab[i]); printf("\n"); 2.3. Generowanie pseudolosowe elementów tablicy Elementy tablicy mogą być wygenerowane pseudolosowo, co pokazuje poniższy program. Generowanie pseudolosowe elementów tablicy. #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) int tab[10], i; srand(time(null)); for (i=0; i<10; i++) tab[i] = rand(); printf("%d ",tab[i]); Do generowania pseudolosowych liczb zastosowana została funkcja rand(): tab[i] = rand(); Funkcja ta zwraca pseudolosową liczbę całkowitą z zakresu: 0 RAND_MAX (32767). Zastosowanie jej w programie wymaga dołączenia pliku nagłówkowego stdlib.h. Przed użyciem funkcji rand() należy zainicjalizować generator liczb pseudolosowych wywołując funkcję srand(): srand(time(null)); której argumentem jest liczba inicjalizująca generator. Aby zapewnić unikalność generowania kolejnych liczb do funkcji srand() przekazywana jest wartość zwracana przez funkcję time(). Zastosowanie funkcji time() wymaga dołączenia pliku nagłówkowego time.h. Ostrzeżenie kompilatora (warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data) można zlikwidować poprzez wymuszenie konwersji typu: srand((unsigned int) time(null)); Zmiana zakresu generowanych liczb odbywa się poprzez zastosowanie dzielenia modulo. Jeśli chcemy otrzymać liczby całkowite z zakresu 0 10, to wystarczy wartość zwracaną przez funkcję rand() podzielić modulo 11: int x; x = rand() % 11; Metodyki i techniki programowania 11 z 28 Instrukcja MITP08 Metodyki i techniki programowania 12 z 28 Instrukcja MITP08

Pseudolosową liczbę całkowitą z przedziału a b otrzymamy używając funkcji rand() w następujący sposób: int x; x = rand() % (b a + 1) + a; 2.4. Inicjalizacja elementów tablicy Po zadeklarowaniu tablicy wartości jej elementów są nieokreślone. 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, np. int a[3] = 5,7,1; Poszczególne elementy tablicy oddzielone są od siebie przecinkami. Jako kolejne elementy mogą występować liczby lub wyrażenia arytmetyczne. 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, np. int a[5] = 5,7,1; Jeśli wartości podanych w trakcie inicjalizacji jest więcej niż wynosi rozmiar tablicy, to kompilator zasygnalizuje błąd, np. int a[5] = 5,7,1,3,6,4; Tablica zadeklarowana bez podania rozmiaru, a zainicjalizowana ma liczbę elementów równą ilości inicjatorów, np. int a[] = 2,3,1,4; jest równoważne: int a[4] = 2,3,1,4; Poniższy program używa tablicy jednowymiarowej do zapamiętania wygenerowanych pseudolosowo, niepowtarzających się liczb całkowitych. Program generujący N niepowtarzających się liczb całkowitych. #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 6 #define ZAKRES 49 int main(void) int lotto[n]; int i, j, x, powt; srand(time(null)); do powt = 0; x = rand() % ZAKRES + 1; for (j=0; j<i; j++) if (lotto[j]==x) powt = 1; while (powt==1); lotto[i] = x; printf("wylosowane liczby: "); printf("%d ",lotto[i]); printf("\n"); return 0; Metodyki i techniki programowania 13 z 28 Instrukcja MITP08 Metodyki i techniki programowania 14 z 28 Instrukcja MITP08

Przykładowy wynik uruchomienia programu: Wylosowane liczby: 27 30 1 13 22 8 2.5. Łańcuchy znaków Łańcuch znaków (napis, stała napisowa, C-string) jest to ciąg złożony z zera lub większej liczby znaków zawartych między znakami cudzysłowu, np. "Informatyka 1" Znaki cudzysłowu nie są częścią napisu, służą jedynie do określenia jego granic. Łańcuchy znaków przechowywane są w postaci tablicy, której elementami są pojedyncze znaki (tablica elementów typu char). Ostatnim elementem tablicy jest znak o kodzie 0 (stała liczbowa 0 lub stała znakowa \0 ), oznaczający koniec napisu (Rys. 4). W większości przypadków znak ten jest dodawany automatycznie. Rozmiar fizycznej pamięci przeznaczonej na napis musi być o jeden większy niż liczba znaków zawartych między znakami cudzysłowu. Deklaracja tablicy, w której można przechowywać napisy o maksymalnej długości do 20 znaków: char txt[21]; 2.6. Inicjalizacja łańcucha znaków Deklarując łańcuch znaków możemy nadać mu wartość początkową, np. char txt[10] = "napis"; Pozostałym elementom tablicy automatycznie przypisywana jest stała liczbowa 0 czyli stała znakowa \0 (Rys. 6). Rys. 4. Tablica przechowująca tekst Informatyka 1 W rzeczywistości w tablicy zamiast znaków przechowywane są odpowiadające im kody ASCII (Rys. 5). Rys. 6. Tablica znaków po inicjalizacji Inicjalizując łańcuch znaków można również podać pojedyncze znaki umieszczone w apostrofach, np. char txt[10] = 'n','a','p','i','s'; Rys. 5. Reprezentacja znaków w tablicy Deklaracja zmiennej mogącej przechowywać napis jest podobna do deklaracji zwykłej tablicy: char nazwa[rozmiar]; lub odpowiadające im kody ASCII: char txt[10] = 110,97,112,105,115; Deklarując napis można nie określać jego długości, kompilator przydzieli wtedy automatycznie odpowiedni rozmiar pamięci (uwzględniając ostatni znak \0 ): Metodyki i techniki programowania 15 z 28 Instrukcja MITP08 Metodyki i techniki programowania 16 z 28 Instrukcja MITP08

char *txt = "napis"; Tabela 1. Wybrane kody ASCII lub char txt[] = "napis"; W powyższy sposób można nadawać wartość łańcuchowi znaków tylko przy jego deklaracji. Zatem błędny jest poniższy zapis: char txt[10]; txt = "napis"; Prawidłowy zapis wymaga wykorzystania funkcji strcpy() z pliku nagłówkowego string.h: char txt[10]; strcpy(txt,"napis"); Funkcje znajdujące się w tym pliku nagłówkowym zostały opisane w dalszej części instrukcji (Rozdział 2.9). 2.7. Stała znakowa Stała znakowa jest to liczba całkowita. Taką stałą tworzy jeden znak ujęty w apostrofy, np. x. Wartością stałej znakowej jest wartość kodu ASCII (Tabela 1). Pewne znaki niegraficzne mogą być reprezentowane w stałych znakowych przez sekwencje specjalne, które wyglądają jak dwa znaki, ale reprezentują tylko jeden znak. Należą do nich: '\n' nowy wiersz '\t' tabulator poziomy '\v' tabulator pionowy '\a' alarm '\\' \ (ang. backslash) '\'' apostrof '\"' cudzysłów '\?' znak zapytania Uwaga: zapis A oznacza jeden znak, natomiast zapis A - dwa znaki, gdyż jest to napis kończący się znakiem \0. Metodyki i techniki programowania 17 z 28 Instrukcja MITP08 Metodyki i techniki programowania 18 z 28 Instrukcja MITP08

2.8. Funkcje do wyprowadzania i wprowadzania znaków printf() Nagłówek: int printf(const char *format,...); - w funkcji printf() do wyświetlenia łańcucha znaków używamy specyfikatora formatu %s, zaś pojedynczego znaku - %c; To jest napis To jest napis To jest napis To jest napis Znaki: T o j e s t n a p i s Kody: 84 111 32 106 101 115 116 32 110 97 112 105 115 0 puts() Nagłówek: int puts(const char *s); scanf() Nagłówek: int scanf(const char *format,...); - funkcja puts() wypisuje na stdout (ekran) zawartość łańcucha znakowego (ciąg znaków zakończony znakiem \0 ), zastępując znak \0 znakiem \n, np. Program przedstawiający różne sposoby wyświetlenia łańcucha znaków. include <stdio.h> int main(void) char txt[15] = "To jest napis"; printf(txt); printf("\n"); printf("%s",txt); printf("\n"); printf("%s\n",txt); puts(txt); printf("znaki: "); for (int i=0; i<14; i++) printf("%c ",txt[i]); printf("\n"); printf("kody: "); for (int i=0; i<14; i++) printf("%d ",txt[i]); printf("\n"); return 0; Łańcuch znaków jest zwykłą tablicą - można więc odwoływać się do jej pojedynczych elementów. Wyświetlając te elementy przy zastosowaniu specyfikatora formatu %c otrzymamy znaki, zaś stosując specyfikator %d - odpowiadające im kody ASCII (liczby). Wynik uruchomienia programu: - w funkcji scanf() do wczytania łańcucha znaków używamy specyfikatora formatu %s, zaś pojedynczego znaku - %c; gets() Nagłówek: char *gets(char *s); - funkcja gets() wprowadza wiersz (ciąg znaków zakończony \n ) ze strumienia stdin (klawiatura) i umieszcza w obszarze pamięci wskazywanym przez wskaźnik s zastępując \n znakiem \0. Wczytanie tekstu funkcją scanf() ma następującą postać: char txt[15]; scanf("%s",txt); Zmienna txt jest tablicą. Nazwa tablicy jest adresem jej początku w pamięci komputera. Z tego względu przed txt nie występuje znak &. Funkcja scanf() kończy wczytywanie danych po wystąpieniu pierwszego tzw. białego znaku (spacja, tabulacja, enter). Jeśli w powyższym przykładzie użytkownik wprowadzi tekst: To jest napis, to scanf() zapamięta tylko pierwszy wyraz To. Zapamiętanie całego wiersza tekstu (do naciśnięcia klawisza Enter) wymaga użycia funkcji gets(): char txt[15]; gets(txt); Metodyki i techniki programowania 19 z 28 Instrukcja MITP08 Metodyki i techniki programowania 20 z 28 Instrukcja MITP08

2.9. Funkcje z pliku nagłówkowego string.h Plik nagłówkowy string.h definiuje funkcje do wykonywania operacji na łańcuchach znaków i tablicach. strlwr() Nagłówek: char *strlwr(char *s); - funkcja strlwr() zamienia w łańcuchu s duże litery na małe; strlen() Nagłówek: size_t strlen(const char *s); strrev() Nagłówek: char *strrev(char *s); - funkcja strlen() zwraca długość łańcucha znaków; - nie bierze pod uwagę znaku \0 ; - funkcja strrev() odwraca kolejność znaków w łańcuchu s; strset() Nagłówek: char *strset(char *s, int c); strcpy() Nagłówek: char *strcpy(char *s1, const char *s2); - funkcja strset() wypełnia łańcuch s znakiem c; - funkcja strcpy() kopiuje łańcuch s2 do łańcucha s1; strstr() Nagłówek: char *strstr(const char *s1, const char *s2); strcat() Nagłówek: char *strcat(char *s1, const char *s2); - funkcja strcat() dołącza do łańcucha s1 łańcuch s2; strchr() Nagłówek: char *strchr(const char *s, int c); - funkcja strchr() przeszukuje łańcuch s w celu znalezienia pierwszego wystąpienia znaku c; - zwraca wskaźnik do znalezionego znaku lub NULL, jeśli znak nie został znaleziony; - funkcja strstr() przeszukuje łańcuch s1 w celu odnalezienia podłańcucha s2 zwracając wskazanie do elementu łańcucha s1, od którego zaczynają się znaki takie same jak w łańcuchu s2, lub NULL, gdy s2 nie występuje w s1; strupr() Nagłówek: char *strupr(char *s); - funkcja strupr() zamienia w łańcuchu s litery małe na duże. Poniższy program pokazuje przykładowe wykorzystanie funkcji z pliku nagłówkowego string.h. strcmp() Nagłówek: int strcmp(const char *s1, const char *s2); Przykładowe operacje na łańcuchu znaków. - funkcja strcmp() porównuje łańcuchy s1 i s2 z rozróżnianiem wielkości liter, - zwraca 0, gdy s1=s2, wartość mniejszą od zera, gdy s1<s2 i wartość większą od zera, gdy s1>s2; strcmpi() Nagłówek: int strcmpi(const char *s1, const char *s2); - funkcja strcmpi() działa jak strcmp(), ale bez rozróżniania wielkości liter; #include <stdio.h> #include <string.h> int main(void) char napis1[] = "Tekst w buforze"; char napis2[20]; int dlugosc; Metodyki i techniki programowania 21 z 28 Instrukcja MITP08 Metodyki i techniki programowania 22 z 28 Instrukcja MITP08

printf("napis1: %s \n",napis1); dlugosc = strlen(napis1); printf("liczba znakow w napis1: %d \n",dlugosc); strupr(napis1); printf("napis1 (duze litery): %s \n",napis1); strlwr(napis1); printf("napis1 (male litery): %s \n",napis1); strcpy(napis2,napis1); printf("napis2: %s \n",napis2); strrev(napis2); printf("napis2 (odwrocony): %s \n",napis2); return 0; W wyniku uruchomienia programu na ekranie pojawi się: napis1: Tekst w buforze liczba znakow w napis1: 15 napis1 (duze litery): TEKST W BUFORZE napis1 (male litery): tekst w buforze napis2: tekst w buforze napis2 (odwrocony): ezrofub w tsket 3. Przebieg ćwiczenia Na pracowni specjalistycznej należy wykonać wybrane zadania wskazane przez prowadzącego zajęcia. W różnych grupach mogą być wykonywane różne zadania. 1. Tablica U przechowuje wyniki N-pomiarów wartości chwilowych napięcia na pewnym dwójniku RLC (przyjmij N nie mniejsze niż 15). Napisz program który: - zapisze do tablicy U wartości chwilowe napięcia zgodnie ze wzorem: U[i] = 10.0*sin((i+5.0)/5.0); (1) - wyświetli na ekranie zapisane wartości chwilowe napięcia, - obliczy i wyświetli największą, najmniejszą i średnią wartość napięcia, - obliczy i wyświetli liczbę pomiarów, dla których wartość chwilowa napięcia była większa od wartości średniej, - zastąpi w tablicy U wszystkie ujemne wartości napięcia wartością zero i ponownie wyświetli wartości elementów tablicy. 2. W pomieszczeniu przeprowadzono pomiar temperatury. Temperaturę mierzono co godzinę (od godz. 0 do 23). Wyniki pomiarów umieszczono w tablicy T. Indeksy elementów tablicy określają jednocześnie godzinę pomiaru. Zakładamy, że wyniki pomiarów nie powtarzają się. Napisz program który: - zapisze do tablicy T wartości temperatury zgodnie ze wzorem (dla i = 0...23): T[i] = sin(i/8.0-10)*cos(i/8.0-10)*30+10; (2) - wyświetli na ekranie zapisane wartości temperatury, - poda godzinę, o której temperatura była najwyższa oraz godzinę, o której temperatura była najniższa w ciągu całej doby, - obliczy i wyświetli średnią temperaturę w ciągu doby, - obliczy i wyświetli największą różnicę temperatur, - poda informację, czy temperatura w ciągu doby spadła poniżej zera stopni, czy też nie spadła poniżej zera stopni. 3. Dane są dwa N-elementowe wektory A i B zawierające wygenerowane pseudolosowo liczby całkowite z zakresu 0, 99 : - utwórz wektor C zawierający na odpowiedniej pozycji większy z elementów wektorów A i B, - utwórz wektor D będący sumą wektorów A i B, - oblicz i wyświetl iloczyn skalarny wektorów A i B. Rozmiar wektorów (N) zadeklaruj jako stałą (#define). Wyświetl wektory A, B, C i D. 4. Napisz program, który dla N-elementowego wektora liczb całkowitych wygeneruje pseudolosowo elementy z zakresu 0, 10, wyświetli zawartość wektora oraz obliczy ile razy każda liczba występuje w wektorze. Metodyki i techniki programowania 23 z 28 Instrukcja MITP08 Metodyki i techniki programowania 24 z 28 Instrukcja MITP08

5. Napisz program, który do 10-elementowej tablicy liczb całkowitych zapisze wygenerowane pseudolosowo liczby z zakresu 0, 9. Liczby nie mogą powtarzać się. Wyświetl zawartość tablicy. Podaj ile razy generowano liczbę dla kolejnego elementu tablicy. 6. Napisz program, który podaną przez użytkownika dodatnią liczbę całkowitą wyświetli w postaci liczby w systemie dwójkowym. 7. Napisz program wyświetlający dla zadanego x (całkowitego, dodatniego) wczytanego z klawiatury, wszystkie liczby od 0 do x w kodzie dwójkowym w postaci: 0 --> 0 1 --> 1 2 --> 10 3 --> 11 4 --> 100... 8. Napisz program zamieniający liczbę dwójkową na liczbę dziesiętną. Liczbę dwójkową wczytaj z klawiatury jako napis. 9. Napisz program wyświetlający na ekranie kolejne kody ASCII (od 30 do 254) oraz odpowiadające im znaki. Przykładowy fragment wydruku: 91 - [ 92 - \ 93 - ] 94 - ^ 95 - _ 96 - ` 97 - a 98 - b 99 c 101 - e 102 - f 103 - g 104 - h 105 - i 106 - j 107 - k 108 - l 109 m 111 - o 112 - p 113 q 10. Napisz program, który wczytuje tekst z klawiatury (jeden wiersz), a następnie usuwa wszystkie znaki spacji znajdujące się na początku tekstu i na jego końcu, np. " Ala ma kota " "Ala ma kota" 11. Napisz program, który będzie wczytywał, wyświetlał i zliczał znaki dopóki nie zostanie wczytany znak @. Wyświetl na koniec liczbę wczytanych znaków. 12. Napisz program, który będzie wczytywał ciąg znaków składający się z zer i jedynek. Następnie program powinien wyznaczyć liczbę serii w ciągu. Seria w ciągu, to podciąg złożony z jednego lub kilku takich samych znaków. Przykładowe wywołanie programu: Podaj ciag: 0011101010011 Liczba serii: 8 4. Literatura [1] Kernighan B.W., Ritchie D.M.: Język ANSI C. Programowanie. Wydanie II. Helion, Gliwice, 2010. [2] Prata S.: Język C. Szkoła programowania. Wydanie V. Helion, Gliwice, 2006. [3] King K.N.: Język C. Nowoczesne programowanie. Wydanie II. Helion, Gliwice, 2011. [4] Summit S.: Programowanie w języku C. FAQ. Helion, Gliwice, 2003. [5] Wileczek R.: Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows. Helion, Gliwice, 2009. [6] http://www.cplusplus.com/reference/cstring/ - C++ Reference 5. Zagadnienia na zaliczenie 1. Omów sposób deklarowania tablic jednowymiarowych (wektorów) w języku C oraz odwoływania się do elementów tych tablic. 2. Wyjaśnij, jak odszukać w tablicy jednowymiarowej element o najmniejszej i element o największej wartości. 3. W jaki sposób w języku C można generować pseudolosowe liczby całkowite i rzeczywiste z określonego zakresu? 4. Opisz inicjalizację elementów tablicy jednowymiarowej. 5. Opisz sposób przechowywania napisów (tekstów) w języku C. 6. Przedstaw sposoby inicjalizacji tablicy znaków. Metodyki i techniki programowania 25 z 28 Instrukcja MITP08 Metodyki i techniki programowania 26 z 28 Instrukcja MITP08

7. Scharakteryzuj funkcje znajdujące się w pliku nagłówkowym string.h. 6. Wymagania BHP Warunkiem przystąpienia do praktycznej realizacji ćwiczenia jest zapoznanie się z instrukcją BHP i instrukcją przeciw pożarową oraz przestrzeganie zasad w nich zawartych. W trakcie zajęć laboratoryjnych należy przestrzegać następujących zasad. - Sprawdzić, czy urządzenia dostępne na stanowisku laboratoryjnym są w stanie kompletnym, nie wskazującym na fizyczne uszkodzenie. - Jeżeli istnieje taka możliwość, należy dostosować warunki stanowiska do własnych potrzeb, ze względu na ergonomię. Monitor komputera ustawić w sposób zapewniający stałą i wygodną obserwację dla wszystkich członków zespołu. - Sprawdzić prawidłowość połączeń urządzeń. - Załączenie komputera może nastąpić po wyrażeniu zgody przez prowadzącego. - W trakcie pracy z komputerem zabronione jest spożywanie posiłków i picie napojów. - W przypadku zakończenia pracy należy zakończyć sesję przez wydanie polecenia wylogowania. Zamknięcie systemu operacyjnego może się odbywać tylko na wyraźne polecenie prowadzącego. - Zabronione jest dokonywanie jakichkolwiek przełączeń oraz wymiana elementów składowych stanowiska. - Zabroniona jest zmiana konfiguracji komputera, w tym systemu operacyjnego i programów użytkowych, która nie wynika z programu zajęć i nie jest wykonywana w porozumieniu z prowadzącym zajęcia. - W przypadku zaniku napięcia zasilającego należy niezwłocznie wyłączyć wszystkie urządzenia. - Stwierdzone wszelkie braki w wyposażeniu stanowiska oraz nieprawidłowości w funkcjonowaniu sprzętu należy przekazywać prowadzącemu zajęcia. - Zabrania się samodzielnego włączania, manipulowania i korzystania z urządzeń nie należących do danego ćwiczenia. - W przypadku wystąpienia porażenia prądem elektrycznym należy niezwłocznie wyłączyć zasilanie stanowiska. Przed odłączeniem napięcia nie dotykać porażonego. Metodyki i techniki programowania 27 z 28 Instrukcja MITP08 Metodyki i techniki programowania 28 z 28 Instrukcja MITP08