Скачиваний:
29
Добавлен:
03.11.2022
Размер:
71.17 Кб
Скачать

Белорусский государственный университет информатики и радиоэлектроники

Кафедра вычислительных методов и программирования

Лабораторная работа № 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++),а также применять их на практике средствами языка С++. Я составил программу и отладил, сравнил полученные результаты с результатами, которые произвел при личном расчете, они совпали.

Соседние файлы в папке 1 курс различные лабы и их куски. Что-то полезное тут есть