lKzNF1mZtz8.jpg
Дана таблица с урожайностью с/х культур в СССР. В скобках указаны названия столбцов таблицы-результата.
а) Абсолютный спад урожайности какой культуры за период 1940-1945гг был максимальным? [культура, урожайность в 1940 и 1945, величина спада].
б) Урожайность каких культур в 1913г была меньше Y ц/га? [с/х культура, ее урожайность в 1913г].
Наработки:
Код:
#include <iostream>
#define N 20
#define LN 20
#define LG_I 66
#define LG_V 66
int main()
{
setlocale(LC_ALL, "rus");
system("chcp 1251");
struct culture //структурный тип исходной таблицы
{
char name[LN + 1]; //название
float y13; //урожайность за 1913
float y28; //1928
float y40; // и т.д.
float y45;
float y53;
};
int n; // количество культур
struct culture c[N]; //исходная таблица
float Y; //заданная величина Y
struct
{
char name[LN + 1];
float y40;
float y45;
float max_decline; //максимальный спад за 1940-45гг
float urozh; //урожайность культуры за 1913
}c_r[N];
int p; //количество культур в таблице-результате
int i, k;
float max_decline;
float urozh;
int pr; //признак корректности
float raz; //разность между урожайностью за 1940 и 1945
float r; //переменная для ввода данных с плавающей точкой
char sg_icx[LG_I + 1] =
"-----------------------------------------------------";
char sg_vix[LG_V + 1] =
"-----------------------------------------------------------------";
//проверка на количество культур
do {
printf("Введите количество культур(не более %d):", N);
scanf_s("%d", &n);
if (n<0 || n>N)
{
pr = 1; printf("Ошибка ввода\n");
}
else pr = 0;
} while (pr);
printf("Введите данные о культурах\n");
printf("%s\n", sg_icx);
printf("! Культуры ! 1913 ! 1928 ! 1940 ! 1945! 1953\n");
printf("%s\n", sg_icx);
do {
for (i = 0; i < n; i++);
{
setlocale(LC_ALL, "rus");
scanf_s("%s", c[i].name, sizeof(c[i]));
scanf_s("%f", &r); c[i].y13 = r;
scanf_s("%f", &r); c[i].y28 = r;
scanf_s("%f", &r); c[i].y40 = r;
scanf_s("%f", &r); c[i].y45 = r;
scanf_s("%f", &r); c[i].y53 = r;
if (c[i].y13 < 0 || c[i].y28 < 0 || c[i].y40 < 0 || c[i].y45 < 0 || c[i].y53 < 0)
{
pr = 1;
printf("Ошибка ввода\n");
i--;
}
else pr = 0;
}
} while (pr);
printf("%s\n", sg_icx);
//проверка переменной Y
do {
printf("Введите переменную Y:");
scanf_s("%f", &Y);
if (Y < 0) {
pr = 1;
printf("Введите переменную Y правильно:");
}
else pr = 0;
} while (pr);
max_decline = 0;
p = -1;
for (i = 0; i < n; i++); {
if (c[i].y45 < c[i].y40) {
raz = c[i].y40 - c[i].y45;
if (raz > max_decline) {
p++;
max_decline = raz;
strcpy_s(c_r[p].name, c[i].name);
c_r[p].y40 = c[i].y40;
c_r[p].y45 = c[i].y45;
c_r[p].max_decline = max_decline;
}
}
}
//поиск значений урожайности, меньших чем Y
k = -1;
for (i = 0; i < n; i++) {
float urozh = c[i].y13;
if (urozh < Y) {
k++;
strcpy_s(c_r[k].name, strlen(c[i].name) + 1, c[i].name);
c_r[k].urozh = urozh;
}
}
//вывод результата условия А
if (p > -1) {
printf("Культура с максимальным спадом урожайности за 1940-1945\n");
printf("%s\n", sg_vix);
printf("!Культура ! 1940 ! 1945 ! Спад !\n");
printf("%s\n", sg_vix);
for (i = 0; i <= p; i++) {
printf("!%-9s!%-5g !%-5g !%-5g !\n", c_r[i].name, c_r[i].y40, c_r[i].y45, c_r[i].max_decline);
printf("%s\n", sg_vix);
}
}
else
printf("Спад урожайности не обнаружен\n");
//вывод результата условия Б
if (k > -1) {
printf("Культуры с урожайностью в 1913 меньше %f\n", Y);
printf("%s\n", sg_vix);
printf("! Культуры ! 1913 !\n");
printf("%s\n", sg_vix);
for (i = 0; i <= k; i++) {
printf("!%-20s!% 7f !\n", c_r[i].name, c_r[i].urozh);
printf("%s\n", sg_vix);
}
}
else
printf("Урожайность культур была больше, чем %f\n", Y);
system("pause");
return 0;
}
После ввода переменной Y происходит следующее:
изображение_2021-11-08_195349.jpg
Подскажите, пожалуйста, как исправить ошибку и как сделать так, чтобы можно было ввести ВСЕ данные из таблицы, а не только одну строку.
P.S. Если заменить в 111 строке знак < на >, то программа будет работать корректно, но уже не так как надо:
if (urozh < Y) {