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

Тема в разделе "C/C++/C#", создана пользователем Miroslava, 27 дек 2012.

  1. Miroslava

    Miroslava New Member

    Регистрация:
    27 дек 2012
    Сообщения:
    3
    Симпатии:
    0
    //*
    //Для хранения данных о ноутбуках описать структуру.
    //Написать функцию, которая читает данные о ноутбуках из файла 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();}
    } }
    }
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    дак ты тут вроде бы и не пытался сортировать..
    можешь использовать стандартный qsort, например.
     
  3. Miroslava

    Miroslava New Member

    Регистрация:
    27 дек 2012
    Сообщения:
    3
    Симпатии:
    0
    Не подскажите, как лучше сделать?
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
  5. Miroslava

    Miroslava New Member

    Регистрация:
    27 дек 2012
    Сообщения:
    3
    Симпатии:
    0
    Спасибо большое!
     
Загрузка...
Похожие Темы - Структуры Не Могу
  1. dimat
    Ответов:
    0
    Просмотров:
    2.294
  2. NatNiM
    Ответов:
    5
    Просмотров:
    1.842
  3. TSoprano
    Ответов:
    1
    Просмотров:
    1.012
  4. vlada
    Ответов:
    6
    Просмотров:
    1.458
  5. Anastasia18
    Ответов:
    1
    Просмотров:
    1.206

Поделиться этой страницей