Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по программированию на языке СС++. Учебно-методическое пособие
.pdf
12. Определение наибольшего из элементов, кратных 3.
13. Определение наименьшего из элементов массива.
14. Вычисление количества нулевых элементов массива.
15. Определение наибольшего из нечетных элементов массива.
16. Вычисление среднего арифметического для элементов массива
больших 2 и меньших 5.
17. Определение максимального значения среди отрицательных
элементов массива.
18. Вычисление суммы элементов массива от первого элемента до
минимального элемента.
Примечание: Исходный массива сформировать с помощью датчика случайных
чисел.
Содержание отчета:
1. Номер, тема и цель лабораторной работы
2. Задание к лабораторной работе.
3. Схема алгоритма.
4. Программа на языке Си.
5. Результаты решения.
Показать отчет преподавателю.
Контрольные вопросы:
1. Типы функции, используемые в программе на языке Си.
2. Структура функции, определенной пользователем.
3. Отличие типовой функции от бестиповой функции.
4. Типы параметров функции.
5. Глобальные и локальные идентификаторы.
Лабораторная работа № 11
БЕСТИПОВЫЕ ПОДПРОГРАММЫ – ФУНКЦИИ
Цель работы: Приобрести навыки организации программ с
использованием бестиповых функций, определенных пользователем.
91

Подготовка к лабораторной работе:
В процессе подготовки к лабораторной работе необходимо повторить
такие элементы языка как: отличие бестиповой функции от типизированной,
списки фактических и формальных параметров, вызов бестиповой функции.
В соответствии с заданием разработать алгоритм решения задачи,
описать его в виде схемы и составить программу на языке Си.
Если функция должна вернуть несколько результатов, то этот возврат
реализуется с помощью указателей, т.е. параметров, передаваемых по адресу и
функция создается бестиповой. Если функция не должна возвращать результат,
то она считается нетипизированной, что задается ключевым словом void,
стоящим на месте типа. В этом случае оператор return в функции не требуется.
void Имя Функции(список формальных параметров)
{
Описание локальных переменных;
Операторы тела функции;
}
Пример программы с бестиповой функцией
Рассмотрим пример функции, перемножающей матрицы А и В; результат -
матрица С. По правилам математики перемножать можно матрицы, размеры
которых (mxn) и (nxk) соответственно. Результирующая матрица будет иметь
размеры (mxk).
constnmax = 50;
void product(int А[][nmax], int В[][nmax],int С[][nmax],
intm, intn, intk)
{
/* m - число строк в матрице А;
n - число строк в матрице В и число столбцов в матрице А;
k - число столбцов в матрице В. */
for (int i=0; i< m; i++)
for (int j=0; j< k; j++)
{
С[i][j]=0;
for (int l=0; l< n; l++)
С[i][j] + = А[i][l]*В[l][j];
}
}
92

Функция product в заголовке содержит список из шести формальных
параметров. Первые три – для приема адресов трех матриц: двух исходных и
результирующей. Последующие три параметра примут копии значений
размеров матриц.
В функции main() данная функция может использоваться так:
void main()
{int А[nmax][nmax];
intВ[nmax][nmax];
int С[nmax][nmax];//объявление матриц
/*здесь произойдет заполнение матриц А и В исходными
данными*/
product(A,B,C);
//здесь будет вывод матрицы С
}
Задание к лабораторной работе:
Разработать программу для выполнения над массивом операций в
соответствии с вариантом. На печать вывести исходный и преобразованный
массив.
Порядок выполнения работы.
1. Получить допуск к работе у преподавателя(показать домашние
заготовки).
2. Загрузить среду Visual Studio.
3. Ввести текст программы.
4. Провести отладку программы.
5. Выполнить программу, провести анализ результатов и убедившись в
правильности решения, предъявить их преподавателю для проверки.
6. Занести результаты расчета в отчет.
7. Выйти из среды.
Варианты заданий:
1. Реверс массива.
2. Вычисление сумм положительных и отрицательных элементов массива
отдельно.
3. Попарное перемножение элементов двух массивов.
93

4. Вычисление суммы положительных элементов и количества
отрицательных элементов массива.
5. Замена отрицательных элементов массива нулями.
6. Сложение двух массивов
7. Умножение элементов массива на скаляр.
8. Замена всех положительных элементов массива нулями.
9. Вычисление отдельно количества нулевых, положительных и
отрицательных элементов массива.
10. Вычисление сумм элементов каждой строки массива.
11. Удвоение всех положительных элементов массива.
12. Замена нулями всех четных элементов массива.
13. Вычисление количеств отрицательных элементов в массиве
14. Вычитание из значения каждого элемента массива его номера.
15. Удвоение всех значений исходного массива.
16. Удвоение значений четных элементов массива.
17. Вычитание из элементов с нечетными номерами элементов с четными
номерами.
18. Деление каждого элемента массива на его номер.
19. Удвоение значений тех элементов массива, у которых номер четный.
20. Прибавление к каждому элементу массива значение его номера.
21. Деление каждого элемента массива на его номер.
22. Вычитание из элементов массива скаляра, равного числу нулевых
элементов этого массива.
23. Замена максимального элемента массива на нуль.
Примечание: Исходный массив сформировать, используя датчик
псевдослучайных чисел RAND().
Содержание отчета:
1. Номер, тема и цель лабораторной работы
3. Задание к лабораторной работе.
4. Схема алгоритма.
5. Программа на языке Си.
6. Результаты решения.
Показать отчет преподавателю.
94

Контрольные вопросы:
1. Для чего используются подпрограммы?
2. Структура бестиповой функции, определенной пользователем.
3. Как вызывается такая функция?
4. Область действия глобальных и локальных имен в программе.
5. Правила взаимодействия списков фактических и формальных
параметров.
6. Отличие параметров-значений от параметров переменных.
95

Лабораторная работа № 12
Технология сборки библиотеки
Цель работы: Приобрести навыки создания библиотеки.
Подготовка к лабораторной работе:
1. Повторить особенности организации конечного цикла.
2. Изучить следующие вопросы и понятия:
- особенности использования библиотек в языке Си;
-правила создания функций;
- правила создание заголовочного файла.
3. Изучить разделы учебного пособия «ОСНОВЫ ПРОГРАММИРОВАНИЯ
НА С++», стр. 104-105.
4. Составить программу на алгоритмическом языке по разработанной схеме
алгоритма.
Технология сборки библиотеки.
Библиотеки интенсивно используются в программной среде языка Си.
Обычно функции ввода-вывода, обработки строк и другие стандартные
функции языка Си собраны в одну библиотеку, а математические функции
поставляются в виде отдельной библиотеки.
Причина популярности библиотек кроется в распространенной практике программирования на языке Си, многие программисты создают небольшие,
многократно используемые функции. Большинство сложных задач
программирования разбивается на небольшие более простые подзадачи,
решение которых выполняется в виде отдельных модулей. Манипулирование
объектными файлами, получаемыми в результате компиляции этих модулей,
облегчается, если организовать их в виде библиотек. Поэтому при разработке
программных проектов, состоящих из большого числа модулей, целесообразно
пользоваться библиотеками. Каждая такая библиотека обычно может быть
включена в проект с помощью средств поддержки проекта.
96

Особенностью использования библиотек является тот факт, что
компоновщик будет обращаться к библиотеке и выбирать оттуда необходимые
функции только по мере необходимости, то есть, если имеются ссылки к
функциям библиотечного модуля.
Следует помнить, что модуль будет выбран из библиотеки и подключен к
программе всегда целиком, даже если на самом деле программе требуется всего
лишь одна функция.
Библиотека пользователя, как и любая стандартная библиотека языка С и
С++, собирается из двух видов файлов: заголовочного файла и файла с кодами
функций.
Заголовочный файл (иногда головной файл, англ. header file), или
подключаемый файл, в языках программирования С и C++ - это файл с
расширением .h. Заголовочный файл в общем случае может содержать любые
конструкции языка программирования, но на практике в него помещают
объявления идентификаторов, которые должны быть объявлены более чем в
одном файле вашей программы, объявления структур, прототипы функций,
перечисления, макросы препроцессора. Основная цель использования
заголовочных файлов — вынесение описания нестандартных типов и функций
за пределы основного файла с кодом. Заголовочный файл используется путём
включения его текста в использующий его файл директивой препроцессора
#include. Чтобы избежать повторного включения одного и того же кода,
используются директивы #ifndef, #define, #endif.
На этом же принципе построены стандартные библиотеки языка С и С++, в
заголовочном файле перечисляются содержащиеся в библиотеке функции и
используемые ею структуры/типы. При этом исходный текст библиотеки
может находиться отдельно от текста программы, использующей функции
библиотеки или вообще быть недоступным.
Пусть создаваемая нами библиотека состоит из заголовочного файла
mylib.h и файла mylib.cpp.
97

В заголовочном файле mylib.h содержатся прототипы функций, которые
описаны в данном параграфе.
Перечислим все эти функции:
maximum(). Находит и возвращает наибольшее из двух чисел.
Form_matrix(). Заполняет матрицу, адрес которой передается ей в
качестве параметра, случайными числами.
ST(). Возводит любое число в степень n.
Z(). Меняет значение переданного ей параметра на случайное число.
Sum(). Вычисляет среднее арифметическое вектора, адрес и размер
которого передаются в качестве параметров.
Product(). Вычисляет произведение двух матриц, адреса и размеры
которых передаются в качестве параметров. Возвращает матрицу
соответствующего размера.
SM().Безтиповая функция вычисляет симметричную матрицу из
исходной матрицы.
PK(). Безтиповая функция переводит декартовые координаты точки в
полярные.
CP().Типизированная функция для подсчета количества
положительных элементов в любой матрице.
Mod_Otk(). Типизированная функция находит максимальный
компонент и среднее значение в любом массиве.
fact().Рекурсивная функция вычисляет факториал числа n.
Текст файла mylib.h:
#ifndef MYLIB_H // если MYLIB_H еще не определили, то определяем
#define MYLIB_H
const nmax = 50; // максимальная размерность матрицы
int maximum(int a, int b);//прототипфункции maximum
98

void Form_matrix(int A[][M], int m, int n);/*прототипфункции
Form_matrix */
float ST(float x, int n);//прототипфункции ST
voidZ (int у); //прототип функции Z
voidZ (int *у);//прототип функции Z
int Sum ( int A[], int N );//прототипфункции Sum
void product(int А[][nmax], int В[][nmax],int С[][nmax],
int m, int n, int k);//прототипфункции product
void SM(float Y[4][4], int n, float
X[4][4]);/*прототипфункции SM */
void PK(float a, float b, float *ro, float
*fi);/*прототипфункции PK */
int CP(float D[7][7], int m, int n);//прототипфункции CP
float Mod_Otk(float *a, int n);//прототипфункции Mod_Otk
float fact(int N); //прототипфункции fact
#endif /* MYLIB_H */
Файл mylib.cpp является созданной нами библиотекой, в которой
содержатся реализации всех перечисленных выше функций.
В целях экономии текст файла mylib.cpp приведем не полностью.
Текст файла mylib.cpp:
#include "stdafx.h"
#include "stdlib.h"
{
int Sum ( int A[], int N )//заголовок функции Sum
{
inti, sum; //локальные переменные
sum = 0;
for ( i = 0; i < N; i ++ )
sum += A[i];
return sum/N; //возвращаемое значение
}
99

void product(int А[][nmax], int В[][nmax],int С[][nmax],
int m, int n, int k)//заголовок функции product
{
/* m - число строк в матрице А;
n - число строк в матрице В и число столбцов в матрице А;
k - число столбцов в матрице В. */
for (int i=0; i< m; i++)
for (int j=0; j< k; j++)
{
С[i][j]=0;
for (int l=0; l< n; l++)
С[i][j] + = А[i][l]*В[l][j];
}
}
float fact(intN) //рекурсивная функция вычисления факториала числа N
{
if (N==0)
return 1;
else
return (fact(N-1)*N);
}
…//здесь могут быть коды других функций
Текст файла, использующего созданную библиотеку:
#include "mylib.h"//подключение заголовочного файла библиотеки mylib
// главная функция выполняет основную работу программы
intmain()
{ inta[nMax][nMax], b[nMax][nMax]; //объявление матриц
SM(a);//вызов функции SM для обработки матрицы a
… // здесь могут быть обращения к другим функциям библиотеки
return 0; }
100
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
