Главная страница

КР по ОАиП для заочников. Основы алгоритмизации и программирования


Скачать 1.08 Mb.
НазваниеОсновы алгоритмизации и программирования
АнкорКР по ОАиП для заочников.pdf
Дата09.09.2018
Размер1.08 Mb.
Формат файлаpdf
Имя файлаКР по ОАиП для заочников.pdf
ТипДокументы
#24304
страница3 из 5
1   2   3   4   5
continue;
continue;
оператор
;
оператор
; } while (
условие
);
}
3.5. Объявление функции
Функция – это последовательность операторов, оформленная таким обра- зом, что ее можно вызвать по имени из любого места программы. Функция
описывается следующим образом:
тип_возвращаемого_значения имя_функции
(
список_параметров
)
{
тело функции
}
Первая строка описания называется заголовком функции.
Тип_возвращаемого_значения может быть любым, кроме массива или
функции. Допустимо не возвращать никакого значения (тип
void
).
Список параметров представляет собой список конструкций следующей формы:
тип параметра имя параметра
Например:
int Sum (int a, double b, char c);
void Prints (char c, int f);

23
Если функция не получает никаких данных, то скобки остаются пустыми:
int Mem ();
Как правило, помимо описания функции в программу вставляется прото-
тип функции (ее предварительное объявление). Прототип аналогичен заголов- ку функции, только на конце его ставится точка с запятой, а имена формальных параметров не указываются (остаются только типы):
int Sum (int, double, char);
Правила оформления тела функции такие же, как и любого другого участ- ка программы. Все объявления носят локальный характер, т.е. объявленные пе- ременные доступны только внутри функции.
В С++ не допускается вложение функций друг в друга.
Выход из функции осуществляется следующими способами:
1. Если нет необходимости возвращать вычисленное значение, то выход осуществляется по достижении закрывающей скобки или при выполнении опе- ратора
return
2. Если необходимо вернуть полученное значение, то выход осуществляет- ся оператором
return
выражение
;
3.6. Передача параметров
При работе важно соблюдать следующее правило: при объявлении и вызо- ве функции параметры должны соответствовать по количеству, порядку следо-
вания и типам. Функция может не иметь параметров, в этом случае после име- ни функции обязательно ставятся круглые скобки. Существует три основных способа передачи параметров: передача по значению, по ссылке или по указа- телю.
3.6.1. Передача параметров по значению
В момент обращения к функции в памяти создаются временные перемен- ные с именами, указанными в списке параметров, в которые копируются значе- ния фактических (передаваемых в функцию) параметров. После завершения ра- боты функции временные переменные удаляются из памяти.
Пример. Вычислить сумму двух переменных
x
и
y.
double Sum(double a, double b)
{
return a+b;
// Вычисление и передача результата
}
… s =Sum (x, y);
// Вызов функции
Sum
Функция
Sum не может изменить значения используемых при вызове функции переменных
x и
y
, так как работает только с их локальными копиями.

24
3.6.2. Передача параметров по ссылке
При передаче параметров по ссылке передается адрес соответствующей переменной, а не ее значение. Для получения адреса используется операция разадресации («
&
»).
Пример. Поменять местами значения двух переменных
x
и
y.
void Swap_Ref (double &a, double &b)
{ int tmp = a; a = b; b = tmp;
}

Swap_Ref (x, y);
//
Вызов функции
Swap_Ref
При таком способе передачи параметры
a и
b
будут инициализированы в качестве псевдонимов переменных-аргументов
x и
y
. Поэтому любые измене- ния параметров
a и
b
будут приводить к соответствующему изменению пере- менных
x и
y
3.6.3. Передача параметров по указателю
Так же как и при передаче параметров по ссылке, в данном способе ис- пользуется не значение соответствующей переменной, а ее адрес. Отличие от предыдущего способа состоит в том, что используется операция косвенной
адресации (*).
Пример. Поменять местами значения двух переменных
x
и
y
void Swap_Ptr (double *a, double *b)
{ double tmp= *a;
*a = *b;
*b = tmp;
}

Swap_Ptr (&x, &y);
//
Вызов функции
Swap_Ptr
Функция
Swap_Ptr
требует явного указания адресов при своем вызове
(&x, &y) и явного их разыменования в функции (
*
a и
*b)
3.7. Перегрузка функций
В С++ допустимо использование нескольких функций с одинаковым име- нем, но различным числом или типами параметров. Такое свойство называется
перегрузкой функций. Перегруженные функции различаются компилятором по
типам и числу параметров.
Пример. Написать функцию, суммирующую два или три целых числа.
#include
#include

25
// Прототипы функций
int Sum(int, int);
int Sum(int, int, int);
int main()
{ cout << Sum(5, 3) << endl; cout << Sum(5, 3, 11) << endl;
return 0;
}
int Sum(int a, int b)
//
Функция суммирования двух чисел
{
return a+b;
}
int Sum(int a, int b, int c)
//
Функция суммирования трех чисел
{
return a+b+c;
}
3.8. Отладка программы
Для поиска логических ошибок используется встроенный отладчик.
Для пошагового выполнения программы необходимо нажимать клавишу
F10
. При каждом нажатии выполняется текущая строка. Если необходимо по- шагово проверить код вызываемой функции, то следует нажать
F11
. Для дос- рочного выхода из функции нажать
Shift+F11
. Еслинеобходимо начать отлад- ку с определенного места программы, то надо установить курсор в соответст- вующую строку программы и нажать
Ctrl+F10
Другим способом отладки является установка точек прерывания програм- мы. Для этого надо поместить курсор в нужную строку и нажать
F9
. Точка пре- рывания обозначается красным кружком на специальном поле, расположенном слева от окна кода программы. Для удаления точки прерывания следует в необ- ходимой строке повторно нажать
F9
. Количество точек прерывания в програм- ме может быть любым.
Для выполнения программы до точки прерывания необходимо нажать
F5
Для продолжения отладки применяется клавиша
F5
(выполнение программы до следующей точки прерывания) или используются клавиши для пошаговой от- ладки.
Желтая стрелка на поле слева от окна кода программы указывает на строку, которая будет выполнена на следующем шаге отладки.
Для контроля за значениями переменных удобно использовать следующий способ: подвести указатель мыши к интересующей переменной и задержать его на несколько секунд. На экране рядом с именем переменной появится окно, со- держащее текущее значение этой переменной. Кроме этого, значения перемен- ных будут отображаться в окнах, расположенных снизу. В левом нижнем окне ото- бражаются значения последних использованных программой переменных. В пра-

26 вом нижнем окне (
Watch
) можно задать имена переменных, значения которых необходимо контролировать.
3.9. Пример выполнения задания
Написать программу вывода на экран таблицы значений функции
20 0
2
cos ( )
k
k
k
x
x


для x, изменяющегося от a = 0,1 до b = 1 с шагом h = 0,1. Вычисле-
ние суммы оформить в виде функции пользователя. Предусмотреть передачу
параметров в функцию разными способами.
Блок-схема алгоритма
Код программы
#include
#include
#include
//
Прототипы функций

27 double Summa (double, int);
//
Передача параметров по значению
void Summa (double*, int*,double*);
//
Передача параметров по указателю
void Summa (double&, int&,double&);
//
Передача параметров по ссылке
int main()
{ double s, x, a, b, h; int k; cout<<"Vvedite a, b, h, k:\n"; cin>>a>>b>>h>>k;
//
Ввод значений:: 0.1 1 0.1 20
// Вывод строки заголовка таблицы
cout<<"\n Value"< //
Начало цикла по x
{
// Вывод таблицы
//
Передача параметров по значению
cout< Summa (&x, &k,&s);
//
Передача параметров по указателю
cout< Summa (x, k, s);
//
Передача параметров по ссылке
cout< //
Изменение значения x на величину шага h
} while (x<=b+h/2);
//
Проверка условия продолжения цикла по x cout< //
Переход на новую строку
return 0;
} double Summa (double x, int k)
//
Передача параметров по значению
{ double s; int i; s=2;
//
Начальное значение при
k=0 for (i=1; i<=k; i++)
//
Вычисление суммы
20 1
2
cos ( )
k
k
k
x
x


s+=2*pow(x,i)/pow(cos(x),i); return s;
//
Передача результата
s
в главную функцию
}
//
Передача параметров по указателю
void Summa (double *x, int *k, double *s)
{ int i;
*s=2;
//
Начальное значение при
k=0

28 for (i=1; i<=*k; i++)
//
Вычисление суммы
20 1
2
cos ( )
k
k
k
x
x


*s+=2*pow(*x, i)/pow(cos(*x),i);
}
//
Передача параметров по ссылке
void Summa (double &x, int &k, double &s)
{ int i; s=2;
//
Начальное значение при
k=0 for (i=1; i<=k; i++)
//
Вычисление суммы
20 1
2
cos ( )
k
n
k
x
x


s+=2*pow(x,i)/pow(cos(x),i);
}
Рисунок 4 – Результат выполнения программы
3.10. Индивидуальные задания
Составить согласно индивидуальному варианту блок-схему алгоритма и
программу вывода на экран таблицы значений функции y(x) для x, изменяюще-
гося от a=0,1 до b=1,2 с шагом h=0,1. Вычисление y(x) оформить в виде функ-
ции. Предусмотреть передачу параметров в функцию разными способами.

29
1.
1 20 1
2 1
n
n
x
y
n





2.
20 0
(2 )
1
n
n
x
y
n




3.
1 20 1
sin(
)
n
n
x
y
nx




4.
2 20 1
1 2
n
n
n
x
y
n

  

 
 

5.
20 1
cos
4 1
n
n
n
y
x
n












6.
2 2
20 1
2 1
n
n
x
y
n





7.
2 20 0
cos(
)
n
n
x
y
nx



8.
2 20 2
2 1
2 1
2
n
n
n
y
x
n





9.
20 1
1 2
1
sin(
)
n
n
n
y
x
nx





10.
20 0
cos ( )
2 1
n
n
x
y
n




11.
1 20 1
sin(2
)
n
n
n x
y
n
x






12.
1 20 1
(1
)
sin ( )
n
n
n
x
y
x





13.
2 2
20 2
1 4cos(
)
n
n
x
y
nx




14.
2 20 1
1
(2 1)
n
n
n
y
x
n





15.
20 2
1
cos
4
n
n
n
y
x
n











30
ЗАДАНИЕ №4
ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ
ОДНОМЕРНЫХ МАССИВОВ
4.1. Одномерные статические массивы
Массив – это набор данных одинакового типа, расположенных в непре- рывной области памяти таким образом, чтобы по индексу элемента можно было вычислить адрес его значения: адрес(a[i]) = адрес(a[0]) + i*k, где
k
– количество байт, отводимых под элемент массива;
i
– индекс элемента массива.
Для доступа к элементу массива необходимо указать его имя и индекс (по- рядковый номер элемента в масиве):
имя_массива [индекс]
В программе одномерный массив объявляется следующим образом:
тип
имя_массива
[
размер
];
Пример декларации массива:
int mas[4];
Индексы в массиве начинаются с 0, т. е. массив, приведенный в примере, будет содержать следующие элементы: mas[0], mas[1], mas[2] и mas[3]. Выход
индекса за пределы массива не проверяется.
Пример 1. Найти произведение нечетных элементов массива, расположен- ных до первого нулевого элемента.
for (pr=1,k=i=0; i //
пока
a
i
≠0
if (a[i]%2) {
// a
i
-
нечетное
pr*= a[i]; k++;
}
if (!k) pr=0; // если таких элементов нет, то произведение =0
Пример 2. Упорядочить элементы массива по возрастанию их значений,
т.е. для всех элементов массива должно выполняться условие: a
i
< a
i+1
.

for (k=1; k// k
– номер просмотра массива
for (i=0; i //
Просмотр
элементов
массива
if (a[i] > a[i+1])
//
Сравнение
элементов
массива
{ temp=a[i];
//
Перестановка
элементов
a
i
и
a
i+1
, a[i]=a[i+1];
//
если
они стоят неправильно
a[i+1]=temp;
}
Пример 3.Удалить из одномерного массива все отрицательные элементы

31
Для решения данной задачи необходимо выполнить следующие действия:

for (i=0; i<n; i++)
if (a[i]<0)
// Если найден отрицательный элемент, то
{
for (j=i+1; j //
сдвинуть все элементы, стоящие
a[j-1]=a[j];
//
после удаляемого на одну позицию
n--;
//
Уменьшение размера массива
i--;
//
Возврат к предыдущему индексу
}
Пример 4.Даныодномерные упорядоченные по возрастанию массивы: X
размером n элементов и Y размером m элементов. Объединить элементы этих
массивов в массив Z так, чтобы и он оказался упорядоченным по возрастанию.
… k=i=j=0;
while(i{
if (a[i] }
else { c[k]=b[j]; j++;
} k++;
}
while(i { c[k]=a[i]; i++; k++;
}
while(j{ c[k]=b[j]; j++; k++;
}
4.2. Пример выполнения задания
Составить программу поиска минимального и максимального элементов
одномерного массива и их индексов.
#include
#include
#include void MinMax (int a[],int,int*,int*,int*,int*);
//
Прототип
функции

32 int main()
{
int a[10], i, n, min, imin, max, imax;
cout<<"Vvedite razmer massiva: ";
//
Ввод размерности массива
cin>>n;
cout<<"\nVvedite massiv:\n";
for (i=0; i //
Ввод одномерного массива
{
cout<<"Vvedite a["< cin>>a[i];
}
cout<<"\nMassiv a:\n";
//
Вывод одномерного массива
for (i=0; i cout< cout< MinMax (a, n, &min, &max, &imin, &imax);
//
Вызов функции
cout<<"\nMax="< cout<<"\nMin="< return 0;
}
//
Функция
поиска минимального и максимального элементов
//
одномерного массива и их индексов
void
1   2   3   4   5


написать администратору сайта