Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка структурных данных на языке turbo С

32K
02 января 2008 года
Ошка
10 / / 02.01.2008
[FONT="Georgia"]Доброго времени суток!!

Условие:
необходимо написать программу сортировки структурных данных по возрастанию, расположенных в файле, длина которого не ограниченна размером оперативной памяти. Результат сортировки записать в файл

Структура содержит переменные типа int x , double y и char s.....
условие, при котором одна структура больше (А) больше другой (B):
(y в степени (x))/s .... элемента A > (y в степени (x))/s элемента B....

Моя программа создает N структур, число которых мы вводим с клавиатуры, содержащих 13 элементов создающихся с помощью rand.....
данные записываются в файл. Как их теперь записать в порядке возрастания?.....


Код:
[COLOR="SeaGreen"]#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>[/COLOR]
int i,k ,m=100;

struct str {int x[13]; double y[13]; unsigned char s[13];} st1;


[COLOR="Orange"]zapoLNeNie[/COLOR]()
{for(i=0;i<13;i++)
{
st1.x=rand()%10;
st1.y=(rand()%10)*1.130666;
st1.s=rand();
}
return 0;}
main()
{clrscr();
srand(13);

//введите количество стуктур
printf("[COLOR="Blue"]Enter quantity and structures and press ** enter ** --> [/COLOR]");

scanf("%d",&m);
printf("\n");
k=0;

FILE *data; // создание файла
if((data=fopen("[COLOR="RoyalBlue"]data.txt[/COLOR]","w"))==NULL)
printf("error");
else printf("[COLOR="Blue"]Structures: [/COLOR]\n");
printf("\n");
for(k=0;k<m;k++)
{
[COLOR="DarkOrange"]zapoLNeNie[/COLOR]();

for(i=0;i<13;i++)
printf("%f " ,st1.y);
printf(";\n");
for(i=0;i<13;i++)
printf("%d ",st1.x);
printf(";\n");
for(i=0;i<13;i++)
printf("%u " ,st1.s);
for(i=0;i<13;i++);
printf(";\n");
printf("\n \n");

for(i=0;i<13;i++)
fprintf(data,"%f " ,st1.y);
for(i=0;i<13;i++)
fprintf(data,"%d ",st1.x);
for(i=0;i<13;i++)
fprintf(data,"%x " ,st1.s);
for(i=0;i<13;i++)
fprintf(data,"\n");

}
fclose(data);
getch();
return 0 ;
}

[/FONT]
33K
03 января 2008 года
ACW-Coder
17 / / 02.01.2008
Привет всем!
Довольно смутно, как мне кажется, обрисована проблема, еще какие-нибудь комментраии не помешали бы. Но вот, что мне на ум пришло: т.е. вся проблема в том, что полносью создать массив нельзя (т.к. он очень большой), а значит и нельзя его спокойно отсортировать и записать в файл?
Разрешение этой проблемы, в основе которого лежит приницип индексных таблиц, схематично можно обрисовать следующм образом:

1) Создать файл, в который записать все структуры в том порядке, в котором они генерируются (это у тебя уже сделано). Далее надо работать с этим файлом.
2) Создать массив в котором будут содержаться индексы всех структур, привязываясь к твоему коду - размерности m. Заполнить его элементы числами от 0 до (m-1). Это и будет таблица индексов. Т.е. каждый элемент этого массива указывает (мысленно) на структуру в файле.
3) А теперь идет сортировка. Возмемь обычный метод - "пузырьковая" сортировка. Вся его сущность в том, что m*(m-1) раз (внешний цикл: i - от 0 до m, втутренний: j - от 0 до m-1) будут сравниваться элементы, которые стоят рядом. Схематично строка анализа будет выглядеть так:
структура[j].поле (==,<,>,!=) структура[j + 1].поле.
А с использованием индексной таблицы это будет выглядеть так:
структура[индекс[j]].поле (==,<,>,!=) структура[индекс[j + 1]].поле.
Если условие выпонено, то здесь надо будет местами лишь элементы индексной таблицы, а не структуры.
4) Записать результат в файл. Обращение к очередной структуре будет производится не прямо - структура, а косвенно - структура[индекс]. (цикл вывода по i, где 0 <= i < m)

Смысл этого метода заключается в том, что те данные, которые нужно анализировать, - статические. В твоем случае они записаны в файл. А работь надо только с индексной таблицей. Немного пошевелить извилинами придется только в пункте (3), когда надо будет считывать из файла записи с номерами - номерами (j) и (j + 1), но это вполне реализуемо, ведь по файлу можно передвигаться в нужное место (если не ошибаюсь, то такая ф-ция в C++ называется seek, или что-то вроде этого): есть номер элемнта, умножаем его на длину структуры в байтах и получаем смещение в байтах относительно начала файла, где начинается нужная структура.
Конечно, так понять все это трудновато, поэтому в прикрепленные файлы я запихал программку, которая работает по такому принципу. Там нудно отсортировать строки (берутся из файла) в алфавитном порядке и вывести на экран. Короче говоря, будут вопросы - задавай.
320
03 января 2008 года
m_Valery
1.0K / / 08.01.2007
[COLOR="Red"]exe-шники выкладывать на форуме запрещено.Удалил.[/COLOR] модератор.
32K
03 января 2008 года
Ошка
10 / / 02.01.2008
я сама немного запуталась.... по идее мне нужно создать 2 файла.... 1ый, который создает структуры..... **new_file.c** и второй, который непосредственно сортирует структуры..... не элементы нужно сортировать, а вычислить критерий структур и провести их сортировку.

Критерий:

условие, при котором одна структура больше (А) больше другой (B):
(y в степени (x))/s .... элемента A > (y в степени (x))/s элемента B....

что-то вроде этого, как мне кажется:
Код:
struct str tmp;
for (i = 0; i < n-1; i++)
{min = i;  
for (j = i+1; j < n; j++)

{double oper_1 = pow(st1[min].y,st1[min].x) / float(st1[min].s);  
double oper_2 = pow(st1[j].y,st1[j].x) / float(st1[j].s);

if (oper_1 > oper_2)
{min = j;}  
}  
 tmp = stl;
  stl = stl[min];  
 stl[min] = tmp;
}

или нет....


программа **new_f**
Код:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
int i,k ,m=100;

struct str {int x; double y; unsigned char s;} st1;
//bool operator <(Thingy a, Thingy b) { return pow(a.x+0.0, a.y)/a.z < pow(b.x+0.0, b.y)/b.z; }
zapoLNeNie()

{
st1.x=rand()%10;
st1.y=(rand()%10)*1.130666;
st1.s=rand();

return 0;}
main()
{clrscr();

/* vvedite kolichestvo structur i na*mite ** enter ** */
printf("Enter quantity and structures and press ** enter ** --> ");
scanf("%d",&m);
printf("\n");
k=0;

FILE *data;
if((data=fopen("data.txt","w"))==NULL)
printf("error");
else printf("Structures: \n");
printf("\n");
for(k=0;k<m;k++)
{
zapoLNeNie();


printf("%f " ,st1.y);
printf(";\n");

printf("%d ",st1.x);
printf(";\n");

printf("%u " ,st1.s);
printf(";\n");

printf("\n \n");
33K
04 января 2008 года
ACW-Coder
17 / / 02.01.2008
"2 файла.... 1ый, который создает структуры" - т.е. входная информация генерируется не программой, а считывается из файла. А переменная m задает кол-во структур для считывания. Я правильно понял?
А вообще, если есть возможнность, напиши точную формулировку задачи. Я попробую не опираясь на твой код реализовать по-своему - с "чистого", так сказать, "листа".
32K
06 января 2008 года
Ошка
10 / / 02.01.2008
ACW-Coder, да..... Т.е Мы вводим с клавиатуры любое количество структур m, которые генерируются произвольно и записываются в файл....
затем эти структуры нужно считать и записать в другой файл....
для сортировки структур используем критерий:
(структура А) больше (структуры B), если:
(y в степени (x))/s .... первой структуры А > (y в степени (x))/s B....
33K
07 января 2008 года
ACW-Coder
17 / / 02.01.2008
Ну, вот, посмотри, как тебе такое решение...

Код:
#include "stdafx.h"

#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <fstream.h>
#include <time.h>
/************************************************************************************/
//Описание структуры
struct sNumbers
{
    int x;
    double y;
    unsigned char z;
};
/************************************************************************************/
//Размер структуры
#define REC_LEN sizeof(sNumbers)
/************************************************************************************/
//Указатель на таблицу индексов
unsigned long *pIndex = NULL;

//Размерность массива
unsigned long ddM;
//Указатели на выходные потоки
ofstream fsOut, fsInText;
//Указатель на входной поток
ifstream fsIn;

//Переменные для временных значений
sNumbers nTmp;
char sBin[REC_LEN];
unsigned long ddTmp;
/************************************************************************************/
//Заполнение входного файла
void fnFillInFile()
{
    //Открытие файлов для записи
    //... в бинарном формате
    fsOut.open("iData.bin");
    //... в текстовом формате
    fsInText.open("iData.txt");

    //Цикл заполнения входных данных для сортировки
    for(unsigned long i = 0; i < ddM; i++)
    {  
        //Генерация информации
        nTmp.x = rand() % 10;
        nTmp.y = (rand() % 10) / 1.130666;
        //Число от 1 до 255, т.к.
        //  z - знаменатель дроби в расчетной формуле
        nTmp.z = rand() % 254 + 1;

        //Копирование данных в символьный массив
        memcpy(sBin, &nTmp, REC_LEN);
        //Запись в бинарном формате
        fsOut.write(sBin, REC_LEN);

        //Запись в текстовом формате
        fsInText << nTmp.x << " " <<
                    nTmp.y << " " <<
                    nTmp.z << endl;
    }

    //Закрытие файлов
    fsOut.close();
    fsInText.close();
}
/************************************************************************************/
//Возвращает значение для сравнения из записи с заданным номером
double fnTestValue(unsigned long ddRecNum)
{  
    double dblRes;
    sNumbers nRecord;
   
    //Вычисление смещения
    ddTmp = ddRecNum * REC_LEN;
    //Переход на заданную позицию
    fsIn.seekg(ddTmp);
    //Чтение структуры
    fsIn.read(sBin, REC_LEN);
    //Перезапись бинарных данных в структуру
    memcpy(&nRecord, sBin, REC_LEN);

    //Вычисление значения
    dblRes = pow(nRecord.y, (double)nRecord.x) / (double)nRecord.z;

    return dblRes;
}
/************************************************************************************/
void fnSorted()
{
    unsigned long i, j, ddOffset;
    double dblValue1, dblValue2;

    //Открытие бинарного файла для считывания
    fsIn.open("iData.bin");

    //Сортировка "пузырьком"
    for(i = 0; i < ddM; i++)
    {
        for(j = 0; j < (ddM - 1); j++)
        {
            //Получение структур для сравнения
            //  с учетом их номеров в индексной таблице
            dblValue1 = fnTestValue(pIndex[j]);
            dblValue2 = fnTestValue(pIndex[j + 1]);

            //Сравнение
            if(dblValue1 > dblValue2)
            {
                //Если условие выполнено, то переставить индексы
                ddTmp = pIndex[j];
                pIndex[j] = pIndex[j + 1];
                pIndex[j + 1] = ddTmp;
            }
        }
    }

    //Закрытие файла
    fsIn.close();
}
/************************************************************************************/
//Запись результата
void fnRecord()
{
    //Открытие файлов для чтения и записи
    fsIn.open("iData.bin");
    fsOut.open("oData.txt");

    //Цикл по всем элементам
    for(unsigned long i = 0; i < ddM; i++)
    {
        //Чтение структуры с заданным индексом
        ddTmp = pIndex * REC_LEN;
        fsIn.seekg(ddTmp);
        fsIn.read(sBin, REC_LEN);

        //Перезапись бинарных данных в структуру
        memcpy(&nTmp, sBin, REC_LEN);

        //Вывод в файл в текстовом формате
        fsOut << nTmp.x << " " <<
                 nTmp.y << " " <<
                 nTmp.z << endl;
    }

    //Закрытие файлов
    fsIn.close();
    fsOut.close();
}
/************************************************************************************/
//Основная функция
void main()
{
    unsigned long i;

    //Инициализация генератора случайных чисел
    srand(time(NULL));

    //Ввод числа элементов
    cout << "M = ";
    cin >> ddM;

    //Создание таблицы индексов
    pIndex = new unsigned long[ddM];
    if(!pIndex) return;
   
    //Заполнение таблицы индексов
    for(i = 0; i < ddM; i++)
        pIndex = i;

    //Генерация данных для сортировки
    fnFillInFile();
    //Сортировка
    fnSorted();
    //Вывод
    fnRecord();

    //Удаление таблицы индексов
    delete []pIndex;
}
/************************************************************************************/
32K
09 января 2008 года
Ошка
10 / / 02.01.2008
ACW-Coder, спасибо!!!! посмотрю.... )))))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог