Практическое занятие №23

Федеральное государственное бюджетное образовательное учреждение

Высшего образования

«Поволжский государственный университет телекоммуникаций и информатики»

КОЛЛЕДЖ СВЯЗИ

УТВЕРЖДАЮ

Директор КС ПГУТИ

_____________Андреев Р.В.

«____»_________________2017г.

СБОРНИК

Практических занятий

по дисциплине

ОСНОВЫ ПРОГРАММИРОВАНИЯ

 

для специальностей: 09.02.03 – Программирование в компьютерных системах

                               

 

Номера занятий: № 22 – 35

Сборник рассчитан на 28 часа

 

 

Составлен преподавателем Игнатов А.С.

 

 

Рассмотрен на заседании П(Ц)К

«Информационных систем и технологий»

Протокол № __ от __________г.

Председатель П(Ц)К________Шомас Е.А.

 

Самара

2017 г

Перечень компетенций

Общие компетенции

ОК 1. Понимать сущность и социальную значимость своей будущей профессии, проявлять к ней устойчивый интерес;
ОК 2. Организовывать собственную деятельность, выбирать типовые методы и способы выполнения профессиональных задач, оценивать их эффективность и качество;
ОК 3. Принимать решения в стандартных и нестандартных ситуациях и нести за них ответственность;
ОК 4. Осуществлять поиск и использование информации, необходимой для эффективного выполнения профессиональных задач, профессионального и личностного развития;
ОК 5. Использовать информацион­но – коммуникационные технологии в профессиональной деятельности;
ОК 6. Работать в коллективе и в команде, эффективно общаться с коллегами, руководством, потребителями;
ОК 7. Брать на себя ответственность за работу членов команды (подчиненных), за результат выполнения заданий;
ОК 8. Самостоятельно определять задачи профессионального и личностного развития, заниматься самообразованием, осознанно планировать повышение квалификации;
ОК 9. Ориентироваться в условиях частой смены технологий в профессиональной деятельности.

Профессиональные компетенции

ПК 1.1 Выполнять разработку спецификаций отдельных компонент;
ПК 1.2. Осуществлять разработку кода программного продукта на основе готовыхспецификаций на уровне модуля;  
ПК 1.3. Выполнять отладку программных модулей с использованием специализированных программных средств;
ПК 1.4. Выполнять тестирование программных модулей;
ПК 1.5. Осуществлять оптимизацию программного кода модуля;
ПК 3.1. Анализировать проектную и техническую документацию на уровне взаимодействия компонент программного обеспечения;

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №22

HАИМЕНОВАНИЕ: Решение задач по обработке строк

1.ЦЕЛЬ РАБОТЫ:

Научится использовать строковые переменные при программирование на С++. Сформировать компетенции ОК 9,ОК3; овладеть знаниями и умениями для освоения

ПК 1.1.

2.ПОДГОТОВКА К ЗАНЯТИЮ:

2.1. Изучить предложенную литературу.

2.2. Подготовить бланк отчёта.

3.ЛИТЕРАТУРА:

3. 1 Игнатов А.С. Основы программирования. Учебное пособие, КС ПГУТИ, 2017

3.2 Белов В.В., Чистякова В.И. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное. Учебное пособие. – М.: Горячая линия – Телеком, 2014

 

4. ПЕРЕЧЕНЬ ОБОРУДОВАНИЯ И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ:          
4.1. Персональный IBM PC.

5.ЗАДАНИЕ:

5.1. Составить программу подсчета количества цифр в данной строке.

5.2. Составить программу, которая по данной символьной строке формирует числовой массив, содержащий коды символов, составляющихстроку.

5.3. Составить функцию, определяющую тождественность двух данных строк.

5.4. Составить программу, удаляющую в данной строке каждый символ с четным номером.

5.5. Составить функцию конкатенации (слияния) двух строк. В основной программе использовать эту функцию для слияния четырех строк.

5.6. Составить функцию, переводящую десятичное целое число, представленное в символьном виде, в соответствующую величину целого типа.

5.7. Составить функцию, переводящую десятичное вещественноечисло, представленное в символьном виде, в соответствующуювеличину плавающего типа.

6. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ:

6.1 По предложенной литературе изучить необходимый материал;

6.2 Выполнить задания;

6.3 Оформить отчет;

7. СОДЕРЖАНИЕ ОТЧЕТА:

7.1 Наименование и цель работы

7.2 Записать результат (листинг) выполненных заданий.

7.3 Ответы на контрольные вопросы

7.4 Вывод о проделанной работе

 

8. КОНТРОЛЬНЫЕ ВОПРОСЫ:

1. Что представляет собой составной оператор? Как ограничиваются операторы,

объединенные в составной оператор?

2. Назначение, формы записи и порядок выполнения оператора условия if?

3. Особенности использования вложенных условных операторов?

4. Каковы отличия оператора выбора case от оператора условия if?

ПРИЛОЖЕНИЕ:

В языках Си/Си++ нет специально определенного строкового типа данных, как в Турбо Паскале. Символьные строки организуются как массивы символов, последним из которых является символ \0, внутренний код которого равен нулю. Отсюда следует одно важное преимущество перед строками в Турбо Паскале, где размер строки не может превышать 255 (длина указывается в первом байте), — на длину символьного массива в Си нет ограничения. Строка описывается как символьный массив. Например: char STR[20];

Одновременно с описанием строка может инициализироваться. Возможны два способа инициализации строки — с помощью строковой константы и в виде списка символов:

char S[10]="строка";

char S[]="строка";

char S[10]={,c,,'T,,,p','o,,'K,,,a,,,\0'};

По результату первого описания под строку s будет выделено 10 байт памяти, из них первые 7 получат значения при инициализации (седьмой — нулевой символ). Второе описание сформирует строку из семи символов. Третье описание по результату равнозначно первому. Конечно, можно определить символьный массив и так:

char S [ 1 0 ] = { ' c,,,T,, ' p ',, o,, ' K,, ' a ' };

т.е. без нулевого символа в конце. Но это приведет к проблемам с обработкой такой строки, так как будет отсутствовать ориентир на его окончание. Отдельные символы строки идентифицируются индексированными именами. Например, в описанной выше строке s [ 0 ] =' с ',

S[5] = ' a \

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

и подсчет длины строки.


Пример 1.

//Замена символов на звездочки

•include <stdio.h>

•include <conio.h>

void main()

{ char S[]="fh5j";

int i=0;

clrscr();

puts(S);

230

while (S[i])

{S[i++]='*'; puts(S);}

printf("\n,Длина строки=",i);

}

В результате выполнения программы на экране получим:

fh5j

*h5j

**5j

• * * *

Длина строки=4

В этой программе цикл повторяет свое выполнение, пока s [i] не получит значение нулевого символа. Для вывода строки на экран в стандартной библиотеке stdio имеется функция puts (). Аргументом этой функции указывается имя строки. В этой же библиотеке есть функция ввода строки с клавиатуры с именем gets (). В качестве аргумента указывается имя строки, в которую производится ввод. Среди стандартных библиотек Си/Си++ существует библиотека функций для обработки строк. Ее заголовочный файл —

string.h. В следующем примере используется функция определения длины строки из этой библиотеки. Имя функции — strlen (). В качестве аргумента указывается имя строки.

Пример 2. Ввести символьную строку. Перевернуть (обратить) эту строку. Например, если ввели строку «abcdef», то в результате в ней должны получить «fedcba».

//Обращение строки

#include <stdio.h>

tinclude <string.h>

•include <conio.h>

void main()

{ char C,S[10];

int i;

clrscr ();

printf("Введите строку");

gets(S);

for(i=0; i<=(strlen(S)-l)/2; i++)

{ C=S[i]; S[i]=S[strlen(S)-i-1];

S[strlen(S)-i-l]=C;}

printf("ХпПеревернутая строка:");

puts(S);

}

Идея алгоритма состоит в перестановке символов, расположенных на одинаковом расстоянии от начала и конца строки. Перебор элементов строки доходит до ее середины. Составляя подобные программы, не надо забывать, что индекс первого символа строки — 0, а индекс последнего на единицу меньше длины строки.

Строка как параметр функции. Использование строк в качестве параметра функции аналогично рассмотренному выше использованию массивов других типов. Необходимо помнить, что имя массива есть указатель на его начало. Однако для строк имеется одно существенное отличие от массивов других типов: имя строки является указателем-переменной, и, следовательно, его значение может подвергаться изменению. Стандарт Си рекомендует в заголовках функций, работающих со строками, явно использовать обозначение символьного указателя.

Пример 1. Запишем определение функции вычисления длины

строки (аналог стандартной функции s t r l e n ()).

int length (char *s)

{ int k;

for(k=0; *s++! = '\0'; k++);

return k;

}

Здесь функция использует явный механизм работы с указателем. Изменение значения указателя s допустимо благодаря тому, что он является переменной. Еще раз напомним, что для числовых

массивов этого делать нельзя! Если соблюдать данное ограничение и для строк, то условное выражение в операторе for следовало бы писать так: *(s + k)! = ' \ 0 ' или s [ k ]! = ' \ 0 '.

Обдумайте это обстоятельство!

 

 

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №23

HАИМЕНОВАНИЕ: Составление и отладка программ с использованием функций

1.ЦЕЛЬ РАБОТЫ:

Научится использовать функции  при программирование на С++. Сформировать компетенции ОК 6, ОК8; овладеть знаниями и умениями для освоения ПК 1.3.

 

2.ПОДГОТОВКА К ЗАНЯТИЮ:

2.1. Изучить предложенную литературу.

2.2. Подготовить бланк отчёта.

3.ЛИТЕРАТУРА:

3. 1 Игнатов А.С. Основы программирования. Учебное пособие, КС ПГУТИ, 2017

3.2 Белов В.В., Чистякова В.И. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное. Учебное пособие. – М.: Горячая линия – Телеком, 2014

 

4. ПЕРЕЧЕНЬ ОБОРУДОВАНИЯ И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ:          
4.1. Персональный IBM PC.

5.ЗАДАНИЕ:

5.1. Найти ошибку в программе:

tinclude <iostream.h>

void main()

{int a=l, b=2, c;

c=sum(a,b);

cout«c;

}

int sum(int x,int y)

{return x+y;}

5.2. Определить результат выполнения программы:

#include <iostream.h>

void m u l (i n t, i n t);

i n t S;

void main ()

{int a=2,b=3;

mul(a,b);a=2*S;mul(a,b);

c o u t «S;

}

void mul (int x, i n t y)

{S=x*y;}

5.3. Составить программу для вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя функцию вычисления площади круга.

5.4. Даны три целых числа. Определить, сумма цифр которого из них больше. Подсчет суммы цифр организовать через функцию.

5.5. Составить функцию, определяющую, является ли ее целый аргумент простым числом. Использовать эту функцию для подсчета количества простых чисел в последовательности из десяти целых чисел, вводимых с клавиатуры.

5.6. Описать рекурсивную функцию stepen (x, n) от вещественного Х (Х ^ 0) и целого п, которая вычисляет величину х" согласно Формуле

5.7. Даны натуральные числа пит; найти НОД(л, т). Составить рекурсивную функцию вычисления НОД, основанную на соотношении НОД(л, /я)=НОД (т, г), где г — остаток от деления п на т (п >т).

6. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ:

6.1 По предложенной литературе изучить необходимый материал;

6.2 Выполнить задания;

6.3 Оформить отчет;

7. СОДЕРЖАНИЕ ОТЧЕТА:

7.1 Наименование и цель работы

7.2 Записать результат (листинг) выполненных заданий.

7.3 Ответы на контрольные вопросы

7.4 Вывод о проделанной работе

 

8. КОНТРОЛЬНЫЕ ВОПРОСЫ:

8.1. Что такое функция?

8.2.Что это за оператор  return и где применяется?

8.3 Формат определения функции?

8.4 Правило относящиеся к функциям?

8.5 Прототип функции?

8.6 Библиотечные функций?

8.7. Что такое typedef?

ПРИЛОЖЕНИE:

Определение функции. Обращение к функции. В Си используется лишь один тип подпрограмм — функция. Здесь вообще не принято употреблять термин «подпрограмма», потому что функция является основной программной единицей в Си, минимальным исполняемым программным модулем. Всякая программа обязательно включает в себя основную функцию с именем main. Если в программе используются и другие функции, то они выполняют роль подпрограмм.

Рассмотрим пример. Требуется составить программу нахождения наибольшего значения из трех величин — max (а, b, с). Для ее решения можно использовать вспомогательный алгоритм нахождения максимального значения из двух, поскольку справедливо

равенство: max (a, b, с) = max (max (A, b), с).

Вот программа решения этой задачи с использованием вспомогательной функции.

Пример 1.

•include <iostream.h>

//Определение вспомогательной функции

int MAX(int x, int у)

{ if (x>y) return х;

else return у;

}

//Основная функция

void main ()

{ int a,b,c,d;

cout<<"BBeflHTe a,b,c:";

cin>>a>>b>>c;

d=MAX(MAX(a,b),c);

cout«"\nmax (a, b, c) = "«d;

}

Формат определения функции следующий: тип имя_функции (спецификация_параметров) {тело_ функции} Тип функции — это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для нее указывается тип void.

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

Тело функции — это либо составной оператор, либо блок. Здесь мы впервые встречаемся с понятием блока. Признакомблока является наличие описаний программных объектов (переменных,массивов и т.д.), которые действуют в пределах этогоблока. Блок, как и составной оператор, ограничивается фигурнымискобками.В Си действует правило: тело функции не может содержать в себе определения других функций. Иначе говоря, недопустимы внутренниефункции, как это делается в Паскале. Из всякой функциивозможно обращение к другим функциям, однако они всегда являютсявнешними по отношению к вызывающей.Оператором возврата из функции в точку ее вызова является операторreturn. Он может использоваться в функциях в двух формах:return; или return выражение;В первом случае функция не возвращает никакого значения в качествесвоего результата. Во втором случае результатом функции являетсязначение указанного выражения. Тип этого выражения долженлибо совпадать с типом функции, либо относиться к числу типов,допускающих автоматическое преобразование к типу функции.Оператор return может в явном виде отсутствовать в теле функции.В таком случае его присутствие подразумевается перед закрывающейтело функции фигурной скобкой. Такая подстановкапроизводится компилятором.Формат обращения к функции (вызова функции) традиционный:имя_функции(список_фактических_праметров)

Однако в Си обращение к функции имеет своеобразную трактовку: обращение к функции — это выражение. В этом выражении круглые скобки играют роль знака операции, для которой функция и фактические параметры (аргументы) являются операндами. Приоритет операции «скобки» самый высокий, поэтому вычисление функции в выражениях производится раньше других операций. Между формальными и фактическими параметрами при вызове функции должны соблюдаться правила соответствия по последовательности и по типам. Фактический параметр — это выражение того же типа, что и у соответствующего ему формального параметра. Стандарт языка Си допускает автоматическое преобразование значений фактических параметров к типу формальных параметров. В Си++ такое преобразование не предусмотрено. Поэтому в дальнейшем мы будем строго следовать принципу соответствия типов.

Необходимо усвоить еще один важнейший принцип, действующий в Си/Си++: передача параметров при вызове функции происходит только по значению. Если снова проводить аналогию с Паскалем, то это значит, что в Си допустимы только параметры-значения (без var). Поэтому выполнение функции не может изменить значения переменных, указанных в качестве фактических параметров.

Правило соответствия по количеству, обязательное в Паскале, в Си в некоторых случаях может не соблюдаться. Более того, в Си возможны функции с переменным числом параметров. Примером таких функций являются библиотечные функции p r i n t f () и scanf ().

Прототип функции. Оказывается, совсем не обязательно было в предыдущем примере помещать полное определение функции МАХ () перед основной частью программы. Вот другой вариант программы, решающей ту же самую задачу.

Пример 2.

tinclude <iostream.h>

//Прототип функции МАХ

int MAX(int, int);

//Основная функция

void main ()

{ int a,b,c,d;

сои1:<<"Введите a, b, c: ";

c i n» a» b» c;

d=MAX(MAX(a,b),c);

cout«"\nmax (a, b, c) = " «d;

}

//Определение функции MAX

int MAX (int x, int y)

{ if (x>y) return x;

else return y;

}

Здесь использован прототип функции. Прототипом называется предварительное описание функции, в котором содержатся все необходимые сведения для правильного обращения к ней: имя и тип функции, типы формальных параметров. В прототипе имена формальных параметров указывать необязательно (как это сделано в примере 2), хотя их указание не является ошибочным. Можно было написать и так, как в заголовке определения функции:

i n t MAX(int x, i n t у);

Точка с запятой в конце прототипа ставится обязательно!

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

состоящую из 80 звездочек.

Пример 3.

tinclude <iostream.h>

//Прототип функции line

void line (void);

//Основная функция

void main ()

{ line (); //Вызов функции line

}

//Определение функции line

void line (void)

{ int i;

for(i=0; i<80; i++) cout«"*";

}

А теперь сопоставим программу на Паскале для вычисления наибольшего общего делителя для суммы, разности и произведения двух чисел с аналогичной программой на Си++.

 

У читателя может возникнуть вопрос: если основная часть программы является функцией, то кто (или что) ее вызывает? Ответ состоит в следующем: программу вызывает операционная система

при запуске программы на исполнение. И в принципе main-функция совсем не обязательно должна иметь тип void. Например, она может возвращать операционной системе целое значение 1 в качестве признака благополучного завершения программы и 0 — в «аварийном» случае. Обработка этих сообщений будет осуществляться системными средствами.

Использование библиотечных функций. Библиотечными называются вспомогательные функции, хранящиеся в отдельных файлах. Стандартные библиотеки входят в стандартный комплект системы программирования на Си/Си++. Кроме того, программист может создавать собственные библиотеки функций. Ранее уже говорилось о том, что для использования стандартных функций необходимо подключать к программе заголовочные файлы соответствующих библиотек. Делается это с помощью директивы претранслятора #include с указанием имени заголовочного файла. Например, #include <stdio.h>. Все заголовочные файлы имеют расширение h (от английского header). Теперь должно быть понятно, что эти файлы содержат прототипы функций библиотеки. На стадии претрансляции происходит подстановка прототипов перед основной функцией, после чего компилятор в состоянии контролировать

правильность обращения к функциям. Сами программы, реализующие функции, хранятся в форме объектного кода и подключаются к основной программе на стадии редактирования связей (при работе компоновщика). Рассмотрим программу решения следующей задачи: зная декартовы координаты вершин выпуклого четырехугольника, вычислить его площадь (рис. 45).

Математическое решение этой задачи следующее. Обозначим координаты вершин четырехугольника так: (х1,у1), (х2,у2), (х3, х3), (х4, уА). Площадь четырехугольника можно вычислить как сумму площадей двух треугольников. В свою очередь, площадь каждого

треугольника вычисляется по формуле Герона. Для применения формулы Герона нужно найти

длины сторон. Длина стороны между первой и второй вершинами вычисляется по формуле:

Ln = J(x\-x2)2 + (yl~y2)2.

Аналогично вычисляются длины других отрезков. Таким образом, для решения

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

Ниже приведена программа решения поставленной задачи.

Пример 5.

//Площадь выпуклого четырехугольника

#include <iostream.h>

linclude <math.h>

#include <conio.h>

typedef double D; //Переименование типа double

D Line(D,D,D,D); //Прототип функции Line

D Geron(D,D,D,D,D,D); // Прототип функции Geron

//Основная функция

void main ()

{ D xl,yl,x2,y2,x3,y3,x4,y4,S1234;

clrscr();

cout«"yl=";

cout«"y2=";

cout«"y3=";

cout«"y4 = ";

cin»yl;

cin»y2;

cin»y3;

cin»y4;

cout«"xl="; cin»xl

cout«"x2="; cin»x2

cout«"x3="; cin»x3

cout«"x4 = "; cin»x4

S1234=Geron(xl,yl,x2,y2,x3,y3)

+Geron(xl,yl,x3,уЗ, х4,у4);

cout«"Плoщaдь четырехугольника="«31234;

}

//Определение функции Line

D Line(D a,D b,D c,D d)

{return sqrt((a-c)*(a-c)+(b-d)*(b-d));}

//Определение функции Geron

D Geron(D al,D a2,D bl,D b2,D cl,D c2)

{D p,ab,bc,ca;

ab=Line(al,a2,bl,b2); bc=Line(bl,b2,cl,c2);

ca=Line(cl,c2,al,a2);

p=(ab+bc+ca)/2;

return sqrt(p*(p-ab)*(p-bc)*(p-ca));

}

В этой программе используются функции из трех стандартных библиотек с заголовочными файлами iostream.h, math.h и conio. h. С первыми двумя мы уже встречались раньше. Третья библиотека (файл conio. h) содержит функции, предназначенные для управления выводом на экран в символьном режиме. Она является аналогом модуля CRT в Турбо Паскале. В программе из этой библиотеки используется функция c l r s c r () — очистка экрана. Еще одним новым элементом в приведенной программе является строка

typedef double D;

Служебное слово typedef представляет собой спецификатор типа, позволяющий определять синонимы для обозначения типов. В результате в рассматриваемой программе вместо длинного слова double для обозначения того же самого типа можно употреблять одну букву D. Данное описание действует глобально и распространяется как на основную, так и на вспомогательные функции. Обратим внимание на еще одно обстоятельство. В функции Geron имеются обращения к функции Line, а в основной функции — обращение только к функции Geron. Для компилятора важно, чтобы перед вызывающей функцией присутствовал или прототип, или определение

вызываемой функции. Поэтому если из данной программы убрать прототип функции Line, то ошибки не будет. Но если одновременно с этим поменять местами определения функций Line и Geron, то компилятор выдаст сообщение об ошибке.

 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: