[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 ;
}
Сортировка структурных данных на языке turbo С
Условие:
необходимо написать программу сортировки структурных данных по возрастанию, расположенных в файле, длина которого не ограниченна размером оперативной памяти. Результат сортировки записать в файл
Структура содержит переменные типа int x , double y и char s.....
условие, при котором одна структура больше (А) больше другой (B):
(y в степени (x))/s .... элемента A > (y в степени (x))/s элемента B....
Моя программа создает N структур, число которых мы вводим с клавиатуры, содержащих 13 элементов создающихся с помощью rand.....
данные записываются в файл. Как их теперь записать в порядке возрастания?.....
Код:
[/FONT]
Довольно смутно, как мне кажется, обрисована проблема, еще какие-нибудь комментраии не помешали бы. Но вот, что мне на ум пришло: т.е. вся проблема в том, что полносью создать массив нельзя (т.к. он очень большой), а значит и нельзя его спокойно отсортировать и записать в файл?
Разрешение этой проблемы, в основе которого лежит приницип индексных таблиц, схематично можно обрисовать следующм образом:
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, или что-то вроде этого): есть номер элемнта, умножаем его на длину структуры в байтах и получаем смещение в байтах относительно начала файла, где начинается нужная структура.
Конечно, так понять все это трудновато, поэтому в прикрепленные файлы я запихал программку, которая работает по такому принципу. Там нудно отсортировать строки (берутся из файла) в алфавитном порядке и вывести на экран. Короче говоря, будут вопросы - задавай.
[COLOR="Red"]exe-шники выкладывать на форуме запрещено.Удалил.[/COLOR] модератор.
Критерий:
условие, при котором одна структура больше (А) больше другой (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;
}
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");
#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");
А вообще, если есть возможнность, напиши точную формулировку задачи. Я попробую не опираясь на твой код реализовать по-своему - с "чистого", так сказать, "листа".
затем эти структуры нужно считать и записать в другой файл....
для сортировки структур используем критерий:
(структура А) больше (структуры B), если:
(y в степени (x))/s .... первой структуры А > (y в степени (x))/s B....
Код:
#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;
}
/************************************************************************************/
#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;
}
/************************************************************************************/
ACW-Coder, спасибо!!!! посмотрю.... )))))