Tablice Napisy Funkcje i procedury Pliki

Podobne dokumenty
Funkcje i procedury szybkie przypomnienie Tablice i wskaźniki Napisy

Prawidłowa konstrukcja (3 x 4) char** tab = new char*[3]; for (size_t i = 0; i < 3; i++) tab[i] = new char[4];

Tablice Napisy Funkcje i procedury Pliki

I znowu można jak w C, za pomocą starych struktur i metod:

Lab 9 Podstawy Programowania

*W uproszczeniu: jest dziewięciu sędziów przyznających po dwie noty: za wartość techniczną i artystyczną (skala od 0.0 do 6.0)

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

Klasy: String, Random, Math. Korzystanie z dokumentacji.

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

Operacje na łańcuchach znaków

Wskaźniki. Informatyka

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

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

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

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

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

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

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Funkcja (podprogram) void

lekcja 8a Gry komputerowe MasterMind

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

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

C++ - [3-5] Pliki i strumienie w C++

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

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

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

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

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

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

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

Podstawy programowania w języku C++

Zajęcia 4 procedury i funkcje

Struktury, unie, formatowanie, wskaźniki

Część 4 życie programu

Podstawy Programowania

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

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

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

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

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

Tablice, funkcje - wprowadzenie

Funkcje Typy wyliczeniowe Struktury, unie Scanf / printf Wskaźniki

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

Biblioteka standardowa - operacje wejścia/wyjścia

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

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

Pliki wykład 2. Dorota Pylak

* Funkcje, podprogramy

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

Język C++ Różnice między C a C++

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

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

dr inż. Jarosław Forenc

Podstawy programowania komputerów

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

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

2 Przygotował: mgr inż. Maciej Lasota

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

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

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

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

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

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

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:

1 Powtórzenie wiadomości

Tablice deklaracja, reprezentacja wewnętrzna

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

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

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++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Podstawy programowania w języku C++

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

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

Podstawy i języki programowania

Tablice, funkcje, wskaźniki - wprowadzenie

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

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

Podstawy programowania w języku C++

I. Podstawy języka C powtórka

Podstawy programowania

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

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

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

Język C++ wykład VIII

1. Napisz program wypisujący w kolejnych wierszach standardowego wyjścia pojedyncze słowa następującego napisu Bardzo dlugi napis. 2.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

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

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

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

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

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.

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

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

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Podstawy programowania 1

Programowanie 2 - Tablice i łańcuchy

Wejście wyjście strumieniowe

Transkrypt:

Tablice Napisy Funkcje i procedury Pliki

Poniekąd takie samo jak w Javie:

Poniekąd, bo: 1. Można zwrócić kilka wartości na raz (referencja) 2. Parametry mogą być przekazywane przez referencję lub przez wartość 3. Funkcje mogą mieć zmienną liczbę parametrów 4. Mamy do dyspozycji funkcje inline

1. Zaprojektuj funkcję, która odczytuje liczby od użytkownika aż do podania 0. Funkcja ma zwrócić 0 lub 1 w zależności od tego czy tych liczb była parzysta czy nieparzysta ilość. Co więcej funkcja ma jednocześnie zwrócić sumą oraz iloczyn wszystkich podanych liczb.

Zalety używania dynamicznego przydzielania pamięci: Może ona być dzielona między różnymi obiektami w programie. Jej rozmiar może być ustalany podczas działania programu. int a = 2; STOS STERTA a 2 int* a = new int; STOS STERTA a? *a

int** wsk; wsk = new int*; *wsk = new int; STOS STERTA wsk? *wsk? **wsk new int; STOS // Ops I leaked it again STERTA? //MMMAAAAMOOO!! Zgubiłem się! int* liczba = new int; delete liczba; Do każdego new powinno być jedno delete. ZAWSZE.

Lepiej używać malloc() czy new? Są jakieś różnice? Klasa* mojaklasa = (Klasa*)malloc(sizeof(Klasa)); Klasa* mojaklasa2 = new Klasa(); A co jeśli przydział pamięci się nie powiedzie? Wielu programistów polega na tym, że new zawsze spełni swoją funkcję i zwróci oczekiwany rezultat. Domyślnie program się zakończy (niezbyt przyjemnie ale jednak). Istnieje wersja new, która nie używa wyjątków: int* wsk = new(nothrow) int; //zwraca nullptr lub null Niebezpieczne.. Sugeruje nie używać.

Podobne do Javy: typ nazwa[rozmiar] Tego typu tablice tworzone są na stosie. int tablica[] = { [3] = 10, 20, 30, [4] = 50};

int* tab = new int[5]; delete[] tab; STOS STERTA tab????? tab[0] tab[1] tab[2] tab[3] tab[4] Tablice dynamiczne!= Tablice alokowane dynamicznie Nie używać funkcji realloc() z C do stworzenia dynamicznej tablicy.

char statki[3][3]; statki[1][1] = X ; STOS STERTA? tab[0][0]? tab[0][1]? tab[0][2]? tab[1][0]? tab[1][1]? tab[1][2]? tab[2][0]? tab[2][1]? tab[2][2]

Czy tak można? const int i = 3, j = 3; char** board = new char[i][j]; STOS STERTA

Pozostało jeszcze m.in.: Powiązanie tablice wskaźniki Arytmetyka wskaźników w nawiązaniu do tablic. Stałe wskaźniki a tablice Tablice znakowe Tablica ->

1. Zadeklaruj tablicę o rozmiarze 100. Wypełnij tablicę zgodnie z regułami Ciągu Fibbonacciego (pierwszy i drugi element = 1, każdy następny to suma dwóch poprzednich: 1,1,2,3,5,8, itd.). 2. Napisz program, który zamienia liczbę dziesiętną podaną przez użytkownika na liczbę binarną i szesnastkową. 3. Napisz program do mnożenia dwóch macierzy o dowolnym rozmiarze. Sprawdzaj, czy mnożenie jest możliwe! 4. Program zgadnij moją liczbę. Program losuje liczbę z zakresu 1 100, a naszym zadaniem jest zgadnąć tą liczbę na podstawie za dużo, za mało. Po zgadnięciu program wyświetla liczbę prób. 5. Wypisz całą tablicę ASCII na ekran (każdy znak w nowej linijce opatrzony numerkiem ) i zapisz ją do tablicy o nazwie tab_ascii w programie.

1. Zrealizować grę w statki na planszy generowanej dynamicznie (do 10 x 10). Raz strzela użytkownik, raz komputer. Dozwolone okręty: 4 x jednomasztowiec Zaprogramować sytuacje: Trafiony zatopiony, Trafiony, Pudło, W plansze id***o.

Prawidłowa konstrukcja (3 x 4) char** tab = new char*[3]; for (size_t i = 0; i < 3; i++) tab[i] = new char[4]; STOS STERTA tab for (size_t i = 0; i < 3; i++) delete[] tab[i]; delete[] tab;

Wskaźnik = adres w pamięci char* wsk = (char*)255; STOS STERTA tab 1000 1 1000 2 3 4 5 1001 1002 1003 1004

Odwoływanie się do tablicy jednowymiarowej: int tab[6]; int* wsktab = tab; wsktab[4] = 1; Przekazywanie do funkcji: void Przetwarzaj(int* tablica) { // (int tablica[]) for (int i = 0; i < 5; i++) { tablica[i] = -5; } } int* tab_dyn = new int[2]; tab[0] = 2; tab[1] = 3; int tab_stos[] = {2, 3}; Przetwarzaj(tab_dyn); Przetwarzaj(tab_stos); Przetwarzaj(&tab_stos[0]);

Prosty przykład int* wsk= new int; addr( ptr + i ) = addr( ptr ) + [ sizeof( T ) * i ] wsk++; A jak z tablicami: int* tab = new int[5]; *(tab+2) = -3 //tab[2] = -3; Załóżmy, że mamy procedurę: void toupper(char* litera) { } Oraz: char ciag[] = Ala ma kota ; toupper(ciag + 4); Zamieni literę m na wielką. A co się dzieje tutaj? int tab[] = {1,2,3,4,5}; int* p1 = tab + 1; int* p2 = tab + 4; cout << p2 - p1; ( p2 - p1 ) == ( addr( p2 ) - addr( p1 ) ) / sizeof( T )

Przekazywanie do funkcji: void suma(int tab[][ lkolumn ]) { } void suma(int tab[lwierszy][lkolumn]) { } void suma(int tab[][]) { } //ŹLE void suma(int **tab) { } **tab!= tab[][ lkolumn ] addr(& tab[row][col]) = addr(tab) + [sizeof(int) * lkolumn * row] + [ sizeof(int) * col]

Napisy traktowane jako tablice zakończone znakiem o kodzie 0:

Porównywanie: strcmp(str1, str2): zwraca -, + lub 0 Kopiowanie: strcpy(str1, str2) znaczy to samo co intuicyjne: str1 = str2; Konkatenacja: strcat(str1, str2) znaczy to samo co intuicyjne: str1 = str1 + str2; tolower(), toupper(), islower(), isupper() trywialne Konwersje: atol, strtol - zamienia łańcuch na liczbę całkowitą typu long atoi - zamienia łańcuch na liczbę całkowitą typu int atoll, strtoll - zamienia łańcuch na liczbę całkowitą typu long long (64 bity); atof, strtod - przekształca łańcuch na liczbę typu double

char* kopiujstr(const char* wejscie) { char* wynik = new char[strlen(instring)]; strcpy(wynik, wejscie); return wynik; } Poprawna wersja: char* kopiujstr(const char* wejscie) { char* wynik = new char[strlen(instring + 1)]; strcpy(wynik, wejscie); return wynik; }

Co będzie wyświetlone? char text1[] = "abcdef"; size_t s1 = sizeof(text1); size_t s2 = strlen(text1); char* text2 = "abcdef"; size_t s3 = sizeof(text2); size_t s4 = strlen(text2);

1. Zadeklaruj napis c-string o długości 10 i przypisz mu 11 znaków (najpierw w deklaracji, a potem za pomocą konkatenacji) 2. Przeczytaj z klawiatury kilka napisów i dodawaj je do jednej zmiennej c-string. Jeśli będzie za dużo znaków, poinformuj o tym użytkownika. 3. Zmień małe na wielkie litery i odwrotnie w napisie przeczytanym z klawiatury.

Jesteśmy uratowani! W C++ jest string!

Konwersja na string: string to_string(int val); string to_string(unsigned val); string to_string(long val); string to_string(unsigned long val); string to_string(long long val); string to_string(unsigned long long val); string to_string(float val); string to_string(double val); string to_string(long double val); Konwersja ze stringa na int stoi(const string& str, size_t *idx=0, int base=10); long stol(const string& str, size_t *idx=0, int base=10); unsigned long stoul(const string& str, size_t *idx=0, int base=10); long long stoll(const string& str, size_t *idx=0, int base=10); unsigned long long stoull(const string& str, size_t *idx=0, int base=10); float stof(const string& str, size_t *idx=0); double stod(const string& str, size_t *idx=0); long double stold(const string& str, size_t *idx=0);

Pozostałe metody: str1.compare(str) analogiczne do tego z C str1.c_str(str) zwraca stary łańcuch 0terminated str1.find(co, [odkad]), rfind (szuka od końca), find_first_not_of, find_first_of, str1.replace(start,length,sourceforreplacement) str1.reverse() odwraca ciąg str1.substr(odkad, ile_znakow) zwraca pociąg ciągu str1.swap(str) zamienia zawartości ciągów między sobą

1. Czym różni się operator [] od funkcji at? Sprawdź to praktycznie 2. Zaimplementuj proste szyfry harcerskie: GA-DE-RY-PO-LU-KI, PO-LI-TY-KA-RE-NU, KA-CE-MI-NU-TO-WY. Wyświetla się menu, gdzie użytkownik wybiera szyfr. Następnie komunikat Podaj ciąg wejściowy, który jest odczytywany przez program a następnie zmieniane litery zgodnie ze wzorcem szyfru. 3. Przeczytaj od użytkownika ciąg tekstu zakończony znakiem kropki (.) Następnie podziel tenże tekst na słowa i wszystkie dłuższe od 4 znaków zapisz do oddzielnej tablicy stringów. Na końcu wypisz na ekran napis złożony z 2 i 3 znaku każdego elementu w tej nowej tablicy. 4. Zadeklaruj dłuższy tekst zawierający słowa zakazane (np. matematyka ) i pozamieniaj wszystkie wystąpienia na coś neutralnego (np. kwiatek ). 5. Napisz funkcję sprawdzającą czy wyraz jest palindromem. Tu konkurs na najkrótszy program

-"nieee, przecież nikt nie ma tak długiego nazwiska, damy char[25]..." i przyszła klientka z podwójnym nazwiskiem od tej pory wołaliśmy na nią 'segmentation fault'

I znowu można jak w C, za pomocą starych struktur i metod:

Zapis (ofstream) Odczyt (ifstream)

app jak append http://www.cplusplus.com/reference/iostream/ifstream/ http://www.cplusplus.com/reference/iostream/ofstream/

Funkcja good() jest tutaj lepsza.

int get(); - zwraca znak ze strumienia (lub EOF jeśli skończył się plik) i konwertuje na typ integer. istream& get( char& c ); - wpisuje do c odczytany ze strumienia znak [koniec pliku należy sprawdzić przez eof() ]. istream& get( char* buf, int len, char eot = '\n' ); - pobiera ze strumienia do `buf' maksymalnie `len' znaków i aż do napotkania znaku `eot' (tablica znaków jest terminowana zerem) lub do pobrania len 1 znaków. istream& getline( char* buf, int len, char eot = '\n' ); - jak powyższa get, ale znak `eot' nie jest zapisywany w `buf' istream& read( char* ptr, long len ); istream& read( void* ptr, long len ); - odczytują ze strumienia maksymalnie `len' znaków do `ptr'; jest to jak widać funkcja do odczytu danych binarnych, zatem tablica NIE jest terminowana zerem! istream& unget();- wstawia znak z powrotem do strumienia bool good() sprawdza czy nie zostały ustawione jakiekolwiek flagi błędów dla strumienia (eofbit, failbit and badbit).

assert.h - makra do asercji ctype.h - klasyfikacje znaków typu char (isspace, isalpha itd.) errno.h - deklaracja errno limits.h - makra określające granice dla typów ścisłych locale.h - definicje lokali math.h - funkcje matematyczne stdarg.h - narzędzia dla funkcji o zmiennej liście argumentów stddef.h - standardowe definicje (ptrdiff_t i size_t głównie) stdio.h - operacje wejścia/wyjścia stdlib.h - zespół funkcji użytkowych string.h - funkcje operujące na tablicach znaków time.h - narzędzia do odczytywania, interpretacji i prezentacji czasu

1. Poczytaj o instrukcja preprocesora (#define, #include, #error, makra). Za pomocą tej wiedzy napisz kilka szybkich makr automatyzujących liczenie np. sinusa lub cosinusa. 2. Napisz program używając mechanizmu przeciążania funkcji do obliczania obwodów: trójkąta (3 boki), prostokąta(2 boki), okręgu (1 prawie bok ). 3. Jak już powyższe będzie działać, zaimplementuj funkcjonalność odczytu z pliku tekstowego informacji o figurach i ich bokach, a następnie zapisu wyniku też do pliku. 4. Zaimplementuj Szyfr Cezara: kodowanie i dekodowanie (http://pl.wikipedia.org/wiki/szyfr_cezara) wraz z obsługą plików (szyfrogram, deszyfrogram). Wymyśl sobie własną technikę zapisu. 5. Odczytaj tekst wpisywany przez użytkownika a następnie wypisz statystykę analizy częstości występowania poszczególnych liter (od a do z ) zamieniając wielkie litery na małe. 6. Wypełnij tablicę 10 x 10 tabliczką mnożenia ale w kodzie trójkowym. 7. Napisz program odwrotny do zgadnij moją liczbę : człowiek wymyśla liczbę, program ma ją znaleźć. 8. Napisz konwerter temperatur. W parametrze funkcja dostaje tablicę oraz dwa parametry: z czego ma zamienić i na co (np. zamiana(tablica[], F, K) ). Ma zamienić wewnątrz tablicy i zwrócić wartość 0 lub jeden w zależności od sukcesu (zwróci 1 jeśli np. temperatura w Kelvinach była < 0). 9. Poczytaj o flagach modyfikujących format wyjścia strumienia.