Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
01.10.2019
Размер:
144.87 Кб
Скачать

Лабораторная работа №10

РАБОТА СО СТРУКТУРАМИ

Студент гр. ИКПИ-81

Коваленко Л. А.

А. Постановка задачи

В настоящей лабораторной необходимо сформировать массив структур. Структуры содержат сведения о запасах некоторых товаров. Каждая структура должна содержать следующие поля: наименование товара, норматив на величину запаса (целое число в диапазоне до 5000), единица измерения (тонна, центнер, литр, упаковка и др.), текущее значение запаса. Вывести на экран сведения о товарах, запасы которых меньше норматива.

Структуры вводятся с клавиатуры. Необходимо выполнить обработку сформированного массива структур и результаты обработки вывести на экран дисплея. В программе следует в максимальной степени использовать функции. Например, функции должны использоваться для ввода структур, обработки сформированного массива структур и вывода результатов обработки.

Лабораторная работа выполняется в виде проекта, состоящего из двух файлов: один содержит функции для работы со структурами, второй содержит функцию main(), в которой происходит обращение к функциям из первого файла.

Б. Разработка алгоритма

Алгоритм решения задачи следующий:

  1. Ввод n (количества элементов в массиве структуры).

  2. Создание двух динамических массивов структур (первый — для ввода, второй — для записи результата).

  3. Ввод первого динамического массива структур (функция ввода).

  4. Обработка первого динамического массива структур с записью во второй динамический массив структур (функция обработки).

  5. Вывод второго (обработанного) массива структур (функция вывода).

Входные данные состоят из величины 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);

}

}

Ж. Выводы

Тот факт, что результаты контрольных расчетов, выполненных вручную, достаточно совпадают с результатами контрольных расчетов, выполненных на ЭВМ, свидетельствуют о том, что программа составлена правильно.

Соседние файлы в папке Примеры отчетов