{{indexmenu_n>1}}
====== 1 - Úvodní cvičení ======
Seznámení s počítačovou učebnou, [[courses:b0b36prp:tutorials:services|ownCloud]] a [[https://cw.felk.cvut.cz/upload/|BRUTE]].
* pro vyučující: [[courses:b0b36prp:internal:tutorialinstruction:01|]]
===== Cíle cvičení =====
- Přihlášení do operačního prostřední a nastavení vývojového prostředí.
- Vytvoření jednoduchého skriptu (posloupnosti příkazů) pro práci se soubory.
- Formátování zdrojového programu.
- Kompilace programu a spouštění programu.
V PRP nepředepisujeme jaké [[https://cw.fel.cvut.cz/b221/courses/b0b36prp/tutorials/start?animal=b221#pracovni_prostredi|pracovní vývojové prostředí používat]]. Obecně doporučujeme začínajícím programátorům použít prostředí [[courses:b0b36prp:tutorials:devel:vscode|VS Code]], případně nakonfigurovaný editor ''gedit'' nebo ''vim''. Určitě je také možné použít komplexní prostředí jako je např. CLion. Nicméně jeho konfigurace a prozkoumání všech možností, může velmi rychle překročit časovou dotaci předmětu.
===== Práce v příkazové řádce =====
Příkazová řádka je uživatelské rozhranní, ve kterém uživatel komunikuje s počítačem podobně jako při psaní programu, tj. píše příkazy, které počítač vykonává tak, jako když programátor píše program (recept), který následně spustí.
V případě přímého ovládání počítače a interakce s operačním systémem je využito interaktivního režimu, ve kterém počítač reaguje na každý příkaz, který je v příkazové řádce napsán a odeslán počítači ke zpracování klávesou "''Enter''".
Data jsou v počítači uložena ve formě souborů, k nímž je přístup uživatelů zprostředkován operačním systémem. Proto základní práce s počítačem spočívá v interakci s operačním systémem a práci se soubory.
Výhodou ovládání počítače sekvencí příkazu je opakovatelnost, neboť se vlastně jedná o textový zápis operací podobně jako při psaní programu. Vlastně tak programujeme i pře běžném používání, zlvášťě pokud přidáme i podmíněné vykonávání příkazu a cykly.
Takový zápis lze uložit do souboru a posleze replikovat, nebo vytvořit skript, který lze následně opakovaně spouštět a tím vlastně vytvořit nový příkaz.
Příkazová řádka je přítomna ve všech operačních systémech. Ve Windows je příkazová řádka přístupna pomocí programu **cmd.exe** nebo modernější varianty **PowerShell.exe**, případně alternativou Z-shell. Na systémech unixového typu běží příkazová řádka
jako tzv. shell dostupný buď přímo v textovém režimu, nebo přes emulátory z grafického rozhranní (na Linuxu **Xterm, Gnome terminal, Konsole ...**, na OS X **terminal**). Příkazová řádka umožňuje základní ovládání operačního systému (procházení adresářové struktury, práce se soubory, vyhledávání ...), poskytuje rozhranní uživatelským programům a hlavně umožňuje řetězit vstupy a výstupy jednotlivých programů.
Velkou výhodou vývojového prostředí VS Code je integrace příkazové řádky do okna prostředí spolu s editačním oknem případně náhledem na existující soubory a to i v prostředí založené na aplikace v jediném grafickém okně.
==== Typická struktura příkazu ====
''prikaz [přepínače] [parametry|argumenty|jména souboru(ů)]''
==== Příkazy navigace v adresářové struktuře ====
^ Příkaz ^ Používané přepínače ^ Význam ^
|''ls''| -l -t | vypíše obsah aktuálního pracovního adresáře (//**l**i**s**t directory contents//) |
|''cd''| | změní aktuální pracovní adresář (//**c**hange **d**irectory//) |
|''pwd''| | vypíše absolutní adresu aktuálního pracovního adresáře (//**p**rint **w**orking **d**irectory name//)|
|''tree''| | vypíše strukturu aktuálního pracovního adresáře včetně podadresářů formou stromu|
==== Příkazy práce se soubory a adresáři ====
^ Příkaz ^ Používané přepínače ^ Význam ^
|''mkdir''| | Vytvoří adresář zadaného jména (//**m**a**k**e **dir**ectories //)|
|''cp''| -r | Zkopíruje soubor zadaného jména (//**c**o**p**y files//)|
|''mv''| | Přesune (přejmenuje) soubor zadaného jména (//**m**o**v**e files//)|
|''rm''| -r -f | Odstraní soubor zadaného jména (//**r**e**m**ove directory entries//)|
|''touch''| | Vytvoří soubor zadaného jména, pokud takový existuje, jinak aktualizuje tzv. //modification time//. |
Drtivá většina příkazů má typicky vestavěnou manuálovou stránku, např. ''man touch'', případně návod ''touch ----help''.
==== Ostatní důležité příkazy ====
^ Příkaz ^ Používané přepínače ^ Význam ^
|''man''| | Vypíše manuálovou stránku zadaného příkazu. |
|''find''| | Vyhledá soubor zadaného jména v aktuálním adresáři.|
|''locate''| | Jako ''find'', ale hledá v kompletní adresářové struktuře vytvořené databáze. |
|''cat''| | Vypíše obsah souboru jako text |
|''echo '' | | Vypíše obsah argument na standardní výstup, např. návratovou hodnota posledního příkazu ''echo $?'' nebo proměnná prostředí ''echo $HOME'' nebo ''echo $PWD''.|
|''hexdump''| -C | Vypíše obsah souboru v hexadecimálním tvaru doplněný o adresy paměti. |
==== Úkoly ====
* Nastavte si heslo v počítačové učebně [[https://www.felk.cvut.cz/labpass/|(Nastavení hesla)]] a seznamte se používaným prostředím
''Adresář'' (anglicky ''directory'') je objektem souborového systému s přesně definovaným umistěním v rámci hiearchie souborů. ''Složka'' (''folder'') je motivována grafickým rozhraním reprezentující nějaký konkrétní adresář. [[https://en.wikipedia.org/wiki/Directory_(computing)#Folder_metaphor|]].
Například domovský adresáře uživatele ''user'' najdeme typicky v adresáři ''/home/user''. Složku //Dokumenty// můžeme například najít na grafického rozhraní a podle volby jazyka prostředí může odkazovat na ''/home/user/Documents'' nebo jinou složkou, třeba i vzdálený adresář.
* V příkazové řádce vytvořte adresář ''prp'' a v něm ''lab01''. Ideálně přímo v domovském adresáři, alternativně například ve složce ''Documents''.
* Ve vytvořeném adresáři ''prp'' vytvořte adresář ''lab01''.
* V adresáři ''lab01'' vytvořte textový soubor se jménem ''prp-lab01.txt''
* Celý adresář 'lab01' přesuňte do adresáře 'prp-lab01' v adresáři ''~/ctu-fee'', kde symbol ''~'' reprezentuje domovský adresář, tež odkazovaný v proměnné prostředí ''HOME'', odkazované např. ''printenv $HOME''.
* Soubor ''prp-lab01.txt'' přejmenujte na ''main.c''.
Příklad sezení v příkazovém interpretu může být
➜ ~ pwd
/home/jf
➜ mkdir -p prp/lab01
➜ touch prp/lab01/prp-lab01.txt
➜ tree prp
prp
└── lab01
└── prp-lab01.txt
1 directory, 1 file
➜ mkdir ctu-fee
➜ mv prp/lab01 $HOME/ctu-fee/prp-lab01
➜ cd ctu-fee/prp-lab01
➜ pwd
/home/jf/ctu-fee/prp-lab01
➜ ls
prp-lab01.txt
➜ mv prp-lab01.txt main.c
➜ cd
➜ tree ctu-fee
ctu-fee
└── prp-lab01
└── main.c
1 directory, 1 file
Jednotlivé kroky můžete kontrolovat například pohledem grafického správce souborů.
* Vytvořte skript ''prp-lab01.sh'', který provede uvedené kroky v posloupnosti, ale místo domovského adresáře umístě podadresáře a soubory do pracovního prostoru ''/tmp'', například odkazovaného ''/tmp/$PWD''.
* Soubor označte jako spustitelný např. ''chmod +x prp-lab01.sh'' pro přímé spuštění ve stylu ''./prp-lab01.sh'' nebo jej můžete spustit v rámci konkrétní instance příkazového interpretu např. ''. ./prp-lab01.sh''.
Pokud ve skriptu použijete příkaze ''cd'' pro změnu aktuálního pracovního adresáře, můžete se k předchozím adresáři vrátit ''cd -'', viz například [[https://www.youtube.com/watch?v=zvKRKU-ex6g]].
* Ve skriptu můžete pro zjednodušení využít proměnnou např. ''dst=/tmp/$HOME'' použitelnou třeba v ''mkdir -p $dsts/prp/lab01''.
Výstup může například vypadat následovně.
. ./prp-lab01.sh
/tmp/home/jf/prp
└── lab01
└── prp-lab01.txt
1 directory, 1 file
/tmp/home/jf/ctu-fee
└── prp-lab01
└── main.c
1 directory, 1 file
==== Formátování zdrojového programu ====
* Stáhněte si nastavení pro textový editor **gedit**: {{:courses:b0b36prp:labs:setup_gedit.zip|}}.
=== ===
wget https://cw.fel.cvut.cz/wiki/_media/courses/b0b36prp/labs/setup_gedit.zip
==== ====
* Rozbalte ho a nainstalujte (=spusťte)
=== ===
unzip setup_gedit.zip
./setup_gedit.sh
==== ====
Klíčové nastavení editoru je pro formátování zdrojového kódu. V předmětu PRP je preferováno formátování nástrojem clang-format a nastavením stylu:
{BasedOnStyle: llvm, IndentWidth: 4, BreakBeforeBraces: Linux}
Formátování zdrojového kódu pak provedete např. následovně:
clang-format -style='{BasedOnStyle: llvm, IndentWidth: 4, BreakBeforeBraces: Linux}' muj_kod.c > formatovany_kod.c
V případě použití vývojového prostředí VS Code lze lokálně nastavit formátování vytvořením souboru ''.clang-format'', viz [[courses:b0b36prp:tutorials:devel:vscode|Programovací prostředí]]. Výstup pak může například vypadat následovně.
{{:courses:b0b36prp:labs:vscode-clangformat2.png?400|}}
{{:courses:b0b36prp:labs:vscode-clangformat.png?400|}}
{{:courses:b0b36prp:labs:vscode-clang_format10.png?400|}}
===== Úvod do programování v jazyce C =====
==== ====
// example program in C
#include
int main()
{
printf("Hello PRP!\n");
return 0;
}
==== Překlad programu ====
Překlad na spustitelný soubor provádíme z příkazové řádky příkazem
clang -Wall -pedantic -std=c99 main.c -o main
případně
gcc -Wall -pedantic -std=c99 main.c -o main
==== Spuštění programu ====
Program spouštíme z příkazové řádky příkazem
./main
=== VS Code ===
V prostředí VS Code může vypadat interaktivní práce tak, že si stáhneme soubor domácího úkolu v prohlížeči do adresáře ''~/Downloads'' a dále vše řešíme už jen z VS Code s využitím integrovaného terminálu.
{{:courses:b0b36prp:labs:vscode-hw00.png?800|}}
kde můžeme též využít příložena ''Makefile'' a vytvořit si ''zip'' soubour voláním ''make zip''.
{{:courses:b0b36prp:labs:vscode-hw00zip.png?800|}}
==== Úkoly ====
* Do souboru ''main.c'' napište zdrojový kód programu, který vypíše na standardní výstup **"Hello PRP!"**.
* Program zkompilujte a spusťte.
* Zdrojový kód zazipujte do archivu **''main.zip''**, například pomocí příkazu: **"''zip main.zip main.c''"**.
* Vytvořený archiv nahrajte do [[https://cw.felk.cvut.cz/brute|Upload systému]], viz úkol [[courses:b0b36prp:hw:hw00|HW00]].
* Dále je možné využít proměnnou prostředí ''$?'' a vyzkoušet si různé návratové hodnoty programu a řetězení kompilace a spuštění programu, včetně např. podmíněného spuštění programu v závislosti na úspěchu kompilace programu.
{{:courses:b0b36prp:labs:vscode-lab01-return_value.png?800|}}