• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Структуры. Не Могу Справиться С Сортировкой.

  • Автор темы Miroslava
  • Дата начала
M

Miroslava

//*
//Для хранения данных о ноутбуках описать структуру.
//Написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру. Написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла:
//первые два байта — целое число записей в файле;
//далее записи в формате структуры NOTEBOOK.
//Написать программу, в которой на основе разработанных функций осуществляется запись в двоичный файл данных только о тех ноутбуках, объем HDD которых больше 1 Гбайт, отсортированных в порядке возрастания размера диагонали дисплея.
//
//Для хранения данных о ноутбуках описать структуру вида:
//struct NOTEBOOK {
// struct dlsp_resf // разрешающая способность дисплея
// int x; // по горизонтали
// int у; // по вертикали
// int f; // частота регенерации
// float d; // размер диагонали дисплея
// float hdd; // объем диска
// char model[21]; // наименование
//}

//-----------------------------------------------------*/

#include <stdio.h> //содержит стандартные функции файлового ввода-вывода
#include <io.h> //для работы с файлами
#include <conio.h> // функции для работы с консолью
#include <process.h> //для очистки экрана
#include <locale.h> // подключение setlocale
#include <malloc.h> // Функции для манипулирования динамической памятью
#include <string.h> // для работы со строками
#include <fcntl.h.> //работы с функциями дискриптора
#include <stdlib.h> //содержит функции преобразования строк

struct dlsp_resf { //объявляем структуру "разрешающая способность дисплея"
char model[21]; // наименование
int x; // по горизонтали
int у; // по вертикали
int f; // частота регенерации
float d; // размер диагонали дисплея
float hdd; // объем диска
};
typedef struct notebook { //объявляем структуру "ноутбук"
char model[21]; //название модели
struct dlsp_resf s; //способность дисплея
} NB; //вводим новый тип - NB
NB a; //переменная a является типом NB

// --------------------- объявляем функции
float func_preobr(char *st, int start) //функция преобразования строки в число
{
//char *buf_d;//буфферный массив
char *buf_hdd;//буфферный массив
int i,j;
//buf_d = new char [4];
buf_hdd = new char [5];// Захват памяти
//if (buf_d==NULL) {puts("Ошибка при создании массива строки"); _getch(); return 0;}
//for (i=0;i<5;i++) //обработка строки из 5-ти символов
//*(buf_d+i)=st[start+i]; //присваиваем буфферной строке значение размера диагонали
if (buf_hdd==NULL) {puts("Ошибка при создании массива строки"); _getch(); return 0;}
for (j=0;j<6;j++) //обработка строки из 6-ти символов
*(buf_hdd+j)=st[start+j]; //присваиваем буфферной строке значение объема диска
//return atof(buf_d); // переводим стринг в дабл
return atof(buf_hdd); // переводим стринг в дабл
}
void func_pokaz (int sz, NB a) { // объявляем функцию просмотреть файл
system("cls"); //очистка экрана
FILE *f1;
int i;
unsigned short q; //переменная "количество записей"
if (!(f1 = fopen("d:\\kr2.bin","rb"))) { //проверка откртылся ли файл
puts("Ошибка открытия файла! Нажмите любую клавишу"); _getch(); return;}

printf("\Файл имеет следующие данные:\n");
fread(&q,2,1,f1); //чтение первых двух байт об количестве записей в файле
printf("число записей в файле = %d",q);

while(fread(&a, sz,1,f1)) //чтение файла поструктурно
{ if(feof(f1)) break; //если достигнут конец файла выйти из цикла
printf("\n%s %.1lf %dx0%dPPI %dГц %.3lfГб", a.model,a.s.d,a.s.x,a.s.у,a.s.f,a.s.hdd); //вывод данных на экран
}
fclose(f1);
return;
}
void f_write(char *st, int sz, NB a) //функция записи данных в файл
{
FILE *f2;
int i;

for (i=0; i<19; i++) //запись имени состоящем из 20-ти симоволов
a.model=*(st+i);
a.s.d=func_preobr(st,51); //запись диагонали
a.s.x=func_preobr(st,58); //запись по горизонтали х
a.s.у=func_preobr(st,63); //запись по вертикали y
a.s.f=func_preobr(st,68); //запись частота регенерации f
a.s.hdd=func_preobr(st,71);//запись объема диска (через функцию преобразования) в промежуточную структуру "а"
if (!(f2 = fopen("d:\\kr2.bin","a+b"))) { //проверка откртылся ли файл
puts("Ошибка открытия файла! Нажмите любую клавишу");_getch(); return;}
fwrite(&a,sz,1,f2); //запись структуры в файл
fclose(f2);
}
unsigned short f_zad(unsigned short x2, int sz, NB a) //отбор и запись в файл данных по условию
{
system("cls");
int i, k, buf;
char *st, *buf_hdd, *buf_d; //указатели на считаную строку и буфферную строку (диагонали)
double hdd,d=0; //переменная "величина диагонали"
FILE *f1;

buf_hdd = new char [5]; // Захват памяти
buf_d = new char [4];
st = new char [100]; // Захват памяти
if (buf_hdd==NULL && buf_d==NULL) {puts("Ошибка при создании массива строки"); _getch(); return x2;} //NULL - при нехватке памяти
if (st==NULL) {puts("Ошибка при создании массива строки"); _getch(); return x2;}

fflush(stdin); //Явная очистка буфера ОС
if (!(f1 = fopen("d:\\note.txt","r+t"))) { //проверка откртылся ли файл
puts("Ошибка открытия файла! Нажмите любую клавишу");_getch(); return x2;}
while (fgets (st,79,f1)) //построчно читаем файл в цикле пока не встретим EOF
{ *(buf_hdd+0)=st[71]; //присваиваем буфферной строке объем диагонали
*(buf_hdd+1)=st[72];
*(buf_hdd+2)=st[73];
*(buf_hdd+3)=st[74];
*(buf_hdd+4)=st[75];


*(buf_d+0)=st[51];
*(buf_d+1)=st[52];
*(buf_d+2)=st[53];
*(buf_d+3)=st[54];



hdd=atof(buf_hdd); // переводим стринг в дабл
d=atof(buf_d);
for (int i = 0; i <d ; i++) {
for(int j = i + 1; j < d; j++) {
if (buf_d > buf_d[j])
/*buf=buf_d;
buf_d=buf_d[j];
buf_d[j]=buf;*/
(buf_d, buf_d[j]);
}
}
if (hdd>1) //если выполняется условие что HDD > 1 gb - записать их в файл

{f_write(st, sz, a); //вызов функции записи в двоичный файл
x2++; //увеличиваем счетчик записей в файле
} }
//delete buf_d;
delete []st; // Освобождение памяти

f1 = fopen("d:\\kr2.bin","r+b"); //далее запишем изменение в количестве записей в фале (первые два байта)
fseek(f1,0,0); //смещение указателя в начало файла
fwrite(&x2,2,1,f1); //запись в первые два байта - "число записей"
fclose(f1); //закрытие файла
return x2; //возврат значения числа записей в файле в основную программу
}

// --------------------- объявляем переменные
int sz; //размер в байтах структуры notebook
unsigned short x1=0; //число записей файле
void main(){
FILE *f1;
setlocale(LC_CTYPE, "Russian"); //Установка поддержки русского языка

sz=sizeof(notebook); //находим размер структуры notebook

if (!(f1 = fopen("d:\\kr2.bin","rb"))) { //если файла нет то
f1 = fopen("d:\\kr2.bin","w+b"); //создать файл
fwrite(&x1,2,1,f1); //запись в первые два байта - "0 записей"
} else //если файл существует то:
{
f1 = fopen("d:\\kr2.bin","r+b"); //открыть файл для чтения
fread(&x1,2,1,f1); //чтение первых двух байт об количестве записей в файле
fclose(f1);
while (1) { //организация бесконечного цикла
int menu_n1=0;
system("cls"); //очистка экрана
puts ("Выберите вариант меню");
puts ("1 - Дописать в файл информацию о ноутбуках");
puts ("2 - Просмотр целочисленного бинарного файла");
puts ("3 - Выйти из программы");

fflush(stdin); // Явная очистка буфера ОС
printf("\nВведите пункт меню: ");
scanf_s("%d", &menu_n1);

switch(menu_n1) //меню
{
case 1: x1=f_zad(x1, sz, a); break; //вызов функции чтения текстового файла
case 2: func_pokaz (sz, a); printf("\n\n\nФайл считан. Нажмите любую клавишу для возврата в меню");_getch(); break;
case 3: exit(0);
default: puts ( "Неверный выбор, нажмите любую клавишу"); _getch();}
} }
}
 
R

rrrFer

дак ты тут вроде бы и не пытался сортировать..
можешь использовать стандартный qsort, например.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!