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

Podobne dokumenty
iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

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

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Biblioteka standardowa - operacje wejścia/wyjścia

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.

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

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

Zmienne, stałe i operatory

Tablice, funkcje - wprowadzenie

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

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

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

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

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

1. Wprowadzanie danych z klawiatury funkcja scanf

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

Programowanie Proceduralne

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

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

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 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.

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

Podstawy programowania 1

Funkcja, argumenty funkcji

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

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

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.

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

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

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

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

Wskaźniki w C. Anna Gogolińska

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

Stałe, tablice dynamiczne i wielowymiarowe

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

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

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

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

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Języki i metodyka programowania. Wskaźniki i tablice.

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

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

Języki i metody programowania I

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

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

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Struktury. Przykład W8_1

Tablice, funkcje, wskaźniki - wprowadzenie

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

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

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

Funkcje zawarte w bibliotece < io.h >

Podstawy programowania komputerów

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

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

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

Funkcje zawarte w bibliotece < io.h >

KURS C/C++ WYKŁAD 6. Wskaźniki

Podstawy programowania w języku C++

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

Podstawy Programowania

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 w C Typ wskaźnikowy do typu znakowego i operacje na łańcuchach

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

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

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

Programowanie w języku C++

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

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

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

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

Podstawy programowania w języku C++

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

PODSTAWY PROGRAMOWANIA W C. Bibliografia W-1. Dr. Inż. Hab. Siergiej Fialko, PK,

Lab 9 Podstawy Programowania

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

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

Język C zajęcia nr 11. Funkcje

Ghost in the machine

Wprowadzenie do programowania w języku C

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

1 Podstawy c++ w pigułce.

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

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

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

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

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

Programowanie w językach wysokiego poziomu

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

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

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

Wstęp do programowania 1

Transkrypt:

Stałe i zmienne znakowe. Stała znakowa: znak Na przykład: a, 1, 0 c Każdy znak jest reprezentowany w pamięci przez swój kod. Kody alfanumerycznych znaków ASCII to liczby z przedziału [32, 127]. Liczby od 128 do 255 też są kodami znaków, ale znaki te mogą być różnie zdefiniowane nie odpowiada to standardu ASCII. Typ danych C dla zapisu znaków char. sizeof(char) -> 1 B Na przykład, char i = 32; char i = ; //i to jest znak spacji reprezentacje przez kod znaku //to jest też znak spacji reprezentacje przez znak

Apostrof jako znak należy przedstawiać jako \ (za pomocą specjalną sekwencje znaków) Może wystąpić konieczność uszycia typu int dla reprezentacji zmiennej znakowej. Na przykład: int ch; while((ch = getchar())!= EOF) ; EOF = -1 nie może być przedstawiona niezawodnie typem char char ap = '\''; // to jest znak apostrofa \ typ char int app = '\''; // to jest znak apostrofa \ typ int printf("ap = %c app = %c \n", ap, app); //to jest wydruk znaków printf("ap = %d app = %d \n", ap, app); //to jest wydruk kodów znaków

Przykład w5_1 Tablice znakowe. Stałe tekstowe Tablice znakowe są używane dla zapisu ciągu znaków w pamięci komputera. Ciąg znaków (wirsz tekstowy) jest umieszczony w kolejnych bajtach pamięci komputera. Każdy znak tego ciągu to jest odpowiedni element tablicy znakowej.

Definicja tablicy znakowej: char id_tablicy[num]; id_tablicy imię tablicy (identyfikator) num - maksymalna liczba znaków minus jeden - Każdy ciąg znaków kończy się symbolem \0 koniec ciągu znaków, który zajmuje 1 bajt dla tego minus jeden. Przy przekroczeniu ilości znaków wartości num-1 występuje błąd pisanie po pamięci (page fault). sizeof(typ), B num-1 0 1 2 n-2 \0 Tablica o n elementów Pamięć zarezerwowana

- Elementy tablicy są ponumerowane od 0 do n-1: id_tablicy[0], id_tablicy[1],..., id_tablicy[n-2], id_tablicy[n-1] (id_tablicy[n-1] -> \0 ) Pamięć zarezerwowana na num elementów: num >= n - Numeru elementów tablicy będziemy nazywali indeksami. - Para nawiasów kwadratowych to jest operator [ ]. (id_tablicy[k] - odwołanie do elementu tablicy o indeksie k). - Rozmiar tablicy w definicji musi być stała. - W każdym elemencie tablicy można zapisać jeden znak: id_tablicy[0] = a ; id_tablicy[1] = b ;... - Ostatnim symbolem ciągu znaków mysi być \0

Stałe tekstowe Dowolny ciąg znaków, zapisany w postaci to jest stała tekstowa, jest stałą tekstową. Jeśli w jednym z tych znaków ma być cudzysłów, to należy zapisać \ Kompilator umieszcza tekst w odpowiedniej grupie bajtów (1 B na symbol). W końcu tekstu (stałą tekstową) jest dopisany symbol \0. Podany tekst ma 22 symboli (razem ze spacjami), więc w pamięci komputera będzie zajmował 23 B razem z \0.

Inicjalizacia zmiennej znakowej Przykład: const char strrr[256] = C:\\Documents and Settings\\MY_APPLIC ; char str[ ] = abcd ; size_t len, len1; len = sizeof(str); // len = 5! + \0 len1 = strlen(str); // len1 = 4 size_t strlen(char *) zwraca ilość // znaków w wiersze tekstowym bez \0 str[2] = ; strrr[6] = j ; //str --> ab d //błąd to jest const char Przykład W5_2

Wskaźnik do tablicy Definicja tablicy rezerwuje odpowiednią grupę bajtów w pamięci i przypisuje identyfikatorowi id_tablicy adres zerowego elementu. id_tablicy wskazuje na zerowy element tablicy Nie wolno zmieniać wartości id_tablicy (to jest stała - wskaźnik na początek tablicy) id_tablicy nie jest L-walue, nie można używać po lewej strone instrukcji przypisania. Przykład: char str1[ ] = "abcde"; //debuger information: str1 = 0x0012fe44 "abcde" //str1[0] = 97 a, &str1[0] 0x0012fe44 "abcde" //str1[1] = 98 b &str1[1] 0x0012fe45 "bcde"...

Funkcja char *gets( char *buffer ); Argument identyfikator tablicy znakowej. Napisany na klawiaturze tekst (stream stdin) po wciśnięciu ENTER zostanie zapisany w tablice jeden znak w jednym elemencie tablicy, i na końcu będzie dopisany \0. Fragment kodu: char str[256]; char *ptr = NULL; ptr = gets(str); //Przy wyjściu z gets str zawiera ciąg znaków, //wprowadzonych z monitora, ptr to jest wskaźnik //do str: str 0x0012fe60 "abcdef" char [256] ptr 0x0012fe60 "abcdef" char * Przykład W5_3

Fragment kodu: char *ptr = NULL; //ptr 0x00000000 <Bad Ptr> char * ptr = abcdefg ; //ptr 0x0041563c "abcdefg" char * //Uwaga! Pamięć pozostała wydzielona w obszarze roboczym. Ta //informacja nie będzie chroniona. //Kod poprawny: ptr = (char *)malloc(256*sizeof(char)); //dynamiczne wydzielenie pamięci w //heap if(!ptr) { printf( błąd \n ); exit(1); } sprintf(ptr, abcdefg );... //ptr jest już nie potrzebne zwolni pamięć! if(ptr) free(ptr); ptr = NULL;

Funkcja int sprintf( char *buffer, const char *format [, argument]... ); Formatuje i przechowuje ciąg znaków i liczby w buforze buffer. Działa analogicznie funkcji printf, fprintf. Operacji z wskaźnikami: int i = 3; char *ptr = NULL; char str[ ] = abcdef ; char symb; ptr = &str[0]; //wskazuje na element str[0]... ptr++; //wskazuje na element str[1] przesuwa wartość wskaźnika //o sizeof(char) w prawo; ptr- -; //wskazuje na element str[0]; - przesuwa wartość wskaźnika //o sizeof(char) w lewo; symb = *(ptr+i); //symb = d (dla tego że ptr+i wskazuje na 3 element //tablicy str

Dla wskaźnika o typie dowolnym: int i[50]; double a[200]; //def. tablice typu int, 50 elementów //def. tablice typu double, 200 elementów //i - wskaźnik, który wskazuje na adres pierwszego bajtu zerowego // elementu tablicy, lub to samo: &i[0] // i 0x0012fe7c int [50] // &i[0] 0x0012fe7c int * int *ptr_i = &i[0]; ptr_i++; //wskazuje na i[1] o adrese &i[0] + sizeof(int) double *ptr_a = &a[0]; ptr_a++; //wskazuje na a[1] o adrese &a[0] + sizeof(double) ptr_a = &a[0]; double bb = *(ptr_a+16); //ptr_a+16 wskazuje na element tablicy a o indeksie // 16 (początek numeracji indeksów od 0!!!)

Instrukcje switch, case switch(wyrażenie_s) { case wyrażenie stałe 1: ciąg instrukcji 1 case wyrażenie stałe 2: ciąg instrukcji 2... case wyrażenie stałe n: ciąg instrukcji n default: ciąg instrukcji default } wyrażenie_s wyrażenie o wartościach całkowitych wyrażenie stałe i - wyrażenie o wartościach całkowitych 1. Obliczenie wartości wyrażenie_s. 2. Jeśli wyrażenie_s == wyrażenie stałe k wykonanie ciąg instrukcji k, ciąg instrukcji k+1,..., ciąg instrukcji n, goto 3; jeśli wyrażenie_s!= wyrażenie stałe k - ciąg instrukcji default, goto 3 3. Pierwszy operator poza blokiem switch

Instrukcje switch, case } switch(wyrażenie_s) { case wyrażenie stałe 1: ciąg instrukcji 1 case wyrażenie stałe 2: ciąg instrukcji 2... case wyrażenie stałe n: ciąg instrukcji n default jest pominięty: 1. Obliczenie wartości wyrażenie_s. 2. Jeśli wyrażenie_s == wyrażenie stałe k wykonanie ciąg instrukcji k, ciąg instrukcji k+1,..., ciąg instrukcji n; pierwszy operator poza blokiem switch Ostatnim operatorem ciągu instrukcji k może być break; break przerywa działanie switch i przekazuje sterowanie do pierwszego operatora poza blokiem switch

switch( c ) { case 'A': capa++; case 'a': lettera++; default : total++; }... switch( i ) { case -1: n++; break; case 0 : z++; break; case 1 : p++; break; } Przykłady:

Funkcje strcpy, strcat (#include <string.h> ) char *strcpy( char *strdestination, const char *strsource ); Kopiuje ciąg znaków (string) strsource, zakończoną symbolem \0, w bufor (string), oznaczony jako strdestination. Zachowanie funkcji nie jest wyznaczone, jeśli bufory strsource i strdestination wzajemnie się przekrywają. Zwraca wskaźnik na strdestination. Nie istnieje wartości, która wskazywała by na błędne zakończenie. strsource Zona przekrywania strdestination Adresy pamięci

char *strcat( char *strdestination, const char *strsource ); Dopisuje ciąg znaków (string) strsource w koniec bufora (string) strdestination i zamyka symbolem \0. Zachowanie funkcji nie jest wyznaczone, jeśli bufory strsource i strdestination wzajemnie się przekrywają. Zwraca wskaźnik na strdestination. Nie istnieje wartości, która wskazywała by na błędne zakończenie.

Przykład: #include <string.h> #include <stdio.h> int main( void ) { char string[80]; strcpy( string, "Hello world from " ); strcat( string, "strcpy " ); strcat( string, "and " ); strcat( string, "strcat!" ); printf( string = %s\n", string ); } Wydruk: Hello world from strcpy and strcat!

Funkcje strcmp: (#include <string.h> ) int strcmp( const char *string1, const char *string2 ); porównuje ciągi znaków string1 i string2. Zwraca RetVal typu int. RetVal: < 0 - string1 < string2 = 0 - string1 == string2 > 0 - string1 > string2 string1 == string2, jeśli każdy znak z string1 jest równy odpowiedniemu znaku string2. Relacji nierówności. W C jest przyjęte że string1 > string2, jeśli pierwszy symbol string1 ma kod, większy od kodu pierwszego symbolu string2. Jeśli pierwsze symbolu są równe, porównujemy drugie. I tak dalej.

Przykład: char ss1[ ] = "abcdef"; char ss2[ ] = "za"; int ret = strcmp(ss1, ss2); //ret = -1, kod a = 97, kod z = 122 -> a < z... char ss1[ ] = "abcdef"; char ss2[ ] = "Abcdef"; int ret = strcmp(ss1, ss2); //ret = 1, kod a = 97, kod A = 65 -> a > A... char ss1[ ] = "abcde^"; char ss2[ ] = "abcdef"; int ret = strcmp(ss1, ss2); //ret = -1, kod ^ = 94, kod f = 102 -> ^ < f... char ss1[ ] = "ABCDE^"; char ss2[ ] = "ABCDEF"; int ret = strcmp(ss1, ss2); //ret = 1, kod ^ = 94, kod F = 70 -> ^ > F