Zopakujete si
- Načítanie po znakoch.
- Koniec vstupu sa vyznačuje ako EOF.
- Zopakujte si formátovaný výstup.
- Písmeno je zakódované ako ASCII kód.
- Zopakujete si prácu s premennými.
- Zopakujete si prácu s cyklami a podmienkami.
Úvod
Pred prácou si prosím pripravte pracovné prostredie:
Potom môžete pracovať na úlohe a posielať Vaše riešenie na GIT. Keď je riešenie na GITe, viete ľahko získať automatickú spätnú väzbu a predbežné hodnotenie.
Prečítajte si tento návod:
- Získajte hodnotenie - systém Traktor Heslo do predmetu je
pvjc26.
Celý postup je možné si pozrieť na videu.
Úloha
Po krátkom zimnom oddychu tu je zase práca. Na všetkých školských klávesniciach sa pokazila klávesa CAPS LOCK čo značne komplikuje písanie pracovných výkazov a iných dôležitých dokumentov. Pravdepodobne to bolo spôsobené zvýšeným záujmom o diskusie na sociálnych sieťach. Verejné obstarávanie na nové klávesnice je už vypísané, ale bude ukončené najskôr v septembri roku 2028. Ako dočasné (rozumej trvalé) riešenie navrhlo vedenie univerzity využiť šikovných študentov odboru Počítačové siete a ich schopnosti pri programovaní štandardného vstupu.
Vedeli ste?
- Nedostatky klávesy CAPS LOCK sa dajú riešiť aj úpravou hardvéru.

Vytvorte program, ktorý bude simulovať klávesu CAPS LOCK. Zo štandardného vstupu načítajte znak, zmente ho a vypíšte na štandardný výstup.
Použite tieto pravidlá:
- Ak nájdete malé ASCII písmeno, premeňte ho na veľké.
- Ak na štandardnom vstupe nájdete veľké písmeno, premeňte ho na malé.
- Všetky ostatné viditeľné znaky vrátane konca riadku nechajte tak ako sú. Medzi viditeľné znaky počítajte tie, ktoré viete napísať v textovom editore pomocou klávesnice bez použitia klávesy CTRL alebo ALT. Za koniec riadku považujte znak '\n'. Riešenie obmedzte na ASCII (bez diakritiky/UTF-8).
- Riadiace (neviditeľné) znaky okrem konca riadku odstránte (napr. tabuľátor '\t', návrat vozíka '\r').
- Načítanie sa ukončí, keď getchar() vráti
EOF(typicky -1); ukladajte do premennej typu int.
Po skončení načítania vypíšte na nový riadok správu o počte načítaných riadkov.
Návrh riešenia
Budeme potrebovať tieto premenné:
- Práve načítaný znak (typ
int). - Znak, ktorý sa vypíše (
char) - Počet riadkov (
int).
a tieto funkcie:
- getchar() na načítanie znaku.
- putchar() na výpis znaku.
- printf() na výpis obsahu premennej.
- Funkcie z
ako isalpha(), isupper(), islower() na rozpoznanie písmen bez ručného porovnávania rozsahov.
Pre zopakovanie, základná kostra programu v jazyku C vyzerá takto:
// Definícia funkcií ktoré budete používať
#include <stdio.h>
// Tu môžte dopísať Vaše funkcie
int main(){
// Tu píšete program
return 0;
}
Pri riešení môžete využiť tento postup:
1. Vytvorte cyklus
V cykle budete načítavať znak pomocou funkcie getchar(), až do vtedy pokiaľ sa dá. Pred tým ako funkciu použijete sa oboznámte s jej technickou dokumentáciou.
Cyklus môže byť typu while, v ktorej budete do premennej typu int načítavať znak z klávesnice.
int c= 0;
while(1){
c = getchar();
//
}
Vo väčšine prípadov nám na uloženie znaku stačí typ char, v tomto prípade potrebujeme typ int aby sme mohli rozlíšiť
aj špeciálny znak EOF (end of file), ktorý signalizuje koniec vstupu.
Pri vstupe sa môže vyskytnúť aj "neočakávaná" situácia - koniec. Ten je
zakódovaný ako špeciálna konštanta EOF a má zväčša hodnotu -1, preto
na uloženie načítaného znaku potrebujeme premennú typu int. Pokus o
vypísanie načítaného EOF môže spôsobiť neočakávané chovanie. Pred tým ako vypíšete znak si musíte byť istí, že to nie je EOF.
V prípade, že je načítaný znak EOF tak cyklus ukončite pred tým ako sa znak vypíše.
Nezabudnite na pravidlo na ukončenie "nekonečného" cyklu.
2. Pridajte pravidlá na zmenu znakov
Pravidlá zmenia načítaný znak podľa potreby (veľké písmeno na malé a naopak). Použite na to ASCII tabuľku.
Pridajte pravidlo, ktoré inkrementuje počítadlo v prípade, že načítaný znak je koniec riadku.
Ak bude ukončená hlavná slučka vypíšte obsah počítadla.
Pri riešení môžme využiť fakt, že znak je zakódovaný ako číslo z ASCII
tabuľky . Na obrazovke sa
zobrazuje ako znak, ale v pamäti má celočíselnú hodnotu, ktorá je iná
ako tá, ktorá je zobrazená. Napr. znak 0 má hodnotu 48.
So znakmi je možné robiť rovnaké operácie ako s číslami - porovnávať aj sčítavať. Nemusíme ich dokonca ani hľadať v ASCII tabuľke, znaková konštanta sa správa rovnako ako číslo.
Vhodnou operáciou odčítania alebo sčítania je možné zmeniť veľký znak na malý a naopak. Nasledovná operácia pre zistenie malého písmena je úplne v poriadku:
if (c >= 'a' && c <= 'z'){
// Našiel som malý znak
}
Znaky sa dajú aj odpočítavať a pripočítavať čo využijeme na zmenu malého znaku na veľký:
int velkyznak = malyznak - 'a' + 'A';
Podobnú operáciu použijete aj pri premene veľkého znaku na malý. Pozor, v prípade iných znakov, napr. čísel táto operácia nemá zmysel. Pozorne si overte (pomocou podmienky if), s akým znakom pracujete.
3. Vyskúšajte program
Preklad programu vykonajte volaním kompilátora:
gcc -g -Wall program.c -o program
Dajte pozor, aby ste nepracovali s premennými, ktoré nemajú priradenú žiadnu hodnotu. V prípade staršej verzie kompilátora (napr. na servri omega) pridajte prepínač -std=c99.
Časté chyby
- Ukladanie hodnoty z getchar() do char namiesto int (strata rozlíšenia EOF).
- Vypisovanie EOF ako znaku.
- Nesprávne podmienky na rozsah písmen alebo ignorovanie ASCII obmedzenia.
- Zabudnuté inkrementovanie počítadla riadkov pri '\n'.
- Neinicializované premenné.
Odovzdanie
- aktivujte si git
- Odovzdajte cez GIT do súboru a1/program.c , do 27.2.2026 8:00 , maximálne za 1 bod.