КР по ОАиП для заочников. Основы алгоритмизации и программирования
Скачать 1.08 Mb.
|
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< // Передача параметров по указателю cout< // Передача параметров по ссылке 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 – номер просмотра массива 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 } while(j } 4.2. Пример выполнения задания Составить программу поиска минимального и максимального элементов одномерного массива и их индексов. #include #include #include // Прототип функции 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<<"\nMax="< } // Функция поиска минимального и максимального элементов // одномерного массива и их индексов void |