POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
ZASADY PROGRAMOWANIA KOMPUTERÓW
ZAP zima 2012
Język programowania: C/C++
Środowisko programistyczne: Qt
Wykład 4 : Liczby, znaki i napisy. Tablice dwuwymiarowe.
2
Biblioteki i pliki nagłówkowe
Biblioteki dołączamy do programu poprzez dołączanie tzw. plików
nagłówkowych. Plik nagłówkowy - plik zawierający deklaracje zmiennych i
funkcji tworzących bibliotekę.
Standardowy format dołączania plików nagłówkowych typowych dla C++:
#include
// iostream jest nazwą dołączanej biblioteki języka C++
Starszy format dołączania takich plików nagłówkowych:
#include
Biblioteki odziedziczone z języka C można dołączać dwojako:
w sposób tradycyjny dla języka C:
nie należy łączyć w
#include // stdlib.h jest plikiem nagłówkowym
jednym programie
obu tych stylów, bo
#include
odpowiednie
biblioteki nie są
równoważne (te w
lub w stylu C++, poprzedzając nazwę biblioteki literą c :
stylu C++ zawierają
tzw. szablony)
#include
#include
3
Symbole specjalne, słowa kluczowe i nazwy
SYMBOLE SPECJALNE:
" jednoznakowe: + - * / = < > ( ) [ ] { } . , ; : ' ^ % ~
" dwuznakowe (dwa znaki traktowane jako całość): != <= >= == ++ -- || && itd.
SAOWA KLUCZOWE:
ciąg znaków o ściśle określonym znaczeniu; np. (tych będziemy używać):
bool break case char const continue do else extern false float for goto if int
namespace new not or return short sizeof struct switch true using void while
NAZWY ( IDENTYFIKATORY ):
" ciąg liter i cyfr, zaczynający się od litery (tylko litery alfabetu łacińskiego)
" znak _ jest traktowany jak litera
" rozróżniane są małe i duże litery (!)
" liczba znaków jest dowolna
" muszą się różnić od słów kluczowych
Np.:
Nazwy poprawne: a A4 a4 _A4 liczbaPunktow przyklad_1 nowyTyp
Nazwy błędne: 5gr przykład_1 przyklad-1 a+b a[4] do
Typy
4
TYP jest zdefiniowany przez zbiór przyporządkowanych mu wartości
TYPY predefiniowane (najważniejsze)
int - podzbiór liczb całkowitych: -2147483648 .. 2147483647
(32 bity, czyli od -231 do 231-1)
double - podzbiór liczb rzeczywistych: 2.23*10-308 .. 1.79 *10308 (co do modułu)
(64 bity, 15-16 cyfr znaczących)
bool - dwie wartości: true (lub 1 liczbowo) oraz false (lub 0 liczbowo)
char - zbiór znaków w kodzie ASCII (8 bitów)
Ponadto w C++ (ale nie w C):
string - określa napis jako dowolny ciąg znaków
(uwaga: string traktujemy umownie jako typ; string nie jest
słowem kluczowym)
UWAGA: Aby można było korzystać z umownego typu string, trzeba dołączyć
bibliotekę (ale w Qt nie jest to potrzebne).
Uwaga: czym innym jest biblioteka , która obsługuje funkcje obsługi napisów typowe dla
języka C i nie jest tu używana.
5
Liczby
LICZBY CAAKOWITE ciąg cyfr poprzedzony znakiem + lub
" zapis dziesiętny: 66 +123 -543
" zapis ósemkowy: 0 przed liczbą: 0102 (2*80+0*81 + 1*82 czyli 66 dziesiętnie)
" zapis szestnastkowy: 0x przed liczbą: 0x42 (2*160+4*161 czyli 66 dziesiętnie)
Zatem 102 i 0102 to zupełnie różne liczby !
LICZBY RZECZYWISTE - zapisuje się:
" w postaci dziesiętnej, z kropką zamiast przecinka, np.: 1.128 -12.3 -0.03
" w postaci wykładniczej; wówczas składają się z:
mantysy - liczba dziesiętna, gdzie w zapisie użyto kropki, a nie przecinka
litery e lub E - która oznacza podstawę wykładnika równą 10
cechy - jest liczbą całkowitą, oznacza wykładnik potęgi
cecha zawsze jest liczbą dziesiętną (nawet jeśli zaczyna się zerem)
Mantysa i cecha mogą być poprzedzone znakiem + lub
Np.: +1.23e-5 (czytaj: 1,23 razy 10 do potęgi 5) -543e3 543E-003 0.16437e+12
6
Generowanie liczb losowych
Jest przydatne do szybkiego wypełniania tablic
rand ( ) - funkcja standardowa bez parametrów, z biblioteki cstdlib, generuje
liczbę losową całkowitą o rozkładzie jednostajnym z przedziału
<0, RAND_MAX>, gdzie RAND_MAX typu int jest stałą (równą 32767)
Jak używać funkcji rand( ):
#include // biblioteka zawierająca funkcje rand, srand i stałą RAND_MAX
#include // biblioteka zawierająca funkcję time
....
// instrukcja srand inicjuje generator liczb losowych wartością przypadkową,
// otrzymaną z zegara systemowego funkcją time (jest to tzw. zarodek liczb losowych)
// dzięki temu za każdym razem program losuje inne liczby:
srand (time(0));
cout << rand( ); // generuje liczbę losową całkowitą z przedziału <0, RAND_MAX>
cout << rand( ) / double(RAND_MAX); // generuje liczbę losową double z przedziału <0, 1>
cout << a+(b-a)*rand( ) / double(RAND_MAX); // generuje liczbę losową double z przedziału
// Prościej jest użyć funkcji modulo, choć nie zapewnia to rozkładu w pełni jednostajnego:
cout << rand( )%100; // generuje liczbę losową całkowitą z przedziału <0, 100)
cout << a+ rand( )%(b+1-a); // generuje liczbę losową całkowitą z przedziału
7
Znaki
Pojedynczy znak można zapisać następująco:
" w apostrofach, np. 'A' '@' '0'
" za pomocą kodu ASCII: każdemu znakowi przyporządkowany jest kod dziesiętny
z przedziału <0, 255>; zależność między typami char i int określa rzutowanie,
np. char (225) lub (char)255 oznacza znak o kodzie 225, czyli b, zaś int ('A') jest równe 65.
Przykład 1: kody ASCII i odpowiadające im znaki można wydrukować za pomocą pętli:
for (int kod =0; kod<256; kod++)
cout << kod << "\t"<< (char) kod << endl;
Znaki w kodzie ASCII uporządkowane są następująco: ... 0 .. 9 ...... A .. Z ...... a .. z ...
Przykład 2: tak możemy sprawdzić, jakie znaki zawarte są między 'Z' i 'a':
for (char zn ='Z' +1; zn<'a'; zn++) // dodanie 1 do znaku oznacza następny w kodzie ASCII znak
cout << (int)zn << "\t" << zn << endl;
W zapisie znaku można też podać kod ósemkowy lub szestnastkowy:
np.: '\33' oznacza znak o kodzie ósemkowym 33, czyli Esc
'\xe1' oznacza znak o kodzie szestnastkowym e1, czyli b
Uwaga: jak widać, wpisując kod ósemkowy lub szestnastkowy, po znaku \ nie należy pisać 0
Znaki specjalne (niektóre):
\n - przejście do nowej linii \t - tabulacja
\b - Backspace \\ - Backslash
\' - apostrof \" - cudzysłów
\a - sygnał dzwiękowy (alarm)
8
Napisy (łańcuchy) i operacje na nich
Napis (inaczej: łańcuch, tekst, string) - dowolny ciąg znaków ujęty w cudzysłowy, może
zawierać znaki specjalne, np.:
"napis \" Podaj liczbe \" zacheca do pisania " // napis zawierający w środku cudzysłowy
"Podaj promien kola \n" // napis zawierający znak przejścia do nowej linii
Napisy można ze sobą porównywać. Wynik jest zgodny z uporządkowaniem w kodzie
ASCII, np. "Jan" < "Jon", "Jan" < "Janina" oraz "Jan" < "jan". Niepoprawnie działa jednak
porównywanie napisów zawierających polskie znaki diakrytyczne.
" Do znaków w łańcuchu odwołujemy się jak do elementów tablicy jednowymiarowej,
poprzez indeksy, zaczynając od 0.
" Rozmiar łańcucha, czyli liczbę jego znaków można wyznaczyć za pomocą funkcji
size( ). UWAGA: funkcja ta nie ma parametrów (wnętrze nawiasów jest puste).
" Aańcuchy można ze sobą łączyć za pomocą operatora +
3
0
2 4
1
string imie = "WITEK";
W K
dwa sposoby inicjowania I T E
string mama ("ASIA");
napisów
...
imie[0] imie[4]
cout << imie[0]; // pierwszy znak napisu
imie[1]
cout << imie [imie.size( )-1]; // ostatni znak napisu
cout << imie + ".cpp " // wyświetli się "WITEK.cpp"
imie.size( ) jest tu równe 5
9
Wczytywanie znaków
Znaki można wczytywać dwojako:
tylko znaki widoczne za pomocą instrukcji:
cin >> znak; gdzie znak jest zmienną typu char
(wczytuje pod zmienną pierwszy widoczny znak)
wszystkie znaki widoczne oraz tzw. znaki białe (spacja, Enter, Tab) za
pomocą instrukcji:
cin.get (znak); gdzie znak jest zmienną typu char
Natomiast instrukcja bezargumentowa:
cin.get ( );
oznacza: poczekaj na wczytanie jakiegoś znaku; ta instrukcja zatrzymuje
bowiem działanie programu, dopóki nie wciśniemy jakiegoś znaku i nie wyślemy
go Enterem (najlepiej od razu wcisnąć Enter).
Ponadto:
cin.ignore ( );
ignoruje jeden znak w strumieniu wejściowym, co pozwala pominąć np. Enter z
wcześniejszego wczytywania znaków.
10
Wczytywanie napisów
Napisy można wczytywać dwojako:
od pierwszego widocznego znaku do pierwszego niewidocznego,
białego znaku (odstępu, Entera itp.) za pomocą instrukcji:
cin >> napis; gdzie napis jest zmienną typu string;
linia po linii - za pomocą instrukcji:
getline (cin, napis); gdzie napis jest zmienną typu string;
Funkcja getline wczytuje do zmiennej typu string wszystkie znaki w
danym wierszu aż do napotkania Entera (ale Entera nie dopisuje do
tej zmiennej).
string dane;
cout << "napisz imie i nazwisko i wcisnij Enter ";
cin >> dane;
cout << " Witaj, " << dane; // wydrukuje się tylko imie
cout << "napisz imie i nazwisko i wcisnij Enter ";
getline (cin, dane);
cout << " Witaj, " << dane; // wydrukuje się imie i nazwisko
11
Tablice dwuwymiarowe
Definicja TABLICY
typ_elementów nazwa_tablicy [ilosc_wierszy] [ilosc_kolumn] ;
lub:
typ_elementów nazwa_tablicy [ilosc_wierszy] [ilosc_kolumn] =
{...,...,..., ,...}; // inicjalizacja tablicy
wartości początkowe
Wartości początkowe w przypadku inicjalizacji tablicy wstawiane są do
kolejnych wierszy tablicy.
kolumny
Przykłady:
const int N=4, W=5, K=7; // tak można zdefiniować kilka stałych
char z[W] [K]; // tablica o nazwie z i W wierszach oraz K
// kolumnach
int a[N] [N]= { 12,9,47,48,17,8,39,8,48,46,18,20,8,18,3,21 };
// tablica kwadratowa o N wierszach i N kolumnach
// - zobacz obok efekt tej inicjalizacji
Uwaga: wiersze i kolumny tablic dwuwymiarowych
też numerowane są (indeksowane) od zera.
wiersze
12
Tablice dwuwymiarowe - wczytywanie
Przykład wczytywania danych do tablicy - wierszami
const int W=4, K=4;
int a[W][K]; // definicja tablicy a
...
...
for (int i = 0; i < W; i++) // dla każdego wiersza i tablicy
for (int j = 0; j < K; j++) // przejdz przez wszystkie kolumny j
cin >> a[i] [j] // wczytaj element o indeksach i, j
...
13
Tablice kwadratowe
UWAGA: po przekątnych (a także po pojedynczych wierszach i kolumnach)
poruszamy się w pętli pojedynczej (!).
Przykład:
Zerujemy elementy głównej przekątnej: Zerujemy elementy drugiej przekątnej:
for (int i = 0; i < N; i++) for (int i = 0; i < N; i++)
a[i][i] =0; a[i][N-1-i] =0;
14
Tablica kwadratowa wypełnianie nad główną przekątną
Pod i nad przekątnymi poruszamy się w pętli podwójnej, w
której zmienna sterująca pętli wewnętrznej zmienia się w
sposób zależny od wartości zmiennej sterującej pętli
zewnętrznej (j jest zależne od i).
Przykład: elementy nad główną przekątną należy wypełnić
kolejnymi liczbami naturalnymi, poczynając od 1
i poruszając się wierszami.
15
Tablica kwadratowa wypełnianie po ukosie
Tablicę wypełnić kolejnymi liczbami naturalnymi,
poczynając od 1 i poruszając się wzdłuż kolejnych linii
ukośnych o numerach od 1 do 7 (jak zaznaczone
kółeczkami na rysunku).
p = 1;
for (k=N-1; k>=0; k--)
for (i=0; i a[i][i+k] = p++;
for (k= 1; kfor (i=k; i a[i][i-k] = p++;
Wyszukiwarka
Podobne podstrony:
wyklad 3 zap i,! 10 2013
wyklad 1 zap i, 7 10 2013
wyklad 2 zap i, 10 2013
wyklad 7 zap i, 11 2013
wyklad 8 zap i, 11 2013
Wykład HGOL 10 2013
wyklad zap i, 12 2013
wyklad zap i, 12 2013
wyklad 5 zap i, 4 11 2013
wyklad 9 zap i, 2 12 2013
wyklad 6 zap i, 11 2013
30 10 2013 POCZĄTKI PAŃSTWOWOŚCI EGIPSKIEJ wykład
23 10 2013 KSZTAŁTOWANIE PAŃSTWA PRZESTRZENNEGO NA TERENIE MIĘDZYRZECZA wykład
wyklad 10 2013
Mikroekonomia wykład 10 2013
Podstawy prawoznawstwa 22 10 2013 Wykład 3
więcej podobnych podstron