You are on page 1of 17

Західноукраїнський національний університет

Комплексне практичне індивідуальне завдання


З дисципліни Основи програмування

Виконав:
Студент групи ІПЗ-12
Строгий Є.В.

Перевірив:
Шпінталь М.Я.

Тернопіль
2022
Лабораторна робота №5
«Робота з файлами. Обробка текстової інформації»
Мета роботи: навчитися складати програми для роботи з файлами
заданої структури та виконання обробки текстової інформації.
Завдання:
В завданні №1 необхідно написати програму, яка виконує вказані
операції (кожну операцію оформити окремою функцією) з інформацією,
що знаходиться у текстовому файлі input.txt і записує всі результати
роботи у файл output.txt. Скласти блок-схему для алгоритму розв’язку
задачі.
Вхідний файл: input.txt
Вихідний файл: output.txt
В завданні №2 необхідно організувати файл даних з вказаною
нижче структурою та передбачити функції, які дозволяють:
 коригування обраного запису файлу;
 пошук інформації за різними полями;
 додавання записів у кінець бази даних;
 вилучення інформації з бази даних.
Варіант 13
1. Написати програму, яка копіює вміст вхідного файла у вихідний;
підраховує кількість слів, які містять однакову кількість голосних і
приголосних літер; визначає найбільше слово; видаляє з тексту всі слова-
паліндроми.
2. Структура з ім’ям SKLAD, яка містить наступні поля:
 NAME – назва товару;
 TYPE – одиниця виміру товару;
 QUANTITY – кількість одиниць товару;
 COST – ціна одиниці товару.

Програма
Завдання №1:

baseIncludeConfig.h
#pragma once
#include <iostream>
#include <vector>
#include <ostream>
#include <fstream>
#include <Windows.h>
#include <string>
#include <algorithm>
#include <ctype.h>
#include <locale>
using namespace std;

Main файл:
#include "baseIncludeConfig.h"
#include "firstTask.h"

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Ukr");
string path = "input.txt";

cout << firstTask(path) << endl;

return 0;
}

Завдання:
#include "baseIncludeConfig.h"

string toLowerCase(string word) {


if (word.empty())
{
return "";
}
string resWord = "";
for (int i = 0; i < word.length(); i++)
{
resWord += static_cast<char>(tolower(word[i]));
}
return resWord;
}
bool compareString(string str1, string str2) {
for (int i = 0; i < str1.length(); i++)
{
if (str1[i] != str2[i]) {
return false;
break;
}
}
return true;
}

string reverseStr(string str) {


string resStr = "";

for (int i = str.length() - 1; i >= 0; i--)


{
resStr += str[i];
}
return resStr;
}

bool check(char symbol) {


vector<char> checkArr{ '\0',' ', '.', ',', ':', ';', '!', '?', '(', ')'};

for (int i = 0; i < checkArr.size(); i++)


{
if (symbol == checkArr[i]) {
return false;
}
}
return true;
}
int checkWordVovelLet(string word) {
vector<char> vovelLetter{ 'а', 'е', 'є', 'и', 'і', 'ї', 'о', 'у', 'ю', 'я', 'a', 'e','i','o','u','y'};
int letterCounter = 0;
for (int i = 0; i <= word.length(); i++) {
for (int j = 0; j < vovelLetter.size(); j++)
{
if (static_cast<char>(tolower(word[i])) == static_cast<char>(vovelLetter[j]))
{
letterCounter++;
}
}
}
return letterCounter;
}
bool checkWordPalindrom(string word) {
return compareString(toLowerCase(word), toLowerCase(reverseStr(word)));
}
string firstTask(string path)
{
ifstream fin;
fin.open(path);

if (!fin.is_open())
{
return "Під час відкриття файлу сталася помилка!";
}

vector<string> wordArr;
int wordPairCounter = 0;
string word = "";
string resStr = "";
char ch;
while (fin.get(ch))
{
resStr += ch;
}
fin.close();

for (int i = 0; i <= resStr.length(); i++)


{
if (check(resStr[i]))
{
word += resStr[i];
}
else {
wordArr.push_back(word);
word.clear();
}
}
for (int i = 0; i < wordArr.size(); i++)
{
if ((wordArr[i].length() / 2.) == checkWordVovelLet(wordArr[i]))
{
wordPairCounter++;
}
}

int indexLongWord = 0;
int maxLongWord = 0;

for (int i = 0; i < wordArr.size(); i++)


{
if (wordArr[i].length() > maxLongWord) {
maxLongWord = wordArr[i].length();
indexLongWord = i;
}
}

ofstream fout;

fout.open("output.txt");

if (!fout.is_open())
{
return "Не вдалося відкрити файл для запису!";
}

fout << "Текст з вхідного файлу: ";

for (int i = 0; i < resStr.length(); i++)


{
fout << resStr[i];
}
fout << "\nТекст з видаленими словами-паліндромами: ";
for (int i = 0; i < wordArr.size(); i++)
{
if (!checkWordPalindrom(wordArr[i]))
{
fout << wordArr[i] << ' ';
}
}
fout << '\n';

fout << "\nКількість слів що містять однакову кількість голосних і приголосних букв: " <<
to_string(wordPairCounter) << '\n';
fout << "Найдовше слово: " << wordArr[indexLongWord] << '\n';
return "Операція пройшла успішно!";
}

Завдання №2
Main файл:
#include <iostream>
#include <string>
#include <Windows.h>
#include <vector>
#include <fstream>

using namespace std;

struct SKLAD
{
string NAME;
string TYPE;
int QUANTITY;
double COST;

void clear() {
NAME = "";
TYPE = "";
QUANTITY = 0;
COST = 0;
}
};

bool compareString(string str1, string str2) {


for (int i = 0; i < str1.length(); i++)
{
if (str1[i] != str2[i])
return false;
}
return true;
};

string formatNum(double num) {


string strNum = to_string(num);
string resStrNum = "";
for (int i = 0; i <= strNum.length(); i++)
{
if (strNum[i] != '.')
{
resStrNum += strNum[i];
}
else {
resStrNum += '.';
resStrNum += strNum[i + 1];
break;
}
}

return resStrNum;
}

vector<SKLAD> parse_data() {
SKLAD sklad;
vector<SKLAD> resArr;
ifstream fin;

fin.open("database.txt");

if (!fin.is_open())
{
cout << "Під час відкриття файлу сталася помилка :(" << endl;
return {};
}

int p = 1;
while (!fin.eof()) {
string line = "";
string value = "";
bool colonFound = false;
getline(fin, line);
for (int i = 0; i < line.length(); i++)
{
if (line[i] == ':')
{
colonFound = true;
continue;
}
if (colonFound)
{
value += line[i];
}
}
switch (p)
{
case 0:
p++;
continue;
case 1:
sklad.NAME = value;
p++;
continue;
case 2:
sklad.TYPE = value;
p++;
continue;
case 3:
sklad.QUANTITY = stoi(value);
p++;
continue;
case 4:
sklad.COST = stoi(value);
resArr.push_back(sklad);
sklad.clear();
p = 0;
continue;
}
}
fin.close();
return resArr;
}

void write_record_to_file(vector<SKLAD> store) {


ofstream fout;

fout.open("database.txt");

if (!fout.is_open())
{
cout << "Під час відкриття файлу сталася помилка :(" << endl;
return;
}

for (int i = 0; i < store.size(); i++)


{
fout << "Назва товару:" << store[i].NAME << endl;
fout << "Одиниця виміру товару:" << store[i].TYPE << endl;
fout << "Кількість одиниць товару:" << store[i].QUANTITY << endl;
fout << "Ціна одиниці товару:" << store[i].COST << endl;
fout << "______________________________" << endl << endl;
}
};

string edit_record(vector<SKLAD>& arr, int number) {


cout << "Виберіть пункт який будете редагувати" << endl << "1.NAME" << endl << "2.TYPE" << endl <<
"3.QUANTITY" << endl << "4.COST" << endl;
int sel;
cin >> sel;

if (sel == 1)
{
while (getchar() != '\n');
cout << "Вкажіть назву товару: ";
getline(cin, arr[number].NAME);
}
if (sel == 2)
{
while (getchar() != '\n');
cout << "Вкажіть одиницю виміру товару: ";
getline(cin, arr[number].TYPE);
}
if (sel == 3)
{
cout << "Вкажіть кількість одиниць товару: ";
cin >> arr[number].QUANTITY;
}
if (sel == 4)
{
cout << "Вкажіть ціну товару: ";
cin >> arr[number].COST;
}

write_record_to_file(arr);
return "\nОперація пройшла успішно\n";
}

string delete_record(vector<SKLAD>& arr, int number) {


vector<SKLAD> dbres;

for (int i = 0; i < arr.size(); i++)


{
if (i == number)
{
continue;
}
dbres.push_back(arr[i]);
}
arr = dbres;
write_record_to_file(arr);
return "\nОперація пройшла успішно\n";
}

string create_record(vector<SKLAD>& arr) {


SKLAD sklad;

cout << "Вкажіть назву товару: ";


getline(cin, sklad.NAME);

cout << "Вкажіть одиницю виміру товару: ";


getline(cin, sklad.TYPE);

cout << "Вкажіть кількість одиниць товару: ";


cin >> sklad.QUANTITY;

cout << "Вкажіть ціну товару: ";


cin >> sklad.COST;

arr.push_back(sklad);
write_record_to_file(arr);
return "------------\nЗапис додано\n------------\nНомер запису: " + to_string(arr.size()) + "\nНазва товару : " +
sklad.NAME + '\n' + "Одиниця виміру товару : " + sklad.TYPE + '\n' + "Кількість одиниць товару : " +
to_string(sklad.QUANTITY) + '\n' + "Ціна одиниці товару : " + formatNum(sklad.COST) + " грн" + "\n------------\
n";
}

string search_record_by_name(vector<SKLAD> arr) {


string resStr = "";
cout << "------------" << endl;
cout << "Введіть ім’я: ";
string name;
getline(cin, name);
cout << "Записи з іменем \"" + name + "\": " << endl;

for (int i = 0; i < arr.size(); i++)


{
if (arr[i].NAME == name)
{
resStr += "\n------------\nНомер запису: " + to_string(i + 1) + '\n' + "Назва товару: " + arr[i].NAME + '\n' +
"Одиниця виміру товару : " + arr[i].TYPE + '\n' + "Кількість одиниць товару : " + to_string(arr[i].QUANTITY)
+ '\n' + "Ціна одиниці товару : " + formatNum(arr[i].COST) + " грн" + "\n------------\n";
}
}

if (!resStr.empty())
{
return resStr;
}
return "\nЗАПИСІВ НЕ ЗНАЙДЕНО :( ";
}

string view_all_record(vector<SKLAD> arr) {


string resStr = "";
cout << "########################" << endl;
cout << "Всі записи в базі данних" << endl;

for (int i = 0; i < arr.size(); i++)


{
resStr += "\n------------\nНомер запису: " + to_string(i + 1) + '\n' + "Назва товару: " + arr[i].NAME + '\n' +
"Одиниця виміру товару : " + arr[i].TYPE + '\n' + "Кількість одиниць товару: " + to_string(arr[i].QUANTITY) +
'\n' + "Ціна одиниці товару : " + formatNum(arr[i].COST) + " грн" + "\n------------\n";
}

if (!resStr.empty())
{
return resStr;
}
return "\nЗАПИСІВ НЕ ЗНАЙДЕНО :(\n";
}

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
vector<SKLAD> db{ parse_data() };
while (true)
{
int sel;

cout << "Виберіть операцію" << endl << "1.Додати запис" << endl << "2.Знайти товар по імені" << endl
<< "3.Переглянути всі записи в базі данних" << endl << "4.Видалити запис з бази данних" << endl <<
"5.Редагувати запис в базі данних" << endl;
cin >> sel;

if (sel == 1)
{
while (getchar() != '\n');
cout << create_record(db);
}
if (sel == 2)
{
while (getchar() != '\n');
cout << search_record_by_name(db);
}
if (sel == 3)
{
cout << view_all_record(db) << endl;
}
if (sel == 4)
{
int number;
cout << "Вкажіть номер запису: ";
cin >> number;

if (number > db.size())


{
cout << "Записів з таким номером не знайдено" << endl;
continue;
}

if (number >= 1)
{
number--;
}

if (!db[number].NAME.empty())
{
cout << delete_record(db, number);
}
}
if (sel == 5)
{
int number;
cout << "Вкажіть номер запису: ";
cin >> number;

if (number > db.size())


{
cout << "Записів з таким номером не знайдено" << endl;
continue;
}

if (number >= 1)
{
number--;
}
if (!db[number].NAME.empty())
{
while (getchar() != '\n');
cout << edit_record(db, number) << endl;
}
}
}
}

Контрольний приклад виконання завдання №1:

Рис. 1: Приклад введення даних через файл

Рис. 2: Приклад виведення відповіді у файл

Контрольний приклад виконання завдання №2:


Рис. 1-2: Приклад введення даних
Рис. 3: Приклад знаходження товару у базі даних
Рис. 4-5: Приклад виведення інформації про всі товари
Рис. 6-7: Приклад видалення товару з бази даних
Рис. 8-9: Приклад редагування запису про товар у базі даних
Висновок: я навчився складати програми для роботи з файлами заданої
структури та виконання обробки текстової інформації

You might also like