Есть ли в любом случае, где я могу сравнить структуры структуры, созданные с использованием указателей?

#c #sorting #struct

#c #сортировка #структура

Вопрос:

Я работаю над проблемой, в которой есть массив дат, подлежащих сортировке, и в его порядке должны отображаться входные данные (отсортированная). Есть две даты: одна — дата посева, а другая — дата сбора урожая. На основе входных данных они должны быть отсортированы и отображены.

Первоначально берется количество введенных культур и с этим именем берутся количество осадков, температура, дата посева, дата сбора урожая. культур обычно два или более, я смог написать только сравнение для двух культур, но мне это нужно для более чем двух. Кроме того, случаи 3 и 4 я не могу понять. Struct Date и struct Crop должны быть обязательными.

 #include <stdio.h>
#include <stdlib.h>

struct Date {
    int dd;
    int mm;
    int yyyy;
};

struct Crop {
    char name[30];
    float rainfall;
    int temperature;
    struct Date *sowDate;
    struct Date *harvestDate;
} c;

int main(void) {
    printf("Enter the number of Cropsn");
    int num;
    scanf("%d", amp;num);

    struct Crop *list = (struct Crop *)malloc(num * sizeof(struct Crop));

    int i, j;
    for (i = 0; i < num; i  ) {
        printf("Enter the details of Crops %dn", i   1);
        printf("Enter namen");
        scanf(" %s", list[i].name);
        printf("Enter rainfalln");
        scanf("%f", amp;list[i].rainfall);
        printf("Enter temperaturen");
        scanf("%d", amp;list[i].temperature);

        list[i].sowDate = (struct Date *)malloc(sizeof(struct Date));
        list[i].harvestDate = (struct Date *)malloc(sizeof(struct Date));
        printf("Enter sowDaten");
        scanf("%d %d %d", amp;list[i].sowDate->dd, amp;list[i].sowDate->mm, amp;list[i].sowDate->yyyy);
        printf("Enter harvestDaten");
        scanf("%d %d %d", amp;list[i].harvestDate->dd, amp;list[i].harvestDate->mm, amp;list[i].harvestDate->yyyy);
    }

    printf("Menun");
    printf("1)Crop that needs the highest rainfalln");
    printf("2)Crop that needs the highest temperaturen");
    printf("3)Display the crop sorted in ascending order of the sowDaten");
    printf("4)Display the crop sorted in ascending order of the harvestDaten");
    printf("Enter your Choicen");
    scanf("%d", amp;j);
    switch (j) {
      case 1:
        for (i = 0; i < num; i  ) {
            if (list[i].rainfall > list[i   1].rainfall)
                printf("Crop that needs the highest rainfall is %sn", list[i].name);
            else 
                printf("Crop that needs the highest rainfall is %sn", list[i   1].name);
            break;
        }
      case 2:
        for (i = 0; i < num; i  ) {
            if (list[i].temperature > list[i   1].temperature)
                printf("Crop that needs highest temperature is %sn", list[i].name);
            else
                printf("Crop that needs highest temperature is %sn", list[i   1].name);
            break;
        }
      case 3:
        for (i = 0; i < num; i  )
            break;
      case 4:
        for (i = 0; i < num; i  )
            break;
      default:
        exit(0);
    }
    return 0;
}
 

Вот взаимодействие с программой:

Введите количество культур
2
Введите сведения об урожаях 1
Введите имя
Рис
Введите количество осадков
15
Введите температуру
23
Введите sowDate
25 7 2016
Введите дату сбора урожая
30 11 2016
Введите сведения об урожаях 2
Введите имя
Пшеница
Введите количество осадков
7
Введите температуру
29
Введите sowDate
24 7 2016
Введите дату сбора урожая
31 11 2016
Меню
1) Урожай, требующий наибольшего количества осадков
2) Обрезка, для которой требуется самая высокая температура
3) Отобразить обрезку, отсортированную в порядке возрастания sowDate
4) Отображение урожая, отсортированного в порядке возрастания даты сбора урожая
Введите свой выбор
1
Урожай, для которого требуется наибольшее количество осадков, - это рис
Меню
1) Урожай, требующий наибольшего количества осадков
2) Обрезка, для которой требуется самая высокая температура
3) Отобразить обрезку, отсортированную в порядке возрастания sowDate
4) Отображение урожая, отсортированного в порядке возрастания даты сбора урожая
Введите свой выбор
2
Урожай, для которого требуется самая высокая температура, - это пшеница
Меню
1) Урожай, требующий наибольшего количества осадков
2) Обрезка, для которой требуется самая высокая температура
3) Отобразить обрезку, отсортированную в порядке возрастания sowDate
4) Отображение урожая, отсортированного в порядке возрастания даты сбора урожая
Введите свой выбор
3 
Пшеница
7.00
29
24 7 2016
31 11 2016
Рис
15.00
23
25 7 2016
30 11 2016
Меню
1) Урожай, требующий наибольшего количества осадков
2) Обрезка, для которой требуется самая высокая температура
3) Отобразить обрезку, отсортированную в порядке возрастания sowDate
4) Отображение урожая, отсортированного в порядке возрастания даты сбора урожая
Введите свой выбор
4
Рис
15.00
23
25 7 2016
30 11 2016
Пшеница
7.00
29
24 7 2016
31 11 2016
Меню
1) Урожай, требующий наибольшего количества осадков
2) Обрезка, для которой требуется самая высокая температура
3) Отобразить обрезку, отсортированную в порядке возрастания sowDate
4) Отображение урожая, отсортированного в порядке возрастания даты сбора урожая
Введите свой выбор
5
ВЫХОД

Комментарии:

1. 1) Сравните части года; если они разные, даты разные. 2) сравните месяцы, например. 3) сравните дни, например. 4) они равны.

Ответ №1:

Это домашнее задание, поэтому я не буду давать полных решений, но я дам «пункты для рассмотрения».

         case 1 :
          for(i=0;i<num;i  )
          {
              if(list[i].rainfall>list[i 1].rainfall)  // (1)
                  printf("Crop that needs the highest rainfall is %sn",list[i].name);
              else 
                  printf("Crop that needs the highest rainfall is %sn",list[i 1].name);
              break; // (2)
          }  // (3)
 

(1): вы уверены, что если это правда, вы нашли наивысший?

(2): вы уверены, что теперь хотите разорвать for цикл?

(3): это конец case 1: . Каким будет следующий оператор, который будет выполнен?

Примечание: каким будет максимальное значение i 1 ? Существует ли этот элемент?


Те же замечания для case 2:


case 3: Отображение урожая, отсортированного в порядке возрастания sowDate

Это означает, что вы должны сортировать list . Кроме того, имя должно быть чем-то вроде cropArray , потому что это не список.

Поиск «быстрая сортировка человека». Это дает вам функцию сортировки, доступную во многих библиотеках языка Си. Вы должны написать функцию сравнения, которая сравнивает две даты посева.


case 4: ну, теперь это будет легко. Просто напишите другую функцию сравнения для быстрой сортировки.