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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2016, 14:40   #1
PharaonV
Новичок
Джуниор
 
Регистрация: 07.11.2016
Сообщений: 4
По умолчанию Переписать код из дека в очередь, сортировку из школьной в выборку(Язык Си)

Здравствуйте, пишу курсовую на языке Си и очень нужна помощь. По заданию надо создать архив, который будет считываться из текстового файла, записываться в бинарник,а с ним уже работаем в самой программе. Нам даже дали похожий готовый пример программы,нужно только заменить под свой вариант и переписать нужные части кода. Так вот я столкнулся с проблемой переписания сортировки этого самого архива. Сортировка в примере проводится на базе Дека по школьному методу,а мне надо на базе очереди по методу прямого выбора. Я вроде бы переписал(но честно не уверен,что правильно), но у меня компилятор выдает ошибку необработанного исключения на этапе сортировки(перестановки элементов). Может кто поможет разобраться. Приложу исходные коды примера и того,что я переделал.
Код формирования Дека(Пример):
Код:
int ReadFileOut(int *np, DynProduct **Lp, DynProduct **Rp)
{            
	ProductType Product;
	DynProduct *Run;				// текущий указатель дека архива 
	int p;
	if (SignArchive==0)		//флаг 1-архив создан
	{
		 printf("\nАрхив не создан. Режим отменяется.\n");
		 wait_press_key("\nДля продолжения нажмите любую клавишу\n");
		 return 1;
	}
	if((fArBin=fopen(fArBinName,"rb"))==NULL)
	{	// открывается бинарный файл архива
		printf("\nФайл %s не найден. Режим отменяется.\n",fArBinName);
		wait_press_key("\nДля продолжения нажмите любую клавишу\n");
		SignArchive=0;
		return 1;
	}
  *np=0;
  *Lp = NULL; *Rp=NULL;
	//считывание первой структуры архива
 	if( p=fread(&Product,sizeof(ProductType),1,fArBin)<1) p=EOF;
  while (p!=EOF)
	{	//выделение памяти для элемента дека
		Run=(DynProduct *)malloc(sizeof(DynProduct));
		(*np)++;
		Run->Inf=Product;	//заполнение информационной части       
		Run->Prev=NULL;		//связывание указателей
	  if (*Rp==NULL) 
			{*Rp=Run; Run->Next=NULL;}
		else
			{(*Lp)->Prev=Run;Run->Next=*Lp;}
	  *Lp=Run;
		//считывание очередной структуры архива
		if( p=fread(&Product,sizeof(ProductType),1,fArBin)<1) p=EOF;
	}
  fclose(fArBin);
	return 0;
}	//-----ReadFileOut()
Код сортировки школьным методом(Пример):
Код:
//---------------------------------------------SortArchive()
//Сортировка архива по возрастанию кода изделия. Просмотр дека 
//с левой стороны и сортировка по убыванию "школьным" методом. 
//При просмотре дека с правой стороны сортировка будет по возрастанию
int SortArchive()
{							
int np;
ProductType Product;
DynProduct *Runi;
DynProduct *Runj;				// текущие указатели дека архива 
DynProduct *Lp,*Rp;			// левый и правый указатели дека 
  if ( ! SignArchive )	//архив не создан
  {
		 printf("\nАрхив не создан. Режим отменяется.\n");
		 wait_press_key("\nДля продолжения нажмите любую клавишу\n");
		 return 1;
	}
	ReadFileOut(&np,&Lp,&Rp);	//Формирование архивного дека
	//Сортировка дека по убыванию "школьным" методом
	for ( Runi=Lp; Runi!=NULL; Runi=Runi->Next )
		for ( Runj=Lp; Runj!=NULL; Runj=Runj->Next )
			if ( Runi->Inf.Kod > Runj->Inf.Kod )
			{
        Product=Runi->Inf; Runi->Inf=Runj->Inf;
          Runj->Inf=Product;
			}
	WriteFileOut(Lp,Rp);	//запись дека в архивный файл
	printf("\nСортировка архива закончена.\n");
	wait_press_key("\nДля продолжения нажмите любую клавишу\n");
	return 0;
}
А теперь то,что переделал я.
Код формирования очереди:
Код:
int ReadFileOut(int *np, DynProduct **Lp, DynProduct **Rp)
{            
	ProductType Product;
	DynProduct *Run;				// текущий указатель очереди архива 
	int p;
	if (SignArchive==0)		//флаг 1-архив создан
	{
		 printf("\nАрхив не создан. Режим отменяется.\n");
		 wait_press_key("\nДля продолжения нажмите любую клавишу\n");
		 return 1;
	}
	if((fArBin=fopen(fArBinName,"rb"))==NULL)
	{	// открывается бинарный файл архива
		printf("\nФайл %s не найден. Режим отменяется.\n",fArBinName);
		wait_press_key("\nДля продолжения нажмите любую клавишу\n");
		SignArchive=0;
		return 1;
	}
  *np=0;
  *Lp = NULL; *Rp = NULL;
	//считывание первой структуры архива
 	if( p=fread(&Product,sizeof(ProductType),1,fArBin)<1) p=EOF;
  while (p!=EOF)
	{	//выделение памяти для элемента очереди
		Run=(DynProduct *)malloc(sizeof(DynProduct));
		(*np)++;
		Run->Inf=Product;	//заполнение информационной части       
		Run->Next=NULL;		//установка указателя правого элемента
	  if (*Lp==NULL) 
			{*Lp=Run; }
		else
			{(*Rp)->Next=Run;}
	  *Rp=Run;
		//считывание очередной структуры архива
		if( p=fread(&Product,sizeof(ProductType),1,fArBin)<1) p=EOF; 
		
	}
  fclose(fArBin);
	return 0;
}	//-----ReadFileOut()
Код сортировки методом прямой выборки:
Код:
int SortArchive()
{                           
int np;
ProductType Product;
DynProduct *imin;
DynProduct *Runi;
DynProduct *Runj;               // текущие указатели очереди архива 
DynProduct *Lp,*Rp;         // левый и правый указатели очереди 
  if ( ! SignArchive )  //архив не создан
  {
         printf("\nАрхив не создан. Режим отменяется.\n");
         wait_press_key("\nДля продолжения нажмите любую клавишу\n");
         return 1;
    }
    ReadFileOut(&np,&Lp,&Rp);   //Формирование архивной очереди
    //Сортировка очереди методом прямой выборки
    for ( Runi=Lp; Runi!=NULL; Runi=Runi->Next ) //внешний цикл
        imin=Runi ; // i-й элемент принимаем за минимум
        for ( Runj=Lp; Runj!=NULL; Runj=Runj->Next ) // внутренний цикл поиска минимума
            if ( imin->Inf.Kod > Runj->Inf.Kod )
                imin=Runj;
            if (imin!=Runi)
            { //Перестановка элементов
               Product=Runi->Inf; Runi->Inf=imin->Inf;
          imin->Inf=Product;
            }
    WriteFileOut(Lp,Rp);    //запись очереди в архивный файл
    printf("\nСортировка архива закончена.\n");
    wait_press_key("\nДля продолжения нажмите любую клавишу\n");
    return 0;
}
Ошибку "Необработанное исключение" на этапе перестановки элементов во время сортировки.

Последний раз редактировалось PharaonV; 07.11.2016 в 14:43.
PharaonV вне форума Ответить с цитированием
Старый 07.11.2016, 15:09   #2
PharaonV
Новичок
Джуниор
 
Регистрация: 07.11.2016
Сообщений: 4
По умолчанию

Переписал сортировку на такой лад,ошибки нету,но он не сортирует, остается все на месте,что не так?

Код:
int SortArchive()
{                           
int np;
ProductType Product;
DynProduct *imin;
DynProduct *Runi;
DynProduct *Runj;               // текущие указатели очереди архива 
DynProduct *Lp,*Rp;         // левый и правый указатели очереди 
  if ( ! SignArchive )  //архив не создан
  {
         printf("\nАрхив не создан. Режим отменяется.\n");
         wait_press_key("\nДля продолжения нажмите любую клавишу\n");
         return 1;
    }
    ReadFileOut(&np,&Lp,&Rp);   //Формирование архивной очереди
    //Сортировка очереди методом прямой выборки
    for ( Runi=Lp; Runi<Rp-1; Runi=Runi->Next ) //внешний цикл
        imin=Runi ; // i-й элемент принимаем за минимум
        for ( Runj=Runi+1; Runj<Rp; Runj=Runj->Next ) // внутренний цикл поиска минимума
			if ( imin->Inf.Kod > Runj->Inf.Kod )
                imin=Runj;
            if (imin!=Runi)
            { //Перестановка элеменетов
               Product=Runi->Inf; Runi->Inf=imin->Inf;
          imin->Inf=Product;
            }
    WriteFileOut(Lp,Rp);    //запись очереди в архивный файл
    printf("\nСортировка архива закончена.\n");
    wait_press_key("\nДля продолжения нажмите любую клавишу\n");
    return 0;
}
PharaonV вне форума Ответить с цитированием
Старый 07.11.2016, 15:17   #3
PharaonV
Новичок
Джуниор
 
Регистрация: 07.11.2016
Сообщений: 4
По умолчанию

А если быть точнее,он меняет местами два последних элемента, не сразу заметил этого.
PharaonV вне форума Ответить с цитированием
Старый 08.11.2016, 12:15   #4
PharaonV
Новичок
Джуниор
 
Регистрация: 07.11.2016
Сообщений: 4
По умолчанию

Все,помощь не требуется.справился своими силами. Вот правильный код,если кому-то вдруг надо будет.
Код:
//Сортировка архива
#include "SortArchiv.h"
//---------------------------------------------SortArchive()
//Сортировка архива по возрастанию кода изделия. Просмотр дека 
//с левой стороны и сортировка по убыванию "школьным" методом. 
//При просмотре дека с правой стороны сортировка будет по возрастанию
int SortArchive()
{                           
int np;
ProductType Product;
DynProduct *imin;
DynProduct *Runi;
DynProduct *Runj;               // текущие указатели очереди архива 
DynProduct *Lp,*Rp;         // левый и правый указатели очереди 
  if ( ! SignArchive )  //архив не создан
  {
         printf("\nАрхив не создан. Режим отменяется.\n");
         wait_press_key("\nДля продолжения нажмите любую клавишу\n");
         return 1;
    }
    ReadFileOut(&np,&Lp,&Rp);   //Формирование архивной очереди
    //Сортировка очереди методом прямой выборки
    for ( Runi=Lp; Runi!=NULL; Runi=Runi->Next ) //внешний цикл
       { imin=Runi ; // i-й элемент принимаем за минимум
	for ( Runj=Runi->Next; Runj!=NULL; Runj=Runj->Next ) // внутренний цикл поиска минимума
            if ( imin->Inf.Kod > Runj->Inf.Kod )
                imin=Runj;
            if (imin!=Runi)
            { //Перестановка элеменетов
               Product=Runi->Inf; Runi->Inf=imin->Inf;
			   imin->Inf=Product; }
            }
    WriteFileOut(Lp,Rp);    //запись очереди в архивный файл
    printf("\nСортировка архива закончена.\n");
    wait_press_key("\nДля продолжения нажмите любую клавишу\n");
    return 0;
}
PharaonV вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переписать код с С++ на С# Annuffka Помощь студентам 0 18.10.2015 21:24
вводим 15 элементов в очередь, затем выводим на экран эту очередь и добавил в очередь еще один элемент. Потом удаляем любой элемен Xumera C++ Builder 2 07.12.2013 13:56
Переписать код Вадим12091965 Microsoft Office Excel 0 24.09.2013 19:44
Код selectBox не могу реализовать выборку akutinrom JavaScript, Ajax 0 16.05.2012 17:39
Код игры на Паскале и на Делфи сильно отличается? Как переписать код с Паскаля в Делфи? Mclaren Помощь студентам 2 27.04.2009 22:37