Страница 1 из 1

Сортировка массива структур по алфавиту

Добавлено: 18 дек 2015, 08:54
Kozolick
Создать программу (выполнив функциональное разбиение) реализующую следующие функции работы с бинарным файлом. Предусмотреть создание меню со следующими пунктами:
1 – СОЗДАНИЕ НОВОГО ФАЙЛА
2– ПРОСМОТР ФАЙЛА
3 – КОРРЕКТИРОВКА ЗАПИСЕЙ ФАЙЛА (изменение, добавление новой записи, удаление записи)
4 – ВЫПОЛНЕНИЕ ЗАДАЧИ
5 – ВЫХОД

В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Квитанция содержит наименование (телевизор и т. п.), марку изделия, дату приемки, фамилию мастера, состояние (выполнен или нет). ВЫВЕСТИ ИНФОРМАЦИЮ О СОСТОЯНИИ ЗАКАЗОВ НА УКАЗАННУЮ С КЛАВИАТУРЫ ДАТУ, ОТСОРТИРОВАННУЮ ПО ФАМИЛИИ ВЫПОЛНЯЮЩЕГО ЗАКАЗ МАСТЕРА.

!!! Помогите пожалуйста разобраться с сортировкой по алфавиту. Не понимаю как сделать так, чтобы выделить записи с указанной датой в отдельный массив и уже его сортировать (код последней функции)!!!

Код: Выделить всё

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <locale.h> 

FILE *fl;

struct worker // Шаблон структуры
{
	char surname[40], name[40], brand[40], status[4];
	int den, mesyc, god;
};

worker work[1000]; // Массив структур
int nw, den, mesyc, god; // Количество рабочих

int Menu(); // Меню
void AddNewData(); // Доблавение новых данных
void ViewFile(); // Просмотр содержимого файла
void Edit(); // Редактирование данных
void FileToStructEdit(); // Запись файла в структуру
void ViewResult(); // Вывод результата
void Exit(); // Выход из программы 

void Enter(int); // Ввод фамилии с проверкой правильности ввода
#define c 99999;

void main()

{
	setlocale(LC_CTYPE, "Russian");

	do
	{
		system("cls"); 

		switch (Menu())
		{
			case 1: AddNewData(); break;
			case 2: ViewFile(); break;
			case 3: Edit(); break;
			case 4: ViewResult(); break;
			case 5: Exit(); break;
		}
		_getch();
	} while(true);
}

int Menu()
{
	int n;

	do
	{
		printf("Enter desired action number");
		printf("\n1 - Sozdanie faila");
		printf("\n2 - view the file");
		printf("\n3 - edit records");
		printf("\n4 - view result");
		printf("\n5 - exit");

		printf("\n\nEnter an action number: ");
		scanf("%d", &n);
		fflush(stdin);

		system("cls");
	} while(n < 1 || n > 5);

	return n;
}

void AddNewData()
{
	int i, den, mesyc, god;
	char continueAdd;
	char Surnme[40], name[40], brand[40], status[4];

	// Создание нового файла/стирание старого
	if (!(fl = fopen("list.txt", "wb")))
	{
		printf("\n\nCreating file error\n");
		return;
	}
	fclose(fl);

	// Открытие файла для записи
	if (!(fl = fopen("list.txt", "rb++")))
	{
		printf("\n\nOpening file error\n");
		return;
	}
	for (i = 0; i < 999; i++)
	{
		Enter(i);
		nw = i + 1;

		fwrite(&work[i], sizeof(worker), 1, fl);
		do
		{
			printf("\nContinue add records(y/n): ");
			scanf("%c", &continueAdd);
			fflush(stdin);
		}
		while(continueAdd != 'y' && continueAdd != 'Y' && continueAdd != 'n' && continueAdd != 'N');

		if (continueAdd == 'n' || continueAdd == 'N')
		{
			break;
		}
	}
	fclose(fl);

	printf("\nZapis sohranena. Najmite lubuy klavihy...");
}

void ViewFile()
{
	if (!(fl = fopen("list.txt", "rb")))
	{
		printf("\n\nOpening file error\n");
		return;
	}

	printf ("Format zapisi");
	printf("\n # Familia, Naimenovanie, Marca izdelia, Data, Sostoynie gotovnosti");
	printf("\n");

	int i = 0;
	worker workRead;

	while (fread(&workRead, sizeof(worker), 1, fl))
	{
		if (feof(fl))
		{
			break;
		}

		work[i] = workRead;

		printf("\n%d %s, %s, %s, %d.%d.%d, %s",
		i + 1,
		work[i].surname,
		work[i].name,
		work[i].brand,
		work[i].den,
		work[i].mesyc,
		work[i].god,
		work[i].status);

		i++;
	}

	fclose(fl);

	printf("\n\nPress any key");
}

void FileToStructEdit()
{
	worker workEdit;
	int i = 0;

	if(!(fl=fopen("list.txt", "rb")))
	{
		printf("\n\nFile opening error\n");
		return;
	}

	nw = 0;

	while(fread(&workEdit, sizeof(worker), 1, fl))
	{
		if (feof(fl))
		{
			break;
		}

		work[i] = workEdit;

		i++;
		nw++;
	}
} 

Re: Сортировка массива структур по алфавиту

Добавлено: 18 дек 2015, 08:54
Kozolick
Часть 2.

Код: Выделить всё

void Edit()
{
	int actionNumber, i, recordNumber;

	do
	{
		printf("1 - ydalite zapis");
		printf("\n2 - redaktirovat zapis");
		printf("\n3 - dobavit novyy zapis");
		printf("\n4 - otmena");

		printf("\n\nVvedite nomer deistviya: ");
		scanf("%d", &actionNumber);
		fflush(stdin);

		if (actionNumber < 1 || actionNumber > 4)
		{
			printf("Pojalyista, vvedite chislo ot 1 do 4\n\n");
		}
	}
	while(actionNumber < 1 || actionNumber > 4);

	switch (actionNumber)
	{
		case 1:
		FileToStructEdit();

		system("cls");
		printf("Ydalenie zapisi");
		printf ("Format zapisi");
		printf("\n # Familia, Naimenovanie, Marka izdelia, Data, Sostoyanie gotovnosti");
		printf("\n");

		for (i = 0; i < nw; i++)
		{
			printf("\n%d %s, %s, %s, %d.%d.%d, %s",
			i + 1,
			work[i].surname,
			work[i].name,
			work[i].brand,
			work[i].den,
			work[i].mesyc,
			work[i].god,
			work[i].status);
		}

		printf("\n\n");

		do
		{
			printf("Vvedite nomer ydalyaemoi stroki: ");
			scanf("%d", &recordNumber);
			fflush(stdin);
		}
		while(recordNumber < 1 || recordNumber > nw);

		if(!(fl=fopen("list.txt", "wb")))
		{
			printf("\n\nFile opening error\n");
			return;
		}

		for (i = 0; i < nw - 1; i++)
		{
			if (i > recordNumber - 2)
			{
				work[i] = work[i + 1];
			}

			fwrite(&work[i], sizeof(worker), 1, fl);
		}

		fclose(fl);
		printf("Ydalenie proshlo yspeshno");

		break;

		case 2:
		FileToStructEdit();

		system("cls");
		printf("Redactirovanie zapisi");
		printf ("Format zapisi");
		printf("\n # Familia, Naimenovanie, Marka izdelia, Data, Sostoyanie gotovnosti");
		printf("\n");

		for (i = 0; i < nw; i++)
		{
			printf("\n%d %s, %s, %s, %d.%d.%d, %s",
			i + 1,
			work[i].surname,
			work[i].name,
			work[i].brand,
			work[i].den,
			work[i].mesyc,
			work[i].god,
			work[i].status);
		}

		printf("\n\n");

		do
		{
			printf("Vvedite nomer zapisi dlya redactirovania: ");
			scanf("%d", &recordNumber);
			fflush(stdin);
		}
		while(recordNumber < 1 || recordNumber > nw);

		if(!(fl=fopen("list.txt", "wb")))
		{
			printf("\n\nFile opening error\n");
			return;
		}

		for (i = 0; i < nw; i++)
		{
			if (i == recordNumber - 1)
			{
				Enter(i);
			}

			fwrite(&work[i], sizeof(worker), 1, fl);
		}

		fclose(fl);
		printf("Editing was successful");

		break;

		case 3: 
		FileToStructEdit();

		system("cls");
		printf("Adding new record\n");

		if(!(fl=fopen("list.txt", "wb")))
		{
			printf("\n\nFile opening error\n");
			return;
		}

		for (int i = 0; i < nw + 1; i++)
		{
			if (i == nw)
			{
			Enter(i);
			}

			fwrite(&work[i], sizeof(worker), 1, fl);
		}

		nw++;
		fclose(fl);
		printf("Adding new record was successful");

		break;

		// Выход в главное меню
		case 4: 
		return;

		break;
	}

	printf("\n\nPress any key");
}

void Enter(int i)
{
	int den, mesyc, god;
	char continueAdd;
	char Surnme[40], name[40], brand[40], status[4];

	printf("\nVvedite familiy: ");
	scanf("%s", &Surnme);
	fflush(stdin);
	strcpy(work[i].surname, Surnme);

	printf("\nVvedite naimenovanie: ");
	scanf("%s", &name);
	fflush(stdin);
	strcpy(work[i].name, name);

	printf("\nVvedite marky izdelia: ");
	scanf("%s", &brand);
	fflush(stdin);
	strcpy(work[i].brand, brand);

	printf("\nvvedite sostoyanie gotovnosti: ");
	scanf("%s", &status);
	strcpy(work[i].status, status);

	printf("\nVvedite den, mesyaz, god: ");
	scanf("%d %d %d", &den, &mesyc, &god);
	work[i].den = den;
	work[i].mesyc = mesyc;
	work[i].god = god;
}

void Exit()
{
	exit(0);
}

void ViewResult()
{
	FileToStructEdit();
	int den1, mesyc1,god1;
	printf("Vvedite daty: ");
	scanf("%d %d %d",&den1, &mesyc1, &god1);
	if(!(fl=fopen("list.txt", "rb")))
	{
		printf("\n\nFile opening error\n");
		return;
	}
	for(int i = 0; i<nw;i++)
	{
		if(den1==work[i].den&&mesyc1==work[i].mesyc&&god1==work[i].god)
		{
			printf("\n%s %s %d %d %d",work[i].surname,work[i].status,work[i].den,work[i].mesyc,work[i].god);
		}
	}
	fclose(fl);
}

Re: Сортировка массива структур по алфавиту

Добавлено: 18 дек 2015, 09:55
Decoder
Я смотрю, твоя задачка выполнена полностью на языке СИ. А язык С++ вообще нельзя использовать? На С++ это можно было бы сделать проще. В том числе сортировку структур в массиве.

Re: Сортировка массива структур по алфавиту

Добавлено: 18 дек 2015, 10:20
Kozolick
Нужно только на СИ ((

Re: Сортировка массива структур по алфавиту

Добавлено: 18 дек 2015, 10:30
Absurd
В ванильном Си есть обобщенный qsort в <stdlib.h>. Ему передается указатель void* на массив, количество и sizeof структур которые там лежат и указатель на функцию - int(*)(void*,void*) компаратор.

https://msdn.microsoft.com/ru-ru/library/zes7xw0h.aspx