Язык Си. Лабораторные работы / Примеры отчетов / Lab10
.docx
Лабораторная работа №10
РАБОТА СО СТРУКТУРАМИ
Студент гр. ИКПИ-81
Коваленко Л. А.
А. Постановка задачи
В настоящей лабораторной необходимо сформировать массив структур. Структуры содержат сведения о запасах некоторых товаров. Каждая структура должна содержать следующие поля: наименование товара, норматив на величину запаса (целое число в диапазоне до 5000), единица измерения (тонна, центнер, литр, упаковка и др.), текущее значение запаса. Вывести на экран сведения о товарах, запасы которых меньше норматива.
Структуры вводятся с клавиатуры. Необходимо выполнить обработку сформированного массива структур и результаты обработки вывести на экран дисплея. В программе следует в максимальной степени использовать функции. Например, функции должны использоваться для ввода структур, обработки сформированного массива структур и вывода результатов обработки.
Лабораторная работа выполняется в виде проекта, состоящего из двух файлов: один содержит функции для работы со структурами, второй содержит функцию main(), в которой происходит обращение к функциям из первого файла.
Б. Разработка алгоритма
Алгоритм решения задачи следующий:
-
Ввод n (количества элементов в массиве структуры).
-
Создание двух динамических массивов структур (первый — для ввода, второй — для записи результата).
-
Ввод первого динамического массива структур (функция ввода).
-
Обработка первого динамического массива структур с записью во второй динамический массив структур (функция обработки).
-
Вывод второго (обработанного) массива структур (функция вывода).
Входные данные состоят из величины n (количество элементов) и n элементов структуры. Значение n вводится в основной части программы. Выходные данные состоят из обработанных элементов массива структуры.
В. Таблица идентификаторов
N |
Обозначение в задаче |
Идентификатор |
Назначение |
1 |
– |
n |
Входные данные |
2 |
Массив структур |
Arr |
Входные данные |
3 |
Массив структур |
Brr |
Выходные данные |
4 |
Структура |
Struct Product |
Структура |
5 |
Наименование товара |
Name |
Части структуры |
6 |
Норматив на величину запаса |
Standart |
|
7 |
Единица измерения |
UnitType |
|
8 |
Текущее значение запаса |
Current |
|
9 |
Функция ввода массива структур |
IProduct(*a, n) |
Функция ввода массива структур |
10 |
Функция обработки массива структур |
DoProduct(*a, *b, n) |
Функция обработки массива структур |
11 |
Функция вывода массива структур |
OProduct(*a, n) |
Функция вывода массива структур |
12 |
– |
i |
Промежуточные данные |
13 |
– |
k |
0
Начало
Ввод
n 1
2
3
4
Останов 5
Вывод
a[i].Name Ввод
a[i].Current Конец Ввод
a[i].Name 6 1 0 2 Ввод
a[i].Standart Ввод
a[i].UnitType 3 4 5 Вывод
a[i].Current Вывод
a[i].Standart 5 Вывод
a[i].UnitType 3 4
a[i].Current<a[i].Standart Нет strcpy(b[k].Name,a[i].Name) b[k].Standart=a[i].Standart strcpy(b[k].UnitType,a[i].UnitType) b[k].Current=a[i].Current k=k+1 2 3 4 5 6 7
Д. Контрольный расчет
Контрольный набор с , .
Под столбцом "Вывод" указывается, будут ли выведены товары или нет.
"Да" — подразумевает, что товар выведется и что набор данных товара выведется правильно, то есть в соответствии с введенными ранее данными.
"Нет" — означает, что товар не выведется (по результатам вычислений).
Назначение набора данных |
Набор данных |
Вывод |
||||||
n |
Name |
Standart |
UnitType |
Current |
Ручные |
Машинные |
||
Контрольный набор |
1 |
хлеб |
500 |
центнер |
400 |
Да |
Да |
|
2 |
сок |
300 |
упаковка |
600 |
Нет |
Нет |
||
бетон |
1000 |
тонна |
1000 |
Нет |
Нет |
Е. Программа на языке Си
/* Файл Lab10.c */
// Стандарт языка СИ: "ISO C99"
// Компилятор: "TDM-GCC (MinGW) 4.9.2"
// ДЛЯ РАБОТЫ С РУССКИМ ЯЗЫКОМ ШРИФТ КОНСОЛИ — Lucida Console
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "StructProduct.h"
/*
Лабораторная работа 10
РАБОТА СО СТРУКТУРАМИ
Студент гр. ИКПИ-81
Коваленко Л. А.
*/
int main()
{
SetConsoleCP(1251); // русский язык в консоли
SetConsoleOutputCP(1251); // русский язык в консоли
// Объявление переменной n (количество товаров)
int n;
// Объявление указателя на массив структур Product
struct Product *Arr;
struct Product *Brr;
// Ввод количества товаров
printf("Введите количество товаров: ");
scanf("%d", &n);
// Выделение памяти
Arr = (struct Product *)malloc(sizeof(struct Product)*n);
Brr = (struct Product *)malloc(sizeof(struct Product)*n);
// Функция ввода элементов массива структуры
IProduct(Arr, n);
// Обнуление массива структур Brr
memset(Brr, 0, sizeof(struct Product));
// Функция обработки
DoProduct(Arr, Brr, n);
// Функция вывода элементов массива структуры
OProduct(Brr, n);
// Освобождение указателя
free(Arr);
Arr = NULL;
return 0;
}
/* Файл StructProduct.h */
#include <string.h>
/// Структура Product
struct Product {
char Name[256]; // Наименование товара
unsigned short Standart; // Норматив на величину запаса
char UnitType[32]; // Единица измерения
unsigned short Current; // Текущее значение запаса
};
/// Функция ввода массива структуры A размера N
void IProduct(struct Product *a, int n) {
int i;
printf("\n");
for(i = 0; i < n; i++) {
printf("==========ВВОД ТОВАРА №%d==========\n", i+1);
printf("Введите наименование товара: ");
fgets(a[i].Name, 256, stdin);
scanf("%[^\n]%*c", &a[i].Name);
printf("Введите норматив на величину запаса: ");
scanf("%d", &a[i].Standart);
printf("Введите единицу измерения (тонна, центнер, литр, упаковка и др.): ");
fgets(a[i].UnitType, 32, stdin);
scanf("%[^\n]%*c", &a[i].UnitType);
printf("Введите текущее значение запаса: ");
scanf("%d", &a[i].Current);
}
}
/// Функция обработки массива структур
/// Первый арг. - исходная структура
/// Второй арг. - структура для записи результата
/// n - количество элементов в массиве структур
/// Функция возвращает индекс последнего элемента массива обработ. структуры b
int DoProduct(const struct Product *a, struct Product *b, int n) {
int i, k = 0;
for (i = 0; i < n; i++) {
if (a[i].Current < a[i].Standart) {
strcpy(b[k].Name, a[i].Name);
b[k].Standart = a[i].Standart;
strcpy(b[k].UnitType, a[i].UnitType);
b[k++].Current = a[i].Current;
}
}
return (k-1);
}
/// Функция вывода массива структуры A размера N
void OProduct(struct Product *a, int n) {
int i;
for(i = 0; i < n; i++)
if ((a[i].Standart + a[i].Current) != 0) {
printf("==========РЕЗУЛЬТАТ №%d==========\n", i+1);
printf("Наименование: %s\n", a[i].Name);
printf("Норматив на величину запаса: %d\n", a[i].Standart);
printf("Единица измерения: %s\n", a[i].UnitType);
printf("Текущее значение запаса: %d\n", a[i].Current);
}
}
Ж. Выводы
Тот факт, что результаты контрольных расчетов, выполненных вручную, достаточно совпадают с результатами контрольных расчетов, выполненных на ЭВМ, свидетельствуют о том, что программа составлена правильно.