Сортировка массивов структур - не получается отсортировать строки по значению первого столбца - C (СИ)
Формулировка задачи:
Нидхэлп.
В функции sort_by_number(size) не получается отсортировать строки по значению первого столбца, т.е. сортируются только значения con[i].num, а надо, чтобы вся строка "ложилась" в новую таблицу...
#include <iostream>
#include <stdio.h>
int size = 0;
typedef struct contracts
{
int num; // номер контракта
double sum; // сумма по контракту
double tamozh; // сумма таможенного сбора
} CONTR;
CONTR con[100]; // оглашение масива структур
void sum_to_tam(int size) // Функция расчета суммы таможенного сбора (с коэфициентом 0,15)
{
for(int i = 0; i < size; i++)
{
con[i].tamozh=con[i].sum*0.15;
}
}
void input(int size) // ввод данных
{
for(int i = 0; i < size; i++)
{
printf("\n *Позиция № %d*", i+1);
printf("\n Введите номер контракта: ");
scanf_s("%d", &con[i].num);
printf(" Сумма по контракту: ");
scanf_s("%lf", &con[i].sum);
}
}
void show(int size) //вывод данных в таблицу
{
printf("\n № | Сумма | Сумма сбора \n");
printf("*******************************\n");
for(int i = 0; i < size; i++)
{
printf(" %-2d | %-9.1lf | %-9.1lf \n",
con[i].num, con[i].sum, con[i].tamozh);
}
}
void sort_by_number(int size) // сортировка методом выбора
{
int i, j, pos, tmp;
for(i = 0; i < size; ++i)
{
pos = i;
tmp = con[i].num;
for(j = i + 1; j < size; ++j)
{
if (con[j].num < tmp)
{
pos = j;
tmp = con[j].num;
}
}
con[pos].num = con[i].num;
con[i].num = tmp;
}
}
int main (void){
setlocale(LC_ALL, "");
printf("Введите количество контрактов: ");
scanf_s("%d", &size);
input(size);
sum_to_tam(size);
printf("\n\n Перед сортировкой:\n");
show(size);
sort_by_number(size);
printf("\n\n После сортировки:\n");
show(size);
getchar ();
getchar ();
return 0;
}Решение задачи: «Сортировка массивов структур - не получается отсортировать строки по значению первого столбца»
textual
Листинг программы
void sort_by_number(int size) // сортировка методом выбора
{
int i, j, pos;
CONTR tmp;
for (i = 0; i < size; ++i)
{
pos = i;
for (j = i + 1; j < size; ++j)
{
if (con[j].num < con[pos].num)
{
pos = j;
}
}
tmp = con[pos];
con[pos] = con[i];
con[i] = tmp;
}
}
Объяснение кода листинга программы
В этом коде реализована сортировка массива структур по значению первого столбца. Список элементов кода:
- В первой строке определяется функция с именем sort_by_number, которая принимает целочисленный аргумент size.
- Переменные i, j, pos и tmp объявляются внутри цикла for.
- Внутренний цикл for начинается с i = 0 и продолжается до size.
- Внешний цикл for начинается с i = 0 и продолжается до size.
- Внутренний цикл for ищет минимальное значение в оставшейся части массива структур и сохраняет его позицию в переменную pos.
- Значение переменной pos заменяется на индекс минимального элемента.
- Значение переменной tmp заменяется на значение элемента по индексу pos.
- Значение элемента по индексу pos заменяется на значение переменной con[i].
- Значение переменной con[i] заменяется на значение переменной tmp.
- Циклы for завершаются.
- Значение переменной size используется в качестве аргумента для функции sort_by_number. В данном коде используется алгоритм сортировки выбором. Он работает следующим образом:
- На каждом шаге выбирается наименьший элемент из неотсортированной части массива и меняется на первое место.
- Процесс повторяется до тех пор, пока массив не будет полностью отсортирован.