Скачиваний:
8
Добавлен:
03.11.2022
Размер:
8.74 Кб
Скачать
// big_sort.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//

#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");
	}
}


// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
// Отладка программы: F5 или меню "Отладка" > "Запустить отладку"

// Советы по началу работы 
//   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
//   2. В окне Team Explorer можно подключиться к системе управления версиями.
//   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
//   4. В окне "Список ошибок" можно просматривать ошибки.
//   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
//   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Соседние файлы в папке 1 курс различные лабы и их куски. Что-то полезное тут есть