![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 27.09.2022
Сообщений: 32
|
![]()
У меня есть програма на C++:
#include <iostream> #include <conio.h> #include <stdio.h> #include <ctime> #include <errno.h> using namespace std; //Объявление типа employee struct employee { char surname[20]; char name[20]; char patronymic[20]; char position[20]; char start_date[11]; float salary; }; //Добавление одной записи в бинарный файл. Параметры – указатель на файл и имя файла void add_record(char* name) { employee z; FILE* f; //Открыть файл и проверить успешность открытия errno_t err; if ((err = fopen_s(&f, name, "ab")) != 0) printf("File not open.\n"); //Считать запись с клавиатуры (данные вводятся в строку через табуляцию) scanf_s("%s\t%s\t%s\t%s\t%s\t%f", z.surname, 20, z.name, 20, z.patronymic, 20, z.position, 20, z.start_date, 11, &z.salary); //Записать запись в файл fwrite(&z, sizeof(employee), 1, f); //закрыть файл fclose(f); } //Просмотр файла. Параметры – указатель на файл и имя файла void view_file(char* name) { employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); cout << "\nView file" << endl; cout << "Surname\tName\tPatronymic\tPositio n\tStart date\tSalary\n" << endl; //Считывать последовательно записи из файла, пока они не закончатся while (fread(&z, sizeof(employee), 1, f)) { //Вывести запись на экран в строку через табуляцию printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n ", z.surname, z.name, z.patronymic, z.position, z.start_date, z.salary); } fclose(f); } //Второй способ определения количества записей в файле. //Параметры – указатель на файл и имя файла. Результат – целое число (количество записей) int number_of_records2(char* name) { int n = 0; employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); //Считывать по очереди все записи и увеличивать счётчик на 1 while (fread(&z, sizeof(z), 1, f)) n++; fclose(f); return n; } //Заполнение (создание) массива из бинарного файла. //Параметры – массив, указатель на файл, имя файла. void create_array(employee* a, int kol, char* name) { FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); //Считать kol записей из файла в массив а одной командой fread(a, sizeof(employee), kol, f); fclose(f); } //Сортировка массива void sort_array(employee* a, int kol) { int i; employee x; bool f; //Цикл пока массив не отсортирован. Признаком того, что массив уже отсортирован будет //значение переменной f, равное 0, после очередного прохода по массиву do { f = 0; //В каждом проходе по массиву сравниваются два соседних элемента. Они меняются местами, //если стоят в неправильном порядке for (i = 0; i < kol - 1; i++) if (a[i].salary < a[i - 1].salary) { x = a[i]; a[i] = a[i - 1]; a[i - 1] = x; f = 1; } } while (f); } //Вывод динамического массива на экран void view_array(employee* a, int kol) { cout << "Surname\tName\tPatronymic\tPositio n\tStart date\tSalary\n" << endl; for (int i = 0; i < kol; i++) printf("%s\t%s\t%s\t%s\t%s\t%10.2f\ n", a[i].surname, a[i].name, a[i].patronymic, a[i].position, a[i].start_date, a[i].salary); } //Создание бинарного файла из динамического массива (возвращение данных в файл) void array_to_file(employee* a, int kol, char* name) { FILE* f; errno_t err; if ((err = fopen_s(&f, name, "wb")) != 0) printf("File not open.\n"); fwrite(a, sizeof(employee), kol, f); fclose(f); } //Вывод данных по условию void select_data(char* name) { employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); cout << "\nSelect records" << endl; cout << "Surname\tName\tPatronymic\tPositio n\tStart date\tSalary\n" << endl; while (fread(&z, sizeof(employee), 1, f)) { //Если должность - «инженер» if ( strcmp(z.position, "gogogogo") == 0) //Выводим запись на экран printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n ", z.surname, z.name, z.patronymic, z.position, z.start_date, z.salary); } fclose(f); } //Создание текстового файла void create_text_file(char* bname, char* tname) { employee z; float sum = 0, avg; FILE* fb; FILE* ft; int k = number_of_records2(bname); //Открываем бинарный файл для чтения errno_t err; if ((err = fopen_s(&fb, bname, "rb")) != 0) printf("File not open.\n"); //Проходим по бинарному файлу и считаем суммарную зарплату fseek(fb, 0, 0); //Открываем текстовый файл для записи if ((err = fopen_s(&ft, tname, "wt")) != 0) printf("File not open.\n"); //Идём по бинарному файлу и считываем записи while (fread(&z, sizeof(employee), 1, fb)) { //Если запплата ниже средней, то вставляем запись в текстовый файл if (strcmp(z.position, "gogogogo") == 0) fprintf(ft, "%s\t%s\t%s\t%s\t%s\t%g\n", z.surname, z.name, z.patronymic, z.position, z.start_date, z.salary); } fclose(ft); fclose(fb); } //Просмотр текстового файла void view_text_file(char* name) { employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rt")) != 0) printf("File not open.\n"); cout << "\nView text file" << endl; cout << "Surname\tName\tPatronymic\tPositio n\tStart date\tSalary\n" << endl; while (!feof(f)) { fscanf_s(f, "%s\t%s\t%s\t%s\t%s\t%f\n", z.surname, 20, z.name, 20, z.patronymic, 20, z.position, 20, z.start_date, 11, &z.salary); printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n ", z.surname, z.name, z.patronymic, z.position, z.start_date, z.salary); } fclose(f); } //Главная функция int main() { char name[] = "kursfile.txt"; char tname[] = "textfile.txt"; //имена файлов //Ввод данных в бинарный файл cout << "Input information about employee:" << endl; cout << "Surname\tName\tPatronymic\tPositio n\tStart date\tSalary\n" << endl; for (int i = 0; i < 10; i++) add_record(name); //Вывод файла на экран view_file(name); //Определение количества записей в файле int kol = number_of_records2(name); cout << "Number of records in the file: " << kol << endl; //cout<<"Number of records in the file: "<<number_of_records2(name)<<en dl; //Объявление динамического массива employee * a = new employee[kol]; //Заполнение динамического массива значениями create_array(a, kol, name); //Вывод динамического массива на экран cout << "Array:" << endl; view_array (a, kol); //Сортировка массива sort_array(a, kol); //Вывод динамического массива на экран cout <<"\nSorted array:"<<endl; view_array (a, kol); //Возвращение отсортированных данных в бинарный файл array_to_file(a, kol, name); //Очистка памяти из-под массива delete[]a; //Вывод файла на экран view_file(name); //Вывод данных из фала на экран по условию select_data(name); //Создание текстового файла из бинарного create_text_file(name, tname); //Вывод содержимого теекстового view_text_file(tname); system("pause"); return 0; } _______________В ней есть функция з для сортировки_________________________ ______________ //Сортировка массива void sort_array(employee* a, int kol) { int i; employee x; bool f; //Цикл пока массив не отсортирован. Признаком того, что массив уже отсортирован будет //значение переменной f, равное 0, после очередного прохода по массиву do { f = 0; //В каждом проходе по массиву сравниваются два соседних элемента. Они меняются местами, //если стоят в неправильном порядке for (i = 0; i < kol - 1; i++) if (a[i].salary < a[i - 1].salary) { x = a[i]; a[i] = a[i - 1]; a[i - 1] = x; f = 1; } } while (f); } Мне нужно исправить этот алгоритм сортировки на алгоритм выбора. Буду очень благодарен)) |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
Тогда во внутреннем цикле осуществляйте поиск минимального или максимального элемента и уменьшайте диапазон поиска на каждой итерации внешнего цикла (начинайте поиск с элемента i) Как-то так:
Код:
|
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 27.09.2022
Сообщений: 32
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обясните небольшую часть кода | Lovskiy | Общие вопросы C/C++ | 10 | 02.01.2022 09:30 |
Нужно прокомментировать небольшую программу | trum | Помощь студентам | 0 | 07.06.2012 19:29 |
нужно решить небольшую задачку | Henry_ | Фриланс | 2 | 07.12.2011 13:22 |
Нужно написать небольшую программу | neomax38 | Фриланс | 4 | 04.10.2011 20:50 |
Нужно написать небольшую программку | shuraa | Фриланс | 3 | 18.02.2008 00:42 |