1 курс различные лабы и их куски. Что-то полезное тут есть / ОАИП 2 лаба
.docxБелорусский государственный университет информатики и радиоэлектроники
Кафедра вычислительных методов и программирования
Лабораторная работа № 2
Тема: «Среда программирования Visual C++. Программирование с использованием методов сортировок»
Вариант 1
Выполнил студент группы №142701
Барановский Никита Александрович Принял: Герасимов В.А
Минск 2022
Цель: Написать программу обработки файла данных, состоящих из структур, в которой реализованы следующие функции: стандартная обработка файла (создание, просмотр, добавление); линейный поиск в файле; сортировка массива (файла) методами прямого выбора и QuickSort; двоичный поиск в отсортированном массиве. 1. В магазине формируется список лиц, записавшихся на покупку товара. Вид списка: номер, ФИО, домашний адрес, дата учета. Удалить из списка все повторяющиеся записи, проверяя ФИО и адрес. Ключ: дата постановки на учет.
Код программы
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
using namespace std;
FILE* f, * fl, * fll;
struct shop
{
int nomer;
char fio[50];
int data;
char adr[50];
};
shop sp[30];
int nst = 0;
char take2[50], take4[50];
int nm = 0;
int i, j;
int take, take3;
int err;
int menu()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout << "Выберите:" << endl;
cout << "1. Создание файла " << endl;
cout << "2. Ввод данных " << endl;
cout << "3. Просмотр данных" << endl;
cout << "4. Добавить данные" << endl;
cout << "5. Линейный поиск" << endl;
cout << "6. Линейная сортировка" << endl;
cout << "7. Quicksort сортировка" << endl;
cout << "8. Бинарный поиск" << endl;
cout << "9. Выход" << endl;
int i;
cin >> i;
return i;
}
void nf()
{
fopen_s(&f, "LLex.txt", "w");
fclose(f);
cout << "Файл создан " << endl;
}
void adf()
{
fopen_s(&f, "LLex.txt", "wb+");
cout << "Введите количество пунктов наименований: " << endl;
cin >> nst;
for (i = 0; i < nst; i++)
{
cout << "Введите nomer:" << endl;
cin >> sp[i].nomer;
cout << "Введите fio:" << endl;
cin >> sp[i].fio;
cout << "Введите adres:" << endl;
cin >> sp[i].adr;
cout << "Введите data:" << endl;
cin >> sp[i].data;
fwrite(&sp[i], sizeof(shop), 1, f);
}
fclose(f);
}
void zaf()
{
cout << "Просмотр данных: " << endl;
fopen_s(&f, "LLex.txt", "rb+");
cout << "Наименование" << " " << "Количество" << " " << "Номер цеха" << endl;
nst = 0; shop std;
while (true)
{
int nwrt = fread(&std, sizeof(shop), 1, f);
if (nwrt != 1) break;
sp[nst] = std;
cout << sp[nst].nomer << " " << sp[nst].fio << " " << sp[nst].adr << " " << sp[nst].data << endl;
nst++;
}
fclose(f);
}
void dobf()
{
fopen_s(&f, "LLex.txt", "a");
cout << "Количество добавлений: " << endl;
int db = 0;
cin >> db;
for (j = 0; j < db; j++)
{
cout << "Введите nomer: " << endl;
cin >> sp[j + nst].nomer;
cout << "Введите fio:" << endl;
cin >> sp[j + nst].fio;
cout << "Введите adres:" << endl;
cin >> sp[j + nst].adr;
cout << "Введите data:" << endl;
cin >> sp[j + nst].data;
fwrite(&sp[j + nst], sizeof(shop), 1, f);
}
fclose(f);
}
void linf()
{
fopen_s(&f, "LLex.txt", "rb+");
fread(sp, sizeof(shop), 1, f);
int kod = 0;
cout << "Введите data: " << endl;
int f_key;
cin >> f_key;
for (i = 0; i < nst; i++)
{
if (sp[i].data == f_key)
{
kod = 1;
}
}
if (kod == 1)
{
cout << "Найдено." << endl << "nomer" << " " << "fio " << " " << "adres" << endl;
for (i = 0; i < nst; i++)
{
if (sp[i].data == f_key)
{
cout << sp[i].nomer << " " << sp[i].fio << " " << sp[i].adr << endl;
}
}
}
else if (kod == 0)
cout << "Не найдено введенного цеха." << endl;
fclose(f);
}
void linvf()
{
fopen_s(&fl, "lineunaya_sortirovka.txt", "wb+");
fopen_s(&f, "LLex.txt", "rb+");
fread(sp, sizeof(shop), 1, f);
cout << "Наименование" << " " << "Количество" << " " << "Номер цеха" << endl;
for (i = 0; i < nst - 1; i++)
{
nm = i;
for (j = i + 1; j < nst; j++)
if (sp[j].data > sp[nm].data)
nm = j;
sp[nst + 1] = sp[nm];
sp[nm] = sp[i];
sp[i] = sp[nst + 1];
fwrite(&sp[i], sizeof(shop), 1, fl);
cout << sp[i].nomer << " " << sp[i].fio << " " << sp[i].adr << " " << sp[i].data << endl;
if (i == nst - 2)
{
cout << sp[i + 1].nomer << " " << sp[i + 1].fio << " " << sp[i + 1].adr << " " << sp[i + 1].data << endl;
fwrite(&sp[i + 1], sizeof(shop), 1, fl);
}
}
err = 1;
fclose(f);
fclose(fl);
}
void quicksort(shop sp[30], int l, int r)
{
int l_h = l;
int r_h = r;
take = sp[l].data;
take3 = sp[l].nomer;
swap(take2, sp[l].fio);
swap(take4, sp[l].adr);
while (l < r)
{
while ((sp[r].data >= take) && (l < r))
r--;
if (l != r)
{
sp[l] = sp[r];
l++;
}
while ((sp[l].data <= take) && (l < r))
l++;
if (l != r)
{
sp[r] = sp[l];
r--;
}
}
sp[l].data = take;
sp[l].nomer = take3;
swap(sp[l].fio, take2);
swap(sp[l].adr, take4);
take = l;
l = l_h;
r = r_h;
err += 1;
if (l < take)
quicksort(sp, l, take - 1);
if (r > take)
quicksort(sp, take + 1, r);
}
void qssf()
{
fopen_s(&f, "LLex.txt", "rb+");
fopen_s(&fll, "quicksort.txt", "wb+");
quicksort(sp, 0, nst - 1);
for (i = 0; i < nst; i++)
{
cout << sp[nst - 1 - i].nomer << " " << sp[nst - 1 - i].fio << " " << sp[nst - 1 - i].adr << " " << sp[nst - 1 - i].data << endl;
fwrite(&sp[nst - 1 - i], sizeof(shop), 1, fll);
}
fclose(f);
fclose(fll);
}
int sbn(shop sp[30], int left, int right, int key)
{
int midd = 0;
while (1)
{
midd = (left + right) / 2;
int mm = sp[midd].data;
if (key > mm)
right = midd - 1;
else if (key < mm)
left = midd + 1;
else
return midd;
if (left > right)
return -1;
}
}
void binf()
{
if (err == 1)
{
fopen_s(&fl, "lineunaya_sortirovka.txt", "rb+");
cout << "Введите количество наименований, которое надо найти: " << endl;
int key, index;
cin >> key;
index = sbn(sp, 0, nst, key);
if (index >= 0)
cout << "Ячейка с данными наименованиями: " << index << endl;
else
cout << "Ячеек данными наименованиями не найдено. " << endl;
fclose(fl);
}
else
{
cout << "Ошибка. Сделайте сначала линейную сортировку для бинарного поиска" << endl;
}
}
void udz(shop sp[50])
{
int so, sa;
char* str, * str1, * str2, * str3;
fopen_s(&f, "shop.txt", "w+");
for (int i = 0; i < nst - 1; i++)
{
str = sp[i].fio;
str1 = sp[i].adr;
sa = 0;
for (int j = i + 1; j < nst; j++)
{
so = 0;
str2 = sp[j].fio;
str3 = sp[j].adr;
if (str == str2 && str1 == str3)
{
so = 1;
sa = 1;
}
if (so == 1)
{
for (int k = j; k < nst; k++)
{
sp[k] = sp[k + 1];
}
j--;
nst--;
}
}
if (sa == 1)
{
for (int p = i; p < nst - 1; p++)
sp[p] = sp[p + 1];
i--;
nst--;
}
}
for (int i = 0; i < nst; i++)
fwrite(&sp[i], sizeof(shop), 1, f);
fclose(f);
}
int main()
{
while (true)
{
switch (menu())
{
case 1: nf(); break;
case 2: adf(); break;
case 3: zaf(); break;
case 4: dobf(); break;
case 5: linf(); break;
case 6:linvf(); break;
case 7:qssf(); break;
case 8:binf(); break;
case 9: return 0;
case 10:udz(sp); break;
default:cout << "Неверный выбор" << endl;
}
puts("Press any key to continue");
system("pause"); system("cls");
}
}
Скриншоты
Вывод: Проведя данную лабораторную работу, я научился работать с сортировками в среде VisualStudio (C++),а также применять их на практике средствами языка С++. Я составил программу и отладил, сравнил полученные результаты с результатами, которые произвел при личном расчете, они совпали.