Základy algoritmizace a programování Přednáška 1 Olga Majlingová Katedra matematiky, ČVUT v Praze 21. září 2009
Obsah Úvodní informace 1 Úvodní informace 2 3 4
Organizace předmětu Přednášky 1. 5. Základní konstrukce C 6. 8. Numerické algoritmy 9. 12. Některé konstrukce MATLABu Cvičení Navazují na přednášky.
Klasifikovaný zápočet Podmínky udělení zápočtu: hodnocení E : První test hodnocení D,C : + Druhý test hodnocení B,A : + Semestrální práce
Klasifikovaný zápočet Podmínky udělení zápočtu: hodnocení E : První test hodnocení D,C : + Druhý test hodnocení B,A : + Semestrální práce
Klasifikovaný zápočet Podmínky udělení zápočtu: hodnocení E : První test hodnocení D,C : + Druhý test hodnocení B,A : + Semestrální práce
Doporučená literatura web: http://marian.fsik.cvut.cz/ zapg Resumé přednášek, informace k předmětu, aktuální informace... Herout, P.:Učebnice jazyka C Kernighan, B.W., Ritchie, D.M. Programovací jazyk C
Cíle předmětu být schopen číst a psát jednoduché programy v C rozumět základním konstrukcím jayzka C a umět je použít být schopen použít MATLAB pro řešení jednoduchých úloh
Algoritmus Úvodní informace Tvoříme-li program, musíme nejprve sami znát podrobný postup neboli algoritmus řešení úlohy. Algoritmus chápeme jako přesný popis výpočtového procesu, který vede od měnitelných výchozích údajů k požadovanému výsledku. Algoritmus má formu posloupnosti jednoduchých pravidel - elementárních kroků (operací). Kroky algoritmu musí být tak podrobné, aby byly srozumitelné tomu, kdo má podle algoritmu postupovat.
Algoritmizace a programování Program pro počítač musí splňovat všechny znaky algoritmu. K zápisu programu se používá programovací jazyk. Přípravu programu obvykle dělíme na dvě etapy: Algoritmizace V průběhu analýzy úlohy nebo po jejím ukončení sestavíme algoritmus řešení, který můžeme znázornit např. graficky, např. ve formě vývojového diagramu. Programování Podle zápisu algoritmu sestavíme program v programovacím jazyku.
Algoritmizace Při algoritmizaci pro počítač členíme postup řešení úlohy na tak podrobné kroky (operace), aby šly jednoduše vyjádřit programovacím jazykem. Při řešení numerických úloh jde o operace: výpočet hodnoty aritmetického výrazu, kde se smí vyskytovat operace sčítání, odčítání, násobení, dělení a výpočty hodnot elementárních funkcí (sin x, log x, x n, a x ) srovnání dvou hodnot podle velikosti, tj. rozhodnutí o pravdivosti relací rovno, nerovno, větší, menší určení pravdivostní hodnoty logického výrazu, k jehož sestavení bylo užito logických spojek konjunkce, disjunkce, negace přiřazení hodnoty proměnné
Proměnné a konstanty Konstanty: hodnoty, které se v průběhu výpočtu nemění. Např. čísla... 1, 1.2, 2.718281828 nebo pojmenované konstanty (π) Proměnné:pamět ová místa, označená jménem proměnné (identifikátorem) jednoduché: kam se vejde jedna hodnota. v: složené: kam se vejde několik hodnot. p:
Příklad algoritmizace Úloha: Určit, zda přirozené číslo N je prvočíslo. Vstupní data: číslo N. Výstupní data (výsledek): ANO nebo NE. Musíme vědět, že přirozené číslo je prvočíslo když má právě 2 dělitele: jedničku a samo sebe. Také víme, že číslo a je dělitelné číslem b, když zbytek po dělení je nula.
Analyzujeme úlohu 1. přečteme N 2. zjistíme zbytek po po dělení čísla N číslem 2 3. když je zbytek 0, máme výsledek: NE, končíme v opačném případě pokračujeme 4. zjistíme zbytek po po dělení čísla N číslem 3 5. když je zbytek 0, máme výsledek: NE, končíme v opačném případě pokračujeme... zjistíme zbytek po dělení čísla N číslem K když je zbytek 0, máme výsledek: NE, končíme v opačném případě pokračujeme... jak dlouho?
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Algoritmus (není dokonalý! PROČ?) 1. Přečteme N. Přejdeme ke kroku 2. 2. Když N je rovno 2 přejdeme ke kroku 8, v opačném případě přejdeme ke kroku 3. 3. Když zbytek po dělení čísla N číslem 2 je 0 v opačném případě přejdeme ke kroku 4. 4. Proměnné K přiřadíme 3. Přejdeme ke kroku 5. 5. Když zbytek po dělení čísla N číslem K je 0 v opačném případě přejdeme ke kroku 6. 6. Hodnotu K zvětšíme o 2. Přejdeme ke kroku 7. 7. Když je pravdivé : K K < N přejdeme ke kroku 5, v opačném případě přejdeme ke kroku 8. 8. Tiskneme ANO. Přejdeme ke kroku 10. 9. Tiskneme NE. Přejdeme ke kroku 10. 10. KONEC
Testování algoritmu Zvolíme si číslo N =... a budeme postupovat podle uvedeného algoritmu. Jaká N jsou vhodná? Najdeme nedokonalosti?
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
algoritmus myšlenka editor překladač linker OS gramatika funkce
Úvodní informace Zápis programu: prostý textový soubor (ASCII) mezery, tabulátory,... překladač ignoruje mezery a tabulátory slouží ke zvýšení čitelnosti nešetřit mezerami! příkazy se ukončují středníkem IDENTIFIKÁTORY (jména) : pouze aa..zz, _, číslice 0..9 nesmí začínat číslicí rozlišují se velká a malá písmena!!! (id, Id, ID jsou 3 různé identifikátory) všechna klíčová slova a názvy funkcí ze standardní knihovny jsou malými písmeny
Nejjednodušší program main() {} o trochu větší: int main() { return 0 ;}
Program, který umí psát #include<stdio.h> main() { printf("hello world!"); }
Proměnné a zápis výrazů Proměnné musíme deklarovat: int a, b; float c; Aritmetické výrazy: sčítání + odčítání - násobení dělení / zbytek po dělení % umocňování... NENÍ! ZLKY! POZOR: celočíselné nebo reálné POZOR: pouze pro celočíselné a/b*c nebo a/(b*c)! a=5*3-12%4; b = 1/3*3; c=1/3*3;
Přiřazení Úvodní informace PRĚNNÁ = VÝRAZ ; int a, b, c; a = 5; b = 2; c = 3; a = a + b ; b = a - b ; a = a - b ; c = c + 1; a = c ; a = b ; c = a ; b = c ; c = a ;
Program, který umí také číst # include<stdio.h> main() { int a; float x; printf("zadejte celé číslo!"); scanf("%d",&a); printf("zadejte reálné číslo!"); scanf("%f",&x); printf("zadali jste %d a %f", a, f); printf("zadejte 1 celé a 1 reálné číslo!"); scanf("%d%f",&a,&x); printf("zadali jste %d a %5.3f", a, f); }
Použtí matematických funkcí ve výrazech MATEMATICKÁ KNIHOVNA: #include<math.h> mocnina: odmocnina: goniometrické: inverzní: logaritmy: pow(co, na_ kolikátou); sqrt(x); sin(x); cos(x); tan(x); asin(x); acos(x); atan(x); log(x); log10(x);
Prográmek pro výpočet obsahů a obvodů # include<stdio.h> # include<math.h> main() { float a,b,o_c,s, o; printf("zadejte stranu ctverce"); scanf("%f",&a); o_c = 4 a; S=pow(a,2); printf("ctverec:o=%5.3f, S=%6.4f",o_c,S); printf("zadejte strany obdelnika"); scanf("%f%f",&a,&b); o = (a+b) 2 ; printf("obdelnik o=%6.4f,s=%5.3f" o,a b); }
Dále... Úvodní informace Na příští přednášce: Logické výrazy Větvení (příkazy if - else, switch) Cykly