Компилятор уведомляет об ошибках типа выражение слева от ".х" должно представлять класс, структуру или объединение - C (СИ)
Формулировка задачи:
Компилятор уведомляет об ошибках типа выражение слева от ".х" должно представлять класс, структуру или объединение. Покажите пожалуйста в коде как правильно использовать указатели в моем случае. И , если можно, то расскажите причину моей ошибки.
Header.h
main()
#include <stdio.h> #include <iostream> #include <string.h> #include <windows.h> #include <conio.h> struct infor_zoo { char name[80]; //Имя. bool pol; //Пол. char date_of_birth[20]; //Дата рождения. float kaloriynost; //Необходимая калорийность ежедневного рациона. bool content_in_winter; //Логический признак - требуется ли содержание в теплом помещении в зимнее время года. }; void read_struct(struct infor_zoo **x, int *number_of_animals); // Для считывания структуры. int menu(); //Для показа меню. void my_gets(char* x); //Функция для очистки буфера. int search(struct infor_zoo **x, int number_of_animals);//Для поиска подходящих к условию животных. void bubbleSort(float* arr, int size); //Для сортировки поля float kaloriynost;
#include "header.h" int main() { SetConsoleOutputCP(1251); struct infor_zoo *animal; //Для хранения информации о животных. int number_of_animals=0; // Для определения количества животных. int result_menu = menu(); //Для хранения результата функции menu(). bool flag = false; do { if (result_menu == 2) result_menu = menu(); else flag = true; }while(!flag); do { if (result_menu == 1) { read_struct(&animal,&number_of_animals); system("pause"); system("cls"); result_menu = menu(); } if (result_menu == 2) { search(&animal,number_of_animals); system("pause"); system("cls"); result_menu = menu(); } }while(result_menu !=3); system("pause"); return 0 ; } void read_struct(struct infor_zoo **x, int *number_of_animals) { printf("Введите количество животных : "); scanf("%i",number_of_animals); *x= (infor_zoo*) malloc (*number_of_animals * sizeof(infor_zoo)); for (int i = 0; i < *number_of_animals;i++) { printf("Введите данные о %i животном: \n",i+1); printf("Введите имя: "); my_gets(x[i].name); int b; printf("Введите пол(1-мужской,0-женский): "); scanf("%i",&b); x[i].pol = (b == 1); printf("Введите дату рождения ДД.ММ.ГГ: "); my_gets(*x[i].date_of_birth); printf("Введите необходимую калорийность: "); scanf("%f",*x[i].kaloriynost); int q; printf("Требуется ли содержание в теплом помещении?(1-да,0-нет): "); scanf("%i",&q); *x[i].content_in_winter = (q == 1); } } int menu() { int q; do { printf("Ввод: 1.\n"); printf("Поиск: 2.\n"); printf("Выход: 3.\n"); scanf("%i",&q); system("cls"); if ((q == 1) || (q == 2) || (q == 3)) return q; }while((q!=1) && (q!=2) && (q!=3)); } void my_gets(char* x) { fflush(stdin); gets(x); } int search(struct infor_zoo **k, int number_of_animals) { int m=0; // Для определения того,что искать. do { printf("1-Самое молодое животное.\n"); printf("2-Трех животных с найменьшей необходимой калорийностью требующих переселения.\n"); printf("Что будем искать?: "); scanf("%i",&m); system("cls"); }while((m!=1) && ( m!=2)); if (m == 1) {return 0;/*Поиск самого младшего.*/} else { if(number_of_animals >= 3) { int j=0; bool s=0; int b=0; do { printf("Введите пол(1-мужской,0-женский): "); scanf("%i",&b); s = (b == 1); }while((b != 1) && (b != 0)); for (int i=0;i<number_of_animals;i++) { if (s == *k[i].pol) j++; } if (j <= number_of_animals) { float *animal_kaloriynost = (float*) malloc (j * sizeof(float)); for (int i=1;i<=j;i++) { animal_kaloriynost[i] = *k[i].kaloriynost; } bubbleSort(animal_kaloriynost,j); for (int i=0;1<3;i++) { printf("Животное №%i : %f\n",i,animal_kaloriynost[i]); } system("pause"); return 0; free(animal_kaloriynost); } else { system("pause"); return 0; } } else { printf("Животных меньше чем требуется найти по условию!\n"); return 0; } } } void bubbleSort(float* arr, int size) { int tmp, i, j; for(i = 0; i < size - 1; ++i) { for(j = 0; j < size - 1; ++j) { if (arr[j + 1] < arr[j]) { tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; } } } }
Решение задачи: «Компилятор уведомляет об ошибках типа выражение слева от ".х" должно представлять класс, структуру или объединение»
textual
Листинг программы
#include "header.h" int main() { SetConsoleOutputCP(1251); struct infor_zoo *animal; //Для хранения информации о животных. int number_of_animals=0; // Для определения количества животных. int result_menu = menu(); //Для хранения результата функции menu(). bool flag = false; do { if (result_menu == 2) result_menu = menu(); else flag = true; }while(!flag); do { if (result_menu == 1) { read_struct(&animal,&number_of_animals); system("pause"); system("cls"); result_menu = menu(); } if (result_menu == 2) { search(&animal,number_of_animals); system("pause"); system("cls"); result_menu = menu(); } }while(result_menu !=3); system("pause"); return 0 ; } void read_struct(struct infor_zoo **x, int *number_of_animals) { printf("Введите количество животных : "); scanf("%i",number_of_animals); *x= (infor_zoo*) malloc (*number_of_animals * sizeof(infor_zoo)); for (int i = 0; i < *number_of_animals;i++) { printf("Введите данные о %i животном: \n",i+1); printf("Введите имя: "); my_gets((*x[i]).name); int b; printf("Введите пол(1-мужской,0-женский): "); scanf("%i",&b); (*x[i]).pol = (b == 1); printf("Введите дату рождения ДД.ММ.ГГ: "); my_gets((*x[i]).date_of_birth); printf("Введите необходимую калорийность: "); scanf("%f",(*x[i]).kaloriynost); int q; printf("Требуется ли содержание в теплом помещении?(1-да,0-нет): "); scanf("%i",&q); (*x[i]).content_in_winter = (q == 1); } } int menu() { int q; do { printf("Ввод: 1.\n"); printf("Поиск: 2.\n"); printf("Выход: 3.\n"); scanf("%i",&q); system("cls"); if ((q == 1) || (q == 2) || (q == 3)) return q; }while((q!=1) && (q!=2) && (q!=3)); } void my_gets(char* x) { fflush(stdin); gets(x); } int search(struct infor_zoo **k, int number_of_animals) { int m=0; // Для определения того,что искать. do { printf("1-Самое молодое животное.\n"); printf("2-Трех животных с найменьшей необходимой калорийностью требующих переселения.\n"); printf("Что будем искать?: "); scanf("%i",&m); system("cls"); }while((m!=1) && ( m!=2)); if (m == 1) {return 0;/*Поиск самого младшего.*/} else { if(number_of_animals >= 3) { int j=0; bool s=0; int b=0; do { printf("Введите пол(1-мужской,0-женский): "); scanf("%i",&b); s = (b == 1); }while((b != 1) && (b != 0)); for (int i=0;i<number_of_animals;i++) { if (s == (*k[i]).pol) j++; } if (j <= number_of_animals) { float *animal_kaloriynost = (float*) malloc (j * sizeof(float)); for (int i=1;i<=j;i++) { animal_kaloriynost[i] = (*k[i]).kaloriynost; } bubbleSort(animal_kaloriynost,j); for (int i=0;1<3;i++) { printf("Животное №%i : %f\n",i,animal_kaloriynost[i]); } system("pause"); return 0; free(animal_kaloriynost); } else { system("pause"); return 0; } } else { printf("Животных меньше чем требуется найти по условию!\n"); return 0; } } } void bubbleSort(float* arr, int size) { int tmp, i, j; for(i = 0; i < size - 1; ++i) { for(j = 0; j < size - 1; ++j) { if (arr[j + 1] < arr[j]) { tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; } } } }
Объяснение кода листинга программы
В данном коде выполняется ввод данных о животных и последующий поиск определенных животных в структуре данных.
- Структура
infor_zoo
содержит поля:name
- имя животного (тип данных - строка)pol
- пол животного (тип данных - логическое значение)date_of_birth
- дата рождения животного (тип данных - строка)kaloriynost
- необходимая калорийность для животного (тип данных - число с плавающей точкой)content_in_winter
- требуется ли содержание животного в теплом помещении (тип данных - логическое значение)
- В функции
read_struct
происходит чтение данных о животных из стандартного ввода. После ввода количества животных, для каждого животного запрашиваются и сохраняются данные, указанные выше. - В функции
menu
пользователю предлагается выбрать действие из списка:- 1 - Ввод данных о животных
- 2 - Поиск определенных животных
- 3 - Выход из программы
- В функции
my_gets
выполняется очистка буфера ввода, чтобы избежать утечек памяти. - В функции
search
пользователю предлагается выбрать тип поиска:- 1 - Поиск самого молодого животного
- 2 - Поиск трех животных с наименьшей необходимой калорийностью, требующих переселения
- Если выбрано первое действие, то происходит поиск самого молодого животного в структуре данных.
- Если выбрано второе действие, то происходит поиск трех животных с наименьшей необходимой калорийностью, требующих переселения. Для этого сначала определяется пол животных, затем сортируются по необходимому количеству калорий и выводятся на экран.
- В функции
bubbleSort
выполняется сортировка массива по возрастанию. - В функции
main
происходит инициализация переменных и основного цикла программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д