Составление линейных программ на С++ 10


НазваниеСоставление линейных программ на С++ 10
страница6/26
ТипПрактическая работа
1   2   3   4   5   6   7   8   9   ...   26
Тема: Работа с функциями на языке С++

Цель: выработать практические навыки работы с функциями в системе, научиться создавать пользовательские функции, иметь представление об области видимости переменных.

Теоритические сведения

Выполнение предыдущих лабораторных работ показало, что программа на языке С++ состоит из последовательности операторов (простых и структурных). Кроме того, мы использовали заранее определенные встроенные в систему программирования функции. Однако С++ предоставляет возможность создавать новые наборы операторов и функций на основе стандартных. Такие функции принято называть пользовательскими.

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

Функция – это совокупность объявлений и операторов, предназначенная для решения определенной задачи. Обычно каждая функция в программе должна выполнять определенную задачу, иметь уникальное имя, которое используется для ее объявления, определения и вызова. В любой программе на С++ должна быть функция с именем main, именно с этой функции, в каком бы месте программы она не находилась, начинается выполнение программы.

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

Функция C++ по структуре подобна программе main, которая использовалась нами во всех предыдущих программах. Другими словами, имя функции предваряется ее типом, а за ним следует список параметров, описание которых появляется в скобках. Необходимо группировать операторы функций внутри левой и правой фигурных скобок, как показано ниже:

тип_возврата имя_функции (список_параметров)

{

объявления_переменных; операторы;

}

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

С использованием функций в языке С++ связаны три понятия – определение функции (описание действий, выполняемых функцией), объявление функции (задание формы обращения к функции) и вызов функции.

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

Следующие операторы определяют функцию с именем show_message, которая выводит сообщение на экран, используя cout. void show_message (void)

{ cout << "Привет, учусь программировать на C++" << endl; }

Из сказанного ранее известно, что слово void, предшествующее имени функции, указывает функции не возвращать значение. Подобно этому, слово void, содержащееся внутри круглых скобок, указывает (компилятору C++ и программистам, читающим ваш код), что функция не использует параметры (информацию, которую программа передает функции). Следующая программа использует определенную ранее функцию show_message для вывода сообщения на экран:

#include void show_message (void)

{

cout << "Привет, учусь программировать на C++" << endl;

}

void main (void)

{

cout << "Перед вызовом функции" << endl; show_message ();

cout << "Вернулись из функции" << endl;

}

Выполнение программы всегда начинается внутри main. Внутри main следующий оператор (вызов функции) вызывает функцию show_message:

show_message ();

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

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

Однако для того, чтобы компилятор мог осуществить проверку соответствия типов

передаваемых фактических параметров типам формальных параметров до вызова функции нужно поместить прототип функции.

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

вид

void show_message (void);

или
show_message (void);

Прототип – это явное объявление функции, которое предшествует определению функции. Тип возвращаемого значения при объявлении функции должен соответствовать типу возвращаемого значения в определении функции.

Наличие в прототипе полного списка типов аргументов параметров позволяет

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

прототипе можно указать, что число параметров функции переменно, или что функция не имеет параметров.

В программах на языке С++ широко используются, так называемые, библиотечные функции, т.е. функции предварительно разработанные и записанные в библиотеки. Функция возвращает значение, если ее выполнение заканчивается оператором return, содержащим некоторое выражение. Указанное выражение вычисляется, преобразуется, если необходимо, к типу возвращаемого значения и возвращается в точку вызова функции в качестве результата. Если оператор return не содержит выражения или выполнение функции завершается после выполнения последнего ее оператора (без выполнения оператора return), то возвращаемое значение не определено. Для функций, не использующих возвращаемое значение, должен быть использован тип void, указывающий на отсутствие возвращаемого значения. Если функция определена как функция, возвращающая некоторое значение, а в операторе return при выходе из нее отсутствует выражение, то поведение вызывающей функции после передачи ей управления может быть непредсказуемым.

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

Передача параметра на примере функции show_number (параметр типа int). void show_number (int value) {

cout << "Значение параметра равно " << value << endl; }

Вызывающая функцию show_number программа должна передать ей значение, как показано ниже:

show_number ( 1001 ) ; //Значение, передаваемое в функцию

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

#include

void show_number (int value)

{ cout << "Значение параметра равно " << value << endl; }

void main (void) {

show_number (1); show_number (1001); show_number (-532); }

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

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

Пример 1. Вычислить значения функции f(x)=2 cos x+3, при x={1; 4; 7,5; 20}. Вывести результаты в два столбца: в первом – значения x, во втором – значения f(x). Вычисления провести с помощью функции.

Решение. Аргумент и результат функции – действительные числа, поэтому используем тип float. В теле функции будет только оператор возврата значения функции – для вычисления значения выражения. Чтобы вывести результаты в виде таблицы, используем форматный вывод (с помощью управляющего метасимвола \t).

#include using namespace std; #include #include
// Описываем функцию float func(float x)
{ return (2*cos(x)+3); }

// Главная программа void main(){
float x, fx ; setlocale(LC_ALL, "Russian"); cout<<" x\tf(x)"<<"\n";
x=1; fx=func(x); cout<
Реализовав данную программу в интегрированной среде программирования, получим результирующее окно, представленное на рисунке 8.1.


Рис. 8.1. Окно выполнения задачи

Рекурсивный вызов функций

Любая функция в программе на языке С++ может быть вызвана рекурсивно, т.е. она может вызывать саму себя. Компилятор допускает любое число рекурсивных вызовов.

Классический пример рекурсии – это математическое определение факториала n!. Рекурсивная функция для вычисления факториала n! имеет следующий вид:

long fact(int n)

{ if (n==0) return 1;

return (n*fact(n-1)); // рекурсивный вызов !}

Эта функция может быть представлена более компактно (обратите внимание на то, как описаны параметры возврата для данной функции) – с использованием тернарной операции – операции условие (см. лабораторную работу № 2):

long fakt(int n)

{ return ((n==1) ? 1:n*fakt(n-1)); }

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

#include using namespace std; #include

long fakt(int n) {

return ((n==1) ? 1:n*fakt(n-1)); }

void main(){

int n; long f; setlocale(LC_ALL, "Russian"); cout<<"Введите число:"; cin>>n;

f=fakt(n); cout<<"Факториал: "; cout<
_getch(); }

Хотя компилятор языка С++ не ограничивает число рекурсивных вызовов функций, это число ограничивается ресурсом памяти компьютера и при слишком большом числе рекурсивных вызовов может произойти переполнение стека.

Пример 2. Создать рекурсивную функцию поиска i-го члена последовательности, заданной рекуррентной формулой A1=const1, A2=const2, Ai=3Ai-2-Ai-1. Вывести через пробел значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.

Решение. По условию задачи аргумент может принимать только целые значения, поэтому функция имеет параметр-значение типа int. Выход из рекурсии в данном случае осуществляется при двух значениях аргумента (при i=1, i=2), поэтому в рекурсивной функции необходимы два вложенных условных оператора или же оператор выбора switch. В приведенном примере использованы операторы if, но попробуйте самостоятельно записать решение с помощью оператора выбора. В основной программе значения аргумента – целые последовательные числа, поэтому следует воспользоваться оператором цикла с параметром for.

#include using namespace std; #include #include

// Описываем функцию int A (int )

if (i==1) return 1; else

if (i==2) return 3; else return (3*A(i-2)-A(i-1));

}// Главная программа void main() {

int i;

for (i=1; i<=10; i++) cout<
Реализовав данную программу в интегрированной среде программирования, получим результирующее окно, представленное на рисунке 8.2.




Рис. 8.2. Окно выполнения задачи.
Передача параметров функции main

Функция main, с которой начинается выполнение программы на языке С++, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют свои правила представления данных, а точнее, все данные представляются в виде строк символов. Для передачи этих строк в функцию main используются два параметра, первый параметр служит для передачи числа передаваемых строк, второй для передачи самих строк. Общепринятые (но не обязательные) имена этих параметров argc и argv. Параметр argc имеет тип int, его значение формируется из анализа командной строки и равно количеству слов в командной строке, включая и имя вызываемой программы (под словом понимается любой текст не содержащий символа пробел). Параметр argv – это массив указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.

Функция main может иметь и третий параметр, который принято называть argp, и который служит для передачи в функцию main параметров операционной системы (среды) в которой выполняется программа на языке C++.

Заголовок функции main имеет вид:

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

Если, например, командная строка программы на языке С++ имеет вид:

A:\>cprog.exe working 'C program' 1

то аргументы argc, argv, argp содержат следующие данные argc = 4

argv[0] = "A:\\cprog.exe" argv[1] = "working" argv[2] = "C program" argv[3] = "1"

argp[0] = "path=A:\\;C:\\" argp[1] = "lib=D:\\LIB"

argp[2] = "include=D:\\INCLUDE"

argp[3] = "conspec=C:\\COMMAND.COM"

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

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

{ int i=0;

printf ("\n Имя программы %s", argv[0]); for(i=1; i>=argc; i++)

printf ("\n аргумент %d равен %s", argv[i]); printf ("\n Параметры операционной системы:");

while(*argp)

{ printf ("\n %s",*argp); argp++; }

return (0); }

Область видимости переменных в функциях С/С++, расширение области видимости переменных

По месту объявления переменные в языке Си можно разделить на три класса:

a) локальные – переменные, которые объявляются внутри функции и доступны только в ней. Например:

int main()

{ float s; s=4.5; } int f1() { int s; s=6; }

int f2()

{ long int s;

s=25; }

В функции main определена вещественная переменная s (типа float), ей присвоено

значение 4.5, в функции f1 есть другая переменная s (типа int), ей присвоено значение 6, а

функции f2 есть еще одна переменная s (типа long int), ей присвоено значение 25.

глобальные – переменные, которые описаны до всех функций, они доступны из любой функции. Например:

float s; int main() { s=4.5; }

int f1()
{ s=6; } int f2() { s=25; }

Определена глобальная переменная s (типа float), в функции main ей присваивается значение 4.5, в функции f1 – присваивается значение 6, а в функции f2 – присваивается значение 25.

c) формальные параметры функций описываются в списке параметров функции. Рассмотрим особенности использования локальных и глобальных переменных в программах на С++:

1. Область видимости и использования локальной переменной ограничена функцией, где она определена.

глобальные переменные объявляются вне любых функций и их областью видимости является весь файл.

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

Из функции, где действует локальное описание переменной можно обратиться к глобальной переменной с таким же именем, используя оператор расширения области

видимости ::переменная.

Рассмотрим это на примере

#include using namespace std; #include float pr=100.678; int prostoe (int n)

{

int pr=1,i;

if (n<0) pr=0; else

for (i=2;i<=n/2;i++)

if (n%i==0){pr=0;break;}

Вывод локальной переменной cout<<"local pr="<

Вывод глобальной переменной cout<<"global pr="<<::pr<
}

int main() { int g; cout<<"g="; cin>>g;

if (prostoe(g)) cout<<"g - prostoe"; else cout<<"g - ne prostoe";

_getch(); return 0;

}

Результат работы программы представлен на рисунке 8.3.



Рис. 8.3. Окно выполнения задачи.

Задачи для индивидуального решения:

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

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

s  a 2 3 4

Вариант 2. Для правильного треугольника со стороной а построены вписанная и описанная окружности. Найти площадь образовавшегося кольца, используя функцию вычисления площади круга S=πR2. Для нахождения радиусов окружностей воспользуйтесь формулами:
R  a3 , r  a3 3 6

Вариант 3. Тариф предусматривает оплату телефонных разговоров следующим образом: при продолжительности разговора меньше P минут стоимость одной минуты составляет S1 копеек, в противном случае – S2 коп/мин (S1, S2, P – константы). Используя функцию вычисления стоимости одного разговора, найти суммарную стоимость трех звонков известной продолжительности.

Вариант 4. На товар дважды была сделана скидка – на p1, а затем на p2 процентов. Первоначальная стоимость товара составляла S рублей. Используя функцию вычисления стоимости товара с учетом скидки на P процентов, найти стоимость товара после двойной скидки.

C  100  P  S

100

Задание 2. Вывести значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.

Вариант 1. Найти член последовательности, заданной формулой: Di=7+Di-1 при i>1, где D1 определяется пользователем.

Вариант 2. Найти член последовательности, заданной формулой: Ai=Ai-1-Ai-2 при i>2. Значения первого и второго членов последовательности вводятся пользователем.

Вариант 3. Найти член последовательности, заданной следующим образом:

y1=0; y2=10; yn=2yn-1-yn-2, где n>2.

Вариант 4. Найти член последовательности, заданной формулой Bi=4·Bi-1, при i>1. Значения первого члена последовательности вводится пользователем.

Литература

Дж. Рихтер. Windowsдля профессионалов. – 3-е изд.: М: Русская редакция. 1993; 4-е изд: СПб: Русская редакция, 2001. – 752 с. [шифр библиотеки 681.3 Р-558]

Д. Круглински, С. Уинглоу, Дж. Шеферд. Программирование на MicrosoftVisualC++ 6.0 для профессионалов. – СПб: Питер, М: Русская редакция, 2001. – 864 с. [шифр библиотеки 681.3 К-844]

Архангельский А.Я. Программирование в C++Builder5. – М: БИНОМ, 2000. – 1152 с.

Вильямс А. Системное программирование в Windows2000 для профессионалов. – СПб.: Питер, 2001 – 624 с. [шифр библиотеки 681.3 В-467]

Оценка

Критерии

5

Студент написал правильно программу

4

Правильно написана программа, но есть не большие отклонения

3

Код программы написан, верно, но есть отклонения в работе программы

2

не справился с заданием (программа не написана)


Практическая работа №11

1   2   3   4   5   6   7   8   9   ...   26

Похожие:

Составление линейных программ на С++ 10 iconПорядок учетно-кадастровых процедур в отношении сооружений (линейных объектов недвижимости)
В соответствии с Федеральным законом от 24. 07. 2007 №221-фз «О государственном кадастре недвижимости» (далее Закон) в отношении...

Составление линейных программ на С++ 10 icon«Составление индивидуальных корреционно развивающих программ развития...

Составление линейных программ на С++ 10 iconО подготовке к государственной аккредитации образовательных программ в 2018 г
Количество образовательных программ бакалавриата, специалитета и магистратуры (без учета программ, реализация которых завершается...

Составление линейных программ на С++ 10 iconОао мгтс
...

Составление линейных программ на С++ 10 iconЛекция: Организация похода выходного дня
Составление плана подготовки и проведения путешествия. Разработка маршрута, подбор картографического материала, составление схемы...

Составление линейных программ на С++ 10 iconАдминистративный регламент №36
«Выдача разрешений на ввод линейных объектов, расположенных на территории двух и более поселений Добрянского муниципального района,...

Составление линейных программ на С++ 10 iconУльяновский институт повышения квалификации и переподготовки работников...
Портфолио учащегося: составление и использование: методические рекомендации./ Автор-составитель: Т. Б. Табарданова – Ульяновск: уипк...

Составление линейных программ на С++ 10 iconАннотация к рабочей программе профессионального модуля «Составление...
Рабочая программа профессионального модуля «Составление и использование бухгалтерской отчётности» является частью основной профессиональной...

Составление линейных программ на С++ 10 iconРабочая программа производственной практики пп. 03 Пм. 04 «Составление...
Программа практики является составной частью профессионального модуля 04 Составление и использование бухгалтерской отчетности основной...

Составление линейных программ на С++ 10 iconИ составление «рабочего» плана курсовой работы 7
Предварительная проработка литературы по теме и составление «рабочего» плана курсовой работы 7

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск