910 likes | 1.2k Views
Podstawy programowania w języku C i C++. Tematy : Makrodefinicje, operacje na znakach. Instrukcje warunkowe if … else; switch. Instrukcje iteracji: while, do…while, for. Cele nauczania : Podstawowe zasady programowania . Praktyczna znajomość elementów programowania w języku C/C++
E N D
Podstawy programowania w języku C i C++.Tematy: Makrodefinicje, operacje na znakach. Instrukcje warunkowe if … else; switch. Instrukcje iteracji: while, do…while, for. Cele nauczania: Podstawowe zasady programowania. Praktyczna znajomość elementów programowania w języku C/C++ Docelowo : Opracowanie algorytmu wybranego zadania geodezyjnego i przedstawienie go w postaci schematu blokowego. Opracowanie programu w wybranym języku programowania Wykonanie dokumentacji programu . Szczegółowe dla lekcji: Zapoznanie się z makrodefinicjami, podstawowymi operacjami na znakach, instrukcjami warunkowymi i instrukcjami iteracji. Praktyczne wprowadzanie, uruchamianie i kompilacja programów z tymi instrukcjami. Cele operacyjne lub szczegółowe cele kształcenia Po zakończeniu lekcji uczeń będzie umiał: stosować podstawowe proste makrodefinicje i operacje na znakach w C oraz instrukcje warunkowe i iteracje.
Część wstępna Część wstępna - organizacyjna: przywitanie, sprawdzenie obecności, wpisanie tematu lekcji. - Część merytoryczna Ogniwo 1. Uświadomienie uczniom celów– pogadanka Celem zajęć jest zapoznanie się z pojęciem makrodefinicji, podstawowymi operacjami na znakach i łańcuchach znaków oraz instrukcjami warunkowymi if…else, switch i iteracyjnymi: while, do…while, for. Po 2 lekcjach : wpisuje i uruchamia programy, stosując proste makrodefinicje, operacje na znakach i instrukcje warunkowe oraz iteracyjne.
Ogniwo 2Poznanie nowych faktów – pogadanka • W języku C i C++ można stosować dyrektywy preprocesora #define - tzw. makrodefinicje – stałe symboliczne i makrorozwiniecia. • Stała symbolicznajest nazwą zastępującą łańcuch znaków. Może być stała numeryczna, znakowa lub tekstowa. Np. #define PI=3.141596. • Do podejmowania decyzji w programie służą instrukcje warunkoweif, if…else oraz instrukcja wyboru switch…case. • Do organizacji obliczeń cyklicznych stosuje się pętlewhile, do…while, for, instrukcję zaniechania break, kontynuowania continue.
Ogniwo 3. Kształtowanie pojęć, poznawanie, systematyzowanie wiedzy - Przypomnienie podstawowych elementów języka C: Programy w C mają rozszerzenia plików C a w C++ rozszerzenie CPP. Po skompilowaniu program ma rozszerzenie EXE. Polecenia kończymy średnikiem. Kod funkcji umieszcza się w nawiasach klamrowych. Rozróżniane są w C duże i małe litery. Stałe oznaczamy zwykle dużymi literami. W definicji poprzedzone słowem const Komentarze typu /* … */ w C i C++ mogą być wielo-liniowe oraz typu // w jednej linii w C++ Program zawiera zawsze: funkcję main(). Na końcu funkcji main jest zwykle return 0;. Zwykle program zawiera nagłówek jako komentarz,, dyrektywy preprocesora , zwłaszcza #include, czasem #define – stałe i makroinstrukcje. Przed funkcją główną mogą być zadeklarowane lub zdefiniowane stałe, zmienne globalne oraz funkcje. Zmienna musi być zadeklarowana prze użyciem. Aby zatrzymać program, używamy funkcji getch();. Do czyszczenia ekranu służy funkcja clrscr();. W tekście możemy używać tzw. znaków specjalnych, np. przejście do następnej linii \n. Program składa się z ciągu instrukcji rozdzielonych średnikami Instrukcje położone są pomiędzy słowami kluczowymi { i } Instrukcje mogą zawierać wyrażenia oraz wywołania funkcji. Wyrażenia składają się ze stałych, operatorów i identyfikatorów (nazwa stałych, zmiennych, funkcji). Identyfikatory są nazwami obiektów składających się na program. Mogą one zawierać litery, cyfry i znaki podkreślenia, nie mogą jednak zaczynać się od cyfr. Mogą zaczynać się od liter lub znaku _
Podstawowe typy danych w jezyku C • W języku C każda zmienna ma swój typ, który musi być określony przed pierwszym użyciem. • Istnieją wbudowane i zdefiniowane przez użytkownika typy danych. • W języku C wyróżniamy następujące podstawowe wbudowane typy zmiennych. • char – typ znakowy - jednobajtowe liczby całkowite, służy do przechowywania znaków (1 Bajt); • int- liczby całkowite - typ całkowity, o długości domyślnej dla danej architektury komputera (2 B); • float – liczby rzeczywiste - typ zmiennopozycyjny (zwany również zmiennoprzecinkowym), reprezentujący liczby rzeczywiste (4 Bajty); • double – liczby rzeczywiste - typ zmiennopozycyjny podwójnej precyzji (8 B); • Specyfikatory – signed, unsigned, short, long - słowa kluczowe, które zmieniają znaczenie • short - liczby całkowite krótkie • long - liczby całkowite długie • long double - liczby zmiennoprzecinkowe podwójnej precyzji długie
Typy zmiennych, zakresy, rozmiar, zapis Zapis liczb: dziesiętne, z kropką dziesiętną i ewentualnie E (postać m*10^c)ósemkowe z 0 na początku, szesnastkowe z 0x na początku.
Operatory można pogrupować wg cech funkcjonalnych na grupy: • operatory arytmetyczne: +, -, *, /, % (dzielenie modulo - reszta) • operatory porównania – relacyjne: ==, !=, <, >, <=. >+ • operatory logiczne: && (and), || (or), ! (not) • operatory bitowe • operatory przypisania: =, += (a=+b a=a+b), -=, *=, /+, %=… • operatory unarneinkrementacji i dekrementacji: ++, --np. x++; x--; ++x; --x; • operatory rozmiaru: sizeof(obiekt) • operatory konwersji: (nazwa typu) wyrażenie • operator warunkowy: Op1 ? Op2: Op3; • operator przecinkowy: Op1, Op2, ..., Opn • operatory wskazywania->
Inne operatory: • Operator przecinkowy (,), stosowany w instrukcjach cyklu fora także w wywołaniach funkcji. Para wyrażeń oddzielonych operatorem obliczana jest od lewej do prawej. Rezultatem jest wyrażenie po prawej stronie. Ogólny zapis: wyrażenie po lewej, wyrażenie po prawej Instrukcja for z operatorem przecinkowym: for (wyr1; wyr2; wyr3a; wyr3b) { instrukcje}np.int i, j; for(i=0; j=10; j>=0; i++; j--) {printf(„\n %2i %2i %6.3f %6.3f, i, j, sqrt((double) i), sin((double) j)); } Przykład wywołania funkcji: f(a, b, (k=2, k+7), d) – wywołanie funkcji z 4 argumentami, trzeci ma wartość 9. • Operatory wskazywania:&operator adresu, - adres zmiennej np. &count– adres zmiennej count*operator adresowania pośredniego, .operator składowej, ->operator wskaźnikowy składowej • Operatory wejścia >> i wyjścia << w C++
Priorytety operatorów, kolejność wykonywania działań: • Nawiasy mają najwyższy priorytet. • Mnożenie i dzielenie mają pierwszeństwo przed dodawaniem i odejmowaniem.Dzielenie jest równoprawne z mnożeniem. • W przypadku jednakowego priorytetu operatorów o priorytecie decyduje kolejność ich występowania w wyrażeniu – od lewej do prawej strony.
Instrukcje wejścia i wyjścia w języku C: Wejście i wyjście programu • Do podstawowych funkcji języka C, umożliwiających komunikację z otoczeniem należą: dla operacji wyjścia: putchar, puts, printf; dla operacji wejścia: getchar, gets, scanf; • W DOS, wynikiwysyłane na ekran mogą być przy pomocy znaku potokuwysłane do pliku lub na drukarkę.Np. program.exe > Wynik.txt do pliku, usunięcie istniejącegoprogram.exe >> wyniki.txt do pliku – dopisanie do istniejącegoprogram.exe > PRN na drukarkę
Kody sterujące /* Program dzwonki.c */ #include <iostream.h> #include <conio.h> #define BELL 7 #define DZWONEK '\007' void main() { int a, b, c; putchar ('\a'); getch(); putchar('\007'); getch(); putchar('\7'); getch(); putchar('\x7'); getch(); putchar(DZWONEK); getch(); putchar(BELL); getch(); } • Kody sterujące: kod nowego wiersza: \n np. puchar(‘\n’); kod tabulacji: \t kod powrotu karetki \r Kod cofania \b kod wysunięcia strony \f kod dzwonka \a putchar(‘\a’); lub \007 • Znaki specjalne: \’ – wyświetla apostrof, \” – cudzysłów, \\ - backslash, \007 – dzwonek
Funkcja printf() - uniwersalna • Funkcje puts() i puchar() mogą wyświetlić tylko jedną rzecz: łańcuch znaków lub znak i nie mogą wyświetlić wartości liczbowych. • Funkcja printf() jest bardziej uniwersalna. Może wyświetlić dane dowolnego typu i współpracować z wieloma argumentami. • Wyprowadza wynik przetwarzania w różnych formatach. • printf (łańcuch_sterujący, lista _danych_argumentów); lub inaczej printf(ciag_formatujący, lista parametrów); • Ciąg formatujący jest zwykłym ciągiem znaków do wyświetlenia na ekranie. Jednak niektóre znaki mają funkcję specjalną i nie zostaną one po prostu wyświetlone. Takim właśnie znakiem jest znak % . Gdy funkcja printf() go napotka to wie, że po nim wystąpi określenie rodzaju argumentu i formatu jego wyświetlenia na ekranie. /* Przykład: getchar1.c */ #include <stdio.h> #include <conio.h> int main(void) { int inicjal; puts("Podaj swoj inicjal "); inicjal=getchar(); putchar(inicjal); putchar('\n'); printf("Twoj inicjal to %c. Jego kod ASCII: %i ",inicjal, inicjal); getch(); }
Formaty realizowane przez funkcję printf()(znaki typu w łańcuchach formatujących)
Wyprowadzanie danych w języku C++: cout << • Polecenie cout z operatorem wyjścia<< , czyli cout << • W C++ poza powyższymi istnieje dodatkowy sposób wyprowadzania informacji wszystkich typów:Instrukcja cout<< wyświetla wartości literałów, stałych i zmiennych bez konieczności korzystania ze specyfikatorów formatowania. • Do wykorzystania polecenia cout należy w dyrektywie #include wyspecyfikować plik iostream.h • Polecenie cout języka C++ #include <iostream.h> cout << lista_danych; // np. cout << "Masz " << wiek << "lat " << ‘\n’; cout << „łańcuch”; // cout << "Cześć, nazywam się Jan Nowak. My się znamy " cout << nazwa_stałej; // char nazwisko[]=”Jan Nowak”; cout << nazwisko; cout << nazwa_zmiennej; // cout << wiek;
Operacje wejścia wprowadzanie danych w C i C++ • Do wczytywania danych stosuje się instrukcjegetchar(), gets(), scanf() w C i C++ oraz cin >> w C++ • Funkcja gets() służy do wczytania pojedynczej linii. Np. char linia[80]; gets(linia); • getchar umożliwia wprowadzenie pojedynczego znakuNp. char znak; znak=getchar(); putchar(znak); • scanf() to uniwersalna funkcja do wprowadzania wszelkiego typu informacji. Składa się z łańcucha sterującego i listy danych. scanf(„lancuch_sterujacy”,lista_danych);Np. float ilosc; scanf(„%f”,&ilosc);Łańcuch sterujący zawiera specyfikatory formatowania – jak będą interpretowane dane wejściowe. • Specyfikatory formatowania: %d– wprowadza liczbę całkowitą, %u – liczba bez znaku, %f– liczba float, %e – liczba w systemie wykładniczym, %g– liczba dziesiętna w najkrótszym zapisie, %c– dana znakowa char, %s– łańcuch znaków,%o– liczba ósemkowa, %x– liczba szesnastkowa
Specyfikatory formatowania • %d – wprowadza liczbę całkowitą, • %u – liczbę całkowitą bez znaku, • %f – liczba rzeczywista typu float, • %c – znak, • %s – łańcuch, • %o - liczba ósemkowa, • %x – liczba szesnastkowa, • %e – liczba w zapisie wykładniczym, • %g – liczba dziesiętna w najkrótszym zapisie. • Wzorzec konwersji określa typ zmiennej, którą wpiszemy z klawiatury lub wypiszemy na ekranie.
Tabela: deklaracje zmiennych określonego typu, wzorce konwersji, przykłady /* Program kalk1.c – prosty kalkulator, dane liczby całkowite*/ #include <stdio.h> #include <conio.h> int main() /* funkcja główna */ { int a,b; /* deklaracja zmiennych całkowitych a i b */ int suma,roznica,iloczyn; float iloraz; /* deklaracje zmiennych */ clrscr(); /* kasowanie ekranu */ printf("Prosty kalkulator\n"); /* nagłówek */ printf("\nPodaj liczbe a: "); scanf("%d",&a); /* wczytanie liczby a */ printf("Podaj liczbe b: "); scanf("%d",&b);/* wczytanie liczby b */ suma=a+b; roznica=a-b; iloczyn=a*b; /* obliczenia */iloraz=(float)a/(float)b; /* operator rzutowania w dzieleniu */ printf("\nWyniki dzialan:\n"); printf("\nSuma: %d ",suma); printf("\nRoznica: %d ",roznica); printf("\nIloczyn: %d ",iloczyn); printf("\nIloraz: %f ",iloraz); getch(); return 0 ; }
Podsumowanie: operatory, instrukcje wejścia, wyjścia • Podstawowe typy danych: char, int, float, long double specyfikatorylong, signed, unsigned, short, long. • Zapis liczb dziesiętnych, ósemkowych, szesnastkowych, znaków, kody sterujące (\n, \t, \f, \a – BEL, \r, \0 – nul, \’ itd.) Operatory: arytmetyczne, zwiększania i zmniejszania ++, --, relacyjne : <, <=, >, >=, ==, !=, logiczne(!, && - and, || - lub), przypisania=, wieloznakowe operatory przypisania (a#=b; czyli a=a#b; np. a+=b; a=a+b:), operator rozmiarusizeof, operator konwersji(typ) wyrażenie, np. (float) (21/10);operator warunkowy wyr_warunkowe ? wyr_na_tak: wyr_na_nie (np. z = (a>b)? a:b; /* z=max(a,b) */ • Instrukcje wejścia wyjścia: Wyświetlenie na ekranie: puchar(znak) – znak, puts(napis) - łańcuch znaków, printf(„łańcuch formatu”, argumenty); Wyprowadzanie wyników w C++: cout << lista, np. cout << „Wynik: „ << cout a << endl;Wprowadzanie danych: znak=getchar() – pojedynczy znak; gets(zmienna_łańcuchowa); - napis (do klawisza Enter),scanf(„łańcuch sterujący”, lista_danych) – uniwersalna funkcja do wprowadzania informacji wszelkiego typu.Wprowadzanie danych w C++: cin >> zmienna
Podsumowanie – wejście, wyjście, liczby, zmienne, wzorce konwersji • Aby wczytać liczbę należy użyć funkcji scanf w postaci: scanf("wzorzec",&zmienna); • Aby wypisać wczytaną w ten sposób liczbę należy użyć funkcji printf, która służy do wypisywania komunikatów. Postać funkcji: printf("Komunikat wzorzec",zmienna); • W funkcji scanf zawsze przed nazwą zmiennej używamy znaku &, a nie robimy tego przy używaniu funkcji printf. • Zmienna służy do przechowania danych, których wartość ustala się w trakcie działania programu i może być zmieniana. • Każda zmienna musi być zadeklarowana przed jej użyciem jako zmienna odpowiedniego typu: int, float, char itp. • Do wypisywania komunikatówsłuży funkcja printf, lub puts a do wczytywania zmiennych funkcja scanf. • Do poprawnego użycia obu funkcji należy znać podstawowe wzorce konwersji: %d, %f, %s.
Preprocesor, dyrektywy, funkcje biblioteczne C Preprocesor przetwarza wiersze programu rozpoczynające się znakiem #. Taki wiersz nazywamy dyrektywą preprocesora. Podstawową dyrektywą jest #include, umożliwiająca dołączenie do programu pliku o podanej nazwie. Ma 2 postacie: #include <nazwa> i #include „nazwa” Nazwa w nawiasach kwadratowych oznacza plik nagłówkowy dostępny w systemie C, natomiast w cudzysłowieplik zdefiniowany przez użytkownika. W C istnieje duża biblioteka funkcji standardowych, czyli dostępnych bezpośrednio w systemie. Zawarte są w tzw. modułach. Moduły biblioteczne dołącza się przez instrukcję#include <nazwa>. Standardowo dołączamy stdio.h w C a iostream.h w C++ Procedura clrscr() zawarta w module conio.h umożliwia wyczyszczenie ekranu. W math.h zdefiniowane jest np. M_PI (czyli PI) Dyrektywa #define , np. #define NMAX 20 definiuje stałą NMAX o wartości 20.
Stałe symboliczne Stała symbolicznajest nazwą zastępującą ciąg znaków #define NAZWA tekst Np. #definePI 3.1415926 #defineMIEJSCOWOSC Sosnowiec #defineWYNIK printf(("Pole=%d\f %”,pole1) #defineWZOR1 (a*b)
Stałe symboliczne - makrodefinicje • Stała symboliczna jest nazwą przedstawiającą inną stałą - numeryczną, znakową lub tekstową. Definicję stałej symbolicznej umożliwia instrukcja #define:#define NAZWA tekstgdzie NAZWA jest nazwą stałej symbolicznej, a tekst jest związanym z tą nazwą łańcuchem znaków • Przykłady:Makrodefinicje proste: #define identyfikator <ciąg-jednostek-leksykalnych> #define PI 3.14159 #define TRUE 1 #define FALSE 0 #define NAPIS1 Siemianowice #define IMIE "Andrzej" // (puts(IMIE) rozwija w tekst puts("Andrzej") #define IMIE_I_NAZWISKO IMIE+"Zalewski" #define WCZYTAJ_IOSTREAM_H #include <iostream.h>
Makrodefinicje parametryczne • #define identyfikator(idPar1, idPar2,...) ciąg_jedn_leksykalnych • Np. • #define ILORAZ(a,b) ((a)/(b)) //- makrodefinicja ILORAZ – parametry a i b w nawiasach! • #define SUMA(a,b)((a)+(b)) • W trakcie kompilacjinazwy stałych symbolicznych są zastąpione przez odpowiadające im łańcuchy znaków. Ułatwia to parametryzację programu, a także umożliwia zastępowanie często niewygodnych w pisaniu sekwencji programu, tworzenie makrodefinicji
Szablony programu dla ucznia – dane wpisane w #define /* zmienne globalne - stale, zmienne */ constdoublepi=3.14159265; constchar szkola[]="Sztygarka"; /* Przykladowa funkcja - deklaracja */ float suma1(float l1, float l2); /* ========== Funkcja główna * ======== */ int main() { clrscr(); printf("Program: %s \n",PROGRAM); KRESKA2; puts(NAZWISKO); puts(KLASA); puts(SZKOLA); KRESKA; /* -- dalszy kod programu głównego */ /* -------------------------------------------- */ KONIEC; getch(); return 0; } /* =========== Funkcje - definicje ======= */ float suma1(float l1, float l2) /* Definicja funkcji */ { return(l1+l2); } /* Program Szablon1.c */ /* #include - włączenia tekstowe bibliotek */ #include <stdio.h> /* prawie zawsze np. do printf() */ #include <conio.h> /* np. do getch() */ #include <math.h> /* #define - stale makroinstrukcje */ #define PROGRAM "program.c" #define NAZWISKO "Nowak Jan" #define ROK 2011 #define SZKOLA "Sztygarka" #define KLASA "2BG" #define NL printf("\n"); #define TAB putchar('\t'); #define PI 3.141592653 #define KRESKA puts("------------------------------") #define KRESKA2puts("================"); #define KONIEC puts("\n\nNacisnij cos ")
Szablon programu do obliczeń geodezyjnych /* zmienne globalne - stale, zmienne */ const double pi=3.14159265; const double rograd=63.66197724, rostop=57.2957795130823; /* Ro[grad]=200/PI, Ro[stopn]=180/PO const char szkola[]="Sztygarka"; /* Przykladowa funkcja - deklaracja */ float suma1(float l1, float l2); /* ========== Funkcja glowna * ======== */ intmain() { clrscr(); printf("Program: %s \n",PROGRAM); KRESKA2; puts(NAZWISKO); puts(KLASA); puts(SZKOLA); KRESKA; printf("63.66198[grad]=%f[rad]",KATRAD(rograd)); /* -- dalszy kod programu, głównego. -- */ KONIEC; getch(); return 0; } /* =========== Funkcje - definicje ======= */ float suma1(float l1, float l2) /* Definicja funkcji */ { return(l1+l2); } /* Schemat programu do obliczeń geodezyjnych */ /* Program Szablgeo.c */ /* preprocesor: #include - wlaczenia tekstowe bibliotek */ #include <stdio.h> /* prawie zawsze c C, np. do printf() */ #include <conio.h> /* np. do getch() */ #include <math.h> /* #define - stale makroinstrukcje */ #define PROGRAM "program.c" #define NAZWISKO "Nowak Jan" #define ROK 2011 #define SZKOLA "Sztygarka" #define KLASA "2BG" #define NL printf("\n"); #define TAB putchar('\t'); #define PI 3.141592653 #define ROG 63.66197724 #define ROS=57.2957795130; #define KRESKA puts("------------------------------------------------") #define KRESKA2puts("============================="); #define KONIEC puts("\n\nNacisnij cos ") #define KATRAD(g) ((g)/(ROG)) #define KATGRAD(r) ((r)/(ROS))
Stałe wyliczeniowe (enumeration constant) • Stałe wyliczeniowe tworzą zbiór stałych o określonym zakresie wartości. • Wyliczenie jest listą wartości całkowitych, np.enumboolean {NO, YES};Pierwsza nazwa na liście wyliczenia ma wartość 0, następna 1 itd., chyba że nastąpi jawnie podana wartość. • Przykłady:enumKOLOR {CZERWONY, NIEBIESKI, ZIELONY, BIAŁY, CZARNY}enum KOLOR {red=100, blue, green=500, white, black=700}; red przyjmiewartość 100, blue 101, green 500, white 501, black 700
Operacje na znakach i łańcuchach znaków • Typy znakowe: - deklaracja: char zmienna; pojedynczy znak: char znak; np. char zn1=‘a’; char litera; litera = ‘F’;łańcuch znaków (napis, słowo) • char *napis; np. char *str1=„Programowanie”; • char napis[n]; np. char linia[80]; gets(linia); char imie[20]; scanf("%s",imie); • np.char napis[]="Tekst”, np. char pozdrowienie="Jak się masz” • Wzorzec konwersji przy wyświetleniu lub wczytywaniu zmiennej typuchar • %cdla pojedynczego znaku (łańcucha jednoznakowego) np. char znak1; scanf("%c",&znak1); • %s dla łańcucha dłuższego niż 1 znaknp. char slowo2[20]; scanf("%s",slowo2);
/* Program znaki1.c */ #include <stdio.h> #include <conio.h> #include <string.h> main (void) { char znak1,znak2,znak3; //deklaracja znaków char slowo1[10], slowo2[15]; char slowo3[]="Adam"; // definicja clrscr(); // czyszczenie ekranu znak1='a'; // inicjalizacja zmiennej znak1 znak2=102; // znak w postaci kodu dziesiętnego ASCII - litera f printf("Podaj znak3: "); scanf("%c",&znak3); // podajemy jakiś znak printf("\nPodaj slowo1: "); scanf("%s",slowo1); // wpisujemy słowo 1 printf("\nPodaj slowo2: "); scanf("%s",slowo2); // wpisujemy słowo 2 printf("\nZmienne zawieraja znaki: "); printf("znak1 (a), znak2 (102), znak3 (wprowadzony): %c %c %c ",znak1,znak2,znak3); printf("\noraz slowa: "); printf("slowo1, slowo2, slowo3: %s %s %s ",slowo1, slowo2, slowo3); getch(); return 0 ; }
Przypisanie wartość zmiennej znakowej i napisom • Przypisać wartość zmiennej jednoznakowej możemy na kilka sposobów: • w apostrofach: zmienna='a'; • poprzez przypisanie kodu znaku: zmienna=97; • poprzez wczytanie znaku z klawiatury funkcją scanf():scanf("%c",&zmienna); • Przypisanie wartości do zmiennej dla łańcucha znaków dłuższego niż jeden znak odbywa się podobnie jak w pierwszym przypadku, z tą jednak różnicą, że zamiast apostrofów ' należy używać cudzysłowia "char slowo3[]="Adam"; // definicja
Odczytanie długości łańcucha znaków – strlen(lancuch) /* dluglanc.c */ #include <stdio.h> #include <conio.h> #include <string.h> main (void) { int dlugosc; char *lancuch; clrscr(); lancuch="Adam Nowak"; dlugosc=strlen(lancuch); printf("Lancuch '%s' ma: %d znaków \n",lancuch, dlugosc); printf("Pierwsza litera łańcucha to: %c \n",lancuch[0]); printf("Ostatnia litera łańcucha to: %c \n",lancuch[dlugosc-1]); getch(); return 0 ; }
Inne funkcje operujące na łańcuchach: strlwr, strupr, strcat, strrv, streset – z biblioteki string.h strcat() - łączy dwa łańcuchy, strcmp() - porównuje dwa łańcuchy rozróżniając małe i duże litery, strlwr() i strupr() - zamienia w danym łańcuchu duże litery na małe i odwrotnie, strrev() - odwraca kolejność znaków w łańcuchu, strset() - wypełnia łańcuch danym znakiem. /* znaki5.c - operacje na tekstach */ #include <stdio.h> #include <conio.h> #include <string.h> main (void) { char *lancuch1, *lancuch2, *lancuch3; char znakwyp='x'; // znak wypełniający clrscr(); puts("Operacje tekstowe\n"); lancuch1="Janusz"; lancuch2="Kowalski"; printf("Lancuch1 to: %s \n",lancuch1); printf("Lancuch2 to: %s \n",lancuch2); printf("\nZmieniamy duze litery na male: \n"); strlwr(lancuch1); printf("Lancuch1 wyglada teraz tak: %s \n",lancuch1); printf("\nZmieniamy male litery na duze: \n"); strupr(lancuch2); printf("Lancuch2 wyglada teraz tak: %s \n",lancuch2); printf("\nLaczymy dwa lancuchy: \n" ); lancuch3=strcat(lancuch1,lancuch2); printf("Lancuch3 wyglada teraz tak: %s \n",lancuch3); printf("\nOdwracamy kolejnosc znakow w lancuchu: \n" ); strrev(lancuch3); printf("Lancuch3 wyglada teraz tak: %s \n",lancuch3); printf("\nWypelniamy lancuch znakiem 'x':\n" ); strset(lancuch3,znakwyp); printf("Lancuch3 wyglada teraz tak: %s \n",lancuch3); getch(); return 0 ; }
Podsumowanie – znaki, łańcuchy znaków • Zmienne liczbowe mogą zawierać się w pewnych zakresach, których nie można przekraczać. • Deklaracja zmiennej znakowej: char znak; a zmiennej łańcuchowej: char *slowo; • Wartość zmiennej znakowej można przypisać w programie poprzez umieszczenie znaku w apostrofach lub przez napisanie jego kodu. • Wartość zmiennej łańcuchowej można przypisać w programiepoprzez umieszczenie napisu w cudzysłowie. • Zmienne znakowe i łańcuchowe można wczytywać z klawiatury używając funkcjiscanf() i odpowiednich wzorców konwersji: %s dla ciągu znaków i %c dla pojedynczego znaku. • Każdy znak posiada swój kod ASCII. • Kod ASCII mają również znaki nie przedstawione na klawiaturze komputera. np. ß, ö. • Łańcuch, który wygląda jak liczba nie jest liczbą. Istnieją funkcje, które potrafią przekonwertować łańcuch liczbowy do postaci liczby. • Mając dany łańcuch, możemy odczytać dowolny jego znak używając nawiasów kwadratowych. Pierwszy wpisany znak ma numer0, a nie 1. • Każdy ciąg kończy znak'\0'. • Długość łańcucha można ograniczyć przy deklaracji, np.: char slowo[10]; • Łańcuchy można ze sobą porównywać, łączyć, odwracać w nich kolejność liter, zmieniać małe litery na duże i odwrotnie, a także przeszukiwać, kopiować na siebie itp. Nazwy funkcji, które to wykonują zawsze zaczynają się na 'str' (z angielskiego: string).
Zasięg zmiennej • Zmienne globalne- obejmujące zasięgiem cały program – mogą być dostępne dla wszystkich funkcji programu. Deklaruje się je przed wszystkimi funkcjami programu: • Zmienne globalne, jeśli programista nie przypisze im innej wartości podczas definiowania, są inicjalizowane wartością 0. • Zmienne lokalne – o zasięgu obejmującym pewien blok.Zmienne, które funkcja deklaruje do “własnych potrzeb” nazywamy zmiennymi lokalnymi. • Pytanie: Czy jest błędem nazwanie tą samą nazwą zmiennej globalnej i lokalnej?. Nie. Natomiast w danej funkcji da się używać tylko jej zmiennej lokalnej. Tej konstrukcji należy, unikać. int a=1; /* zmienna globalna */ int main() { int a=2; /* to już zmienna lokalna – gdyby nie ta definicja to a =1 */ printf("%d", a); /* wypisze 2 (gdyby nie było powyższej instrukcji to 1)*/ }
Biblioteki, procedura, funkcja • Biblioteki (moduły) - zapisane są w nich różne funkcje i procedury do użycia w programie. • Funkcja - jest to podobnie jak procedura, pewien wyraz, który nie dość że coś wykona to również zwróci nam rezultat tego co zrobił, przykładowymi funkcjami są: pierwiastkowanie, sinus, cosinus. Zwracaną wartością niekoniecznie musi być liczba może to być również inny rodzaj zmiennych.
Typy char (C)bool, string (C++) • TYP ZNAKOWY - CHAR - typ ten przyjmuje dowolny pojedynczy znak o kodach ASCII (0..255) np. znak ‘A’ czy ‘!’ • W C łańcuchy reprezentuje się jako tablice znaków char slowo[dlug] a operacje na nich wykonuje z użyciem wskaźników. • TYP LOGICZNY - bool- typ ten może przyjmować jedynie dwie wartości: true (prawda) – 1 lub false (fałsz) - 0 #include <stdbool.h> int main(){ bool b = false; b = true;} • W C++ oprócz tradycyjnych ciągów znaków w stylu C istnieje w bibliotece standardowej klasa std::string. Ukrywa ona niewygodne aspekty używania napisów w stylu C: zarządzanie pamięcią, określanie długości, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisie. Dodatkowo pozbyto się problemu znaku kończącego - znak o kodzie \0.
INSTRUKCJE STERUJĄCE • PODEJMOWANIE DECYZJI W PROGRAMIE • Instrukcja warunkowaif…else; • Instrukcja wyboruswitch • ORGANIZACJA OBLICZEŃ CYKLICZNYCH - INSTRUKCJE PĘTLI: • Instrukcja pętli while • Instrukcja pętli do … while • Instrukcja pętli for
Instrukcja warunkowaif… [else...] • Pozwala nawykonanie lub zaniechanie wykonania pewnych czynności, w zależności od konkretnego warunku logicznego. • Instrukcja ma następującą składnię: if (warunek) instrukcja;np. if (x>30) y=20;If (warunek) {instrukcja_1; instrukcja_2; … instrukcja_N;}np. if (min <x) {min=x; nr=i;} • Instrukcja ta sprawdza czy jest spełniony warunek postawiony po „if",jeżeli tak to wykonywana jest instrukcja lub ciąg instrukcji w nawiasach { } • Można jeszcze też użyć słowa else oznaczającego "w przeciwnym wypadku”If (warunek) instrukcja_1; else instrukcja_2; np. if (a>0) c=b+2; else c=b-3;If (warunek) {instrukcja_1; instrukcja_2; … instrukcja_N;}else {instrukcja_A; instrukcja_B; … instrukcja_Z;}
jesli Warunek to Instrukcja; if (W) I; // if1a.c – instrukcja if #include <stdio.h> #include <conio.h> #include <math.h> Int main (void) { float liczba1, x; clrscr(); x=0; printf("Podaj liczbe dodatnia: \n"); scanf("%f",&liczba1); if (liczba1 >=0) x=sqrt(liczba1); printf ("Pierwiastek z %f = %f", liczba1, x); getch(); return 0 ; }
jeśli W to Instrukcja1 w przeciwnym przypadku Instrukcja2; if (W) I1; else I2; // program if1.c #include <stdio.h> #include <conio.h> Int main () { int liczba1,liczba2; clrscr(); printf("Podaj pierwszą liczbę: \n"); scanf("%d",&liczba1); printf("Podaj drugą liczbę: \n"); scanf("%d",&liczba2); if (liczba2==0) // operator == printf("Nie wolno dzielić przez 0!\n"); else printf("Wynik dzielenia: %f\ n", (float) liczba1/liczba2); getch(); return 0 ; } // program if1b.cpp #include <iostream.h> int Latka; intmain() { cout << "Program dla dorosłych \n Ile ty masz lat?\n"; cin >> Latka; if(Latka < 18) cout << "Jesteś, małolatem \n"; elsecout << "Jesteś dorosły; \n"; return 0; }
/* Program if1c.c język C */ #include <stdio.h> #include <conio.h> int main() { int a; printf("Podaj liczbe calkowita >0 "); scanf("%d",&a); if (a<=0) return 1;/* wyjście awaryjne z systemu */ printf("OK! a = %d >=0",a); getch(); return 0; } Przykłady programów z if /* Program If1cpp. cpp C++*/; #include <iostream.h> #include <conio.h> int main() {int a; cout << "Podaj liczbe calkowita >0 "; cin >> a; if (a<0) return 1; //wyjscie awaryjne z systemu cout << "OK"; getch(); return 0; // wyjscie normalne} /* Program If-else1.cpp */; #include <iostream.h> #include <conio.h> int main() { int a; cout << "Podaj liczbe calkowita > 0 ==> "; cin >> a; if(a<0) cout << "a < 0"; elsecout << "a >=0 "; getch(); return 0; } /* Program if-else1.c */; #include <stdio.h> #include <conio.h> int main() { int a; puts("Podaj liczbe calkowita > 0 "); scanf("%i", &a); if (a<=0) printf("a = %d <= 0",a); elseprintf("a = %d >= 0",a); getch(); return 0; }
Ogólna składnia if.. else if(warunek_logiczny) { instrukcje_do_wykonania } else if (inny_warunek_logiczny) { instrukcje_do_wykonania } else{ instrukcje_do_wykonania } • Po słowie kluczowym if, w nawiasie umieszcza się warunek. Jeśli jest prawdziwy, program przechodzi do wykonywania kodu w klamrach. Co jeśli warunek jest fałszywy? Wtedy program sprawdza kolejne warunki (każdy następny to już nie if, lecz else if) aż do napotkania wartości prawdziwej, po której wykonywany jest kod w klamrach. Jeśli wszystkie wartości będą fałszywe, program wykona kod umieszczony w klamrach po instrukcji else.
// Program if2.cpp C++ #include <iostream.h> int main() { int wiek = 0; char a; cout << "Podaj ile masz lat "; cin >> wiek; if (wiek > 18) // Jeśli wprowadzona liczba jest większa od 18 { cout << "Jesteś już dorosły!" << endl; } else if(wiek < 18) // Jeśli wprowadzona liczba jest mniejsza od 18 { cout << "Nie jesteś jeszcze dorosły!" << endl; } else// Jeśli wprowadzona liczba jest równa 18 { cout << "Masz równo 18 lat więc jesteś już dorosły!" << endl; } cin >> a; // wprowadzenie jakiegoś znaku return 0; }
Przykładowy program - zagnieżdżone instrukcje if - obliczenie podatku /* Program podatek.c */ #include <stdio.h> /* brackets.c */ voidmain() { floatincome; printf("Podaj sumę przychodów: "); scanf("%f", &income); if(income < 20000.00) puts("Podatek wynosi 15%"); else// >= 20000 if(income < 100000.00) // [20000, 100000) puts("Podatek wynosi 22%"); else// od 100000 puts("Podatek wynosi 35%"); }
Instrukcja ifi operatory logiczne: && (and), || (or), !(not) • Mogą one przyjmować wartościtrue czyli 1 lub 0 czyli falseZa ich pomocą możemy skonkretyzować nasz warunek. Np. if (warunek1) && (warunek2) instrukcja; • Operator &&(koniunkcja) sprawia, że instrukcja zostanie wykonana tylko w przypadku gdy spełnione są oba warunki. Gdybyśmy zastąpili go operatorem || (alternatywa), to wystarczyłby tylko jeden spełniony. • Drugi przypadekif (! Warunek) instrukcja;W tym przypadku instrukcja będzie wykonana jeśli warunek nie jest spełniony (ma wartość false). Do tego właśnie służy operator ! (czyli negacja).
if (a !=0) { if (delta<0) cout << "Delta ujemna - brak rozwiazan.\n" ; else if (delta==0) cout << "x= " << (-b+sqrt(delta))/(2*a); else if (delta>0) { cout << "x1= " << (-b+sqrt(delta))/(2*a) << endl; cout << "x2= " << (-b-sqrt(delta))/(2*a) << endl; } } else { if ((a==0) && (b==0)) cout << "Rownanie ma nieskonczenie wiele rozwiazan."; else if ((a==0) && (b!=0)) { cout << "Rownanie o podaneych wspolczynnikach jest liniowe.\n"; cout << "jego pierwiastek jest rowny: " << -c/b << endl; } } getch(); return 0; } Równanie kwadratowe a*x2 + b*x +c = 0 Instrukcje: if (a !=0) if (delta==0 … else if ((a==0) && (b==0)) … if ((a==0) && (b!=0)) /* program rowkwadr.cpp */ #include <iostream.h> #include <conio.h> #include <math.h> int main() { float a, b, c, delta; clrscr(); cout << "Program oblicza pierwiastki rownania kwadratowego." << endl; cout << "Podaj wspolczynniki: " << endl; cout << "a= " ; cin >>a; cout << "b= "; cin >> b; cout << "c= "; cin >> c; delta=b*b-4*a*c;
If - podsumowanie • Jeżeli do rozpatrzenia mamy kilka przypadków, stosujemy instrukcję warunkową if. • Instrukcję zapisujemy: if (warunek) instrukcja1; else instrukcja2; • Dla więcej niż jednej instrukcji należy zgrupować je za pomocą nawiasów klamrowych. • W warunku logicznym instrukcji if zawsze stosujemy operator porównania ==, a nie przypisania =. • Jeśli jednocześnie powinno być sprawdzone kilka warunków, łączymy je za pomocą operatorów logicznych && (and) , || (or) lub ! (nie)
Instrukcja switch - instrukcja wyboru • Instrukcja switch jest wykorzystywana kiedy zachodzi konieczność podjęcia kilku decyzji, gdy wykonanie różnych części programu jest uzależnione od stanu pewnej zmiennej. • Podstawą podjęcia decyzji jest wyrażenie typu całkowitego, znakowego lub logicznego • Instrukcja switch ma postać: switch (zmienna lub wyrażenie) {case wartosc_1: Instrukcje_1; break; // break nie musi być.................... case wartosc_N: Instrukcje_N; break;default Instrukcje_domyslne; }
Instrukcja wyboru switch dla wielu warunkówswitch – case – przypadek W spośród (I1, I2, … In)