Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2022, 21:36   #1
MaxBrat
Пользователь
 
Регистрация: 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);
}

Мне нужно исправить этот алгоритм сортировки на алгоритм выбора. Буду очень благодарен))
MaxBrat вне форума Ответить с цитированием
Старый 29.10.2022, 22:04   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда во внутреннем цикле осуществляйте поиск минимального или максимального элемента и уменьшайте диапазон поиска на каждой итерации внешнего цикла (начинайте поиск с элемента i) Как-то так:
Код:
for (int i = 0; i < kol; ++i) {
  int f = i;
  for (int j = i + 1l j < kol; ++j)
    if (a[f].salary > a[j].salary) // или (a[f].salary < a[j].salary) для сортировки по убыванию.
      f = j;
  if (f != i) {
    x = a[i]; a[i] = a[f]; a[f] = x;
  }
}
macomics вне форума Ответить с цитированием
Старый 29.10.2022, 22:33   #3
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Тогда во внутреннем цикле осуществляйте поиск минимального или максимального элемента и уменьшайте диапазон поиска на каждой итерации внешнего цикла (начинайте поиск с элемента i) Как-то так:
Код:
for (int i = 0; i < kol; ++i) {
  int f = i;
  for (int j = i + 1l j < kol; ++j)
    if (a[f].salary > a[j].salary) // или (a[f].salary < a[j].salary) для сортировки по убыванию.
      f = j;
  if (f != i) {
    x = a[i]; a[i] = a[f]; a[f] = x;
  }
}
Спасибо большое всё подошло)))
MaxBrat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обясните небольшую часть кода 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