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

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

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

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

Wprowadzenie do tablic znaków (łańcuchów) w ANSI C

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

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 - ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF10Z

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

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

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

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

dr inż. Jarosław Forenc

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

Programowanie Proceduralne

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

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Podstawy programowania 1

Podstawy Programowania

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

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

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

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

Programowanie w C Typ wskaźnikowy do typu znakowego i operacje na łańcuchach

Podstawy programowania w języku C++

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

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

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

Tablice deklaracja, reprezentacja wewnętrzna

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

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

Reprezentacja symboli w komputerze. Znaki alfabetu i łańcuchy znakowe. Programowanie Proceduralne 1

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

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

Podstawy programowania

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

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

JĘZYK C - TABLICE DWUWYMIAROWE,

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

1. Wprowadzanie danych z klawiatury funkcja scanf

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

Programowanie w językach wysokiego poziomu

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

Tablice, funkcje - wprowadzenie

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

2 Przygotował: mgr inż. Maciej Lasota

Wprowadzenie do programowania w języku C

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

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

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

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

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

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Łańcuchy znaków. Agnieszka Nowak - Brzezińska

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

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

Tablice wielowymiarowe. Przykład tablica 2-wymiarowa. Przykład. Przykład 3-wymiarowy. Tak naprawdę nie istnieją w C! Rozważmy tablicę o rozmiarze 3x2

Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych

Podstawy programowania w języku C++

Operacje na łańcuchach znaków

Biblioteka standardowa - operacje wejścia/wyjścia

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

Argumenty wywołania programu, operacje na plikach

Reprezentacja symboli w komputerze.

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

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

Reprezentacja symboli w komputerze.

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

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

Wyklad 7 Funkcje (c.d.). Tablice jednowymiarowe znaków

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

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

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

7 Przygotował: mgr inż. Maciej Lasota

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

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

Programowanie Proceduralne

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Inicjacja tablicy jednowymiarowej

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

main() { float promien=p,wysokosc=h,objetosc; float objetosc_walca(float promien, float wysokosc);

Podstawy Programowania. Przetwarzanie napisów, drzewa binarne

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!

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

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

Podstawy Programowania

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Podstawy Programowania. Przetwarzanie napisów, drzewa binarne

Wstęp do programowania

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

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

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

Programowanie strukturalne i obiektowe

Podstawy programowania w języku C++

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

Część 4 życie programu

Transkrypt:

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

Język C tablice znaków Tablice znaków (łańcuchy) Tablice znaków stanowią specjalny rodzaj tablic o budowie ułatwiającej przetwarzanie tekstów. Przetwarzanie obejmuje szereg operacji takich jak tworzenie, modyfikację i przeszukiwanie. Tablice znakowe mogą być definiowane w sposób następujący: char s1[5]; char s2[5]="abcd"; char s3[ ]="abcd"; Definicje tablic s2 i s3 zawierają też inicjalizację. Tablice znaków zakończone są znakiem \0. Znak ten umożliwia wykrycie końca tablicy, a tym samym umożliwia traktowanie tablic znaków w nieco inny sposób niż zwykłych tablic.

Budowa tablicy znaków Przykładowo, tablica s2 ma następującą budowę: 'A' 'B' 'C' 'D' '\0' Tak więc definiując tablicę znakową należy przewidzieć jedną komórkę na znak końcowy \0.

Stałe łańcuchowe i wskaźniki do znaków cz. 1 Stałe łańcuchowe ( stałe typu tablica znaków), np. "Tekst", są przechowywane w pamięci jako tablice znaków z ostatnim elementem równym \0. Stała "Tekst" jest typu char *, czyli wskaźnik do znaku. Wskaźnik do znaku może więc zostać zainicjowany stałą łańcuchową char *ps="tekst"; // sposób 1 Inicjalizacja taka jest równoważna parze instrukcji char *ps;// sposób 2 ps="tekst"; W przypadku sposobu 1 do wskaźnika ps jest przypisywany wskaźnik do tablicy znaków, a nie do *ps ( czyli nie do miejsca wskazywanego przez ps).

Stałe łańcuchowe i wskaźniki do znaków cz. 2 Warto też zauważyć, że przy definicji tablicy znakowej char s2[5]; nie jest możliwa realizacja przypisania w programie s2="abcd" ;// przypisanie błędne Wynika to z faktu, że s2 jako nazwa tablicy jest typu stały wskaźnik do znaku, który to wskaźnik nie może być zmieniony poprzez przypisanie.

Wczytywanie i drukowanie tablic znakowych cz.1 W języku C istnieje specjalny deskryptor formatu %s umożliwiający wczytywanie i drukowanie tablic znakowych przy użyciu funkcji scanf i printf, istnieją też inne funkcje biblioteczne realizujące te operacje. Jeśli zdefiniowano tablicę znakową char s1[5]; można ją wczytać i wydrukować w poniższy sposób: printf("\n Podaj lancuch :"); scanf("%s",s1); // nie stosuje się znaku & przed // s1, gdyż s1 jest wskaźnikiem. printf("\n Wczytany lancuch to :%s ", s1);

Wczytywanie i drukowanie tablic znakowych cz.2 Jednak wczytywanie łańcuchów przy użyciu funkcji scanf nie pozwala na wczytanie łańcuchów zawierających spacje, gdyż wczytywanie łańcucha jest przerywane po napotkaniu spacji. Dla takich łańcuchów należy zastosować funkcję gets lub też funkcję fgets. Funkcja gets ma następujący prototyp: char* gets(char *s);

Wczytywanie i drukowanie tablic znakowych cz.3 Opis działania funkcji gets: Funkcja wczytuje znaki ze standardowego wejścia ( stdin) aż do momentu napotkania znaku nowej linii (Enter). Wczytywane znaki są wyświetlane na ekranie i zapamiętywane począwszy od miejsca wskazywanego przez argument funkcji, s. Znak nowej linii jest zastępowany w łańcuchu znakiem końca łańcucha '\0'. Ciąg wejściowy może zawierać pewne białe znaki (np. spacje lub znaki tabulacji poziomej). Funkcja zwraca s, gdy operacja się powiodła lub NULL w przypadku wystąpienia błędu.

Wczytywanie i drukowanie tablic znakowych cz.4 Długość wczytywanego ciągu znaków nie jest ograniczana, co przy ciągach dłuższych niż to wynika z argumentu funkcji gets, może powodować uszkodzenie sąsiednich obszarów pamięci. Przykład. char lan [20]; printf ("\n Podaj lancuch:"); gets(lan); Bardziej uniwersalną funkcją służącą do wczytywania łańcuchów jest fgets..

Wczytywanie i drukowanie tablic znakowych cz.5 Funkcja fgets ma nastepujący prototyp: char *fgets(char *s, int n, FILE *stream); Funkcja ta czyta do łańcucha s znaki ze strumienia wejściowego (pliku) określonego przez wskaźnik stream. Funkcja kończy wczytywanie znaków po przeczytaniu n - 1 znaków lub też po pojawieniu się znaku nowej linii i wpisuje znak nowej linii do do łańcucha. Zwraca łańcuch lub NULL w przypadku pojawienia się końca pliku lub błędu. Przykład. Wczytywanie ze standardowego strumienia wejściowego. char lan [20]; printf ("\n Podaj lancuch:"); fgets(lan,15,stdin);

Wczytywanie drukowanie tablic znakowych cz.6 Do drukowania tablic znakowych poza funkcją printf można zastosować funkcje puts i fputs. Prototyp funkcji puts ma postać int puts (const char *s); Funkcja wyprowadza łańcuch na wyjście standardowe (stdout) i dołącza znak nowej linii. W przypadku pomyślnej realizacji funkcja zwraca wartość nieujemną, w przeciwnym przypadku EOF. int fputs(const char *s, FILE *stream); Funkcja zapisuje łańcuch s do do strumienia wyjściowego określonego przez wskaźnik stream. Funkcja nie zapisuje do pliku znaku '\0'. W przypadku powodzenia operacji funkcja zwraca wartość nieujemną, w przypadku błędu wartość EOF.

Przykład. Zastosowanie funkcji fputs do wydruku w standardowym strumieniu wyjściowym (stdout). #include <stdio.h> #include <string.h> int main(int argc, char **argv) } { char s1[10]="abcde"; char s2[10]="abcde"; fputs(s1,stdout); fputc('\n',stdout);// dodanie znaku nowej linii fputs(s2,stdout); fputc('\n',stdout);// wyprowadzenie znaku nowej linii system ("pause");

Standardowe funkcje łańcuchowe cz. 1 Poniżej omówione zostaną wybrane najczęściej spotykane funkcje związane z przetwarzaniem łańcuchów (pełny zestaw w <string.h> i <stdlib.h>, opisano je też w materiale TabliceZnakowe.pdf. Funkcje te to: strlen, strcpy, strcat, strcmp, strlwr, strupr, atoi, itoa, strchr, strstr. Funkcja strlen size_t strlen(const char *s); Funkcja oblicza długość łańcucha s bez końcowego znaku '/0'. Przykład. Zastosowanie funkcji strlen do wyznaczania długości łańcucha. char s[10]="12345678"; int dl; dl=strlen(s);// dl będzie równe 8

Funkcja strcpy Standardowe funkcje łańcuchowe cz. 2 char *strcpy(char *dest, const char *src); Kopiuje łańcuch src do łańcucha dest. Kopiowanie ulega zakończeniu po skopiowaniu znaku '\0' kończącego łańcuch src. Funkcja zwraca wskaźnik dest. Przykład. #include <stdio.h> #include <string.h> int main(void) { char lan1[10="abc"; char lan2[ ]= "12345"; strcpy(lan1, lan2);// kopiowanie łańcuchów printf("%s", lan1); return 0; }

Funkcja strcat char *strcat(char *dest, const char *src); Dołącza łańcuch src do końca łańcucha dest. Funkcja zwraca wskaźnik dest. Długość połączonego łańcucha jest równa strlen(dest)+strlen(src). Przykład. #include <stdio.h> #include <string.h> int main(void) { char lan1[20]="abcde"; char lan2[ ]= "123456789"; strcat(lan1, lan2); printf("%s", lan1); return 0; } Standardowe funkcje łańcuchowe cz. 3

Standardowe funkcje łańcuchowe cz. 4 Funkcja strcmp int strcmp(const char *s1, const char *s2); Porównuje łańcuch s1 z łańcuchem s2, porównując kody znaków (np. kody ASCII) obu łańcuchów. Porównanie kończy się, gdy w jednym z łańcuchów zostanie napotkany znak o większym kodzie lub też zostanie osiągnięty koniec jednego z łańcuchów ( wtedy dłuższy łańcuch uważany jest za większy). Funkcja zwraca - wartość < 0, gdy s1<s2, - wartość 0, gdy s1==s2, - wartość > 0, gdy s1>s2.

Standardowe funkcje łańcuchowe cz. 5 Przykład. Zastosowanie funkcji strcmp. #include <stdio.h> #include <string.h> int main(void) { char lan1[10]="abcde",lan2[10 ]; int p; printf(" Podaj lancuch:"); scanf("%s", lan2); p= strcmp(lan1,lan2); if (p<0) printf(" lan1<lan2"); else printf("\n lan1=lan2"); else printf("\n lan1>lan2"); getchar(); return 0; } if ( p==0)

Standardowe funkcje łańcuchowe cz. 6 Funkcja strlwr char *strlwr(char *s); Zamienia w łańcuchu duże litery na małe, innych znaków nie zmienia. Np. jeśli łańcuch lan1 ma postać char lan1[ ]="String ABC"; to po wykonaniu instrukcji strlwr(lan1); lan1 ulega zmianie na łańcuch "string abc".

Standardowe funkcje łańcuchowe cz. 7 Funkcja strupr char *strupr(char *s); Zamienia w łańcuchu małe litery na duże, innych znaków nie zmienia. Jeśli np. łańcuch lan2 ma postać char lan2[ ]="lancuch abc"; to po wykonaniu instrukcji strupr(lan2); lan2 ulega zmianie na łańcuch "LANCUCH ABC"

Funkcja atoi int atoi(const char *s); Funkcja atoi zamienia łańcuch będący argumentem funkcji na liczbę całkowitą, rozpoznaje ona (w zadanym porządku) - opcjonalny łańcuch znaków tabulacji i spacji - opcjonalny znak - łańcuch cyfr Łańcuch musi mieć następującą postać: [ws] [sn] [ddd] (ws białe znaki, sn -znak Pierwszy nierozpoznany znak kończy konwersję. Nadmiar nie jest rozpoznawany( wynik jest nieokreślony. Wartość zwracana Standardowe funkcje łańcuchowe cz. 8 atoi zwraca liczbę całkowitą odpowiadającą łańcuchowi wejściowemu.

Standardowe funkcje łańcuchowe cz. 9 Funkcja itoa char *itoa(int value, char *string, int radix); Funkcja zamienia liczbę będącą pierwszym argumentem funkcji ( value) na łańcuch znaków umieszczany w tablicy znakowej (string) będącej drugim argumentem. Konwersja odbywa się dla podstawy systemu liczbowego podanej jako trzeci argument funkcji (radix). Podstawa systemu musi należeć do przedziału [2,36]. Jeśli liczba jest ujemna i podstawa systemu jest równa 10, pierwszym znakiem łańcucha znaków jest znak '-'.

Przykład. Ilustracja użycia funkcji atoi do konwersji liczby w postaci łańcucha na liczbę typu int. #include <stdio.h> #include <string.h> int main(void) { char liczbalan[5]="123"; int liczbaint; liczbaint=atoi(liczbalan);// konwersja printf("\n liczba po konwersji=%d", liczbaint); return 0; }

Standardowe funkcje łańcuchowe cz. 10 ( przykłady użycia są w osobnych plikach) Funkcja strchr char *strchr(const char *s, int c); Funkcja wyszukuje w łańcuchu znaków s znak c. Funkcja zwraca wskaźnik do pierwszego wystąpienia znaku c. Jeśli znaku nie ma, funkcja zwraca zerowy wskaźnik null. Funkcja strstr char *strstr(const char *s1,const char *s2 ); Funkcja wyszukuje w łańcuchu znaków s1 łańcuch s2. Funkcja zwraca wskaźnik do pierwszego wystąpienia łańcucha s2 (do pierwszego znaku łańcucha s2). Jeśli łańcucha s2 nie ma, funkcja zwraca zerowy wskaźnik null.

Standardowe funkcje łańcuchowe cz. 11 double atof (const char *s); Funkcja przekształca tekst zawarty w s na wartość typu double. Funkcja rozpoznaje wartość zmiennoprzecinkową reprezentowaną przez s. Funkcja rozpoznaje również wartość nieskończoną, podczas działania tej funkcji pierwszy nierozpoznany znak kończy jej działanie. Format: [biały_znak] [znak] [ddd] [.] [ddd] [eie[znak]ddd]. Przykład. double x; x=atof("123.45");

int sprintf(char *str, const char *format,...) ; Funkcja ta przesyła sformatowane wyjście do tablicy znakowej. Parametry str jest wskaźnikiem do tablicy znaków, do której zostanie zapisany wynikowy łańcuch format jest to łańcuch formatujący taki jak w printf Przykład. char s[20]; double x=25.5; sprintf(s,"%5.1f", x) ; printf("\n x w postaci lancucha=%s",s); Wynik działania programu x w postaci lancucha=25.5

Przykład. Wczytywanie dwuwymiarowej tablicy znaków (tablicy łańcuchów) oraz sortowanie niemalejąco. (cz.1) // cz. 1 programu #include <stdio.h> #include <conio.h> #include <string.h> int main(int argc, char* argv[]) { char stab[5][10]; char spom[10]; int i,zam; for(i=0;i<5;i++) { printf("\n lan %d :",i); scanf("%s",stab[i]); // wczytywanie tablicy znaków // będącej wierszem tablicy dwuwymiarowej } for(i=0;i<5;i++) printf("\n lan %s",stab[i]);

Cz. 2 programu do { zam=0; for (i=0;i<4;i++) if (strcmp(stab[i],stab[i+1])>0) { strcpy(spom, stab[i]); strcpy(stab[i], stab[i+1]); strcpy( stab[i+1],spom ); zam=1; } } while (zam); printf("\n\n Tablica po sortowaniu"); for(i=0;i<5;i++) printf("\n lan %s",stab[i]); getch(); return 0;}