11. týždeň

Problem Set 7: Files

Ciele

  1. Osvojiť si prácu s argumentami príkazového riadku.
  2. Osvojiť si prácu so súbormi.
  3. Poradiť si so špecifickými obmedzeniami (keď jednoduchý problém nie je až taký jednoduchý).

Úloha 1: Spočítaj slová

Vytvorte program count_words.c, ktorý spočíta, koľko krát sa vo vstupnom súbore nachádza postupnosť znakov: ananas. Výsledok sa zapíše do toho istého súboru (pôvodný obsah súboru bude prepísaný).

Poznámka

V celom programe pri počítaní a porovnávaní slov nezáleží na veľkosti písmen.

V programe je zakázané používať akékoľvek knižničné funkcie (strlen(), strcpy(), strcmp() a pod.). Povolené sú len nasledujúce 4 funkcie:

  • fopen() pre inicializáciu práce so súborom
  • fclose() pre ukončenie práce so súborom
  • fgetc() pre čítanie zo súboru
  • fputc() pre zápis do súboru

Program bude mať jeden argument:

  • vstupno-výstupný súbor (jeho názov)

Príklad použitia programu môže byť nasledujúci. Text zvýraznený tučne bude predstavovať vstup od používateľa. Riadok začínajúci znakom '$' bude predstavovať príkazový riadok.

$ ls
bananas.txt count_words
$ ./count_words bananas.txt
$ ls
bananas.txt count_words

Ak je obsah súboru bananas1.txt nasledujúci:

Bananas are edible fruits, botanically berries. In some countries, bAnAnAs used for cooking are called plantains, distinguishing them from dessert bananaS. The fruits grow in clusters hanging from the top of the plant. Almost all modern edible seedless BANANAS come from two wild species of Musa acuminata and Musa balbisiana. The scientific names of most cultivated bananas are Musa acuminata, Musa balbisiana, and Musa X paradisiaca, depending on their genomic constitution.

obsah súboru bananas1.txt po úspešnom ukončení programu je nasledujúci:

5

Ak je obsah súboru bananas2.txt nasledujúci:

In the past, there was a hoax that some countries wanted to ban ananas (also known as pineapple) because it was less delicious than bananas but fortunately, this is not true.

obsah súboru bananas2.txt po úspešnom ukončení programu je nasledujúci:

2

Poznámka

Názov vstupného súboru sa môže líšiť od príkladu vyššie (je ľubovoľný).

Úloha 2: Každé druhé slovo

Vytvorte program every_second.c, ktorý vytvorí súbor na základe iného súboru a to tak, že do druhého súboru zapíše každé druhé slovo načítané z prvého súboru medzi slovami START a STOP. Názvy týchto súborov sú zadané ako argumenty príkazového riadku. Za slovo sa považuje každá postupnosť znakov oddelená medzerami.

Ukladanie slov (každého druhého slova) začína potom, ako sa vo vstupnom súbore objaví slovo START. Slová (každé druhé slovo) sú ukladané do výstupného súboru a ukladanie slov končí, ak sa vo vstupnom súbore nájde slovo STOP.

Poznámka

Slová ukladané do výstupného súboru musíte oddeliť medzerou.

Poznámka

V celom programe pri ukladaní každého druhého slova záleží na veľkosti písmen.

V programe je zakázané používať akékoľvek knižničné funkcie (strlen(), strcpy(), strcmp() a pod.). Povolené sú len nasledujúce 4 funkcie:

  • fopen() pre inicializáciu práce so súborom
  • fclose() pre ukončenie práce so súborom
  • fgetc() pre čítanie zo súboru
  • fputc() pre zápis do súboru

Program bude mať dva argumenty:

  • prvým argumentom bude vstupný súbor (jeho názov)
  • druhým argumentom bude výstupný súbor (jeho názov)

Príklad spustenia a použitia programu môže byť nasledujúci. Text zvýraznený tučne bude predstavovať vstup od používateľa. Riadok začínajúci znakom '$' bude predstavovať príkazový riadok.

$ ls
every_second input.txt
$ ./every_second input.txt output.txt
$ ls
every_second input.txt output.txt

Po úspešnom ukončení programu sa v adresári nachádza novovytvorený súbor. Ak je obsah súboru input.txt nasledujúci:

Hello start START Hello Kitty, say, how are you doing today? STOP

obsah súboru output.txt po úspešnom ukončení programu je nasledujúci:

Kitty, how you today?

Poznámka

Názvy vstupného a výstupného súboru sa môžu líšiť od príkladu vyššie (sú ľubovoľné).

Požiadavky pre úspešné odovzdanie zadania

  • Projekt musí byť odovzdaný včas v git repozitári na adrese git.kpi.fei.tuke.sk (viď nižšie).
  • Počas prekladu nemôže dôjsť ku žiadnej chybe! Projekt sa bude prekladať prekladačom gcc pomocou nasledovných prepínačov:
gcc -std=c11 -Werror -Wall -lm 
  • Vo výslednej implementácii sa nemôže nachádzať žiadna globálna premenná.
  • Vo výslednej implementácii sa nemôžu nachádzať žiadne knižničné funkcie okrem 4 povolených funkcií.

Odovzdávanie projektu

Zadanie odovzdajte do 14.12.2023 (štvrtok). Posledné testovanie prebehne v tento deň o polnoci.

Zadanie sa odovzdáva prostredníctvom systému na správu verzií Git na serveri git.kpi.fei.tuke.sk.

Názov Vášho projektu musí byť v tvare: zap-2023-id.

Projekt musí mať nasledujúcu štruktúru priečinkov a súborov:

.
├── ps7
│   ├── count_words.c
│   ├── every_second.c
└── README

Význam jednotlivých súborov je nasledovný:

  • README - Súbor, v ktorom bude uvedená Vaša skupina, ktorú navštevujete na cvičeniach v tvare:
GROUP : C1
  • /ps7/count_words.c - Zdrojový kód riešenia prvej úlohy - Spočítaj slová.
  • /ps7/every_second.c - Zdrojový kód riešenia druhej úlohy - Každé druhé slovo.

Upozornenie

Je dôležité, aby Vaše súbory zachovali uvedenú štruktúru. Ak sa niektorý zo súborov síce v repozitári nachádza, ale v inom priečinku, bude to považované za chybu a takýto projekt nebude považovaný za správny.

Upozornenie

Pri názvoch priečinkov, súborov a obsahu súboru README záleží na veľkosti písmen!

Poznámka

Ak sa vo Vašom projekte budú nachádzať ďalšie súbory okrem požadovaných, ich existencia nebude považovaná za chybu.

Hodnotenie a testovanie

Za zadanie môžete získať max. 10 bodov, z toho max. 5 bodov za prvú úlohu a max. 5 bodov za druhú úlohu. Ľubovoľné 2 body sa započítajú do zápočtu, ostatné body sa započítajú do skúšky. Počet získaných bodov sa bude odrážať od výsledku testov, ktorými Vaše zadanie úspešne prejde. Overovať sa bude:

  • Štruktúra Vášho projektu (či sa v ňom nachádzajú všetky potrebné súbory).
  • Funkčnosť Vašej implementácie.

Váš kód sa bude prekladať prekladačom gcc s nasledovnými prepínačmi:

gcc -std=c11 -Werror -Wall -lm

Za chybu sa bude považovať:

  • Ak vo Vašej implementácii použijete globálnu premennú.
  • Ak vo Vašej implementácii použijete knižničné funkcie okrem 4 povolených funkcií.
  • Ak počas prekladu dôjde ku chybe (upozornenia sú priamo konvertované na chyby).
  • Ak Vaša implementácia neprejde niektorým z testov.

Testovanie Vašich riešení sa bude vykonávať automaticky každé 3 hodiny a to konkrétne o 0300, 0600, 0900, 1200, 1500, 1800, 2100 a 2400.

Vaše riešenia prejdú kontrolou originality. Preto sa pri práci na Vašom zadaní správajte podľa pravidiel etického kódexu! V prípade, že odovzdáte zadanie, ktoré nie je Vaše, môžete byť vylúčení z predmetu!