You are on page 1of 7

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»

ІКТА
кафедра ЕОМ

ЗВІТ
до лабораторних робіт з курсу: «Основи алгоритмізації та
програмування»
ЛАБОРАТОРНА РОБОТА №8 РОЗВ'ЯЗУВАННЯ НА МОВІ С ЗАДАЧ, ЯКІ
ВИКОРИСТОВУЮТЬ СТРУКТУРИ І ФАЙЛИ

Виконав:
ст. гр. КІ-104
Мороз М.Т.
.
Прийняв:
Асистент каф.
ЕОМ Гузинець
Н.В.
Львів 2023
Мета роботи:
• познайомитися з структурами у мові програмування С;
• познайомитися з засобами файлового вводу та виводу в мові програмування С.
Теоретичний вступ:

Структури в мові C
Структура в мові C - це об’єднання кількох об’єктів, можливо, різного типу під одним
ім’ям1. Ці об’єкти можуть бути змінними, масивами, покажчиками та іншими
структурами1. Структури дозволяють трактувати групу зв’язаних між собою об’єктів
не як множину окремих елементів, а як єдине ціле1.

Структура оголошується за допомогою ключового слова struct, за яким слідує ім’я


структури та список полів, обмежений фігурними дужками2. Наприклад:
struct date {
int day;
char *month;
int year;
};

Цей код оголошує структуру date, яка містить три поля: day, month і year1.

Робота з текстовими і бінарними файлами


Робота з файлами в мові C включає в себе відкриття файлу, читання або запис даних, а
потім закриття файлу. Функції для роботи з файлами включають fopen, fclose, fread,
fwrite, fprintf, fscanf, fgets, fputs та інші34.

Текстові файли читаються або записуються символ за символом. Коли ви працюєте з


текстовим файлом, ви можете читати або записувати дані, як це робиться з консоллю3.

Бінарні файли дозволяють читати або записувати блоки пам’яті, і вони є особливо
корисними, коли вам потрібно працювати з такими структурами даних, як масиви або
структури4.

Ось приклад запису в бінарний файл в мові C:


FILE *fp;
int arr[5] = {1, 2, 3, 4, 5};
fp = fopen("file.bin", "wb");
fwrite(arr, sizeof(int), 5, fp);
fclose(fp);

Цей код записує масив цілих чисел в бінарний файл


Завдання:Варіант 18

Розв’язок:
блок-схема алгоритму буде мати вигляд:
Код програми:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* myStrcpy(char* destination, const char* source) {


char* start = destination;

while (*source != '\0') {


*destination = *source;
destination++;
source++;
}

*destination = '\0';
return start;
}

struct Product {
char name[50];
int year;
int count;
char maker[50];
double price;

Product(const char name[], int year, int count, const char maker[], double price) {
myStrcpy(this->name, name);
this->year = year;
this->count = count;
myStrcpy(this->maker, maker);
this->price = price;
}

Product() {
name[0] = '\0';
year = 0;
count = 0;
maker[0] = '\0';
price = 0.0;
}

void printP() {
printf("Name: %s\n", name);
printf("Year: %d\n", year);
printf("Count: %d\n", count);
printf("Maker: %s\n", maker);
printf("Price: %.2lf\n", price);
}

void WriteFile(FILE* f) {
fprintf(f, "%s\n", name);
fprintf(f, "%d\n", year);
fprintf(f, "%d\n", count);
fprintf(f, "%s\n", maker);
fprintf(f, "%.2lf\n", price);
}
void WriteBinare(FILE* f) {
fwrite(&name, sizeof(name), 1, f);
fwrite(&year, sizeof(year), 1, f);
fwrite(&count, sizeof(count), 1, f);
fwrite(&maker, sizeof(maker), 1, f);
fwrite(&price, sizeof(price), 1, f);
}

void ReadFile(FILE* f) {
fgets(name, sizeof(name), f);
name[strlen(name) - 1] = '\0';

fscanf(f, "%d", &year);


fgetc(f);
fscanf(f, "%d", &count);
fgetc(f);

fgets(maker, sizeof(maker), f);


maker[strlen(maker) - 1] = '\0';

fscanf(f, "%lf", &price);


fgetc(f);
}

};
void WriteProducts(Product p[], int size, FILE* f) {
for (int i = 0; i < size; i++) {
p[i].WriteFile(f);
}
}
void WriteBinare(FILE* f, Product p[], int size) {
for (int i = 0; i < size; i++) {
fwrite(&p[i].name, sizeof(p[i].name), 1, f);
fwrite(&p[i].year, sizeof(p[i].year), 1, f);
fwrite(&p[i].count, sizeof(p[i].count), 1, f);
fwrite(&p[i].maker, sizeof(p[i].maker), 1, f);
fwrite(&p[i].price, sizeof(p[i].price), 1, f);
}
}

void ReadProducts(Product p[], int size, FILE* f) {


for (int i = 0; i < size; i++) {
p[i].ReadFile(f);
}
}
void PrintProducts(Product p[], int size) {
for (int i = 0; i < size; i++)
{
p[i].printP();
}
}
void expiredGoods(Product p[], int size) {
for (int i = 0; i < size; i++)
{
if (2023 - p[i].year > 3) {
p[i].printP();
}
}
}
int main() {
FILE* f1;
f1 = fopen("prods.txt", "w+");

Product p[] = { {"Product1", 2023, 10, "Maker1", 19.99}, {"Product2", 2013, 14,
"Maker2", 46.79}, {"Product3", 2016, 79, "Maker3", 89.34} };
const int size = sizeof(p) / sizeof(p[0]);
WriteProducts(p, size, f1);

fclose(f1);

Product p1[size];
FILE* f2;
f2 = fopen("prods.txt", "r");
ReadProducts(p1, size, f2);
expiredGoods(p1, size);
fclose(f2);
FILE* f_bin;
f_bin = fopen("prods.bin", "wb");
WriteBinare(f_bin, p, size);
fclose(f_bin);
return 0;

}
Демонстрація:

Висновок:Я познайомився з використанням структур i роботою з файлами

You might also like