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

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

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

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

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

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

. Podstawy Programowania 1. Łańcuchy znaków. Arkadiusz Chrobot. 25 listopada 2015

#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 ); }

Inicjacja tablicy jednowymiarowej

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

#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 ); }

Tablice, funkcje - wprowadzenie

tablica: dane_liczbowe

Podstawy programowania 1

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

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

Tablice deklaracja, reprezentacja wewnętrzna

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

KURS C/C++ WYKŁAD 1. Pierwszy program

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

Język C, tablice i funkcje (laboratorium)

lekcja 8a Gry komputerowe MasterMind

2 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania w języku C++

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

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

1 Podstawy c++ w pigułce.

Lab 9 Podstawy Programowania

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

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

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

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

Podstawy programowania

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

Podstawy Programowania C++

Programowanie strukturalne i obiektowe

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

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

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

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

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

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

1. Wprowadzanie danych z klawiatury funkcja scanf

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

W języku C/C++ pomiędzy wskaźnikami a tablicami istnieje bardzo ścisły związek. Do onumerowania elementów w tablicy służą tzw. INDEKSY.

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

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

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

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

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

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

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

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

Wstęp do Programowania, laboratorium 02

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

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

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

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

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.

Wskaźniki w C. Anna Gogolińska

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Wykład 6. Operacje na łańcuchach znakowych

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

1 Podstawy c++ w pigułce.

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

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

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

Wstęp do programowania. Wykład 1

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

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

Podstawowe typy zmiennych

Laboratorium 2: Pętle i instrukcje warunkowe. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

VII. Ciągi znaków łańcuchy

Wstęp do programowania

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Biblioteka standardowa - operacje wejścia/wyjścia

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

Wprowadzenie do programowania w języku C

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

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

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

Podstawy Programowania

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

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

Struktury, unie, formatowanie, wskaźniki

INFORMATYKA Studia Niestacjonarne Elektrotechnika

IX. Wskaźniki.(3 godz.)

Laboratorium 1: Podstawy języka c. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Język C zajęcia nr 11. Funkcje

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

Warsztaty dla nauczycieli

Transkrypt:

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

1. Wprowadzenie Pierwsza część instrukcji zawiera informacje o sposobie tworzenia i korzystania z tablic w języku c. Druga część poświęcona jest zmiennym, które służą do przechowywania łańcuchów znaków w tym języku, a ostania traktuje o funkcjach umożliwiających wykonywanie operacji na tych łańcuchach. 2. Tablice Tablice należą do podstawowych struktur danych, dlatego są dostępne w większości współczesnych języków programowania. Język c nie jest tutaj wyjątkiem. W tym rozdziale zostaną opisane zasady posługiwania się tablicami w tym języku. 2.1. Tworzenie tablic Tablicę w języku c deklarujemy podając najpierw typ jej elementów, potem jej nazwę, a na końcu, w nawiasach kwadratowych umieszczamy liczbę jej elementów. Deklaracja tablicy kończy się znakiem średnika. Istnieje także możliwość stworzenia tablicy zainicjowanej. W jej deklaracji nawiasy kwadratowe możemy pozostawić puste. Po nich umieszczamy instrukcję przypisania i w nawiasach klamrowych wymieniamy wartości elementów, które rozdzielamy przecinkami. Tablica będzie miała tyle elementów, ile podamy wartości. Tablice wielowymiarowe tworzymy podając kilka par nawiasów kwadratowych za nazwą tablicy, a w nich odpowiednie liczby elementów. Można również tworzyć zainicjowane tablice wielowymiarowe. Przykłady deklaracji tablic podano w listingu 1. Tablice mogą być tworzone zarówno jako zmienne lokalne, jak i globalne. #define N 10 // Definicja stałej o nazwie N i wartości 10. int t[n]; // Tablica o dziesięciu elementach typu int. int tablica[3]; // Tablica o trzech elementach typu int. char tab[3][3]; // Tablica dwuwymiarowa o dziewięciu elementach (3x3) typu char. double ulamki[] = {0.1, 0.2, 0.3}; // Tablica zainicjowana o trzech elementach // typu double. double ulamki2[3] = {0.1, 0.2, 0.3}; // Jak wyżej, ale tym razem podajemy liczbę // elementów należących do tablicy. int macierz[][3] = {{1,2,3},{4,5,6},{7,8,9}}; // Zainicjowana tablica dwuwymiarowa (3x3). W deklaracji możemy opuścić tylko // jeden wymiar, pozostałe należy podać. Dodatkowe pary nawiasów klamrowych, // wewnątrz pierwszej pary, nie są konieczne. Listing 1: Deklaracje tablic 2.2. Dostęp do elementów tablicy W języku c elementy tablicy indeksowane są zawsze od zera, a indeks ostatniego elementu jest równy liczbie elementów tablicy pomniejszonej o jeden. Standard c99 dopuszcza użycie ujemnych liczb całkowitych do indeksowania tablic. Aby takie indeksy były użyte prawidłowo należy użyć ich razem ze wskaźnikiem na tablicę, który nie wskazuje na jej pierwszy element. Związki między wskaźnikami i tablicami zostaną opisane w przyszłych instrukcjach. Należy też wiedzieć, że kompilator nie sprawdza zakresu wartości indeksów. Listing 2 zawiera kilka przykładów. 1

#define N 10 int a[n]; int i; for(i=0;i<n;i++) scanf("%d",&a[i]); int m[2][3]; m[1][2] = 4; m[0][0] = a[0]; Listing 2: Sposoby dostępu do elementów tablicy 2.3. Parametry tablic Wielkość tablicy, czyli liczbę bajtów zajmowanych przez nią w pamięci możemy wyznaczyć za pomocą operatora sizeof. Liczbę elementów tablicy możemy obliczyć dzieląc jej rozmiar przez wielkość pierwszego elementu (jego indeks zawsze wynosi zero). Listing 3 zawiera odpowiednie przykłady. Należy pamiętać, że w przypadku funkcji, które będą opisane w kolejnych instrukcjach, te rozwiązania nie działają poprawnie. int a[10]; int b = sizeof(a); //lub 10*sizeof(int); int c = sizeof(a)/sizeof(a[0]); // Obliczenie liczby elementów tablicy. Listing 3: Wyznaczanie rozmiaru tablic 3. Łańcuchy znaków Język c nie posiada osobnego typu o nazwie string. Zamiast tego pozwala on przechowywać ciągi (łańcuchy) znaków w tablicach elementów typu char. Należy pamiętać, że taka tablica musi mieć o jeden element więcej niż jest znaków w łańcuchu, który chcemy w niej przechować. Dodatkowe miejsce jest potrzebne do zapamiętania znaku o kodzie ascii równym zero, zapisywanym w języku c jako '\0', który oznacza koniec ciągu znaków. Takie tablice mogą być tworzone jako tablice zainicjowane. Listing 4 zawiera kilka przykładów. char ciag[] = {'P','r','z','y','k','ł','a','d','\0'}; char ciag1[] = "Przykład"; // Tekst podany w~cudzysłowie jest traktowany jako // łańcuch znaków i nie wymaga podawania znaku // końca ciągu. char ciag2[10]; // Niezainicjowana tablica znaków, która może pomieścić łańcuchy // o długości maksymalnie dziewięciu znaków. Listing 4: Tablice znaków 2

3.1. Operacje na łańcuchach Tablice w języku c są zrealizowane jako wskaźniki na obszary pamięci mogące pomieścić określoną liczbę elementów danego typu. W tej instrukcji ta cecha tablic nie będzie głębiej analizowana, jednakże ma ona pewne konsekwencje, które są szczególnie widoczne w przypadku tablic znaków. Do każdego elementu takiej tablic możemy dostać się tak samo jak do elementu w zwykłej tablicy, ale nie możemy łączyć ze sobą łańcuchów znaków za pomocą operatora + lub porównywać ich za pomocą operatora == 1. Standardowa biblioteka języka c dostarcza funkcji, które umożliwiają wykonanie takich operacji. Zacznijmy jednak od wczytania ciągu znaków z klawiatury i wypisania go na ekran. Możemy wydrukować łańcuch znaków na ekranie za pomocą funkcji puts() lub printf(). Listing 5 zawiera trzy przykłady. puts("ala ma kota."); printf("ala ma kota.\n"); char ciag[] = "Ala ma kota."; puts(ciag); printf("%s\n",ciag); Listing 5: Wypisanie łańcucha znaków na ekran W funkcji printf() do wypisania zawartości zmiennej będącej tablicą znaków został użyty ciąg formatujący %s. Tego samego ciągu można użyć do wprowadzania łańcucha z klawiatury przy pomocy funkcji scanf(), ale tak użyta funkcja scanf() będzie wczytywała ciąg do napotkania pierwszego znaku białego (np. w przypadku ciągu Ala ma kota. wczyta tylko Ala ). Aby wczytać cały ciąg, należy użyć wzorców regularnych i przekazać funkcji, że ma czytać wszystkie znaki oprócz znaku końca wiersza ( \n ), który generowany jest przez klawisz Enter. Można też użyć w tym celu funkcji fgets() 2. Przyjmuje ona trzy argumenty wywołania: tablicę znaków, maksymalny rozmiar wprowadzanego łańcucha oraz zmienną stdin będącą strumieniem standardowego wejścia, czyli połączeniem z klawiaturą. Listing 6 zawiera odpowiednie przykłady. char str[40]; scanf("%s",str); // Wczytanie ciągu do pierwszego napotkanego znaku białego. while(getchar()!='\n'); // Wyczyszczenie strumienia wejściowego. scanf("%[^\n]s",str); // Wczytanie całego ciągu znaków. while(getchar()!='\n'); // Wyczyszczenie strumienia wejściowego. fgets(str,40,stdio); // Wczytanie całego ciągu znaków. Listing 6: Wprowadzanie ciągu znaków z klawiatury Należy zauważyć, że w funkcji scanf() drugi argument (zmienna string) nie jest poprzedzona operatorem, który zwraca jej adres (znak &). Dzieje się tak, ponieważ jako drugi argument wywołania ta funkcja przyjmuje adres zmiennej do której ma zapisać wartość, a ponieważ nazwa tablicy sama w sobie jest wskaźnikiem, który zawiera taki adres, więc nie należy używać operatora & w stosunku do niej. Zapis [^\n] informuje funkcję scanf(), że ma akceptować wszystkie znaki poza znakiem nowego wiersza. W nawiasach kwadratowych umieszczany jest zbiór znaków, które mają być zaakceptowane, a znak ^ oznacza wszystkie, oprócz. Funkcje wykonujące inne operacje na łańcuchach znaków dostępne są po włączeniu do programu pliku nagłówkowego strings.h lub string.h. Spis wszystkich podprogramów, które dostarczają te pliki otrzymujemy po wydaniu polecania man string w terminalu. Tabela 1 zawiera wykaz kilku z najczęściej używanych. Używając funkcji, które modyfikują zawartość zmiennych (np. dodają do ciągu nowe znaki lub kopiują ciągi znaków) należy pamiętać, że nie sprawdzają one pojemności zmiennych do 1 Dokładniej rzecz ujmując, można za pomocą tego operatora porównywać jedynie adresy takich tablic, ale nie ich zawartość. 2 Dostępna jest także funkcja gets(), ale jej użycie nie jest zalecane. 3

których zmodyfikowane ciągi są zapisywane. Trzeba być ostrożnym, aby nie zapisywać danych poza zmienną. Przykład użycia int dl = strlen(str); int cmp = strcmp(str1,str1); int cmp = strncmp(str1,str2,n); strcpy(str1,str2); strncpy(str1,str2,n); strcat(str1,str2); strncat(str1,str2,n); Opis działania Zwraca długość ciągu znaków zapisanego w zmiennej przekazanej jej przez parametr. Nie uwzględnia znaku końca ciągu, czyli '\0'. Porównuje dwa łańcuchy znaków. Może być używana w instrukcjach warunkowych i pętlach while oraz do while. Zwraca wartość zero jeśli łańcuchy są identyczne, wartość mniejszą od zera, jeśli łańcuch pierwszy jest mniejszy od drugiego, lub dodatnią jeśli jest odwrotnie. Jak wyżej, ale porównuje tylko n pierwszych znaków. Z tego względu jest uważana za bezpieczniejszą w użyciu niż strcmp(). Kopiuje łańcuch będący drugim argumentem jej wywołania do zmiennej będącej pierwszym argumentem wywołania. Zmienna ta powinna być wystarczająco pojemna, żeby pomieścić cały łańcuch wraz ze znakiem końca. Zwraca wskaźnik do skopiowanego łańcucha, ale najczęściej ta wartość jest ignorowana. Jak wyżej, ale ogranicza kopiowanie do n początkowych znaków. Dołącza do łańcucha zapisanego w pierwszym argumencie wywołania łańcuch z drugiego argumentu. Jak wyżej, ale ogranicza się do n znaków drugiego łańcucha. Tabela 1: Wybrane funkcje z pliku string.h 4