Znakový vstup a výstup - CAPS Lock

Ciele:

Zopakujete si

Po krátkom zimnom oddychu tu je zase práca. Na študijnom oddelení majú technické problémy so zápisom výsledkov minulého semestra. Na všetký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. Verejné obstarávanie na nové klávesnice je už vypísané, ale bude ukončené najskôr v septembri roku 2022. Ako dočasné riešenie navrhlo vedenie univerzity využiť šikovných študentov odboru Počítačové siete.

Mali by sme navrhnúť softvérové riešenie, ktoré by čo najlepšie simulovalo klávesu CAPS LOCK. Zo štandardného vstupu budeme postupne načítať znaky pomocou funkcie getchar(). V prípade že načítame veľké písmeno, premeníme ho na malé a vypíšeme. V prípade, že načítame malé písmeno, premeníme ho na veľké a vypíšeme. Všetky ostatné znaky necháme bez zmeny. Koniec pracovnej doby budú používatelia nášho programu signalizovať klávesou CTRL+D. Ak to zistíme, tak ukončíme program a vypíšeme správu o počte spracovaných riadkov.

printf("\nPočet riadkov: %d\n",counter);

Návrh riešenia

Vedeli ste?

caps-lock-flickr-cc

Budeme potrebovať tieto premenné:

a tieto funkcie:

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ť. Vhodnou operáciou odčítania alebo sčítania je možné zmeniť veľký znak na malý a naopak.

So znakom je možné robiť rovnaké operácie ako s číslami - porovnávať aj spočítavať. Nemusíme ich dokonca ani hľadať v ASCII tabuľke, znaková konštanta sa správa rovnako ako číslo.

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), že 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.

Spätná väzba

Vaše riešenie budete odovzdávať pomocou systému Traktor, ktorý Vám poskytne okamžitú spätnú väzbu. Vypracujte program tak, aby vyhovel čo najväčšiemu počtu automatických testov.

Spätná väzba bude časovo obmedzená, sledujte prosím časový termín posledného hodnotenia.

Heslo na prístup do predmetu "Programovanie" je pvjc20. Po prihlásení do predmetu prosím vyberte Vašu skupinu.

Domáca úloha