Компилятор уведомляет об ошибках типа выражение слева от ".х" должно представлять класс, структуру или объединение - 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происходит инициализация переменных и основного цикла программы.