📚 Úloha 8.4
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C17, ktorý vytvorí štruktúru na reprezentáciu knihy v knižnici.
Štruktúra by mala obsahovať:
- názov (pole znakov)
- autora (pole znakov)
- rok vydania (celé číslo)
Program by mal načítať údaje zo súboru kde je definovaná kniha na jednom riadku a hodnoty štruktúry sú oddelené bodkočiarkou. Vstupný súbor môže byť v rovnakom priečinku ako program a môže mať napevno definovaný názov v zdrojovom kóde. Program po úspešnom spracovaní súboru vypíše počet načítaných kníh. Program následne umožní zadať používateľovi rok a vypíše knihy, ktoré boli vydané v zadanom roku.
Príklady vstupov / výstupov programu
Vstupný súbor s knihami
Programovanie v C;Kernighan & Ritchie;1988
Moderné algoritmy;Jon Bentley;1990
Umenie programovania;Donald Knuth;1968
Štruktúra a interpretácia počítačových programov;Harold Abelson & Gerald Jay Sussman;1985
Cvičenia z programovania;Brian Kernighan;1988
Algoritmy v C++;Robert Sedgewick;1990
Čistý kód;Robert C. Martin;2008
Pragmatický programátor;Andrew Hunt & David Thomas;1999
Python pre začiatočníkov;Guido van Rossum;2000
Počítačová grafika;John F. Hughes & James D. Foley;1995 Priebeh programu môže byť nasledovný:
Počet kníh v databáze: 10
Zadajte rok vydania kníh: 1990
Názov: Moderné algoritmy
Autor: Jon Bentley
Rok vydania: 1990
---
Názov: Algoritmy v C++
Autor: Robert Sedgewick
Rok vydania: 1990Rozbaľ pre ukážku riešenia
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TITLE_LENGTH 100
#define MAX_AUTHOR_LENGTH 100
#define MAX_BOOKS 100
// Štruktúra na reprezentáciu knihy
typedef struct {
char title[MAX_TITLE_LENGTH];
char author[MAX_AUTHOR_LENGTH];
int year;
} Book;
// Funkcia na načítanie údajov zo súboru
int loadBooks(const char *filename, Book books[]) {
FILE *file = fopen(filename, "r");
if (file == NULL) {
printf("Nepodarilo sa otvoriť súbor %s.\n", filename);
return -1;
}
int count = 0;
char line[256];
while (fgets(line, sizeof(line), file)) {
if (count >= MAX_BOOKS) {
printf("Dosiahnutý maximálny počet kníh (%d).\n", MAX_BOOKS);
break;
}
// Odstránenie nového riadku na konci
line[strcspn(line, "\n")] = '\0';
// Rozdelenie riadku podľa bodkočiarky
char *token = strtok(line, ";");
if (token != NULL) {
strncpy(books[count].title, token, MAX_TITLE_LENGTH - 1);
books[count].title[MAX_TITLE_LENGTH - 1] = '\0';
}
token = strtok(NULL, ";");
if (token != NULL) {
strncpy(books[count].author, token, MAX_AUTHOR_LENGTH - 1);
books[count].author[MAX_AUTHOR_LENGTH - 1] = '\0';
}
token = strtok(NULL, ";");
if (token != NULL) {
books[count].year = atoi(token);
}
count++;
}
fclose(file);
return count;
}
// Funkcia na vyhľadanie a výpis kníh podľa roku
void printBooksByYear(Book books[], int count, int year) {
int found = 0;
for (int i = 0; i < count; i++) {
if (books[i].year == year) {
printf("Názov: %s\n", books[i].title);
printf("Autor: %s\n", books[i].author);
printf("Rok vydania: %d\n", books[i].year);
printf("---\n");
found = 1;
}
}
if (!found) {
printf("Žiadne knihy z roku %d.\n", year);
}
}
int main() {
Book books[MAX_BOOKS];
const char *filename = "books.txt";
// Načítanie kníh zo súboru
int bookCount = loadBooks(filename, books);
if (bookCount < 0) {
return 1; // Chyba pri načítaní
}
printf("Počet kníh v databáze: %d\n", bookCount);
// Zadanie roku od používateľa
int year;
printf("Zadajte rok vydania kníh: ");
scanf("%d", &year);
// Výpis kníh podľa roku
printBooksByYear(books, bookCount, year);
return 0;
}Vysvetlenie
Štruktúra Book:
- Obsahuje názov knihy, autora a rok vydania.
Načítanie zo súboru:
- Funkcia loadBooks otvára súbor books.txt a načítava knihy po riadkoch.
- Každý riadok je rozdelený na časti (title, author, year) pomocou strtok.
- Maximálny počet kníh je obmedzený na MAX_BOOKS.
Vyhľadanie podľa roku:
- Funkcia printBooksByYear prechádza zoznam kníh a vypisuje knihy, ktoré zodpovedajú zadanému roku.
Hlavný program:
- Načítava knihy zo súboru.
- Vypisuje počet kníh v databáze.
- Umožňuje používateľovi zadať rok a zobrazí zodpovedajúce knihy.