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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2021, 19:57   #1
bebrasx
Новичок
Джуниор
 
Регистрация: 08.11.2021
Сообщений: 1
По умолчанию Работа с табличными данными на языке С++

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) {

Последний раз редактировалось bebrasx; 08.11.2021 в 20:03.
bebrasx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с табличными данными dimon198909 Общие вопросы C/C++ 0 22.02.2014 16:18
РАБОТА С ТАБЛИЧНЫМИ ДАННЫМИ НА Си unknownspace Общие вопросы C/C++ 6 22.12.2011 08:19