Programowanie uzupełnienie notatek: dr Jerzy Białkowski
1 2 3 4 5 6 7
Charakter wykładu ˆ zakłada znajomość idei programowania strukturalnego (np. w Pascalu) oraz podstaw używania środowiska UNIX (wykonywanie poleceń) poznanych na Wstępie do Informatyki; ˆ adresowany do matematyków, a nie informatyków; ˆ jego celem jest zapoznanie z językami C i C++ w stopniu wystarczającym do pisania programów (na wasny użytek) oraz nauczania ich podstaw (np. w szkole), a nie nauka profesjonalnego programowania w tych językach (zwłaszcza w zespole); ˆ wprowadza programowania obiektowego przy założeniu, że dla znacznej części słuchaczy język C++ będzie jedynym poznanym na studiach obiektowym językiem programowania (brak Javy, C#, D).
Zaliczenie wykładu ˆ na zal, a nie na ocenę; ˆ na podstawie obecności na wykładzie (podpisy na listach) oraz zaliczenia ćwiczeń (wpis w USOS-ie); ˆ wymaga zapisania się na przedmiot pod systemem USOS; ˆ uprawniony student ma prawo, a nawet obowiązek upomnieć się o brakujący wpis w USOS-ie (zwłaszcza w przypadku późniejszego zaliczenia laboratorium). Terminy
podstawowa ˆ B. Kernighan, D. Ritchie, Język ANSI C, WNT, Warszawa 2004. ˆ E. Scheinerman, C++ for Mathematicians: An Introduction for Students and Professionals, Chapman & Hall/CRC 2006. ˆ J. Grębosz, Symfonia C++ standard : programowanie w języku C++ orientowane obiektowo, Tom 1 i 2, Kraków 2008. ˆ http://pl.wikibooks.org/wiki/c++ uzupełniająca ˆ B. Stroustrup, Język C++, WNT, Warszawa 2004. ˆ B. Eckel Thinking in C++. Edycja polska, Tom 1 i 2, Helion.
- Programowanie ˆ proste (typy całkowite i rzeczywiste, deklarowanie zmiennych).. Instrukcje. ˆ Funkcje (składnia definicji i deklaracji, wywołanie funkcji, rekurencja). Wskaźniki i tablice, napisy. ˆ Struktury. Wybrane funkcje biblioteki standardowej ˆ Język C, a C++. Pojęcie klasy, konstruktory i destruktory. ˆ Argumenty domyślne funkcji, przeciążone identyfikatory funkcji, referencje. ˆ Przeciążanie operatorów, funkcje zaprzyjaźnione. ˆ Dynamiczne tworzenie obiektów. ˆ Podstawowe o szablonach. Operacje we-wy, informacja o STL. ˆ Przykładowe problemy matematyczne i rozwiązania w.
Edytory i kompilatory Windows ˆ Notatnik[/ConTEXT/Notepad++] + MinGW(z MSYS) ˆ Code::Blocks ˆ Microsoft Visual Studio 2010 Express/Prof./Prem./Ultimate ˆ Dev-C++ ˆ NetBeans ˆ Eclipse CDT ˆ inne (cygwin, Borland, Watcom,...) Linux ˆ vi[m], gedit, kate, [x]emacs + gcc/g++ ˆ Code::Blocks ˆ KDevelop ˆ NetBeans ˆ Eclipse CDT
Code::Blocks
Visual Studio 2010 Ultimate
Dev-C++
Historia Język C został zaprojektowany przez Dennisa Ritchie w 1972 roku. W 1972 roku system operacyjny UNIX został napisany w tym języku. W roku 1989 Amerykański Narodowy Instytut Standaryzacji (American National Standards Institute) przyjął standard zwany odtąd ANSI C.
Historia Język C został zaprojektowany przez Dennisa Ritchie w 1972 roku. W 1972 roku system operacyjny UNIX został napisany w tym języku. W roku 1989 Amerykański Narodowy Instytut Standaryzacji (American National Standards Institute) przyjął standard zwany odtąd ANSI C. Język C jest imperatywnym, strukturalnym językiem programowania: sekwencja instrukcji zmieniających stan, tworzenie w postaci jednolitych bloków bez korzystania z instrukcji skoku oraz numerowania linii, dzielenie kodu na procedury.
Języki C i C++ na tle innych języków wg. Tiobe, http://www.tiobe.com/
1 #include <s t d i o. h> 2 /* Program o b l i c z a NWD dwoch l i c z b */ 3 /* e u k l i d e s. c */ 4 5 int main ( ) 6 { 7 int a, b, d ; 8 9 printf ( "Podaj liczby a i b : " ) ; 10 scanf ( "%d %d", &a, &b ) ; 11 printf ( "NWD(%d,%d) = ", a, b ) ; 12 13 d = a % b ; 14 while ( d!= 0) { 15 a = b ; 16 b = d ; 17 d = a % b ; 18 } 19 20 printf ( "%d\n", b ) ; 21 return 0 ; 22 }
ˆ algorytm (przepis na ciasto) ˆ programowanie w C (lub C++), w wyniku otrzymujemy kod źródłowy, np. euklides.c ˆ kompilacja, np. gcc euklides.c ˆ program w asemblerze ˆ kod maszynowy, np. a.out ˆ ładowanie i wykonanie
Programowanie Fazy kompilacji (do pliku wykonywalnego) plik.c (plik źródłowy w języku C) preprocesowanie plik.i (plik źródłowy bez dyrektyw preprocesora) komplilacja właściwa plik.s (plik.asm) (kod assemblerowy) składanie (asemblacja) plik.o (plik.obj) (plik obiektowy) łączenie (linkowanie) a.out (a.exe, plik.exe) (plik wykonywalny)
dyrektywy preprocesora int main() { deklaracje instrukcje } Preprocesor przetwarza tekst wejściowy w sposób określony za pomocą poleceń preprocesora przez programistę na tekst wyjściowy. Przetworzony tekst poddawany jest analizie składniowej i kompilacji. W wyniku otrzymujemy tekst wyjściowy podlegający następnie kompilacji.
Dyrektywy preprocesora ˆ #include - dyrektywa włącza tekst innego pliku źródłowego, ˆ #define - definiuje stałą i makroinstrukcję (pseudofunkcje) ˆ #undef - usuwa definicję stałej lub makra ˆ #ifdef,...
Dyrektywy preprocesora ˆ #include - dyrektywa włącza tekst innego pliku źródłowego, ˆ #define - definiuje stałą i makroinstrukcję (pseudofunkcje) ˆ #undef - usuwa definicję stałej lub makra ˆ #ifdef,..., #ifndef, #if, #elif, #else, #endif Uwaga: dyrektywy przetwarzane są w sposób sekwencyjny, a nie rekurencyjny
1 #include<s t d i o. h> 2 #define p i 3.14 3 4 int main ( ) 5 { 6 printf ( " Liczba pi wynosi ~ %f", pi ) ; 7 return 0 ; 8 } Przykład
1 #include<s t d i o. h> 2 #define p i 3.14 3 4 int main ( ) 5 { 6 printf ( " Liczba pi wynosi ~ %f", pi ) ; 7 return 0 ; 8 } Przykład 1 #include<s t d i o. h> 2 #define p i 3.14 3 4 int main ( ) 5 { 6 int i=10; 7 printf ( "%f + %i wynosi %f \n", pi, i, pi+i ) ; 8 return 0 ; 9 }
całkowite ˆ char ˆ short int ˆ int ˆ long int proste
proste całkowite ˆ char ˆ short int ˆ int ˆ long int ˆ long long int (nie jest w standardzie ANSI)
proste całkowite ˆ char ˆ short int ˆ int ˆ long int ˆ long long int (nie jest w standardzie ANSI) rzeczywiste ˆ float ˆ double
proste całkowite ˆ char ˆ short int ˆ int ˆ long int ˆ long long int (nie jest w standardzie ANSI) rzeczywiste ˆ float ˆ double ˆ long double (nie jest w standardzie ANSI)
proste całkowite ˆ char ˆ short int ˆ int ˆ long int ˆ long long int (nie jest w standardzie ANSI) rzeczywiste ˆ float ˆ double ˆ long double (nie jest w standardzie ANSI) signed, unsigned, <limits.h>, <float.h>
całkowite ˆ char ˆ short int ˆ int ˆ long int proste ˆ long long int (nie jest w standardzie ANSI) rzeczywiste ˆ float ˆ double ˆ long double (nie jest w standardzie ANSI) signed, unsigned, <limits.h>, <float.h> Brak typu logicznego. Zamiast tego mamy: 0 - fałsz, liczba niezerowa - prawda.
Typ znakowy char - typ znakowy, który pomieści jeden znak dostępny na danej maszynie, a w szczególności duże i małe litery angielskiego alfabetu oraz cyfry.
Typ znakowy char - typ znakowy, który pomieści jeden znak dostępny na danej maszynie, a w szczególności duże i małe litery angielskiego alfabetu oraz cyfry. 1 #include<s t d i o. h> 2 /* p r z y k l a d u z y c i a char */ 3 int main ( ) 4 { 5 char znak='a' ; 6 printf ( "A = %c\n", znak ) ; 7 8 /* k o n w e r s j a char > i n t */ 9 printf ( "A = %i\n", znak ) ; 10 printf ( "a = %i\n", 'a' ) ; 11 /* k o n w e r s j a l o n g u n s i g n e d i n t > i n t */ 12 printf ( "A + 4 = %c\n", znak+4) ; 13 printf ( "Rozmiar %d\n", ( int ) sizeof ( znak ) ) ; 14 return 0 ; 15 }
Identyfikatory Identyfikator jest ciągiem liter małych i dużych, znaku oraz cyfr. Identyfikator musi zaczynać się od litery. W języku C rozróżnia się wielkość liter.
1 #include<s t d i o. h> 2 #include <math. h> /* uzywamy f u n k c j i pow ( l i c z b a, w y k l a d n i k ) */ 3 #define p i 3.14 4 5 int main ( ) 6 { 7 float promien_r, pole=0; /* d e k l a r a c j a zmiennych */ 8 9 printf ( "%f\n", promien_r ) ; 10 printf ( "%f\n", pole ) ; 11 12 scanf ( "%f",&promien_r ) ; 13 pole = pi * pow ( promien_r, 2 ) ; 14 printf ( " Pole wynosi %f\n", pole ) ; 15 return 0 ; 16 }
Słowa kluczowe auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
Priorytet wybranych operatorów 15 ( ) [ ] >. l 14! ++ + & (typ) sizeof p 13 / % (dwuargumetowe operatory) l 12 + l 11 << >> l 10 < <= > >= l 9 ==! = l 8 & l 7 ˆ l 6 l 5 && l 4 l 3? : p 2 = += = = /= %= &= ˆ= = <<= >>= p 1, l l - łączność lewostronna, p - łączność prawostronna
Przykład 1 #include<s t d i o. h> 2 3 int main ( ) 4 { 5 int m=9, n=4, d ; 6 7 m++; 8 printf ( "m=%d\n", m ) ; /* m=10 */ 9 10 d = m / n ; 11 printf ( "d=%d\n", d ) ; /* 10/4=2 */ 12 13 d = m / n ; 14 printf ( "d=%d\n", d ) ; /*? */ 15 printf ( "%d\n", d++) ; /*? */ 16 printf ( "%d\n",++d ) ; /*? */ 17 return 0 ; 18 }
Operator warunkowy wynik = warunek? wartość1 : wartość2; 1 #include<s t d i o. h> 2 3 int main ( ) 4 { 5 int m, n, max ; 6 7 printf ( "Podaj m " ) ; 8 scanf ( "%d", &m ) ; 9 10 printf ( "Podaj n " ) ; 11 scanf ( "%d", &n ) ; 12 13 max = m < n? n : m ; 14 /* max = ( (m < n )? n : m ) ; */ 15 printf ( "%d\n", max ) ; 16 return 0 ; 17 }
Operator warunkowy 1 #include<s t d i o. h> 2 #define max( x, y ) ( x > y? x : y ) 3 4 int main ( ) 5 { 6 int m, n, max ; 7 8 printf ( "Podaj m " ) ; 9 scanf ( "%d", &m ) ; 10 11 printf ( "Podaj n " ) ; 12 scanf ( "%d", &n ) ; 13 14 max = max ( m, n ) ; 15 printf ( "%d\n", max ) ; 16 17 return 0 ; 18 }
Instrukcje i bloki ˆ ; - kończy instrukcję (a nie rozdziela instr. jak w Pascalu) ˆ { } - instrukcja grupująca (blok) ˆ if, if else, switch - instrukcje wyboru ˆ while, do while, for - instrukcje iteracyjne (pętle) ˆ goto, continue, break, return - instrukcje skoku
Warunek if if (wyrażenie1) instrukcja else if (wyrażenie2) instrukcja else instrukcja...
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a, b, max ; 6 7 scanf ( "%d %d", &a, &b ) ; 8 9 if ( ( a%2)==0 ) { 10 printf ( "a jest liczba parzysta\n" ) ; 11 } 12 13 if ( a>b ) { 14 max = a ; 15 } else { 16 max = b ; 17 } 18 19 printf ( " max wynosi %d\n", max ) ; 20 21 return 0 ; 22 }
Warunek if, else if 1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a ; 6 7 scanf ( "%d", &a ) ; 8 9 if ( ( a%3)==0 ) 10 printf ( " liczba jest podzielna przez 3\ n" ) ; 11 else if ( ( a%3)==1 ) 12 printf ( " liczba daje reszte 1 z dzielenia przez 3\n" ) ; 13 else if ( ( a%3)==2 ) 14 printf ( " liczba daje reszte 2 z dzielenia przez 3\n" ) ; 15 16 return 0 ; 17 }
Instrukcja switch switch (wyrażenie) case wyrażenie-stałe: instrukcje case wyrażenie-stałe: instrukcje... default: instrukcje break powoduje natychmiastowy wyskok z instrukcji switch
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a ; 6 7 scanf ( "%d", &a ) ; 8 9 switch ( a%3) { 10 case 0 : 11 printf ( " liczba jest podzielna przez 3\ n" ) ; 12 break ; 13 case 1 : 14 printf ( " liczba daje reszte 1 z dzielenia przez 3\n" ) ; 15 break ; 16 default : 17 printf ( " liczba daje reszte 2 z dzielenia przez 3\n" ) ; 18 } 19 return 0 ; 20 }
while while (wyrażenie) instrukcja Najpierw oblicza wyrażenie. Jeśli jego wartość jest różna od zera (tzn. jest prawdziwe), to wykonuje się instrukcję.
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a, i =2, jest_pierwsza =1; 6 scanf ( "%d", &a ) ; 7 8 while ( i < a ) { 9 if ( ( a%i ) == 0 ) { 10 jest_pierwsza =0; 11 } 12 i++; 13 } 14 15 if ( jest_pierwsza ) 16 printf ( "%d jest liczba pierwsza\n", a ) ; 17 else 18 printf ( "%d jest liczba zlozona\n", a ) ; 19 return 0 ; 20 }
do while do instrukcja while (wyrażenie); Najpierw wykonuje instrukcję a potem oblicza wyrażenie. Jeśli jego wartość jest różna od zera (tzn. jest prawdziwe), to ponownie wykonuje się instrukcję. Instrukcja wykona się co najmniej raz.
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a, i=2, jest_pierwsza =1; 6 scanf ( "%d", &a ) ; 7 8 do { 9 if ( ( a%i ) == 0 ) { 10 jest_pierwsza =0; 11 } 12 i++; 13 } while ( i < a ) ; 14 15 16 if ( jest_pierwsza ) /* czy na pewno? */ 17 printf ( "%d jest liczba pierwsza\n", a ) ; 18 else 19 printf ( "%d jest liczba zlozona\n", a ) ; 20 return 0 ; 21 }
for for (wyr1; wyr2; wyr3) instrukcja Poza pewnymi wyjątkami, na ogół jest ona równoważna następującej pętli wyr1; while (wyr2) { instrukcja; wyr3; }
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a, i, jest_pierwsza =1; 6 scanf ( "%d", &a ) ; 7 8 for ( i=2; i<a ; i++) { 9 if ( ( a%i ) == 0 ) { 10 jest_pierwsza =0; 11 } 12 } 13 14 if ( jest_pierwsza ) 15 printf ( "%d jest liczba pierwsza\n", a ) ; 16 else 17 printf ( "%d jest liczba zlozona\n", a ) ; 18 19 return 0 ; 20 }
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int i, suma =0; 6 7 for ( i =100; i>=1; i ) { 8 suma += i* i ; 9 /* suma = suma + i * i */ 10 } 11 printf ( " Suma kwadratow liczb naturalnych" ) ; 12 printf ( " od 1 do 100 wynosi %d\n", suma ) ; 13 return 0 ; 14 }
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 6 for ( ; ; ) { 7 printf ( "Ala ma kota. " ) ; 8 } 9 10 return 0 ; 11 }
goto Instrukcja goto nie może przekazywać sterowania do etykiety poza daną funkcją. Nie jest zalecane stosowanie goto.
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a, i ; 6 scanf ( "%d", &a ) ; 7 8 for ( i=2; i<a ; i++) { 9 if ( ( a%i ) == 0 ) { 10 goto zloz ; 11 } 12 } 13 goto pierw ; 14 15 zloz : 16 printf ( "%d jest liczba zlozona\n", a ) ; 17 return 0 ; /* z a k o n c z e n i e d z i a l a n i a */ 18 pierw : 19 printf ( "%d jest liczba pierwsza\n", a ) ; 20 return 0 ; 21 }
break Instrukcja break opuszcza najbardziej zagnieżdżoną instrukcję do, while, for, switch.
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int a, i =2, jest_pierwsza =1; 6 scanf ( "%d", &a ) ; 7 8 while ( i < a ) { 9 if ( ( a%i ) == 0 ) { 10 jest_pierwsza =0; 11 break ; 12 } 13 i++; 14 } 15 16 if ( jest_pierwsza ) 17 printf ( "%d jest liczba pierwsza\n", a ) ; 18 else 19 printf ( "%d jest liczba zlozona\n", a ) ; 20 printf ( "Licznik %d\n", i ) ; 21 return 0 ; 22 }
continue Instrukcja continue przerywa wykonywanie instrukcji wewnętrznej w najbardziej zagnieżdżonej pętli do, while, for. Powoduje przejście do następnego kroku pętli. Nie dotyczy instrukcji switch.
1 #include <s t d i o. h> 2 3 int main ( ) 4 { 5 int i ; 6 7 for ( i=0; i<=20; i++ ) { 8 if ( ( ( i%2) == 0) ( ( i%3) == 0) ) { 9 continue ; 10 } 11 printf ( "%d\n", i ) ; 12 } 13 14 return 0 ; 15 }
return return kończy działanie funkcji i zwraca wartość; 1 #include <s t d i o. h> 2 3 int main ( ) 4 printf ( "Ala ma\n" ) ; 5 return 1 ; 6 printf ( "kota\n" ) ; 7 return 0 ; 8 }
1 #include <s t d i o. h> 2 /* Program o b l i c z a NWD dwoch l i c z b */ 3 /* e u k l i d e s. c */ 4 5 int main ( ) 6 { 7 int a, b, d ; 8 9 printf ( "Podaj liczby a i b : " ) ; 10 scanf ( "%d %d", &a, &b ) ; 11 printf ( "NWD(%d,%d) = ", a, b ) ; 12 13 d = a % b ; 14 while ( d!= 0) { 15 a = b ; 16 b = d ; 17 d = a % b ; 18 } 19 20 printf ( "%d\n", b ) ; 21 return 0 ; 22 }
Problemy Zadanie Wczytać liczbę naturalną n i wyznaczyć wszystkie liczby pierwsze mniejsze od n.
Problemy Zadanie Wczytać liczbę naturalną n i wyznaczyć wszystkie liczby pierwsze mniejsze od n. Zadanie Wczytać liczbę naturalną n i wyznaczyć wszystkie liczby doskonałe mniejsze od n.
Problemy Zadanie Wczytać liczbę naturalną n i wyznaczyć wszystkie liczby pierwsze mniejsze od n. Zadanie Wczytać liczbę naturalną n i wyznaczyć wszystkie liczby doskonałe mniejsze od n. Zadanie Dla danych liczb naturalnych m i n, napisać program, który znajduje największy wspólny dzielnik d oraz najmniejszą wspólną wielokrotność w liczb m i n. Znajdź liczby całkowite a i b takie, że d = a m + b n.
Dziękuję za uwagę.