Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
785/2901
Céčko --> Domácí úkoly --> L4
Vytvořte program, který na obrazovku vytiskne převodní tabulku ze stupňů Celsia (od 0 do 100) na stupně Fahrenheita. Tabulka bude obsahovat i hlavičku s nadpisem sloupců.
,
Vytvořte program, který načte rok narození a dle věku zařadí osobu do odpovídající kategorie. Předpokládejte, že vstup je zadán korektně. Aktuální rok v programu uveďte jako symbolickou konstantu.
rok> 2000 >> dite
Napište program pro zvýraznění mezer, tabulátorů a nových řádků. Mezery nahraďte podtržítkem, tabulátory značkou \t a před znak nového řádku přidejte značkou \n.
Vytvořte program, který čte standardní vstup a na standardní výstup zapisuje místo malých písmen velká písmena a místo velkých písmen malá.
Vytvořte program, který nahradí výskyt několika mezer vždy jen jednou mezerou a výskyt několika prázdných řádků vždy jen jedním prázdným řádkem.
abcd kocka prede bez klobouku bez klobouku bez klobouku bos narazil si nos
abcd kocka prede bez klobouku bez klobouku bez klobouku bos narazil si nos
Program upravte, tak aby počítal i s tabulátory a posloupnost libovolného počtu tabulátorů a mezer nahradil jedním znakem. Řádek, na kterém se nachází jen mezery a tabulátory považujte za prázdný.
Vytvořte program, který vypíše počty výskytů jednotlivý písmen anglické abecedy a znázorní je v normovaném bargrafu.
Jako test můžeme stáhnou anglickou html stránku, zbavit ji html značek a
poslat ji na vstup vašeho programu. Mělo by být vidět, proč má E v Morseově
abecedě nejkratší symbol.
$ curl 'http://en.wikipedia.org/wiki/C_(programming_language)' | sed 's/<[^>]\+>//g' | ./pocty-znaku
Mnohem větší výzvou pro vás může být tvorba vertikálního bargrafu.
Pomocí algoritmu Přímého vkládání (Insert sort) nebo přímého výběru (Selection sort) seřaďte pole náhodných čísel.
Implementujte základní řadící algoritmy (Select sort, Insert sort, Bubble sort a Quick sort) a porovnejte jejich rychlosti.
Vytvořte funkci, která realizuje výpočet exponenciální
funkce ex
pomocí součtu nekonečné
konvergentní řady
.
Do výpočtu nezahrnujte členy posloupnosti menší než 10-8 (<1E-8).
Úplný funkční prototyp bude vypadat takto:
double myexp(double x);
Vytvořte funkci, která realizuje výpočet čísla ¶
pomocí vzorce
.
Úplný funkční prototyp bude vypadat takto:
double mypi(double count);
count
je zde počet členů, které budou do výpočtu zahrnuty.
Vytvořte program pro výpočet kořenů kvadratické rovnice a*x^2+b*x+c=0. Program načte ze vstupu koeficienty a, b, c a na výstup vypíše kořeny. Pokud je a=0, je rovnice lineární a bude vypsán jen jeden kořen. Uvažujte i záporný diskriminant a řešení v komplexních číslech. Přesvědčte se o tom, že program si dobře poradí také s ostatními chybovými stavy.
$ ./kvadrr (a)xx+(b)x+(c)=0 > 1 -6 8 ( 4 ) ( 2 ) $ ./kvadrr (a)xx+(b)x+(c)=0 > 1 -6 10 ( 3 + 1*j ) ( 3 - 1*j )
Pro testování vašeho programu můžete využít následující skript. S jeho pomocí budu testovat i programy, které mi odevzdáte.
Vytvořte program, který načte ze vstupu dvě celá kladná čísla a vypočítá jejich největšího společného dělitele a nejmenší společný násobek
Rozhraní programu může vypadat například takto:
> 12 18 nsd=6 nsn=36 > -12 18.7 Err: Očekávám jen celá kladná čísla
Vytvořte program pro výpočet přenosu (modulu a fáze) dolní propusti RC na zadané frekvenci. Samotný výpočet bude realizován funkcí s následující hlavičkou:
int dprc(double r, double c, double f, double *modul, double *faze);
Funkce vrátí 1
, pokud je vše v pořádku a výpočet proběhne správně. Funkce vrátí 0
, pokud zadané vstupní hodnoty jsou nereálné a výpočet není možné provést.
Editujte stánku Ukazatele v C a připište do stránky podstatné informace.
Načítejte ze vstupu dvojice čísel, které určují souřadnice bodu v rovině. Vypočítejte celkovou délku lomené čáry, která všechny načtené body spojuje. Čtěte až do konce souboru.
[x,y]> 0 0 [x,y]> 3 4 >>>>>>>>> 5 [x,y]> 4 3 >>>>>>>>> 6.41 [x,y]> 8 2 >>>>>>>>> 10.54 [x,y]> ^D
Je dáno přirozené číslo N. Jakým nejmenším počtem platidel je možné zaplatit částku N korun, máte-li k dispozici neomezené množství českých mincí a bankovek všech druhů? Na standardní výstup vypište nejen celkový počet platidel, ale také rozpis počtů jednotlivých použitých platidel.
> 987 >>> 1 x 500 >>> 2 x 200 >>> 1 x 50 >>> 1 x 20 >>> 1 x 10 >>> 1 x 5 >>> 1 x 2 >>> Celkem 9 platidel.
Vygenerujte pole 20-ti náhodných čísel v intervalu <0,10>. Vypište čísla, která se v poli vyskytují právě dvakrát.
Z hvězdiček (nebo jiného znaku, který zadá uživatel) vytvořte na zadaný počet řádků různé trojúhelníky.
$ ./trojuhelnik 5 *
*
**
***
**
*
*
***
*****
*******
*********
*********
*******
*****
***
*
*
**
***
**
*
Program nemusí pracovat jen interaktivně ale i dávkově. To znamená, že potřebné údaje mu předáme jako parametry nebo přepínače přímo na příkazové řádce.
Vytvořte program, který na standardní výstup vypíše prvních N prvočísel.
Vytvořte program, který na standardní výstup vypíše všechna prvočísla ≤ N .
Vytvořte program, který obě předchozí úlohy kombinuje tak, že uživatel si parametrem na příkazové řádce zvolí, zda chce prvních N nebo menší než N. (Přebírání_parametrů_z_příkazového_řádku_v_jazyce_C)
$ ./prvocislaN -h
Program vypisuje na stdout prvočísla
-f N tiskne prvních N prvočísel
-l N tiskne prvočísla ≤ N
$ ./prvocislaN -f 10
2 3 5 7 11 13 17 19 23 29
$ ./prvocislaN -l 10
2 3 5 7
Vytvořte program, který čte stdin a zapisuje na stdout všechna malá písmena jako velká a všechna velká písmena jako malá. Všechny nepísmenné znaky samozřejmě zůstanou tak jak jsou.
Vytvořte program, který ze souboru koreny.txt
načte kořeny kvadratického
polynomu a do souboru polynomy.txt
uloží kvadratické polynomy příslušející
těmto kořenům. Pro jednoduchost uvažujte pouze celá čísla.
0 2 1 2 -3 4 8 5 -1 1 2 -5 -2 -7 -1 3
`--> stáhnout
xx-2x xx-3x+2 xx-1x-12 xx-13x+40 xx-1 xx+3x-10 xx+9x+14 xx-2x-3
`--> stáhnout
nebo
x²-2x x²-3x+2 x²-1x-12 x²-13x+40 x²-1 x²+3x-10 x²+9x+14 x²-2x-3
`--> stáhnout
Do následujícího předpřipraveného programu dopište funkce pro přáci s lineárním jednosměrným seznamem.
1 /*
2 * Soubor: lin-jednosm-sezn.c
3 * Datum: 09.12.2011 17:03
4 * Autor: Marek Nožka, nozka <@t> spseol <d.t> cz
5 * Licence: GNU/GPL
6 * Úloha:
7 * Popis:
8 ****************************************************/
9 #define _ISOC99_SOURCE
10 #define _GNU_SOURCE
11 #include <stdio.h>
12 #include <stdlib.h>
13
14
15 typedef struct point {
16 int data;
17 struct point *next;
18 } POINT;
19
20 /* *************** Funkce ******************** */
21
22 /** Přidá položku na začátek seznamu.
23 *
24 * @param data Data uložená v seznamu.
25 * @param list Ukazatel na ukazatal na seznam;
26 * musí být deklarován jako ukazatel na ukazatel, protože
27 * se uvnitř funkce musí přepsat.
28 */
29 void addBegin(int data, POINT ** list)
30 {
31 POINT *working = NULL;
32
33 }
34
35 /** Přidá položku na konec seznamu.
36 *
37 * @param data Data uložená v seznamu.
38 * @param list Ukazatel na ukazatal na seznam;
39 * musí být deklarován jako ukazatel na ukazatel, protože
40 * se uvnitř funkce musí přepsat.
41 */
42 void addEnd(int data, POINT ** list)
43 {
44 POINT *working;
45 POINT *end;
46
47 }
48
49 /** Tiskne celý seznam.
50 *
51 * @param list Ukazatel na seznam.
52 */
53 void printList(POINT * list)
54 {
55 }
56
57 /** Uvolní seznam z paměti.
58 *
59 * @param list Ukazatel na ukazatal na seznam;
60 * musí být deklarován jako ukazatel na ukazatel, protože
61 * se uvnitř funkce musí přepsat.
62 */
63 void freeList(POINT ** list)
64 {
65 POINT *begin = *list;
66 POINT *working;
67 while (begin != NULL) {
68 working = begin;
69 begin = working->next;
70 free(working);
71 }
72 *list = NULL;
73 }
74
75 /** Funkce vrátí ukazatel na položku seznamu
76 * danou pořadovým číslem předaným v parametru.
77 *
78 * @param list Ukazatel na seznam.
79 * @param order Pořadové číslo prvku seznamu. První
80 * prvek má číslo 0.
81 * @return odkaz na požadovaný prvek seznamu
82 */
83 POINT *getItem(POINT * list, unsigned int order)
84 {
85
86 }
87
88
89
90 /****************************************************
91 * Hlavní program.
92 ****************************************************/
93 int main(void)
94 {
95 POINT *list = NULL;
96 POINT *item = NULL;
97
98 addEnd(440, &list);
99 addBegin(20, &list);
100 addBegin(11, &list);
101 addEnd(38, &list);
102 addBegin(13, &list);
103 addEnd(9, &list);
104
105 printList(list);
106 puts("-----------------------------");
107 if ((item = getItem(list, 3)) != NULL) {
108 printf("%d\n", item->data);
109 } else {
110 puts("Tato položka v seznamu není");
111 }
112 if ((item = getItem(list, 9)) != NULL) {
113 printf("%d\n", item->data);
114 } else {
115 puts("Tato položka v seznamu není");
116 }
117 puts("-----------------------------");
118 freeList(&list);
119 printList(list);
120 return 0;
121 }
program by měl dát následující výsledek:
13
11
20
440
38
9
-----------------------------
440
Tato položka v seznamu není
-----------------------------
Vytvořte dvojrozměrné pole a následně je uložte do formátu X PixMap. Takto vytvořte následující obrázek.
Toto zadání jste si navrhli sami, takže si ho prosím dotvořte na Wiki.
Stáhněte si následující zdrojový kód, program zkompilujte, upravte, experimentujte s ním a na základě vašeho experimentování, případně hledání odhalte funkci jednotlivých konstrukcí, které jsou v programu použity.
Vytvořte aplikaci, která čte uživatelem zadaný soubor, zapisuje do dalšího uživatelem zadaného souboru a provádí následující akce:
Aplikace se bude ovládat interaktivně pomocí jednoduchého menu.
$ ./filemishmash
Vyber akci:
1) Převod na malá písmena
2) Nahrazení znaků
3) Statistika souboru
4) Náhodný text
5) Konec
2
zadej vstupní znak > a
zadej výstupní znak > @
Vyber akci:
1) Převod na malá písmena
2) Nahrazení znaku
3) Generování náhodného textu
4) Statistika souboru
5) Konec
3
Zadej výstupní soubor > /dev/stdout
Zadej počet generovaných slov > 20
ytutoqyc nef aqopikydide madamyro yryziwig ujebirinocyh vujyrugyd ysifikavil
p qav q azynixucudy i ic gubypewucu kowyjujuzi qufun u vuxej tuli
Vyber akci:
1) Převod na malá písmena
2) Nahrazení znaků
3) Statistika souboru
4) Náhodný text
5) Konec
5
$
Navrhněte aplikaci pro výpočet a generování tabulky funkcí sin, cos, tan, cotg. Výstup zobrazte s přesností na 3 desetinná místa.
Aplikace se bude ovládat interaktivně pomocí textových příkazů:
s
sinusc
kosinust
tangentso
kotangentsr
přepne na zadávání úhlů v radiánechd
přepne na zadávání úhlů ve stupníchPři zadání jedné hodnoty úhlu se vypíše pouze jedna hodnota funkce. Při
zadání tří hodnot od
do
krok
se vypíše
tabulka s hodnotami.
> s 30
x [°] sin(x)
30.000 0.500
> c 60
x [°] cos(x)
60.000 0.500
> r
> s 1
x [rad] sin(x)
1.000 0.841
> d
> s 1
x [°] sin(x)
1.000 0.017
> o 0 30 2
x [°] cotg(x)
0.000 INF
2.000 28.636
4.000 14.301
6.000 9.514
8.000 7.115
10.000 5.671
12.000 4.705
14.000 4.011
16.000 3.487
18.000 3.078
20.000 2.747
22.000 2.475
24.000 2.246
26.000 2.050
28.000 1.881
30.000 1.732
> ^D
Vytvořte jednoduchou hru, která se vzdáleně může podobat (dnes možná již zapomenuté) deskové hře Logik. Program náhodně vygeneruje 5 čísel (0-9) -- čísla nemusí být nutně různá. Hráč v každém kroku hádá číslo a jeho pozici. Hráč má celkem 10 pokusů.
Při každém pokusu je hráči vhodným způsobem podávána informace o tom, zda číslo uhodl nebo nikoli a to ve třech úrovních:
Hádej 5 čísel od 0 do 9.
Správné místo ↑
Chybné místo ↔
Nesprávné číslo ✗
> 1 2 3 4 5
-> ↔ ✗ ✗ ↔ ↑
> 6 7 4 1 5
-> ✗ ↔ ↑ ↔ ↑
> 7 1 4 8 5
-> ↑ ↑ ↑ ✗ ↑
> 7 1 4 9 5
-> ↑ ↑ ↑ ✗ ↑
> 7 1 4 0 5
-> ↑ ↑ ↑ ✗ ↑
> 7 1 4 4 5
-> ↑ ↑ ↑ ↔ ↑
> 7 1 7 1 5
-> ↑ ↑ ↔ ↔ ↑
> 7 1 4 7 5
-> ↑ ↑ ↑ ↔ ↑
> 7 1 4 5 5
-> ↑ ↑ ↑ ↑ ↑
Gratuluji!!! Uhodnuto v 9 pokusech
Vytvořte výukový program pro první stupeň základní školy, který zkouší sčítání a odčítání do 100 a malou násobilku. Program bude generovat náhodné příklady pro zvolené matematické operace a na závěr vyhodnotí statistiku úspěšnosti.
Operace +, -, *, / je generována náhodně, ale při spuštění programu lze na
příkazovém řádku zadat, které operace jsou povolené. Dále lze pomocí přepínače
-n
zadat počet příkladů.
Například matematika -n 20 + -
generuje 20 příkladů na sčítání a
odčítání.
Pokud při řešení použijete odkaz na funkci bude váš kód jistě přehlednější a pružnější.
$ ./task-gen -h
task-gen [-n number] [+-(*|.)(/|:)]
-n number number of tasks
+ Addition
- Subtraction
* Multiplication
. Multiplication
/ Division
: Division
./task-gen -n 6 + .:
16 / 8 = 2
28 + 12 = 40
7 * 5 = 12
51 + 39 = a
requires a number
51 + 39 = 90
30 / 6 = 5
48 / 6 = 8
---------------------
5 :-) 1 :-{ 83%
Je také možné ovlivnit pravděpodobnost volby jednotlivých matematických operací. V tomto příkladu bude nejvíce úloh na násobení.
$ ./task-gen +.....:
6 * 1 = 6
10 * 9 = 90
48 + 19 = 67
5 * 2 = 10
1 * 1 = 1
13 + 72 = 85
6 * 8 = 48
42 / 6 = 7
10 * 5 = 20
1 * 10 = 10
16 + 35 = 51
3 * 5 = 15
---------------------
11 :-) 1 :-{ 91%
Vytvořte kalkulátor s reverzní polskou notací. Kalkulátor bude podporovat následující matematické operace.
x
-- pomocí součtu nekonečné
konvergentní řady y
-- použijte knihovní funkci
5 4 3 + * 10 3 - /
>>> [ 5 7 ]
>>> [ 35 ]
>>> [ 35 7 ]
>>> [ 5 ]
2 **
>>> [ 25 ]
23 /
>>> [ 1.08696 ]
exp
>>> [ 2.96524 ]
2 sqrt
>>> [ 2.96524 1.41421 ]
+
>>> [ 4.37945 ]
Vytvořte kalkulátor s reverzní polskou notací, který podporuje komplexní čísla a umí pracovat jak s algebraickým, tak exponenciálním tvarem. Kalkulátor bude podporovat následující matematické operace:
Dále bude možné se přepínat mezi stupni a radiány.
Vstup 3,4 odpovídá číslu 3+4j. Vstup 3 odpovídá čistě reálnému číslu 3. Vstup ,4 odpovídá čistě imaginárnímu číslu 4j. Pokud je přepnuto na stupně vstup 5L36 odpovídá číslu 5 ej36°. Pokud je přepnuto na radiány 5L1.6 odpovídá číslu 5 ej1.6.
>>> [ ]
> help
> Kalkulátor s polskou reverzní notací. Pořadí matematických
operací je dáno přímo zápisem. Například:
(5 * (4 + 3) ) / (10-3) odpovídá 5 4 3 + * 10 3 - /
Kalkulátor počítá v komplexních číslech. Podporované matematické operace:
+ - * /
deg|d přepne pro počítání ve stupních
rad|r přepne pro počítání v radiánech
rem|m vymaže poslední číslo ze zásobníku
alg|a print vypisuje v algebraickém tvaru
exp|e print vypisuje v exponenciálním tvaru
clr|c vymaže celý zásobník
quit|q ukončí program
>>> [ ]
> 3,4 print
> >>> [ (5L53.13°) ]
> 5L53.13
> alg
> print
> >>> [ (3+j4) (3+j4) ]
> e p
> >>> [ (5L53.13°) (5L53.13°) ]
> /
> >>> [ (1L0.0001024°) ]
> a p
> >>> [ (1+j1.786e-06) ]
> 3,4
> p
> >>> [ (1+j1.786e-06) (3+j4) ]
> rad
> exp print
> >>> [ (1L1.786e-06) (5L0.9273) ]
> alg print
> >>> [ (1+j1.786e-06) (3+j4) ]
> q
Navrhněte a vytvořte aplikaci pro obsluhu směnárny. Aktuální kurzovní lístek čtěte ze souboru. V případě nákupu zadává směnárna měnu a částku, kterou od zákazníka nakupuje, a výstupem je částka v Kč, kterou zaplatí zákazníkovi. V případě prodeje zadává směnárna měnu a částku, kterou chce zákazník nakoupit a výstupem je částka v Kč, kterou má zákazník zaplatit.
Ovládání volte tak, aby bylo pro uživatele co možná nejpohodlnější a nejrychlejší. Uživatel jako výstup uvidí směněnou částku zaokrouhlenou na celé koruny. Dále aplikaci navrhněte tak, aby nerozlišovala desetinou tečku a čárku (to jak v kurzovním lístku, tak v uživatelském vstupu).