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



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

XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

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

Inicjacja tablicy jednowymiarowej

Wstęp do programowania

XII. Warunek wielokrotnego wyboru switch... case

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

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.

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

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

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

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

Wstęp do programowania

Wstęp do programowania

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.

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

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

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

Programowanie komputerowe. Zajęcia 5

Wstęp do Programowania 2

XIV. Struktury danych

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

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

Programowanie komputerowe. Zajęcia 1

lekcja 8a Gry komputerowe MasterMind

Zajęcia 4 procedury i funkcje

Zadania język C++ Zad. 1. Napisz program wczytujący z klawiatury wiek dwóch studentów i wypisujący informację o tym, który z nich jest starszy.

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Wstęp do informatyki- wykład 7

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Zasady programowania Dokumentacja

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Programowanie - wykład 4

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

Deklaracja struktury w C++

I. Podstawy języka C powtórka

Podstawy programowania w języku C++

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Podstawy Programowania

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

Lekcja : Tablice + pętle

Podstawy programowania

Warunek wielokrotnego wyboru switch... case

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

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

Podstawy programowania w języku C++

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

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

2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117).

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

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

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Pliki wykład 2. Dorota Pylak

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

pobieramy pierwszą literę komunikatu i wypełniamy nią (wszystkie pozycje tą samą literą) bufor słownikowy.

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

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

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

Listy powiązane zorientowane obiektowo

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Programowanie i struktury danych

Wstęp do programowania. Wykład 1

Struktury, unie, formatowanie, wskaźniki

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

Tablice. Jones Stygar na tropie zmiennych

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Podstawy programowania w C++

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

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

Programowanie komputerowe. Zajęcia 4

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

Program 22. #include <iostream> using namespace std; struct Osoba { string Imie; string Nazwisko; char Plec; int RokUr; };

Rekurencja (rekursja)

Pytania sprawdzające wiedzę z programowania C++

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. 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:

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

XVII. Funkcje w C Ogólna budowa funkcji Definicja funkcji Co waŝnego powinniśmy wiedzieć o funkcjach

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Zadanie 1. Napisz, skompiluj i uruchom program, który wyświetla komunikat: "Mam na imie...".

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

> C++ typy wyliczeniowe, struktury, unie, konwersje napis <-> liczba, formatowanie wyjścia

Egzamin z Podstaw informatyki i programowania 2007/2008

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

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

Programowanie obiektowe w C++ Wykład 1

Tablice, funkcje - wprowadzenie

Zmienne i struktury dynamiczne

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Podstawy Programowania

Programowanie komputerowe. Zajęcia 3

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Transkrypt:

VII. Ciągi znaków łańcuchy 7.1. Wczytywanie tekstu Do tej pory poznaliśmy metodę wczytywania i wyświetlania liczb. Tak samo jak liczby moŝemy wczytać jeden znak, jednak co zrobić jeśli chcielibyśmy wczytać cały wyraz? C++ umoŝliwia zastosowanie dwóch wariantów: pierwszy wywodzi się z języka C drugi to uŝycie klasy bibliotecznej string My przyjrzyjmy się na razie bliŝej pierwszemu sposobowi, drugi sposób będzie omawiany w oddzielnym kursie. Ciąg znaków(łańcuch) to kolejno zapisane znaki w pamięci. Dlatego najlepiej do jego zapisania uŝyć tablicy przechowującej znaki(char). //Ciąg znaków a tablica --------------------- //deklaracja ciagów char ciag_znak[10] = 'D', 'D', 'T', ' ', '-', ' ', 'C', '+', '+', '\0'; char zly_ciag[5] = 'B', 'E', ' ', 'B', 'E'; char wyraz[50]; cout << "Podaj tekst: "; cin >> wyraz; cout << "Wprowadziles: \"" << wyraz << "\"" cout << "Poprawny ciag znakow: \"" << ciag_znak << "\"" cout << "Niepoprawny ciag znakow: \"" << zly_ciag << "\"" //------------------------------------- 7.2. Co naleŝy wiedzieć o wczytywaniu tekstu analiza przykładu Jeśli wprowadzisz tekst o długości n znaków to znak n+1 będzie zawsze równy 0. Dla większości funkcji, które operują na łańcuchach znaków jest to informacja, aby zakończyć wyświetlanie kolejnych znaków z tablicy. Inaczej mówiąc: tak się oznacza koniec tekstu. Pamiętaj, Ŝe numerowanie indeksów tablicy zaczyna się od zera! PoniewaŜ tablica

char zly_ciag[5] = 'B', 'E', ' ', 'B', 'E'; nie posiada znaku zero dlatego nie przechowuje łańcucha znaków. Dlaczego jednak jest ona wyświetlana, poniewaŝ w pamięci jest wiele komórek, które przechowują znak zera. Koniec łańcucha znaków moŝemy oznaczać jako '0' lub pisząc słowo NULL(z ang. zero). //pierwszy sposób char ciag_znak[10] = 'D', 'D', 'T', ' ', '-', ' ', 'C', '+', '+', '\0'; //drugi sposób char ciag_znak[10] = 'D', 'D', 'T', ' ', '-', ' ', 'C', '+', '+', NULL; Oczywiście przedstawiony przykład z klamrami ( )jest dość czasochłonny, dlatego wprowadzono prostszy i wydajniejszy zapis. //Ciąg znaków a tablica ---------------------------- //deklaracja tabeli łańcuchem znaków char ciag_znak[10] = "DDT - C++"; /*kompilator sam liczy, jak duŝej będzie potrzebować tablicy by pomieścić cały łańcuch*/ char wyraz[] = "To ciekawe forum i nie tylko..."; cout << ciag_znak cout << wyraz //-------------------------------------------------- 7.3. Kłopoty przy wprowadzaniu tekstu //Problemy przy wczytywaniu łańcuchów-------------- char ciag_znak[40]; char tekst[20] = "C++ to jest to!!!"; cout << "Podaj swoje imie i nazwisko programisto " cin >> ciag_znak; cout << "Nazywasz sie: " << ciag_znak << endl << "Ups a co sie stalo z twoim nazwiskiem!!! \n"

cout << "Oto tekst: " << tekst //co się stanie jak zmienimy 4 znak w tablicy tekst[3] = '\0'; cout << "Oto tekst: " << tekst //-------------------------------------------- Kolejną sprawą, jaka jest waŝna podkreślenia to wczytywanie danych za pomocą strumienia cin. Strumień ma to do siebie, Ŝe wczytuje dane do zmiennej, aŝ do napotkania białego znaku. Białymi znakami nazywamy wszystkie niewidoczne znaki takie jak spacja, tabulator, enter no i jeszcze parę innych mniej znanych. Jeśli napiszemy dwa wyrazy oddzielone spacją, to ten drugi nie zostanie wczytany. C++ oferuję, kilka rozwiązań by uporać się z tą niedogodnością. NaleŜy równieŝ pamiętać, iŝ zmiana jakiegokolwiek znaku w łańcuchu na znak zerowy('\0'), będzie oznaczało jego skrócenie. 7.4. Metody get(), getline() //getline i get w uŝyciu-------------------------- const short rozmiar = 50; char ciag_znak[rozmiar]; char lancuch[rozmiar]; cout << "Podaj swoje imie i nazwisko programisto " /*składnia getline gdzie kopiować, oraz ile znaków skopiować*/ cin.getline(ciag_znak, rozmiar); cout << "Nazywasz sie: " << ciag_znak << endl << "Teraz wszystko jest OK!\n"; cout << "\npodaj swoje 2 imiona "; //składnia get jest identyczna jak getline cin.get(ciag_znak, rozmiar); cout << "Podaj swoje nazwisko "; cin.get(lancuch, rozmiar); cout << endl cout << "Nazywasz sie : " << ciag_znak << " " << lancuch cout << "Co jest grane? Nie masz nazwiska!?!\n"; //-------------------------------------------- Obie metody(klasy iostream) mają za zadanie wczytać cały wiersz danych(razem z białymi znakami) bez znaku nowego wiersza. Składnia ich obu jest identyczna

składnia metod /* cin.getline(nazwa-tabeli, liczba-wczytanych-znaków); cin.get(nazwa-tabeli, liczba-wczytanych-znaków); */ zapis cin.(getline, get) mówi nam o tym, iŝ cin jest obiektem a (getline i get) są metodami tego obiektu Metody posiadają jednak jedną róŝnicę, mianowicie getline() pobiera cały wiersz danych ze strumienia do napotkania znaku nowej linii i usuwa ten znak ze strumienia, a get() zostawia ten znak w strumieniu. Jeśli skompilowałeś program to zapewne zauwaŝyłeś, iŝ drugie podanie nazwiska jest nie moŝliwe! cout << "\npodaj swoje 2 imiona "; //składnia get jest indentyczna jak getline cin.get(ciag_znak, rozmiar); cout << "Podaj swoje nazwisko "; cin.get(lancuch, rozmiar); Zaraz po podaniu imion program kończy działanie. Dzieje się tak, poniewaŝ w strumieniu jest przechowywany znak nowej linii, po tym jak podałeś swoje dwa imiona i nacisnąłeś ENTER to wtedy właśnie wprowadziłeś znak nowej linii(koniec wiersza). Pierwszy get() pobrał dwa imiona i zostawia znak nowej linii w strumieniu, kolejne wywołanie get() cin.get(lancuch, rozmiar) spowodowało, iŝ nic nie zostało wczytane gdyŝ w strumieniu jest tylko znak nowej linii, który jak juŝ wiesz nie jest wczytywany. Dlaczego jednak program nie zatrzymał się byś mógł wprowadzić nazwisko? PoniewaŜ dla kompilatora(metody cin) nowa linia(koniec wiersza) to jest ENTER, który został automatycznie przekazany do cin. By zaradzić tej sytuacji wystarczy wprowadzić zapis cin.get(ciag_znak, rozmiar).get(); //lub moŝna zastosować zapis cin.get(ciag_znak, rozmiar); cin.get(); // zapisy te są równowaŝne W ten sposób po wczytaniu danych, następne wywołanie get() powoduje ominięcie znaku nowej linii(a dokładnie cin wczyta znak ENTER) co umoŝliwia wprowadzenie nazwiska. Jest jeszcze jeden sposób na to by??? 7.5. Liczby i ciągi znów problem z nową linią?!? //miks liczby i ciagi-------------------------- const short rozmiar = 50; char lancuch[rozmiar]; int rok;

cout << "W ktorym roku dostales komputer?" cin >> rok; cout << "Jak sie nazywala ulubiona gra?\n"; cin.getline(lancuch, rozmiar); cout << "Komputer dostales w " << rok << " roku." cout << "Ulubiona gra to " << lancuch << "." //-------------------------------------------- Znowu pojawił się problem przy wprowadzaniu danych. Występuje tutaj podobny problem jak w przykładzie omawianym wcześniej, gdy wprowadzamy rok cin >> rok; i naciskamy ENTER znowu wprowadzamy do strumienia znak nowej linii. Gdy chcemy ponownie wprowadzić dane cin.getline(lancuch, rozmiar); natrafiamy na znak nowej linii i zostaje wprowadzony pusty wiersz. Rozwiązanie problemu jest podobne i eliminuje znak nowej linii ze strumienia. cin >> rok; cin.get(); //lub (cin >> rok).get(); 7.6. Ćwiczenia 1. Napisz program, który prosi o podanie, a potem wyświetla następujący informacje: Podaj nazwę ulicy na której mieszkasz? Stefana Batorego Podaj nr domu? 43/15 Na ile oceniasz swoje umiejętności programowania w skali [2 6]? 3 Twój staŝ programistyczny? 5 Adres: Stefana Batorego 43/15 Ocena: 2 StaŜ: 5 dni Program powinien przyjmować adres składający się więcej niŝ z jednego wyrazu. Dodatkowo ocena podana przez uŝytkownika powinna być przy wyświetleniu mniejsza o 1. Pogrubione informacje to te, które wpisuje uŝytkownik. 2. Napisz program, który prosi o podanie osobno imienia i nazwiska, a wyświetlający to w taki o to sposób: Podałeś takie o to dane: Nazwisko, Imię Ŝyczę miłego dnia. 3. Przerób zadanie 6.3 Tablice wielowymiarowe. UŜyj łańcuchów do zapisania nazw druŝyn w zadaniu.

4.* Zadanie kontrolne Napisz program, prostą bazę danych. UŜytkownik podaje dane techniczne trzech samochodów, marka, model, pojemność silnika, prędkość maksymalna. Dodatkowo wykonaj dwa działania arytmetyczne dodaj pojemności silników poszczególnych samochodów, oraz oblicz ich średnią prędkości maksymalną. Wszystkie dane mają być wprowadzone, oraz wyświetlone w sposób czytelny dla uŝytkownika podczas działania programu. Sam zaprojektuj czytelny interfejs. Przykładowe samochody Fiat; 126p; 0,65; 140, Audi; S6; 4,2; 250, Syrena; 105; 0,84, 120.