Напишите структуру - C (СИ)
Формулировка задачи:
Напишите программу «Речные рыбы». Информация о рыбах должна содержаться в записях со следующими полями: название, средний размер, средний вес, средняя продолжительность жизни. Разработать различные виды запросов информации из базы данных программы, например выдать список рыб в алфавитном порядке, заданных размеров и т. д.
Решение задачи: «Напишите структуру»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#define MAX_NAME 24
#define SIZE 10
struct animal{
char name[MAX_NAME];// Название
double size; // Средний размер (м.)
double weight; // Средний вес (кг.)
int year; // Продолжительность жизни (лет)
}fish[SIZE],fishAlf[SIZE];//fishAlf - рыбы по алфавиту
int inScan(void)
{
FILE *base = fopen("base.txt","r");// Указатель на файл; r - чтение из файла
if(!base) return printf("Файл не найден!");
else{
size_t i;
for( i = 0; i < SIZE; i++){// Заполнение структуры из файла
fscanf(base, "%s", &fish[i].name);
fscanf(base, "%lf", &fish[i].size);
fscanf(base, "%lf", &fish[i].weight);
fscanf(base, "%d", &fish[i].year);
fishAlf[i] = fish[i];
}
fclose(base);
for( i = 0; i < SIZE; i++){// Размещение стркутры в алфавитном порядке
size_t j;
for( j = i+1; j < SIZE; j++){
if(strcmp(fishAlf[i].name, fishAlf[j].name)>0){
struct animal tmp = fishAlf[i];
fishAlf[i] = fishAlf[j];
fishAlf[j] = tmp;
}
}
}
}
}
int outPrint(int alf, double size, double weight, int year)
{
struct animal *p_fish;
if(alf) p_fish = fishAlf;// Если выбрали в алфавитном порядке
else p_fish = fish; // Если выбрали не в алфавитном порядке
size_t i;
for( i = 0; i < SIZE; i++){
if(p_fish[i].size >= size){
if(p_fish[i].weight >= weight){
if(p_fish[i].year >= year){
printf("\nНазвание: %s\n", p_fish[i].name);
printf("Размер: %.2lf м.\n", p_fish[i].size);
printf("Вес: %.3lf кг.\n", p_fish[i].weight);
printf("Продолжительность жизни: %d лет\n", p_fish[i].year);
}
}
}
}
}
int findAnimal(void)
{
printf("Параметры для вывода списка рыб:");
printf("Вывод по алфавиту (0 - нет, 1 - да): ");
int alf = EOF;
while(alf < 0 || alf > 1){
scanf("%d", &alf);
if(alf < 0 || alf > 1) printf("Неверно! Вывод по алфавиту ( 0 - нет, 1 - да): ");
}
printf("Размеры рыбы от N м.: ");
double size;
scanf("%lf", &size);
printf("Вес рыбы от N кг.: ");
double weight;
scanf("%lf", &weight);
printf("Продолжительность жизни от N лет: ");
int year;
scanf("%d", &year);
return outPrint(alf, size, weight, year);
}
int main(void)
{
setlocale(LC_ALL, "Rus");
printf("~ ПРОГРАММА 'РЕЧНЫЕ РЫБЫ' ~\n\n");
inScan();
findAnimal();
return 0;
}
Объяснение кода листинга программы
- Объединение
#include <stdio.h>,#include <stdlib.h>,#include <locale.h>,#include <string.h>в начале кода предоставляет функции для работы с файлами, математическими операциями, строками и вводом-выводом данных. - Переменная
MAX_NAMEопределяет максимально возможное количество символов в названии рыбы (24 символа). - Переменная
SIZEопределяет количество рыб в базе данных (10 рыб). - Структура
animalсодержит поляname(название рыбы, макс. 24 символа),size(средний размер рыбы, double),weight(средний вес рыбы, double) иyear(продолжительность жизни рыбы, int). - Массив
fishиfishAlfсодержат информацию о рыбах. ЗначенияfishAlfиfishидентичны, ноfishAlfотсортирован в алфавитном порядке. - Функция
inScanсчитывает данные из файлаbase.txtи заполняет структуруanimal(переменныеfishиfishAlf). - Функция
outPrintвыводит информацию о рыбах, соответствующих заданным параметрам (алфавитный порядок, размер, вес, продолжительность жизни). - Функция
findAnimalзапрашивает у пользователя параметры для вывода списка рыб и вызывает функциюoutPrint. - В функции
mainпрограмма инициализируется, считывается информация из файлаbase.txtв структурыfishиfishAlf(вызывается функцияinScan) и выполняется поиск рыбы по заданным параметрам (вызывается функцияfindAnimal). - Программа завершается, когда пользователь возвращает
0(ноль) в качестве значения.