Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2013, 01:44   #1
Kingl
 
Регистрация: 30.11.2013
Сообщений: 5
По умолчанию Сортировка по алфавиту

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

Код:
#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); // Ввод фамилии с проверкой правильности ввода
//void EnterDetailsAmount(int); // Ввод количества деталей с проверкой правильности ввода
//void EnterTeamNumber(int); // Ввод номера бригады с проверкой правильности ввода

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 - Создание файла");
		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("\nЗапись сохранена. Нажмите любую клавишу...");
}

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

	printf ("Формат записи");
	printf("\n № Фамилия, Наименование, Марка изделия, Дата, Состояние готовности");
	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++;
	}
}
Kingl вне форума Ответить с цитированием
Старый 18.12.2013, 01:44   #2
Kingl
 
Регистрация: 30.11.2013
Сообщений: 5
По умолчанию

вторая часть кода
Код:
void Edit()
{
	int actionNumber, i, recordNumber;

	do
	{
		printf("1 - удалить запись");
		printf("\n2 - редактировать запись");
		printf("\n3 - добавить новую запись");
		printf("\n4 - отмена");

		printf("\n\nВведите номер действия: ");
		scanf("%d", &actionNumber);
		fflush(stdin);

		if (actionNumber < 1 || actionNumber > 4)
		{
			printf("Пожалуйста, введите число от 1 до 4\n\n");
		}
	}
	while(actionNumber < 1 || actionNumber > 4);

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

			system("cls");
			printf("Удаление записи");
				printf ("Формат записи");
				printf("\n № Фамилия, Наименование, Марка изделия, Дата, Состояние готовности");
				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("Введите номер удаляемой строки: ");
				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("Удаление прошло успешно");

			break;

		case 2:
			FileToStructEdit();

			system("cls");
			printf("Редактирование записи");
			printf ("Формат записи");
			printf("\n № Фамилия, Наименование, Марка изделия, Дата, Состояние готовности");
			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("Введите номер записи для редактирования: ");
				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("\nВведите фамилию: ");
		scanf("%s", &Surnme);
		fflush(stdin);
		strcpy(work[i].surname, Surnme);

		printf("\nВведите наименование: ");
		scanf("%s", &name);
		fflush(stdin);
		strcpy(work[i].name, name);

		printf("\nВведите марку изделия: ");
		scanf("%s", &brand);
		fflush(stdin);
		strcpy(work[i].brand, brand);

		printf("\nВведите состояние готовности: ");
		scanf("%s", &status);
		strcpy(work[i].status, status);

		printf("\nВведите день, месяц, год: ");
		scanf("%d %d %d", &den, &mesyc, &god);
		work[i].den = den;
		work[i].mesyc = mesyc;
		work[i].god = god;

		
}
void Exit()
{
	exit(0);
}
Kingl вне форума Ответить с цитированием
Старый 18.12.2013, 13:04   #3
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

При добавлении новой записи, можно изначально записывать её в массив work по алфавиту, а не в очередную свободную. Запись в файл при этом не делать, а записать всё разом только после того, как введены все заказы на работы.
FataLL вне форума Ответить с цитированием
Старый 18.12.2013, 13:47   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

простите, а в чём сложность сделать сортировку массива ?!
что-то вроде:
Код:
worker workTmp;
for (i = 0; i < (nw-1); i++)
{
  for (j = i+1; i < nw; j++)
   {
      if(work[i].ФамилияМастера>work[j].ФамилияМастера)
      {
         workTmp := work[i];
         work[i] := work[j];
         work[j] := workTmp;
       }
    }
}
ну, для эффективности, можно прочитать в массив только те записи, которые соответствуют заданной дате. или выделить записи с указанной датой в отдельный массив и сортировать уже его.
На самый крайний случай можно и целиком весь массив сортировать, конечно, это не эффективно, но в качестве рабочего варианта может прокатить...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка по алфавиту aerocool Помощь студентам 14 06.02.2013 16:26
Сортировка по алфавиту. asmars Общие вопросы C/C++ 3 17.04.2012 00:42
Сортировка по алфавиту Cpluser Общие вопросы C/C++ 7 03.03.2010 10:11
сортировка по алфавиту на си++ Craz Помощь студентам 2 01.10.2009 23:33