Программирование C++. Пензенский государственный университет введение в программирование на языке с лабораторный практикум пенза 2010 г 2
Скачать 1.47 Mb.
|
return 0; } Вариант 2. #include using std::cin; using std::cout; using std::endl; int main() { int num; cout << Введите целое число :" ; cin>>num; int half, div; for (half = num/2, div=2; div<=half; ++div) if (!(num%div)) cout < system( "pause" ); return 0; } Пример 1_8_5. Вычисление квадратного корня вещественного аргумента x с заданной точностью Eps по итерационной формуле ) ( 2 1 1 1 n n n y x y y , где 1 n y , n y – предыдущее и последующее приближения корня соответственно. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее чем на величину для функции system #include #include double x, Eps; аргумент и точность double yp, y = 1; предыдущее и последующее приближение корня printf (Введите аргумент и точность : " ); scanf ( "%lf%lf" , &x, &Eps); do { yp = y; y = (yp + x/yp)/2; } while (fabs(y - yp) >= Eps); printf (Корень из %lf равен %lf" , x, y); system( "pause" ); return 0; } 18 Задания для самостоятельной работы 1.9.1 Составление простых программ 1) Написать программу вывода таблицы истинности для логической операции a. ИЛИ b. И c. НЕ d. Исключающее ИЛИ. Если операнды имеют различные значения, то значение операция Исключающее ИЛИ – true , в противном случае – false 2) Написать программу, которая преобразует дробное число в денежный формат. Например, число 25.5 преобразуется в 25 рублей 50 копеек. 3) Написать программу, которая пересчитывает временной интервал, заданный в минутах, в количество часов и минут. Например, число 150 преобразуется в 2 часа 30 минут. 4) Написать программу, которая переводит вес, заданный в фунтах, в килограммы (1 российский фунт = 409.5 грамма. 5) Написать программу, которая вычисляет площадь треугольника, если известны координаты его углов x 1 , y 1 ; x 2 , y 2 ; x 3 , y 3 : )) ( ) ( ) ( ) (( 2 1 3 1 3 2 3 2 3 1 y y x x y y x x S 6) Написать программу, которая вычисляет время, через которое встретятся движущиеся навстречу друг другу автомобили, если их скорости V 1 и V 2 , а начальное расстояние между ними – S. 7) Написать программу, рассчитывающую расстояние, которое пройдет автобус (его скорость V 1 ) пока его не догонит легковой автомобиль. Легковой автомобиль отправляется из того же пункта, что и автобус, с задержкой в 30 минут. Скорость автомобиля – V 2 8) Программа печатает квадрат на экране из символов ' ' и '' (пробел 9) Программа выводит на экран рисунок, состоящий из символов ' ' и '': a) b) c) d) 10) Программа считывает с клавиатуры радиус круга и выводит на экран значения диаметра, длины окружности и площади круга. Вычисления выполнить в операторе вывода. Число принять равным 3.14159. 19 1.9.2 Программирование с использованием управляющих структур Напишите программу, которая осуществляет обработку информации по одному из условий, заданных ниже. 1) Присвоить переменной К значение 1, если два числа из трех чисел x, y, z являются положительными и кратными 3, и значение 0 в противном случае. 2) Найти наименьшее из трех чисел x, y, z. 3) Присвоить переменной К значение true, если точка с координатами x, y принадлежит заданнойобласти, и значение false в противном случае 1 -1 -1 1 x y 0 1 -1 -1 1 x y 0 1 -1 -1 1 x y 0 f) b) c) 1 -1 -1 1 x y 0 d) 1 -1 -1 1 x y 0 e) 1 -1 -1 1 x y 0 a) 4) Дано натуральное число N. Определить a) Количество цифр 7 в этом числе b) Произведение цифр заданного натурального числа c) Определить число, получаемое выписыванием в обратном порядке цифр заданного натурального числа d) Является ли заданное натуральное число палиндромом, те. таким, десятичная запись которого читается одинаково слева направо и справа налево e) Сколько чисел натурального ряда необходимо перемножить, чтобы их произведение превысило заданное натуральное число 5) Определить десятичный эквивалент целого положительного двоичного числа К. 6) Определить двоичный эквивалент целого положительного десятичного числа N. 7) Вычислить сумму a. 99 96 9 6 3 b. 201 199 1 5 3 1 3 1 1 c. ) 43 1 41 1 39 1 37 1 35 1 33 1 )...( 13 1 11 1 9 1 )( 7 1 5 1 ( 3 1 d. ! 1 2 1 ! 5 ! 3 1 2 5 3 n x x x x n n с точностью 0.001 8) Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Какой суммарный путь пробежит спортсмен задней) Вычислить приближенную площадь одной арки косинусоиды, разделив отрезок от –π/2 дона частей и суммируя площади десяти прямоугольников с основанием π/10 и высотой, равной значению функции на правой границе каждого интервала. 10) Найти три таких целых числа a, b ив диапазоне от 0 до 20, для которых справедливо равенство Пифагора a 2 + b 2 = c 2 21 2. ФУНКЦИИ. ОТ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ К МОДУЛЬНОМУ Очевидно, что сложные программы составляются из концептуальных блоков, значительно более крупных, чем отдельные операторы языка программирования. Такими блоками являются функции подпрограммы) и модули. Декомпозиция (разбиение) программы на небольшие логически завершенные блоки – это один из основных путей написания программы в ясной и понятной форме. В процессе конструирования программ используются функции, которые поставляются в составе стандартных библиотека также функции, которые пишет сам разработчик программы. Группировка функций и связанных сними данных в отдельные файлы – модули – повышает уровень абстракции программы и ведет к упрощению ее структуры. Определение и вызов функций Функция это логически завершенный компонент программы, предназначеннй для решения опредееной задачи. Функция представляет собой последовательность операторов обработки данных, которая преобразует конкретный набор аргументов в некоторый набор результатов. Определение функции – это программнй код, который описывает, что делает функция. Определение состоит из двух частей прототипа и реализации. Прототип заголовок, сигнатура) функции включает тип возвращаемого значения. Если функция не возвращает значение, то тип – имя функции формальные параметры аргументы и результаты. Параметры могут отсутствовать. Реализация функции ( тело функции) включает описание локальных данных операторы, задающие действия, которые должна выполнить функция. В Св тело функции НЕ могут входить определения других функций. Формально определение функции выглядит так тип имя (список_параметров) //прототип,заголовок функции реализация функции объявление локальных данных могут отсутствовать операторы; } Локальные данные и операторы инка пс ул и ров ан ы (спрятаны, так что ни локальные данные, ни операторы по отдельности недоступны пользователю функции. Пользователь может только вызвать функцию. Вызывающая программа – это программа (функция, которая обращается к функции вызывает функцию. Оператор вызова – оператор вызывающей программы, с помощью которого она обращается к функции. Оператор вызова содержит имя функции список фактических параметров. Фактические параметры это элементы вызывающей программы константы, переменные, массивы и другие, значения которых передаются в функцию или возвращаются из нее. При вызове функции значения фактических параметров присваиваются соответствующим формальным параметрам типы фактических и формальных параметров должны совпадать Схема передачи управления между вызывающей программой и функцией приведена на рисунке 2.1. Рисунок 2.1 – Схема передачи управления между вызывающей программой и функцией Пример Программа нахождения максимума из трех чисел Вариант 1 #include using std::endl; using std::cout; using std::cin; функция находит максимум из двух целых чисел int max2( int a, int b) заголовок функции { тело функции if (a>b) return a; // return – оператор возврата значения в вызывающую программу b; } int main() // main – это тоже функция использование функции max для нахождения большего из a, b, c int a, b, c, d; cout << Введите ас вызов функции max с параметрами a, b // d = результат функции max – большее из a, b d = max2(d, c); вызов функции max с параметрами d, c // d = результат функции max – большее из d, c – большее из a, b, c cout << Максимальное число - " << d< system( "pause" ); return 0; } 23 Вариант 2 #include using std::endl; using std::cout; using std::cin; int max2( int , int ); прототип функции имена параметров можно не указывать int main() { использование функции max для нахождения большего из a,b,c int a, b, c, d; локальные переменные функции main cout << Введите ас вызов функции max как параметр функции порядок вызовов max как в варианте 1 примера 2_1 cout << Максимальное число - " << d< system( "pause" ); return 0; } функция находит максимум из двух целых чисел int max2( int a, int b) заголовок функции { тело функции int d; локальная переменная, доступна только в функции max a>b? d=a : d=b; return d; } Глобальные данные и параметры Обмен информацией между вызывающей программами и функциями может осуществляться с использованием глобальных данных (рисунок 2.2) или передачей параметров. Функция Главная программа П рог рам м а Глобальные данные ( объявляются вначале программы и доступны во всей программе) Локальные данные функции ( объявляются в функции, недоступны за ее пределами) Локальные данные главной программы ( объявляются в main - главной программе и доступны только в ней) Ф у н к ц и я Функция Рисунок 2.2 – Глобальные и локальные данные 24 Глобальные данные – это данные (константы, переменные, массивы и другие, объявленные вначале программы и доступные в функциях и главной программе функции main ). Глобальные данные следует использовать только для передачи информации от одной функции к другой. Например, одна функция формирует значения данных, а другая функция использует эти значения. Передача параметров. Когда вызывающая программа обращается к функции, требуется связать фактические параметры вызывающей программы с формальными параметрами функции. Чаще всего применяются два подхода либо фактический параметр вычисляется и полученное значение передается формальному параметру передача значением, либо формальному параметру становится доступен адрес значения фактического параметра передача по адресу Передача значением. Схема обмена информацией с использованием передачи параметра значением приведена на рисунке 2.3. В этом случае формальный параметр обрабатывается в функции как локальная переменная, инициализируемая вначале выполнения функции значением соответствующего фактического параметра. int c, x = 0; … // вызов функции f c = f(x); Значение x x: фактический параметра формальный параметр Вызывающая программа Функция Значение x выз ов возврат Копия Рисунок 2.3 – Передача параметра значением Значение фактического параметра при изменении соответствующего ему формального параметра неизм е н я е т с я . В примерена рисунке 2.3 после завершения работы функции значение фактического параметра остается равным, несмотря на оператор a++ в теле функции В операторе вызова фактическим параметром (при передаче параметра значением) может быть константа, переменная, выражение или функция. Параметры по умолчанию Значения параметров, передаваемых в функцию как аргументы (исходные данные, можно задать по умолчанию в заголовке функции. 25 Пример Функция возведения целого числа в целую степень using std::endl; using std::cout; using std::cin; int sgr_of_power( int x, int n=2) значения по умолчанию указываются только в конце списка параметров { вычисление x в степени n многократным умножением предполагается, что чаще всего требуется x в квадрате if (n==2) return x*x; else { int result=1; for ( int i=0; i result*=x; //result=result*x; результат – x*x*x*..*x, n раз return result; } } int main() { int d; cin>>d; cout< // sgr_of_power можно не передавать – используется значение по умолчанию cout< system( "pause" ); return 0; В случае использования прототипа функции значения параметров по умолчанию указываются только в прототипе (смотрите код примера 2_4_1). Рекурсия Слово рекурсия происходит от латинского слова « recursio » – возвращение. В программирование рекурсия означает, что функция обращается сама к себе непосредственно или через цепочку вызовов других функций. Известными рекурсивными функциями являются вычисление факториала, решение задачи о Ханойских башнях, быстрая сортировка Хоара, а также подпрограммы работы с динамическими структурами данных, подпрограммы построения фракталов и многие другие. Главные требования к организации рекурсивной функции следующие рекурсивная функция имеет хотя бы один параметр рекурсивная функция всегда содержит условие завершения рекурсии и, если это условие не выполняется, функция вызывает сама себя с изменением значения параметра. Рассмотрим применение рекурсии для возведения целого числа в целую степень (рисунок 2.4). 26 Рисунок 2.4 – Рекурсивный алгоритм возведения числа в целую степень Реализация этого алгоритма на С приведена в примере 2_4_1. Пример Функция возведения целого числа в целую степень using std::endl; using std::cout; using std::cin; int sgr_of_power( int x, int n=2); значения по умолчанию указываются только в прототипе функции int main() { int d; cin>>d; cout< //sgr_of_power можно не передавать – используется значение по умолчанию cout< system( "pause" ); return 0; } int sgr_of_power( int x, int n) { вычисление x в степени n многократным умножением if (n==2) предполагается, что чаще всего требуется x в квадрате return x * x; рекурсивный вызов sgr_of_power return (x * sgr_of_power(x, n-1)); } 27 Библиотечные функции При разработке программ широко применяются функции стандартных библиотек С++. Каждая стандартая библиотека имеет соответствующий заголовочный файл, содержащий прототиы всех функций библиотеки и объявления различных типов данных и консант, которые используются этитми функциями. Примеры заголовочных файлов приведены в таблице 2.1. Таблица 2.1 Примеры заголовочных файлов стандартных библиотек |