Вы находитесь на странице: 1из 55

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ МОЛДОВЫ

Программирование
(Информатика)

Методические указания к
выполнению лабораторных и
контрольных работ для студентов
факультета «CIM» дневной и
заочной форм обучения

Кишинев 2003
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ МОЛДОВЫ

Факультет информатики, вычислительной техники и


микроэлектроники

Кафедра Информатики и прикладных иностранных


языков

Программирование
(Информатика)

Методические указания к
выполнению лабораторных и
контрольных работ для студентов
факультета «CIM» дневной и
заочной форм обучения

Кишинев 2003
Методические указания содержат индивидуальные задания
и примеры их выполнения на языке Си.
Методические указания предназначены для студентов всех
специальностей факультета „CIM”, а также для всех желающих
изучить язык программирования Си.

Авторы: Ливиу Карча


Людмила Лукьянова
Элеонора Тутунару
Николая Фалько

Ответственный редактор: профессор, доктор хабилитат


Попеску А.Н.

Рецензент: конференциар, доктор Морару В.А.

Кишинев 2003
Лабораторная работа №1

ЦИКЛИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ

Пример задания: Вычислить и вывести на экран значения


функции F на интервале от Xнач. До
Хкон. с шагом dX.

 2
ax  b при x < 0 и b  0

x  a
F  при x > 0 и b = 0
x c
x
c
 в остальных случаях

где a, b, c – действительные числа


Функция F должна принимать действительное
значение, если выражение (Ац ИЛИ Вц) И (Ац ИЛИ
Сц) не равно нулю, и целое значение в противном
случае. Через Ац, Вц и Сц обозначены целые части
значений a, b, c, операции И и ИЛИ – поразрядные.
Значения a, b, c, Хнач., Хкон., dX ввести с
клавиатуры.

Пример решения задачи:


/*
Подключние рабочих библиотек
<stdio.h> - библиотека ввода/вывода
<math.h> - содержит функции floor() и pow()
• double floor(double x) - возвращает
вещественное значение представляющее
наибольшее целое не превышающее данное.
• double pow(double x, double y) - возводит
значение x в степень y.
*/

#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[])
{
/* Объявление переменных действительного типа */
float a, b, c;
float StartX, EndX, dX;
float F;

/* Запрашиваем ввод данных с клавиатуры, выводя на


экран соответствующие подсказки */
printf("Введите:");
printf("\ta = "); scanf("%f", &a);
printf("\tb = "); scanf("%f", &b);
printf("\tc = "); scanf("%f", &c);
printf("\tX нач. = "); scanf("%f", &StartX);
printf("\tX кон. = "); scanf("%f", &EndX);
printf("\tdX = "); scanf("%f", &dX);

/* Выполняем цикл от начального значения Х до


конечного значения Х с шагом dX */
for (float x = StartX; x <= EndX; x += dX)
{
/* Вычисляем значение функции F, исходя из
заданных условий */
if (x < 0 && b != 0)
F = a * (float)pow(x, 2) + b;
else if (x > 0 && b == 0)
F = (x - a) / (x - c);
else
F = x / c;

/* Проверяем заданное условие ((Ац ИЛИ Вц) И (Ац


ИЛИ Сц)) и в случае его ложности значение
функции F принимает целое значение.
Преобразуем все значение к типу <long> для
выполнения побитовых операций И и ИЛИ */

if (!(((long)floor(a) | (long)floor(b)) &


((long)floor(a) | (long)floor(c))))
/* Выводим округленное (целое) значение */
printf("x = %.2f\tF = %.0f\n", x, F);
else
/* Выводим вещественное значение */
printf("x = %.2f\tF = %.2f\n", x, F);
}

3
return 0; /* Успешное завершение программы */
}

Результат выполнения программы:


Введите: a = 3.5
b = 8
c = 293
X нач. = -4
X кон. = 2.5
dX = 0.5
x = -4.00 F = 64.00
x = -3.50 F = 50.88
x = -3.00 F = 39.50
x = -2.50 F = 29.88
x = -2.00 F = 22.00
x = -1.50 F = 15.88
x = -1.00 F = 11.50
x = -0.50 F = 8.88
x = 0.00 F = 0.00
x = 0.50 F = 0.00
x = 1.00 F = 0.00
x = 1.50 F = 0.01
x = 2.00 F = 0.01
x = 2.50 F = 0.01

Индивидуальные задания:
Вариант 1
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dX.




ax2 + b

при х < 0 и b = 0



x a
F= x c при х > 0 и b = 0
x
c в остальных случаях
где а, b, с - действительные числа.

4
Функция F должна принимать действительное значение,
если выражение (Ац ИЛИ Вц) И (Ац ИЛИ Сц) не равно
нулю, и целое значение в противном случае. Через Ац, Вц
и Сц обозначены целые части значений а, b, с, операции И
и ИЛИ - поразрядные. Значения а, b, с, Хнач., Хкон., dХ
ввести с клавиатуры.

Вариант 2
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dX.

1




 b при х + 5 < 0 и с = 0



ax
x a
F= при х + 5 > 0 и с  0
x
10 x
в остальных случаях
c 4
где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение (Ац И Вц) ИЛИ (Вц И Сц) не равно нулю, и
целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений я, Ь, с, операции И и ИЛИ -
поразрядные. Значения а, Ь, с, Хнач., Хкон., dХ ввести с
клавиатуры.

Вариант 3
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dХ.




ax2 + bx + c при a < 0 и c  0





 a
F= при a > 0 и b = 0
x c
a(x + c) в остальных случаях

5
где a,b,c - дствительные числа.

Функция Р должна принимать действительное значение, если


выражение АцИ( ВцИЛ ИСц) не равно нулю, и целое
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операции И и ИЛИ -
поразрядные. Значения a, b, с, Хнач., Хкон., dХ ввести с
клавиатуры.

Вариант 4
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dХ.

ax - c при c < 0 и x  0







x a
F= при c > 0 и x = 0
 c
bx
в остальных случаях
c a

где а,b, с - действительные числа.

Функция F должна принимать действительное значение,


если выражение Ац ИЛИ Вц ИЛИ Сц не равно нулю, и целое
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операция ИЛИ - поразрядная.
Значения a, b, с, Хнач., Хкон., dХ ввести с клавиатуры.

Вариант 5
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dХ.

6
x




a- при х < 0 и b  0



10  b
x a
F= при х > 0 и b = 0
x c
2
3x + в остальных случаях
c

где а, b, с - действительные числа.

Функция F должна принимать действительное значение,


если выражение (Ац ИЛИ Вц) И Сц не равно нулю, и целое
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операции И и ИЛИ -
поразрядные. Значения а, b, с, Хнач., Хкон., dХ ввести с
клавиатуры.

Вариант 6
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dX.

ax2 + b2x + c при c < 0 и b  0






xa
F= при c > 0 и b = 0
xc
x
в остальных случаях
c
где а, b, с - действительные числа.

Функция F должна принимать действительное значение,


если выражение (Ац И Вц) ИЛИ (Ац И Сц) не равно нулю,
и целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений а, b, с, операции И и ИЛИ
- поразрядные. Значения а, b, с, Хнач., Хкон., dX ввести с
клавиатуры.

7
Вариант 7
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dX.

- ax2 - b при х < 5 и с  0


x a
F= при х > 5 и с = 0
x
 x
в остальных случаях
c
где а, b, с - действительные числа

Функция F должна принимать действительное значение, если


выражение (Ац ИЛИ Вц) МОД2 (Ац ИЛИ Си) не равно нулю,
и целое значение в противном случае. Через Ац, Вц и Сц обозна-
чены целые части значений a, b, с, операции И, ИЛИ и МОД2
(сложение по модулю 2) - поразрядные. Значения а, b, с, Хнач.,
Хкон., dX ввести с клавиатуры.

Вариант 8
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dХ.

- ax2 при х < 0 и b  0


a x
F= при х > 0 и b = 0
cx
x
в остальных случаях
c
где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение (Ац МОД2 Вц) И НЕ(Ац ИЛИ Сц) не равно нулю,
и целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений а, b, с, операции И, ИЛИ и
МОД2 (сложение по модулю 2) - поразрядные. Значения а, b, с,
Хнач., Хкон., ёХ ввести с клавиатуры.
Вариант 9
8
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dХ.

ax2 + b2x при a < 0 и x  0


x a
F= x- при a > 0 и x = 0
x c
x
1+ в остальных случаях
c
где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение НЕ(Ац ИЛИ Вц) И (Вц ИЛИ Сц) не равно нулю, и
целое значение в противном случае. Через Ац, Вц и Сц обозна-
чены целые части значений а, b, с, операции НЕ, И и ИЛИ -
поразрядные. Значения а, b, с, Хнач., Хкон., dХ ввести с
клавиатуры.

Вариант 10
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dX.

ax2 – bx + c при х < 3 и b  0


x a
F= при х > 3 и b = 0
x c
x
в остальных случаях
c

где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение НЕ(Ац ИЛИ Вц) И (Ац МОД2 Сц) не равно нулю, и
целое значение в противном случае. Через Ац, Вц и Сц обозна-
чены целые части значений а, b, с, операции НЕ, И, ИЛИ и
МОД2 (сложение по модулю 2) - поразрядные. Значения а, b, с,
Хнач., Хкон., dХ ввести с клавиатуры.

9
Вариант 11
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dХ.

b
ax2 + при х < 1 и c  0
с
x a
F= при х > 1,5 и c = 0
( x  c) 2
x2
в остальных случаях
c2

где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение (Ац И Вц) МОД2 Сц не равно нулю, и целое
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операции И и МОД2 (сложение
по модулю 2) - поразрядные. Значения а, b с, Хнач., Хкон., dX
ввести с клавиатуры.

Вариант 12
Вычислить и вывести на экран в виде таблицы значения функции
F на интервале от Хнач. до Хкон. с шагом dХ.

ax2 + b2 + c при х < 0,6 и b + c  0

x a
F= при х > 0,6 и b + c = 0
x c
x c
+ в остальных случаях
c a

где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение (Ац ИЛИ Вц) И Сц не равно нулю, и целое
10
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операции И и ИЛИ -
поразрядные. Значения а, b, с, Хнач., Хкон., dХ ввести с
клавиатуры.

Вариант 13
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dX.

ax2 + b при x - 1 < 0 и b - x  0


x a
F= при х – 1 > 0 и b+x = 0
x
x
в остальных случаях
c

где a, b, с - действительные числа.

Функция F должна принимать действительное значение,


если выражение (Ац ИЛИ Вц) МОД2 (Вц И Сц) не равно
нулю, и целое значение в противном случае. Через Ац, Вц и
Сц обозначены целые части значений а, Ъ, с, операции И,
ИЛИ и МОД2 (сложение по модулю 2) - поразрядные.
Значения a, b, с, Хнач., Хкон., dХ ввести с клавиатуры.

Вариант 14
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dХ.

11
- ax2 - b при x + c < 0 и a  0
x a
F= при х + c > 0 и a = 0
x с
x с
+ в остальных случаях
c x

где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение -(Ац МОД2 Вц) ИЛИ (Ац МОД2 Сц) не равно
нулю, и целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений а, b, с, операции ИЛИ и
МОД2 (сложение по модулю 2) - поразрядные. Значения а, b, с,
Хнач., Хкон., dХ ввести с клавиатуры.

Вариант 15
Вычислить и вывести на экран в виде таблицы значения функции
F на интервале от Хнач. до Хкон. с шагом dХ.

- ax2 + b при x < 0 и b  0


x
F= + 5,5 при х > 0 и b = 0
x с
x
в остальных случаях
 c

где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение НЕ(Ац ИЛИ Вц ИЛИ Сц) не равно нулю, и целое
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операции НЕ и ИЛИ -
поразрядные. Значения а, b, с, Хнач., Хкон., dХ ввести с
клавиатуры.

12
Вариант 16
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом сЗХ.

a(x + c)2 - b при x < 0 и b  0


x a
F= при х > 0 и b = 0
 с
x
a+ в остальных случаях
c
где а,b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение (Ац МОД2 Вц) И НЕ(Ац ИЛИ Сц) не равно нулю,
и целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений а, b, с, операции НЕ,.И, ИЛИ
и МОД2 (сложение по модулю 2) - поразрядные. Значения а, b,
с, Хнач., Хкон., dX ввести с клавиатуры.

Вариант 17
Вычислить и вывести на экран в виде таблицы значения
функции F на интервалеот Хнач. до Хкон. с шагом dХ.

ax2 – cx + b при x + 10 < 0 и b  0


x a
F= при х + 10 > 0 и b = 0
x с
 x
в остальных случаях
a c

где а, b, с - действительные числа.


Функция F должна принимать действительное значение,
если выражение (Ац ИЛИ Вц) И НЕ(Ац ИЛИ Сц) не
равно нулю, и целое значение в противном случае. Через
Ац, Вц и Сц обозначены целые части значений а, b, с,

13
операции НЕ, И и ИЛИ - поразрядные. Значения a, b, с,
Хнач., Хкон., dX ввести с клавиатуры.

Вариант 18
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dX.

ax3 + bx2 при x < 0 и b  0


x a
F= при х > 0 и b = 0
x с
x 5
в остальных случаях
c( x  10)

где а, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение НЕ ( А цИ Вц И Сц ) не равно нулю, и целое
значение в противном случае. Через Ац, Вц и Сц обозначены
целые части значений а, b, с, операции НЕ и И - поразрядные.
Значения а, b, с, Хнач., Хкон., dХ ввести с клавиатуры.

Вариант 19
Вычислить и вывести на экран в виде таблицы (значения
функции F на интервалеот Хнач. до Хкон. с шагом dX.

a(x + 7)2 - b при x < 5 и b  0


x  сd
F= при х > 5 и b = 0
ax
x
в остальных случаях
c

где а, b, с, d, - действительные числа.

14
Функция F должна принимать действительное значение, если
выражение (Ац МОД2 Вц) ИЛИ (Ац МОД2 Сц) не равно
нулю, и целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений а, b, с, операции ИЛИ и
МОД2 (сложение по модулю 2) - поразрядные. Значения а, b, с,
д., Хнач., Хкон., dХ ввести с клавиатуры.

Вариант 20
Вычислить и вывести на экран в виде таблицы значения
функции F на интервале от Хнач. до Хкон. с шагом dХ.

2x  c
- при x < 0 и b  0
cx  a
x a
F= при х > 0 и b = 0
x c
x  c
- + в остальных случаях
c 2x

где a, b, с - действительные числа.

Функция F должна принимать действительное значение, если


выражение НЕ(Ац ИЛИ Вц) И НЕ(Ац ИЛИ Сц) не равно
нулю, и целое значение в противном случае. Через Ац, Вц и Сц
обозначены целые части значений а, b, с, операции НЕ, И и ИЛИ -
поразрядные. Значения а, b, с, Хнач., Хкон., dХ ввести с
клавиатуры.

15
Лабораторная работа №2

ОДНОМЕРНЫЕ МАССИВЫ

Пример задания: В одномерном массиве, состоящем из п


вещественных элементов, вычислить:
1) сумму отрицательных элементов
массива;
2) произведение элементов массива,
расположенных между максимальным и
минимальным значениями.
Упорядочить элементы массива по возрастанию.

Примечание: Размерности массивов задаются именованными


константами.

Пример решения задачи:


/*
Подключние рабочих библиотек:
<stdio.h> - библиотека ввода/вывода
*/
#include <stdio.h>

int main(int argc, char* argv[])


{
/* Именованная константа, определяющая количество
элементов массива */
const MAX_ELEMENTS = 8;

/* Объявление и инициализация переменных */


float m[MAX_ELEMENTS];
float sum = 0;
float result = 1;
int iMax, iMin;

/* Запрашиваем ввод данных с клавиатуры */


for (int i = 0; i < MAX_ELEMENTS; i++)
{
printf("m[%d] = ", i);
scanf("%f", &m[i]);
}
16
/* Принимаем индексы максимального и минимального
массива равными 0 */
iMin = iMax = 0;
for (i = 0; i < MAX_ELEMENTS; i++)
{
/* Вычисляем сумму отрицательных элементов
массива */
if (m[i] < 0) sum += m[i];

/* Находим индексы максимального и минимального


элементов массива */
if (m[i] > m[iMax]) iMax = i;
if (m[i] < m[iMin]) iMin = i;
}

/* Находим произведение элементов массива,


находящихся между минимальным и максимальными
элементами */
for (i = ((iMax < iMin) ? iMax : iMin);
i <= ((iMax > iMin) ? iMax : iMin);
result *= m[i++]);

/* Выводим на экран результат вычислений */


printf("\nСумма отрицательных элементов = %.2f\n",
sum);
printf("Результат = %.2f\n\n", result);

/* Сортировка элементов массива по возрастанию */


for (i = 0; i < MAX_ELEMENTS; i++)
{
for (int j = i + 1; j < MAX_ELEMENTS; j++)
{
if (m[i] > m[j])
{
result = m[i];
m[i] = m[j];
m[j] = result;
}
}
}

/* Вывод на экран отсортированного по возрастанию


массива */
printf("Отсортированный массив:\n");

17
for (i = 0; i < MAX_ELEMENTS; printf("%.2f ", m[i+
+]));

return 0;
}

Результат выполнения программы:


m[0] = 3
m[1] = 7
m[2] = -4
m[3] = 8
m[4] = -1
m[5] = 9
m[6] = 0
m[7] = 7

Сумма отрицательных элементов = -5.00


Результат = 288.00

Отсортированный массив:
-4.00 -1.00 0.00 3.00 7.00 7.00 8.00 9.00

Индивидуальные задания:
Вариант 1
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) сумму отрицательных элементов массива;
2) произведение элементов массива, расположенных между
максимальным и минимальным элементами.
Упорядочить элементы массива по возрастанию.

Вариант 2
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) сумму положительных элементов массива;
2) произведение элементов массива, расположенных между
максимальным по модулю и минимальным по модулю
элементами.
Упорядочить элементы массива по убыванию.

18
Вариант 3
В одномерном массиве, состоящем из п целых элементов,
вычислить:
1) произведение элементов массива с четными номерами;
2) сумму элементов массива, расположенных между первым и
последним нулевыми элементами.
Преобразовать массив таким образом, чтобы сначала
располагались все положительные элементы, а потом - все
отрицательные (элементы, равные 0, считать положительными).

Вариант 4
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) сумму элементов массива с нечетными номерами;
2) сумму элементов массива, расположенных между первым и
последним отрицательными элементами.
Сжать массив, удалив из него все элементы, модуль которых не
превышает 1. Освободившиеся в конце массива элементы
заполнить нулями.

Вариант 5
В одномерном массиве, состоящем из п вещественных элементов,
вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего
положительного элемента.
Сжать массив, удалив из него все элементы, модуль которых
находится в интервале [а,b]. Освободившиеся в конце массива
элементы заполнить нулями.

Вариант 6
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) минимальный элемент массива;
2) сумму элементов массива, расположенных между первым и
последним положительными элементами.

19
Преобразовать массив таким образом, чтобы сначала
располагались все элементы, равные нулю, а потом - все
остальные.

Вариант 7
В одномерном массиве, состоящем из п целых элементов,
вычислить:
1) номер максимального элемента массива;
1) произведение элементов массива, расположенных между
первым и вторым нулевыми элементами.
Преобразовать массив таким образом, чтобы в первой его
половине располагались элементы, стоявшие в нечетных
позициях, а во второй половине -элементы, стоявшие в четных
позициях.

Вариант 8
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) номер минимального элемента массива;
2) сумму элементов массива, расположенных между первым и
вторым отрицательными элементами.
Преобразовать массив таким образом, чтобы сначала
располагались все элементы, модуль которых не превышает 1, а
потом - все остальные.

Вариант 9
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) максимальный по модулю элемент массива;
2) сумму элементов массива, расположенных между первым и
вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные
нулю, располагались после всех остальных.

Вариант 10
В одномерном массиве, состоящем из п целых элементов,
вычислить:
20
1) минимальный по модулю элемент массива;
2) сумму модулей элементов массива, расположенных после
первого элемента, равного нулю.
Преобразовать массив таким образом, чтобы в первой его
половине располагались элементы, стоявшие в четных
позициях, а во второй половине - элементы, стоявшие в
нечетных позициях.

Вариант 11
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) номер минимального по модулю элемента массива;
2) сумму модулей элементов массива, расположенных после
первого отрицательного элемента.
Сжать массив, удалив из него все элементы, величина которых
находится в интервале [а,b]. Освободившиеся в конце массива
элементы заполнить нулями.

Вариант 12
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) номер максимального по модулю элемента массива;
1) сумму элементов массива, расположенных после первого
положительного элемента.
Преобразовать массив таким образом, чтобы сначала
располагались все элементы, целая часть которых лежит в
интервале [а,b], а потом - все остальные.

Вариант 13
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, лежащих в диапазоне от А до
В;
2) сумму элементов массива, расположенных после
максимального элемента.
Упорядочить элементы массива по убыванию модулей
элементов.
21
Вариант 14
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, равных 0;
2) сумму элементов массива, расположенных после
минимального элемента.
Упорядочить элементы массива по возрастанию модулей
элементов.

Вариант 15
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, больших С;
2) произведение элементов массива, расположенных после
максимального по модулю элемента.
Преобразовать массив таким образом, чтобы сначала
располагались все отрицательные элементы, а потом - все
положительные (элементы, равные 0, считать
положительными).

Вариант 16
В одномерном массиве, состоящем из п вещественных
элементов, вычислить: 1) количество отрицательных
элементов массива;
2) сумму модулей элементов массива, расположенных после
минимального по модулю элемента.
Заменить все отрицательные элементы массива их
квадратами и упорядочить элементы массива по возрастанию.

Вариант 17
В одномерном массиве, состоящем из п целых элементов,
вычислить:
1) количество положительных элементов массива;
2) сумму элементов массива, расположенных после последнего
элемента, равного нулю.

22
Преобразовать массив таким образом, чтобы сначала
располагались все элементы, целая часть которых не
превышает 1, а потом - все остальные.

Вариант 18
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, меньших С;
1) сумму целых частей элементов массива, расположенных после
последнего отрицательного элемента.
Преобразовать массив таким образом, чтобы сначала
располагались все элементы, отличающиеся от максимального
не более чем на 20%, а потом - все остальные.

Вариант 19
В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) произведение отрицательных элементов массива;
2) сумму положительных элементов массива, расположенных до
максимального элемента.
Изменить порядок следования элементов в массиве на
обратный.

Вариант 20
В одномерном массиве, состоящем из и вещественных
элементов, вычислить:
1) произведение положительных элементов массива;
2) сумму элементов массива, расположенных до минимального
элемента.
Упорядочить по возрастанию отдельно элементы, стоящие на
четных местах, и элементы, стоящие на нечетных местах.

23
Лабораторная работа №3

ДВУМЕРНЫЕ МАССИВЫ

Пример задания: Для заданной матрицы размером 8 на 8


найти такие k, что k-я строка матрицы
совпадает с k-м столбцом. Найти сумму
элементов в тех строках, которые
содержат хотя бы один отрицательный
элемент.

Пример решения задачи:


#include <stdio.h>

int main(int argc, char* argv[])


{
/* Объявляем и инициализируем матрицу 8х8 */
int matrix[8][8] = {
{ 2, 7, 2, 7, 1, 4, 0, 3 },
{ 1, 0, 7, 6, 0, -8, 3, 5 },
{ 2, 7, 1, 8, 1, 4, 9, 3 },
{ 9, 2, 8, 5, 2, 0, 0, 6 },
{ 7, 1, 1, 3, 9, 3, 9, 1 },
{ 8, 2, 4, 9, 1, -6, 4, 9 },
{ 0, 3, 9, 0, 9, 4, 8, 8 },
{ 1, 8, 3, 2, 8, 2, 8, 0 }
};
int i, j, iSumm; /* Счетчик и переменная для
хранения суммы */
bool bFlag; /* Флаг */

/*----------------------------------------------*/
/* П Е Р В А Я Ч А С Т Ь З А Д А Н И Я */
/*----------------------------------------------*/
printf("k = ");
for (i = 0; i < 8; i++)
{
/* Присваиваем Флагу исходное значение */
bFlag = true;
for (j = 0; j < 8; j++)
{

24
/* Сравниваем элемент i-й строки j-го
столбца с элементом j-й строки i-го столбца. В
случае их несоответствия присваиваем Флагу
значение Ложь и прерываем цикл по j
конструкцией break */
if (matrix[i][j] != matrix[j][i])
{
bFlag = false;
break;
}
}
/* В случае сохранения флагом исходного значения
выводим на экран номер соответствующей строки */
if (bFlag) printf("%d ", i);
}

/*----------------------------------------------*/
/* В Т О Р А Я Ч А С Т Ь З А Д А Н И Я */
/*----------------------------------------------*/
printf("\n\n");
for (i = 0; i < 8; i++)
{
/* Присваиваем переменным исходные значения */
bFlag = false;
iSumm = 0;
for (j = 0; j < 8; j++)
{
/* При нахождение хотя бы одного
отрицательного элемента присваиваем Флагу
значение Истина, обозначающее необходимость
вывода Суммы на экран */
if (matrix[i][j] < 0) bFlag = true;

/* Суммируем значения элементов i-й строки */


iSumm += matrix[i][j];
}
/* В случае нахождения в строке хотя бы одного
отрицательного элемента выводим на экран сумму
элементов i-й строки */
if (bFlag) printf("Сумма элементов строки #%d =
%d\n", i, iSumm);
}

return 0;
}

25
Результат выполнения программы:
k = 2 6

Сумма элементов строки #1 = 14


Сумма элементов строки #5 = 31

Индивидуальные задания:
Вариант 1
Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, не содержащих ни одного нулевого
элемента;
2) максимальное из чисел, встречающихся в заданной матрице
более одного раза.

Вариант 2
Дана целочисленная прямоугольная матрица. Определить
количество столбцов, не содержащих ни одного нулевого
элемента.
Характеристикой строки целочисленной матрицы назовем
сумму ее положительных четных элементов. Переставляя
строки заданной матрицы, расположить их в соответствии с
ростом характеристик.

Вариант 3
Дана целочисленная прямоугольная матрица. Определить:
1) количество столбцов, содержащих хотя бы один нулевой
элемент;
2) номер строки, в которой находится самая длинная серия
одинаковых элементов.

Вариант 4
Дана целочисленная квадратная матрица. Определить:
1) произведение элементов в тех строках, которые не содержат
отрицательных элементов;
2) максимум среди сумм элементов диагоналей, параллельных
главной диагонали матрицы.

26
Вариант 5
Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех столбцах, которые не содержат
отрицательных элементов;
1) минимум среди сумм модулей элементов диагоналей,
параллельных побочной диагонали матрицы.

Вариант 6
Дана целочисленная прямоугольная матрица. Определить:
1) сумму элементов в тех строках, которые содержат хотя бы
один отрицательный элемент;
1) номера строк и столбцов всех седловых точек матрицы.
ПРИМЕЧАНИЕ:
Матрица А имеет седловую точку А ij, если Aij является
минимальным элементом в i-й строке и максимальным в j-м
столбце.

Вариант 7
Для заданной матрицы размером 8 на 8 найти такие k, что k-я
строка матрицы совпадает с k-м столбцом.
Найти сумму элементов в тех строках, которые содержат хотя
бы один отрицательный элемент.

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

Вариант 9
Соседями элемента Аij в матрице назовем элементы А kl с i-1 
к  i+1, j-1  l  j+1, (k, l) (i,j). Операция сглаживания
матрицы дает новую матрицу того же размера, каждый элемент
которой получается как среднее арифметическое имеющихся
соседей соответствующего элемента исходной матрицы.
27
Построить результат сглаживания заданной вещественной
матрицы размером 10 на 10. В сглаженной матрице найти
сумму модулей элементов, расположенных ниже главной
диагонали.

Вариант 10
Элемент матрицы называется локальным минимумом, если он
строго меньше всех имеющихся у него соседей. Подсчитать
количество локальных минимумов заданной матрицы размером
10 на 10. Найти сумму модулей элементов, расположенных
выше главной диагонали.

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

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

Вариант 13
Осуществить циклический сдвиг элементов прямоугольной
матрицы на п элементов вправо или вниз (в зависимости от
введенного режима). n может быть больше количества
элементов в строке или столбце.

Вариант 14
Осуществить циклический сдвиг элементов квадратной
матрицы размерности МхN вправо на k элементов таким
образом: элементы 1-й строки сдвигаются в последний столбец
сверху вниз, из него - в последнюю строку справа налево, из нее
- в первый столбец снизу вверх, из него - в первую строку; для
остальных элементов - аналогично.
28
Вариант 15
Дана целочисленная прямоугольная матрица. Определить номер
первого из столбцов, содержащих хотя бы один нулевой
элемент.
Характеристикой строки целочисленной матрицы назовем
сумму ее отрицательных четных элементов. Переставляя строки
заданной матрицы, расположить их в соответствии с убыванием
характеристик.

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

Вариант 17
Путем перестановки элементов квадратной вещественной
матрицы добиться того, чтобы ее максимальный элемент
находился в левом верхнем углу, следующий по величине - в
позиции (2,2), следующий по величине - в позиции (3,3) и т. д.,
заполнив таким образом всю главную диагональ.
Найти номер первой из строк, не содержащих ни одного
положительного элемента.

Вариант 18
Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, содержащих хотя бы один нулевой
элемент;
1) номер столбца, в которой находится самая длинная серия
одинаковых элементов.

Вариант 19
Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, которые не содержат
отрицательных элементов;
1) минимум среди сумм элементов диагоналей, параллельных
29
главной диагонали матрицы.

Вариант 20
Дана целочисленная прямоугольная матрица. Определить:
1) количество отрицательных элементов в тех строках, которые
содержат хотя бы один нулевой элемент;
2) номера строк и столбцов всех седловых точек матрицы.
ПРИМЕЧАНИЕ:
Матрица A имеет седловую точку Aij если Аij является
минимальным элементом в i-й строке и максимальным в j-м
столбце.

30
Лабораторная работа №4

СТРУКТУРЫ

Пример задания: 1. Описать структуру с именем


STUDENT, содержащую следующие
поля:
 Name – фамилия;
 Group – номер группы;
 Ses – успеваемость.
2. Написать программу, выполняющую
следующие действия:
 ввод с клавиатуры данных в
массив Stud1, состоящей из 10 структур
типа Student; записи должны быть
упорядочены по возрастанию
содержимого поля Group;
 вывод на экран фамилий и
номеров групп для всех студентов,
включенных в массив, если балл
успеваемости студента больше 4.
 если таких студентов нет, вывести
соответствующее сообщение.

Пример решения задачи:


#include <stdio.h>

struct Student
{
char Name[255]; /* Фамилия студента */
int Group; /* Номер группы */
float Ses; /* Балл успеваемости */
};

int main(int argc, char* argv[])


{
/* Объявление и инициализация переменных и констант */

31
const MAX_STUDENTS = 5; /* Определяет
количество студентов */
Student Stud1[MAX_STUDENTS];
Student stTemp;
bool is = false;

/* Запрашиваем ввод данных с клавиатуры */


for (int i = 0; i < MAX_STUDENTS; i++)
{
printf("Введите запись #%d:\n\tИмя: ", i);
gets(Stud1[i].Name);
printf("\tГруппа: ");
scanf("%d", &Stud1[i].Group);
printf("\tБалл: ");
scanf("%f", &Stud1[i].Ses);
}

/* Сортировка массива структур Student по полю Group


(по возрастанию) */
for (i = 0; i < MAX_STUDENTS; i++)
{
for (int j = i + 1; j < MAX_STUDENTS; j++)
{
if (Stud1[i].Group > Stud1[j].Group)
{
stTemp = Stud1[i];
Stud1[i] = Stud1[j];
Stud1[j] = stTemp;
}
}
}

/* Вывод на экран фамилий студентов и номеров групп,


у которых средний балл больше 4 */
for (i = 0; i < MAX_STUDENTS; i++)
{
if (Stud1[i].Ses > 4)
{
printf("\n%s из группы #%d", Stud1[i].Name,
Stud1[i].Group);

/* При наличие хотя бы одного такого


студента выставляем флаг */
is = true;
}

32
}

/* Если не найдено ни одного студента,


удовлетворяющего условиям отбора выводим
соответствующее сообщение */
if (!is) printf("\nСтуденты с баллом успеваемости >
4 отсутствуют.");

return 0;
}

Результат выполнения программы:


Введите запись #0:
Имя: Golodoniuc Pavel
Группа: 12
Балл: 8.77
Введите запись #1:
Имя: Vasia Pupkin
Группа: 14
Балл: 2.7
Введите запись #2:
Имя: Philip Lykov
Группа: 11
Балл: 6.8
Введите запись #3:
Имя: Alexander Pushkin
Группа: 13
Балл: 3.4
Введите запись #4:
Имя: Stepan Fedorov
Группа: 11
Балл: 4.8

Golodoniuc Pavel из группы #12


Philip Lykov из группы #11
Stepan Fedorov из группы #11

Индивидуальные задания:
Вариант 1
1. Описать структуру с именем STUDENT, содержащую
следующие поля:
 NAME - фамилия и инициалы;
 GROUP - номер группы;

33
 SES - успеваемость (массив из пяти элементов).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив STUD1,
состоящий из десяти структур типа STUDENT; записи
должны быть упорядочены по возрастанию содержимого
поля GROUP;
 вывод на дисплей фамилий и номеров групп для всех
студентов, включенных в массив, если средний балл
студента больше 4,0;
 если таких студентов нет, вывести соответствующее
сообщение.

Вариант 2
1. Описать структуру с именем STUDENT, содержащую
следующие поля:
 NАМЕ - фамилия и инициалы
 GROUP - номер группы;
 SES - успеваемость (массив из пяти элементов).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив STUD1, состоящий
из десяти структур типа STUDENT; записи должны быть
упорядочены по возрастанию среднего балла;
 вывод на дисплей фамилий и номеров групп для всех
студентов, имеющих оценки 4 и 5;
 если таких студентов нет, вывести соответствующее
сообщение.

Вариант 3
1. Описать структуру с именем STUDENT, содержащую
следующие поля:
 NАМЕ - фамилия и инициалы;
 GROUР - номер группы;
 SЕS - успеваемость (массив из пяти элементов).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив STUD1, состоящий
из десяти структур типа STUDENT; записи должны быть
упорядочены по алфавиту;
34
 вывод на дисплей фамилий и номеров групп для всех
студентов, имеющих хотя бы одну оценку 2;
 если таких студентов нет, вывести соответствующее
сообщение.

Вариант 4
1. Описать структуру с именем АЕRОFLОТ, содержащую
следующие поля:
 NAZN - название пункта назначения рейса;
 NUMR - номер рейса;
 ТIР - тип самолета.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив AIRPORT, состоящий
из семи элементов типа АЕRОFLОТ; записи должны быть
упорядочены по возрастанию номера рейса;
 вывод на экран номеров рейсов и типов самолетов,
вылетающих в пункт назначения, название которого совпало
с названием, введенным с клавиатуры;
 если таких рейсов нет, выдать на дисплей
соответствующее сообщение.

Вариант 5
1. Описать структуру с именем АЕRОLOT, содержащую
следующие поля:
 NAZN - название пункта назначения рейса;
 NUMR - номер рейса;
 ТIР - тип самолета.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив АIРОRТ, состоящий
из семи элементов типа АЕRОFLОТ; записи должны быть
размещены в алфавитном порядке по названиям пунктов
назначения;
 вывод на экран пунктов назначения и номеров рейсов,
обслуживаемых самолетом, тип которого введен с
клавиатуры;
 если таких рейсов нет, выдать на дисплей
соответствующее сообщение.
35
Вариант 6
1. Описать структуру с именем WORKER, содержащую
следующие поля:
 NАМЕ - фамилия и инициалы работника;
 РОS - название занимаемой должности;
 YЕАR - год поступления на работу.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив ТАВL, состоящий из
десяти структур типа WORKER; записи должны быть
размещены по алфавиту.
 вывод на дисплей фамилий работников, чей стаж работы
в организации превышает значение, введенное с
клавиатуры;
 если таких работников нет, вывести на дисплей
соответствующее сообщение.

Вариант 7
1. Описать структуру с именем ТRAIN, содержащую следующие
поля:
 NAZN - название пункта назначения;
 NUMR - номер поезда;
 ТIМЕ - время отправления.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив RASР, состоящий из
восьми элементов типа ТRAIN; записи должны быть
размещены в алфавитном порядке по названиям пунктов
назначения;
вывод на экран информации о поездах, отправляющихся
после введенного с клавиатуры времени;
 если таких поездов нет, выдать на дисплей
соответствующее сообщение.

Вариант 8
1. Описать структуру с именем ТRAIN, содержащую
следующие поля:
36
 NAZN - название пункта назначения;
 NUMR - номер поезда;
 ТIМЕ - время отправления.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив , состоящий из шести
элементов типа ТRAIN; записи должны быть упорядочены по
времени отправления поезда;
 вывод на экран информации о поездах, направляющихся в
пункт, название которого введено с клавиатуры;
 если таких поездов нет, выдать на дисплей
соответствующее сообщение.

Вариант 9
1. Описать структуру с именем TRAIN, содержащую следующие
поля:
 BEGST - название пункта назначения;
 TERM - номер поезда;
 ТIМЕ - время отправления.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив RASР, состоящий из
восьми элементов типа TRAIN; записи должны быть
упорядочены по номерам поездов;
 вывод на экран информации о поезде, номер которого введен
с клавиатуры;
 если таких поездов нет, выдать на дисплей
соответствующее сообщение.

Вариант 10
1. Описать структуру с именем TRAFIC, содержащую
следующие поля:
 ВЕGSТ - название начального пункта маршрута;
 ТЕRМ - название конечного пункта
маршрута;
 NUMER - номер маршрута.
2. Написать программу, выполняющую следующие действия:

37
 ввод с клавиатуры данных в массив ТRAFIC, состоящий из
восьми элементов типа МАRSН; записи должны быть
упорядочены по номерам маршрутов;
 вывод на экран информации о маршруте, номер которого
введен с клавиатуры;
 если таких маршрутов нет, выдать на дисплей
соответствующее сообщение.

Вариант 11
1. Описать структуру с именем MARSH, содержащую
следующие поля:
 ВЕС5Т - название начального пункта маршрута;
 ТЕRМ - название конечного пункта маршрута;
 NUMER - номер маршрута.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив ТRАFIС, состоящий из
восьми элементов типа МАRSН; записи должны быть
упорядочены по номерам маршрутов;
 вывод на экран информации о маршрутах, которые
начинаются или кончаются в пункте, название которого
введено с клавиатуры;
 если таких маршрутов нет, выдать на дисплей
соответствующее сообщение.

Вариант 12
1. Описать структуру с именем NОТЕ, содержащую следующие
поля:
 NАМЕ - фамилия, имя;
 ТЕLЕ - номер телефона;
 ВDAY - день рождения (массив из трех чисел).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив BLOCKNOТЕ,
состоящий из восьми элементов типа NОТЕ; записи должны
быть упорядочены по датам дней рождения;
 вывод на экран информации о человеке, номер телефона
которого введен с клавиатуры;

38
 если такого нет, выдать на дисплей соответствующее
сообщение.

Вариант 13
1. Описать структуру с именем NОТЕ, содержащую
следующие поля:
 NАМЕ - фамилия, имя;
 ТЕLЕ - номер телефона;
 ВDAY - день рождения (массив из трех чисел).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив BLOCKNОТЕ,
состоящий из восьми элементов типа NОТЕ; записи должны
быть размещены по алфавиту;
 вывод на экран информации о людях, чьи дни рождения
приходятся на месяц, значение которого введено с
клавиатуры;
 если таких нет, выдать на дисплей соответствующее
сообщение.

Вариант 14
1. Описать структуру с именем NОТЕ, содержащую
следующие поля:
 NАMЕ - фамилия, имя;
 ТЕLЕ - номер телефона;
 ВDAY - день рождения (массив из трех
чисел).
2. Написать программу, выполняющую
следующие действия:
 ввод с клавиатуры данных в массив ВLОСКNОТЕ,
состоящий из восьми элементов типа NОТЕ; записи должны
быть упорядочены по трем первым цифрам номера телефона;
 вывод на экран информации о человеке, чья фамилия введена
с клавиатуры;
 если такого нет, выдать на дисплей соответствующее
сообщение.

Вариант 15
39
1. Описать структуру с именем ZNАК, содержащую
следующие поля:
 NАМЕ - фамилия, имя;
 ZODIAC - знак Зодиака;
 ВDAY - день рождения (массив из трех чисел).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив ВООК, состоящий из
восьми элементов типа ZNАК; записи должны быть
упорядочены по датам дней рождения;
 вывод на экран информации о человеке, чья фамилия
введена с клавиатуры;
 если такого нет, выдать на дисплей соответствующее
сообщение.

Вариант 16
1. Описать структуру с именем ZNАК, содержащую следующие
поля:
 NАМЕ - фамилия, имя;
 ZODIAС - знак Зодиака;
 ВDAY - день рождения (массив из трех чисел).
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив ВООК, состоящий из
восьми элементов типа ZNАК; записи должны быть
упорядочены по датам дней рождения;
 вывод на экран информации о людях, родившихся под
знаком, наименование которого введено с клавиатуры;
 если таких нет, выдать на дисплей соответствующее
сообщение.

Вариант 17
1. Описать структуру с именем ZNАК, содержащую
следующие поля:
 NАМЕ - фамилия, имя;
 ZODIАС - знак Зодиака;
 ВDAY - день рождения (массив из трех чисел).
2. Написать программу, выполняющую следующие действия:

40
 ввод с клавиатуры данных в массив ВООК, состоящий из
восьми элементов типа ZNАК; записи должны быть
упорядочены по знакам Зодиака;
 вывод на экран информации о людях, родившихся в месяц
значение которого введено с клавиатуры;
 если таких нет, выдать на дисплей соответствующее
сообщение.

Вариант 18
1. Описать структуру с именем РRIСЕ, содержащую
следующие поля:
 ТOVАR - название товара;
 МАG - название магазина, в котором продается товар;
 STOIМ - стоимость товара в руб.
2. Написать программу выполняющую следующие действия:
 ввод с клавиатуры данных в массив SPISOK, состоящий из
восьми элементов типа PRICЕ; записи должны быть
размещены в алфавитном порядке по названиям товаров;
 вывод на экран информации о товаре, название которого
введено с клавиатуры;
 если таких товаров нет, выдать на дисплей
соответствующее сообщение.

Вариант 19
1. Описать структуру с именем РRIСЕ, содержащую следующие
поля:
 ТОVАR - название товара;
 МАG - название магазина, в котором продается товар;
 STOIМ - стоимость товара в руб.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив SPISOK, состоящий из
восьми элементов типа PRIСЕ; записи должны быть
размещены в алфавитном порядке по названиям магазинов;
 вывод на экран информации о товарах, продающихся в
магазине, название которого введено с клавиатуры;
 если такого магазина нет, выдать на дисплей
соответствующее сообщение.
41
Вариант 20
1. Описать структуру с именем ORDER, содержащую
следующие поля:
 РLАТ - расчетный счет плательщика;
 РОL - расчетный счет получателя;
 SUMMA - перечисляемая сумма в руб.
2. Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив SPISОК, состоящий из
восьми элементов типа ОRDER; записи должны быть
размещены в алфавитном порядке по расчетным счетам
плательщиков;
 вывод на экран информации о сумме, снятой с расчетного
счета плательщика, введенного с клавиатуры;
 если такого расчетного счета нет, выдать на дисплей
соответствующее сообщение.

42
Лабораторная работа №5

ПРОСТЕЙШИЕ ФУНКЦИИ

Задание: Выполнить упражнение из лабораторной работы


«Двумерные массивы», оформив каждый пункт
задания в виде функции. Все необходимые данные
для функций должны передаваться им в качестве
параметров. Использование глобальных
переменных в функциях не допускается.
Пример задания: Для заданной матрицы размером 8 на 8
найти такие k, что k-я строка матрицы
совпадает с k-м столбцом. Найти сумму
элементов в тех строках, которые
содержат хотя бы один отрицательный
элемент.

Пример решения задачи:


/*
Подключение рабочих библиотек:
<stdio.h> - библиотека ввода/вывода
*/
#include <stdio.h>

/* Объявление прототипов функций */


void Task1(int *mat, int m, int n);
void Task2(int *mat, int m, int n);
int main(int argc, char* argv[])
{
/* Объявляем и инициализируем матрицу 8х8 */
int matrix[8][8] = {
{ 2, 7, 2, 7, 1, 4, 0, 3 },
{ 1, 0, 7, 6, 0, -8, 3, 5 },
{ 2, 7, 1, 8, 1, 4, 9, 3 },
{ 9, 2, 8, 5, 2, 0, 0, 6 },
{ 7, 1, 1, 3, 9, 3, 9, 1 },
{ 8, 2, 4, 9, 1, -6, 4, 9 },
{ 0, 3, 9, 0, 9, 4, 8, 8 },
{ 1, 8, 3, 2, 8, 2, 8, 0 }
};
43
Task1(&matrix[0][0], 8, 8);
Task2(&matrix[0][0], 8, 8);

return 0;
}

void Task1(int *mat, int m, int n)


{
int i, j; /* Счетчики */
bool bFlag; / Флаг */

printf("k = ");
for (i = 0; i < m; i++)
{
/* Присваеваем Флагу исходное значение */
bFlag = true;
for (j = 0; j < n; j++)
{
/* Сравниваем элемент i-й строки j-го столбца с
элементом j-й строки i-го столбца. В случае их
несоответствия присваеваевам Флагу значение
Ложь и прерываем цикл по j конструкцией break
*/
if (mat[i * m + j] != mat[j * m + i])
{
bFlag = false;
break;
}
}

/* В случае сохранения флагом исходного значения


выводим на экран */
/* номер соответствующей строки */
if (bFlag) printf("%d ", i);
}
}

void Task2(int *mat, int m, int n)


{
int i, j, iSumm; /* Счетчик и переменная для
хранения суммы */
bool bFlag; /* Флаг */

printf("\n\n");

44
for (i = 0; i < m; i++)
{
/* Присваеваем переменным исходные значения */
bFlag = false;
iSumm = 0;
for (j = 0; j < n; j++)
{
/* При нахождение хотя бы одного
отрицательного элемента присваиваем Флагу
значение Истина, обозначающее необходимость
вывода Суммы на экран */
if (mat[i * m + j] < 0) bFlag = true;

/* Суммируем значения элементов i-й строки */


iSumm += mat[i * m + j];
}

/* В случае нахождения в строке хотя бы одного


отрицательного элемента выводим на экран сумму
элементов i-й строки */
if (bFlag) printf("Summ of elements of row #%d =
%d\n", i, iSumm);
}
}

Результат выполнения программы:


k = 2 6

Сумма элементов строки #1 = 14


Сумма элементов строки #5 = 31

Индивидуальные задания:
Выполнить упражнения из раздела «Двумерные массивы»,
оформив каждый пункт задания в виде функции. Все
необходимые данные для функций должны передаваться им в
качестве параметров. Использование глобальных переменных в
функциях не допускается.

45
Лабораторная работа №6

УКАЗАТЕЛИ

Задание: Выполнить задание из раздела «Двумерные


массивы», используя динамическое выделение
памяти.
Пример задания: Анкета для опроса населения содержит две
группы вопросов.
Первая группа содержит сведения о респонденте:
 возраст;
 пол;
 образование (начальное, среднее, высшее);
Вторая группа содержит собственно вопрос анкеты,
ответ на который либо ДА, либо НЕТ
Составить программу, которая:
 обеспечивает начальный ввод анкет;
 на основе анализа анкет выдает ответы на
следующие вопросы: а) сколько мужчин
старше 40 лет, имеющих высшее
образование, ответили ДА на вопрос анкеты;
б) сколько женщин моложе 30 лет, имеющих
среднее образование, ответили НЕТ на
вопрос анкеты; в) сколько мужчин моложе
25 лет, имеющих начальное образование,
ответили ДА на вопрос анкеты;
 производит вывод всех анкет и ответов на
вопросы.
Программа должна обеспечивать диалог с помощью
меню и контроль ошибок при вводе.

Пример решения задачи:


#include <stdio.h>
#include <stdlib.h>

46
struct Form
{
int Age;
int Sex; /* 0 - мужчина; 1 – женщина */
int Education; /* 0 - начальное; 1 - среднее; 2 –
высшее */
int Question; /* 0 - НЕТ; 1 – ДА */
};

int main(int argc, char* argv[])


{
int Selection, i;
Form *pForm = NULL;
int RecCount = 0;
int k1, k2, k3;
char *str;

printf("М Е Н Ю\n-------------------\n");
printf("1. Добавить запись\n");
printf("2. Анализ анкет\n");
printf("3. Вывод всех анкет\n");
printf("4. Выход");

while (true)
{
printf("\n\nВаш выбор: ");
scanf("%d ", &Selection);

switch (Selection)
{
case 1: /* Добавить запись */
pForm = (Form*)realloc(pForm, (RecCount + 1)
* sizeof(Form));

printf("\nВведите данные:\n");
printf("\tВозраст: "); scanf("%d",
&pForm[RecCount].Age);
printf("\tПол (0 - М; 1 - Ж): ");
scanf("%d", &pForm[RecCount].Sex);
printf("\tОбразование (0 – нач.; 1 – ср.; 2
- высшее): ");
scanf("%d", &pForm[RecCount].Education);
printf("\tВы курите? (0 - НЕТ; 1 - ДА): ");
scanf("%d", &pForm[RecCount].Question);

47
RecCount++;
break;
case 2: /* Анализ анкет */
k1 = k2 = k3 = 0;
for (i = 0; i < RecCount; i++)
{
if (pForm[i].Sex == 0 && /* мужчина.*/
pForm[i].Age > 40 && /* старше 40 лет.*/
pForm[i].Education == 2 && /* имеющий
высшее образование...*/
pForm[i].Question == 1) /* ответивший
ДА.*/
k1++;
if (pForm[i].Sex == 1 && /* женщина.*/
pForm[i].Age < 30 && /* моложе 30
лет...*/
pForm[i].Education == 1 && /* имеющая
среднее образование... */
pForm[i].Question == 0) /* ответившая
НЕТ. */
k2++;
if (pForm[i].Sex == 0 && /* мужчина... */
pForm[i].Age < 25 && /* моложе 25 лет.*/
pForm[i].Education == 0 && /* имеющий
начальное образование... */
pForm[i].Question == 1) /* ответивший
ДА... */
k3++;
}
printf("\nСтатистика #1: %d\n", k1);
printf("Статистика #2: %d\n", k2);
printf("Статистика #3: %d\n", k3);
break;
case 3: /* Вывод всех анкет */
printf("\nВсе анкеты:\n");

printf("================================================
====\n");
printf("Возраст Пол
Образование Ответ\n");

printf("================================================
====\n");
for (i = 0; i < RecCount; i++)
{

48
if (pForm[i].Education == 0)
str = "Начальное";
else if (pForm[i].Education == 1)
str = "Среднее ";
else
str = "Высшее ";

printf("%d %s %s
%s\n", pForm[i].Age,
((pForm[i].Sex) ? "Ж" : "M"),
str,
((pForm[i].Question) ? "ДА" :
"НЕТ"));

printf("________________________________________________
____\n");
}
break;
case 4: // Выход
free(pForm);
exit(0);
break;
}
}

free(pForm);
return 0;
}

Результат выполнения программы:


М Е Н Ю
-------------------
1. Добавить запись
2. Анализ анкет
3. Вывод всех анкет
4. Выход

Ваш выбор: 1

Введите данные:
Возраст: 48
Пол (0 - М; 1 - Ж): 0
Образование (0 – нач.; 1 – ср.; 2 - высшее): 2
Вы курите? (0 - НЕТ; 1 - ДА): 1

49
Ваш выбор: 1

Введите данные:
Возраст: 41
Пол (0 - М; 1 - Ж): 0
Образование (0 – нач.; 1 – ср.; 2 - высшее): 2
Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:
Возраст: 25
Пол (0 - М; 1 - Ж): 1
Образование (0 – нач.; 1 – ср.; 2 - высшее): 1
Вы курите? (0 - НЕТ; 1 - ДА): 0

Ваш выбор: 1

Введите данные:
Возраст: 18
Пол (0 - М; 1 - Ж): 0
Образование (0 – нач.; 1 – ср.; 2 - высшее): 0
Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:
Возраст: 16
Пол (0 - М; 1 - Ж): 0
Образование (0 – нач.; 1 – ср.; 2 - высшее): 0
Вы курите? (0 - НЕТ; 1 - ДА): 1

Ваш выбор: 1

Введите данные:
Возраст: 27
Пол (0 - М; 1 - Ж): 1
Образование (0 – нач.; 1 – ср.; 2 - высшее): 1
Вы курите? (0 - НЕТ; 1 - ДА): 0

50
Ваш выбор: 1

Введите данные:
Возраст: 17
Пол (0 - М; 1 - Ж): 1
Образование (0 – нач.; 1 – ср.; 2 - высшее): 1
Вы курите? (0 - НЕТ; 1 - ДА): 0

Ваш выбор: 2

Статистика #1: 2
Статистика #2: 3
Статистика #3: 2

Ваш выбор: 3

Все анкеты:
====================================================
Возраст Пол Образование Ответ
====================================================
48 M Высшее ДА
____________________________________________________
41 M Высшее ДА
____________________________________________________
25 Ж Среднее НЕТ
____________________________________________________
18 M Начальное ДА
____________________________________________________
16 M Начальное ДА
____________________________________________________
27 Ж Среднее НЕТ
____________________________________________________
17 Ж Среднее НЕТ
____________________________________________________

Ваш выбор: 4

Индивидуальные задания:
Выполнить задания из разделов «Двумерные массивы»
используя динамическое выделение памяти.

51
Оглавление

1. Лабораторная работа №1_______________________1


ЦИКЛИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ

2. Лабораторная работа №2_______________________18


ОДНОМЕРНЫЕ МАССИВЫ

3. Лабораторная работа №3_______________________26


ДВУМЕРНЫЕ МАССИВЫ

4. Лабораторная работа №4_______________________33


СТРУКТУРЫ

5. Лабораторная работа №5_______________________45


ПРОСТЕЙШИЕ ФУНКЦИИ

6. Лабораторная работа №6_______________________48


УКАЗАТЕЛИ

52

Вам также может понравиться