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

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

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

Podstawy programowania w języku C++

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

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

Podstawy programowania

Tablice deklaracja, reprezentacja wewnętrzna

dr inż. Jarosław Forenc

Podstawy Programowania

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

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

Wprowadzenie do programowania w języku C

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

Operacje na łańcuchach znaków

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

Programowanie Proceduralne

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

Podstawy programowania 1

PARADYGMATY PROGRAMOWANIA Wykład 3

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

scanf( %s,tekst); //znaki podane z klawiatury (do pierwszego białego znaku ) //s kopiowane do zmiennej tekst i dostawiany jest znak \0

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

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

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

Języki i metody programowania I

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

Reprezentacja symboli w komputerze.

Inicjacja tablicy jednowymiarowej

Tablice, funkcje - wprowadzenie

Wstęp do programowania

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

Podstawy programowania w języku C++

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

1 Przetwarzanie tablic znakowych

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

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:

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

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

tablica: dane_liczbowe

Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

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

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

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

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

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

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

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

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

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

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

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

Programowanie komputerowe. Zajęcia 4

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

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Wstęp do programowania

Wstęp do programowania

1. Typy zmiennych. 2. Typy podstawowe: char short int int long int float

JĘZYK C - TABLICE DWUWYMIAROWE,

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Funkcje zawarte w bibliotece < io.h >

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

Podstawy programowania w języku C i C++

2 Przygotował: mgr inż. Maciej Lasota

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

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

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.

Zaawansowane programowanie w języku C++ Biblioteka standardowa

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

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

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

Zajęcia 4 procedury i funkcje

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

Programowanie w językach wysokiego poziomu

Część 4 życie programu

Funkcje zawarte w bibliotece < io.h >

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

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

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

Programowanie Proceduralne

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

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Programowanie Proceduralne

lekcja 8a Gry komputerowe MasterMind

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

Podstawy programowania - 1

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.

( wykł. dr Marek Piasecki )

Programowanie i struktury danych

Co nie powinno być umieszczane w plikach nagłówkowych:

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 INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Podstawy Programowania Podstawowa składnia języka C++

Ćwiczenia podstawowe, zestaw 5, część 1

Podstawy programowania (1)

Podstawy programowania w języku C++

Programowanie komputerowe. Zajęcia 5

Transkrypt:

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE Stała tekstowa / łańcuchowa jest tablicą znaków zakończoną znakiem o kodzie: 0 np. stała łańcuchowa: Jestem tekstem ASCII... J e s t e m t e k s t e m \0... wartości... 74 101 115 116 101 109 32 116 101 107 115 116 101 109 0... adresy 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Definicje i inicjalizacje zmiennych tekstowych : char tekst[ ] = J, e, s, t, e, m,, t, e, k, s, t, e, m, \0 ; char tekst2[ ] = Jestem tekstem ; char tekst3[ ] = Jestem tekstem ; char tekst4[100] = Jestem tekstem ; char tekst5; // wskaźnik na znak == wskaźnik na początek łańcucha znaków tekst5 = Jestem tekstem ; // przypisanie zmiennej tekst5 adresu stałej tekstowej tekst5 = tekst4 ; // poprawne przypisanie adresu tablicy char tekst6[100]; // 100-elementowa tablica znakow tekst6 = Jestem tekstem ; // błędne przypisanie!!! memcpy( tekst6, Jestem tekstem, 15 ); // poprawne przypisanie strcpy ( tekst6, Jestem tekstem ); // poprawne przypisanie Przykładowe operacje na pojedynczych literach tekstu: tekst[1] = E ; // zamiana drugiej litery na dużą tekst[2] = tekst[2] 32; // zamiana trzeciej litery na dużą (?) tekst[3] = toupper( tekst[3] ); // zamiana czwartej litery na dużą for( int i=4; i<10; i++) tekst[ i ] = toupper( tekst[ i ] ); tekst[5] = \0 ; // zamiana kolejnych sześciu liter // skrócenie tekstu do 5 liter for( int i=0; tekst[ i ]!= \0 ; i++) cout << tekst[ i ]; // wydrukowanie zawartości tekstu (1) for( char* wsk=tekst; *wsk ; wsk++) cout << *wsk; // wydrukowanie zawartości tekstu (2) M. Piasecki, PODSTAWY PROGRAMOWANIA str. 1 (W7) Dane tekstowe - tablice znaków

Przykład przetwarzania tekstów dodanie rozszerzenia *.txt na końcu nazwy pliku #include <iostream.h> int main(void) char nazwa[100]; cout << Podaj nazwe pliku: ; cin.getline(nazwa,100); // poszukiwanie ostatniej kropki w łańcuchu int i, poz_kropki=-1; for(i=0; nazwa[i]!= \0 ; i++) if( nazwa[i] ==. ) poz_kropki=i; // sprawdzenie obecności rozszerzenia txt bool jest_txt=false; if(poz_kropki!=-1) if( nazwa[poz_kropki+1]== t && nazwa[poz_kropki+2]== x && nazwa[poz_kropki+3]== t && nazwa[poz_kropki+4]== \0 ) jest_txt=true; //jeżeli nie ma rozszerzenia ".txt" to dopisujemy je na końcu nazwy if(!jest_txt ) nazwa[i+0] =. ; // zmienna 'i' nadal wskazuje koniec nazwy nazwa[i+1] = t ; nazwa[i+2] = x ; nazwa[i+3] = t ; nazwa[i+4] = \0 ; // // To samo co powyżej, ale z wykorzystaniem gotowych funkcji <string.h> // char* poz_kropki=strrchr(nazwa,'.'); // bool jest_txt=false; // if( poz_kropki && strcmp( poz_kropki,".txt" )==0 ) // jest_txt=true; // if(!jest_txt ) // strcat(nazwa,".txt"); // wyświetlenie wyniku nazwy z rozszerzeniem txt na końcu cout << endl << endl; cout << Nazwa z rozszerzeniem \ txt\ = [ << nazwa << ] ; cout << Nacisnij ENTER, aby zakonczyc program ; cin.get(); M. Piasecki, PODSTAWY PROGRAMOWANIA str. 2 (W7) Dane tekstowe - tablice znaków

Funkcje operujące na łańcuchach znaków <string.h> Funkcja kopiowania zawartości jednej tablicy znakowej do drugiej (ang. string copy ). Prototyp: char *strcpy(char *dest, const char *src); // przykładowa implementacja (z wykorzystaniem zapisu indeksowego ) char strcpy( char tekst_wyj[ ], char tekst_wej[ ] ) int i = 0; while( ( tekst_wyj[ i ] = tekst_wej[ i ] )!= \0 ) i++; return( tekst_wyj ); // kopiowanie jednego łańcucha do drugiego wersja wskaźnikowa (1) char strcpy( char tekst_wyj, char tekst_wej ) char pocz=tekst_wyj; while( ( tekst_wyj = tekst_wej )!= \0 ) tekst_wyj++; tekst_wej++; return( pocz ); // funkcja kopiująca łańcuchy wersja wskaźnikowa (2) char strcpy( char tekst_wyj, char *tekst_wej ) char pocz=tekst_wyj; while( tekst_wyj++ = tekst_wej++ ) ; return( pocz ); // kopiowanie, z ograniczeniem długości kopiowanego łańcucha char strncpy( char tekst_wyj[ ], char tekst_wej[ ], unsigned maks_dlugosc ) int i = 0; while( ( tekst_wyj[ i ] = tekst_wej[ i ] )!= \0 && i < maks_dlugosc ) i++; return( tekst_wyj ); M. Piasecki, PODSTAWY PROGRAMOWANIA str. 3 (W7) Dane tekstowe - tablice znaków

Funkcja porównująca teksty: int strcmp ( char tekst_1, char tekst_2 ) ( ang. string compare ) funkcja zwraca wartość: < 0 gdy tekst_1 < tekst_2 = 0 gdy tekst_1 == tekst_2 > 0 gdy tekst_1 > tekst_2 int strcmp( char tekst_1[ ], char tekst_2[ ] ) int i = 0; while( tekst_1[ i ] == tekst_2[ i ] ) if( tekst_1[ i++ ] == \0 ) return( 0 ); return( tekst_1[ i ] tekst_2[ i ] ); // wersja tablicowa int strcmp( char tekst_1, char tekst_2 ) // wersja wskaźnikowa (1) while( tekst_1 == tekst_2 ) if( tekst_1 == \0 ) return( 0 ); tekst_1 = tekst_1 + 1; tekst_2 = tekst_2 + 1 ; return( tekst_1 tekst_2 ); int strcmp( char tekst_1, char tekst_2 ) // wersja wskaźnikowa (2) for( ; tekst_1 == tekst_2 ; tekst_2++ ) if(! tekst_1++ ) return( 0 ); return( tekst_1 tekst_2 );... // przykładowe zastosowanie funkcji strcmp char tekst[100]; cin >> tekst; if( strcmp( tekst, Kowalski )==0 ) cout << Podales tekst: \ Kowalski\ ;... M. Piasecki, PODSTAWY PROGRAMOWANIA str. 4 (W7) Dane tekstowe - tablice znaków

Inne wybrane funkcje z biblioteki <string.h> size_t strlen( const char s ) od ang. string length Funkcja wyznacza i zwraca długość (ilość znaków) łańcucha s (bez znaku \0 ) char strcat( char dest, const char src ) od ang. string concatenate Funkcja dodaje łańcuch src (ang. source) do łańcucha dest (ang. destination) Zwraca wskaźnik na połączony łańcuch (dest) char strchr( const char s, int c ) od ang. string char Funkcja szuka pierwszego wystąpienia znaku c w podanym łańcuchu s Zwraca wskaźnik na znalezioną pozycję wystąpienia lub adres NULL. char strrchr( char s, int c ) od ang. string right char Funkcja szuka ostatniego wystąpienia znaku c w podanym łańcuchu s Zwraca wskaźnik na znalezioną pozycję wystąpienia lub adres NULL. char strstr( char s, const char sub ) od ang. scans string for substring Funkcja szuka pierwszego wystąpienia łańcucha sub w podanym łańcuchu s Zwraca wskaźnik na znalezioną pozycję wystąpienia lub adres NULL. char strupr( char s ) od ang. string upper Funkcja zamienia zawartość łańcucha s na duże litery char strlwr( char s ) od ang. string lower Funkcja zamienia zawartość łańcucha s na małe litery M. Piasecki, PODSTAWY PROGRAMOWANIA str. 5 (W7) Dane tekstowe - tablice znaków

Przykłady operacji na łańcuchach znaków 1) #include <stdio.h> // przykład zamiany wszystkich liter na duże #include <ctype.h> // standardowe funkcje zamiany łańcuchów na małe lub duże litery // #include <string.h> char *strlwr(char *s); char *strupr(char *s); char Zamien_Na_Duze( char tekst ) char wsk = tekst; do wsk = toupper( wsk ); // zamiana pojedynczej litery na dużą while( wsk++ ); return( tekst ); //------------------------------------------------------------------------ Zamien_Na_Duze int main( void ) char lancuch_testowy[100] = "abcdefghijklmnopqrstuvwxyz"; printf( "%s\n", Zamien_Na_Duze ( lancuch_testowy ) ); 2) #include <stdio.h> // przykład zamiany pierwszych liter wyrazów #include <ctype.h> char Slowa_Na_Duze( char tekst ) char wsk = tekst; if(! wsk ) // jeżeli tekst pusty to zakończ działanie return(tekst); wsk = toupper( wsk ); // zamiana pierwszej litery while( ++wsk ) if( (wsk-1) == ' ' ) // jeżeli poprzedzający znak jest spacją wsk = toupper( wsk ); // zamiana znaku na dużą literę return( tekst ); //------------------------------------------------------------------------ Slowa_Na_Duze int main( void ) char lancuch[100] = "to jest probka tekstu "; printf( "%s\n", Slowa_Na_Duze( lancuch ) ); M. Piasecki, PODSTAWY PROGRAMOWANIA str. 6 (W7) Dane tekstowe - tablice znaków

3) #include <stdio.h> // funkcja zamieniająca zadane fragmenty tekstu #include <string.h> void Zamien_Fragmenty( char tekst, char stary_wzorzec, char nowy_wzorzec ) char wsk = tekst; int dlugosc_starego = strlen( stary_wzorzec ); int dlugosc_nowego = strlen( nowy_wzorzec ); do wsk = strstr( tekst, stary_wzorzec ); if( wsk ) // if( wsk!= null ) // ewentualne zsunięcie lub rozsunięcie tekstu memmove( wsk + dlugosc_nowego, wsk + dlugosc_starego, strlen( wsk + dlugosc_starego ) +1 ); // wpisanie nowego wzorca w przygotowane miejsce memcpy( wsk, nowy_wzorzec, dlugosc_nowego); while( wsk ); //---------------------------------------------------------------------- Zamien_Fragmenty int main( void ) char tekst[200] = "Ala ma kota a Ola ma Asa"; printf( "Stary tekst: %s\n", tekst ); Zamien_Fragmenty( tekst, "ma", "miala" ); printf( " Nowy tekst: %s\n", tekst ); // "Ala miala kota a Ola miala Asa" UWAGA! Zastosowanie w powyższym przykładzie funkcji strcpy zamiast memmove będzie generować błędy (gdy nowy_wzorzec będzie dłuższy od stary_wzorzec) np. strcpy( wsk+dlugosc_nowego, wsk+dlugosc_starego ); utworzy tekst: Ala ma ko ko ko ko ko ko ko k Definicja: char tekst = "Ala ma kota a Ola ma Asa"; jest równoważna: char tekst[24+1] = "Ala ma kota a Ola ma Asa"; Ponieważ podczas zamiany tekst może się wydłużyć (poprzez wstawienie dłuższych fragmentów), więc zmienna tekst powinna być tablicą większą niż długość inicjującego tekstu. M. Piasecki, PODSTAWY PROGRAMOWANIA str. 7 (W7) Dane tekstowe - tablice znaków