Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по языкам программирования. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
Федеральное агентство связи
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Сибирский государственный университет
телекоммуникаций и информатики»
О. И. Моренкова
Практикум по языкам программирования
Учебно-методическое пособие
Новосибирск
2020
2
УДК 004.43.(075.8)
Утверждено редакционно-издательским советом СибГУТИ
Рецензент: доцент СибГУТИ Кокорева Е.В.
Моренкова О.И. Практикум по языкам программирования : Учебно- методическое пособие / Сиб. гос. ун-т телекоммуникаций и информатики. – Новосибирск, 2020. – 99 с.
Данное учебно-методическое пособие предназначено для студентов
специальности 11.05.04 «Инфокоммуникационные технологии и системы
специальной связи» любой формы обучения, изучающих курс «Языки программирования». Оно включает в себя задания по углубленному изучению
программирования на языке С/С++. Пособие содержит теоретический материал
в кратком изложении и задания для самостоятельной работы.
Кафедра телекоммуникационных сетей и вычислительных средств
© Моренкова О.И., 2020 © Сибирский государственный университет телекоммуникаций и информатики, 2020
3
Оглавление
ВВЕДЕНИЕ .................................................................................................................. 4
Практическая работа №1. ........................................................................................... 5
Тема: «Программирование циклических процессов на языке С++ с
использованием функций» ......................................................................................... 5
Практическая работа №2 .......................................................................................... 15
Тема: «Указатели и динамические массивы. Использование указателей в
качестве аргументов функций» ................................................................................ 15
Практическая работа №3. ....................................................................................... 31
Тема: «Динамическая память. Структуры в С++» ................................................. 31
Практическая работа №4 . ........................................................................................ 38
Тема: « Текстовые и двоичные (бинарные) файлы» ............................................... 38
Практическая работа № 5 ......................................................................................... 58
Тема: «Динамические структуры данных. Стеки» ................................................ 58
Практическая работа №6 .......................................................................................... 64
Тема: «Динамические структуры данных. Списки» .............................................. 64
Практическая работа №7 .......................................................................................... 86
Тема: «Введение в объектно-ориентированное программирование. Простые
классы» ....................................................................................................................... 86
Практическая работа №8 .......................................................................................... 92
Тема: «Введение в объектно-ориентированное программирование.
Наследование и полиморфизм» ............................................................................. 92
ЛИТЕРАТУРА ........................................................................................................... 98
4
ВВЕДЕНИЕ
Настоящее учебно-методическое пособие предназначено для
использования в процессе лабораторного практикума по дисциплине «Языки
программирования» студентами специальностей 10.03.01 «Радиоэлектронные системы и комплексы», 10.05.02 «Специальные радиотехнические системы».
В ходе выполнения практических заданий студенты должны приобрести
углубленные теоретические знания в области программирования и навыки разработки программного обеспечения на конкретном алгоритмическом языке. В процессе решения задач студенты должны правильно выбирать и описывать типы данных, изучить синтаксис и правильно использовать операторы алгоритмического языка, освоить работу с такими структурами данных, как
массивы, структуры, файлы, разрабатывать программы с использованием динамических структур стек, очередь, список, получить базовые знания объектно-ориентированного программирования.
В данном руководстве предлагается 12 лабораторных работ, посвященных изучению базовых конструкций языка С/С++ (условия, циклы и функции) и способов хранения и обработки данных (массивы, структуры, файлы).
5
Практическая работа № 1
Тема: «Программирование циклических процессов на языке С++
с
использованием функций»
Цель работы: Изучение функций в языке С++. Знакомство с функциями,
возвращающими одно значение.
ПОДПРОГРАММЫ – ФУНКЦИИ в языке Си
Любая программа может быть разбита на ряд логически завершенных
программных единиц – подпрограмм. Такое разделение вызвано двумя причинами:
1. Экономия памяти. Каждая подпрограмма записывается в программе
один раз, в то время как обращаться к ней можно многократно из разных точек
программы.
2. Структурирование программы. Алгоритм решения задачи может быть
достаточно сложным, поэтому целесообразно выделить самостоятельные
смысловые части алгоритма и оформить их в виде подпрограмм.
В языке Си существует один вид подпрограмм, который называется
функция. Каждая программа должна иметь главную функцию (main), которая
служит точкой входа в программу. Кроме главной функции в программе может
быть оформлено произвольное число функций.
Общий вид описания функции
Описание функции содержит заголовок со списком формальных
параметров и тело функции.
Тип Имя Функции(список формальных параметров) { Описание локальных переменных; Операторы тела функции; return результат; }
Описание подпрограммы само по себе никаких действий не вызывает. При запуске программы выполнение начинается с операторов главной функции main(). Чтобы выполнить подпрограмму, в нужной точке главной функции
необходимо записать обращение к подпрограмме.
Ниже схематично приведена структура программы, в которой описана
подпрограмма-функция.
#include "stdafx.h"
//Раздел описаний функций
тип Имя Функции(тип имя_параметра_1, тип имя_параметра_2,...)
{ тело функции
6
} ……
main() //начало главной функции {
Имя Функции(список фактических параметров);/*Обращение к функции*/
……………………..
} //конец главной функцииmain
Функции
Функция – это автономная часть программы, реализующая определенный
алгоритм и допускающая обращение к ней из различных частей программы.
Каждая функция по отношению к другим является внешней.
Параметры, указанные в заголовке функции, называются формальными, а
параметры, указываемые при ее вызове – фактическими.
Список формальных параметров обеспечивает передачу исходных данных
в функцию.
Согласование параметров
Формальные и фактические параметры должны быть согласованы друг с другом по количеству, типу и порядку следования. Это означает, что количество формальных параметров должно быть равно количеству фактических параметров, и каждый формальный параметр должен иметь тот же тип и занимать в списке то же место, что и соответствующий ему
фактический параметр.
Механизм замены параметров
В языке Си существует два механизма передачи параметров в функции: по
значению и по адресу.
Как правило, параметры функции (кроме массивов и указателей) передаются по значению. Параметры, передаваемые по значению, играют роль входных параметров. Фактическим параметром, передаваемым по значению, может быть константа, переменная или выражение. Для них при вызове функции в памяти компьютера временно выделяются ячейки, в которые передаются копии значений фактических параметров. При выполнении функции значения в этих ячейках могут измениться, однако соответствующие
им фактические параметры останутся без изменения.
При передаче параметров по адресу все действия в процедуре выполняются непосредственно над фактическим параметром, а не его копией.
7
Поэтому любое изменение формального параметра приводит к изменению
соответствующего ему фактического параметра.
Рассмотрим два примера, иллюстрирующие механизмы передачи
параметров.
Пример 1 Пример 2
#include "stdafx.h" #include "stdafx.h"
void Z (int у) void Z (int *у)
{ {
y=l; *y=1;
} }
void main() void main() { int х; { int х;
x=0; х=0; Z(x); Z(&x); printf("x=%d", x); printf("x=%d", x);
} }
В примере 1 функция Z содержит формальный параметр у, который
передается по значению, поэтому его изменение в процедуре (у=1;) не влияет на значение фактического параметра х. После выполнения программы на экран
будет выведено: х=0.
В примере 2 формальный параметр у – это указатель. Это означает, что в
функции изменяется значение в той ячейки памяти, адрес которой передавался
в функцию Z, т.е. по адресу фактического параметра x. На экран будет выведено: х = 1.
Параметры-массивы в функциях
Массивы, так же как и простые переменные, можно передавать в функции
в качестве параметров. Так как имя массива – это адрес, то передача массива происходит всегда по адресу.
Если мы хотим передать в подпрограмму отдельный элемент
массива, то в качестве соответствующего ему формального параметра
указывается простая переменная того же типа.
Общий вид описания типовой функции
Описание функции содержит заголовок со списком формальных
параметров и тело функции.
Тип Имя Функции(список формальных параметров) { Описание локальных переменных;
8
Операторы тела функции; return результат; }
Тип, указываемый в заголовке функции, определяет тип результата ее
работы, который будет возвращаться в точку вызова. Если тип не указан, то по
умолчанию подразумевается int (целый). Для возврата значения в теле функции должен быть оператор return. В дальнейшем будем называть такую функцию
типизированной или типовой.
Результат работы функции возвращается в точку вызова с помощью
оператора return. Таким образом, функция может вернуть только одно
скалярное значение.
Рассмотрим пример оформления типовой функции для вычисления
максимального значения из двух заданных.
#include "stdafx.h"
int max(int a, int b) { int c; if (a>b) c=a; else c=b; return c; }
void main() { int x,y,z; printf("Введите x и y:"); scanf("%d%d",&x,&y);
z=max(x,y);
printf("max=%d\n",z); }
Обращение к типовой функции
Обращение к типизированной функции не является специальным
оператором, а включается в состав оператора присваивания или оператора
вывода. Результат выполнения функции возвращается в точку вызова через имя
функции. Обращение к функции записывается аналогично записи стандартной
функции (например, sin(x), ехp(x) и т.п.) в виде операнда:
<имя функции>(<список фактических параметров>);
При вычислении выражения операнд обращения к функции заменяется
значением функции.
Рассмотрим, например, функцию, вычисляющую среднее значение
элементов массива. Желательно сделать ее так, чтобы в нее можно было
9
передавать массивы любого размера и она всегда правильно вычисляла
результат. В языке Си функции не могут самостоятельно определять размер массива, поэтому он должен быть обязательно одним из параметров.
#include "stdafx.h"
int Sum ( int A[], int N )//заголовокфункции Sum { int i, sum; sum = 0; for ( i = 0; i < N; i ++ ) sum += A[i]; return sum/N; //возврат вычисленного значения }
void main() { int x[5]={1,2,3,4,5},y[3]={11,22,33}; printf("\nsrx=%dsry=%d\n", Sum(x,5),Sum(y,3)); }
Обратите внимание, что в заголовке функции размер массива указан отдельно. Нельзя объявлять массив-параметр как A[N], а только как A[] или
*A.
Если в функцию передаётся двумерный массив, то описание соответствующего аргумента функции должно содержать количество столбцов; количество строк несущественно, поскольку фактически передаётся указатель.
Например: int Х[ ][5], или Х[5][5].
Общий вид описания бестиповой функции
Если функция должна вернуть несколько результатов, то этот возврат
реализуется с помощью указателей, т.е. параметров, передаваемых по адресу, и функция создается бестиповой. Если функция не должна возвращать результат, то она считается нетипизированной, что задается ключевым словом void, стоящим на месте типа. В этом случае оператор return в функции не требуется.
void Имя Функции(список формальных параметров) { Описание локальных переменных; Операторы тела функции;
}
10
Пример программы с бестиповой функцией
Рассмотрим пример функции, перемножающей матрицы А и В; результат –
матрица С. По правилам математики перемножать можно матрицы, размеры
которых (mxn) и (nxk) соответственно. Результирующая матрица будет иметь размеры (mxk).
const nmax = 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]; } }
Функция product в заголовке содержит список из шести формальных параметров. Первые три – для приема адресов трех матриц: двух исходных и
результирующей. Последующие три параметра примут копии значений
размеров матриц. В функции main() данная функция может использоваться так:
void main() {int А[nmax][nmax];
intВ[nmax][nmax]; int С[nmax][nmax];//объявление матриц
/*здесь произойдет заполнение матриц А и В исходными данными*/
product(A,B,C);
//здесь будет вывод матрицы С }
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]