Программирование линейных алгоритмов

Линейная программа

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

  • Раздел директив, глобальных деклараций и объявлений
  • Реализация диалога для ввода исходных данных
  • Раздел вычислений
  • Форматированный вывод результатов
Рассмотрим пример линейной программы на примере программы расчета прямоугольного треугольника. Постановка задачи: по данным катетам a и b определить площадь и периметр прямоугольного треугольника.
Программа 8.3.1

//============================================//
//                     1                      //
//============================================//
#include <iostream>
#include <iomanip>
#include <cmath> 
using namespace std;
//============================================//
//                     2                      //
//============================================//
int main() {
    double a, b;
    cout << "a = "; cin >> a; 
    cout << "b = "; cin >> b;
//============================================//
//                     3                      //
//============================================//
    double c = hypot(a, b);
    double S = 0.5 * a * b;
    double P = a + b + c;
//============================================//
//                     4                      //
//============================================//
    cout << setprecision(3) 
         << fixed 
         << "c = " << setw(7) << c << "\n"
         << "S = " << setw(7) << S << "\n"
         << "P = " << setw(7) << P << endl;
    return 0;
}

Строго говоря, в C++ нет каких-либо обязательных разделов (в отличие от языка программирования Pascal). Но есть определенные программные блоки, например, объявления и определения функций, структур и классов расположение которых в программном файле строго регламентировано и подчиняется синтаксическим правилам. В данной программе используется только одна функция (главная). Включения заголовочных файлов должны быть произведены до вхождения в эту функцию, поскольку реализация этой функции зависит от этих включений.

Библиотека математических функций cmath

В отличие от Pascal, математические функции не входят в ядро языка, а вынесены в отдельную Си-библиотеку cmath. Чтобы эти функции стали доступными в программе необходимо включить в программу одноименный заголовочный файл (как это сделано в программе 8.3.1). Основные функции перечислены в методичке (Таблица 10).
Функции этой библиотеки возвращают действительный тип (в зависимости от типа аргумента). Одна из этих функций – abs() возвращает целый тип, поскольку применяется для целочисленных данных.

Работа с целыми числами

С целым типом связаны несколько типичных задач. Наиболее распространенные – это работа с разрядами числа и остатками от деления. Обе эти задачи используют операции деления целых чисел. Таких операций две:

  • Получение целой части от деления – “/”
  • Получение остатка от деления – “%”

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

//============================================================//
// Получение суммы и произведения разрядов трехзначного числа //
//============================================================//
#include <iostream>
using namespace std;

int main() {
	int n;
	cout << "n = "; cin >> n;
	cout << "Сумма цифр числа = "
		 << n % 10 + n / 10 % 10 + n / 100
		 << "\nПроизведение цифр числа = "
		 << (n % 10) * (n / 10 % 10) * (n / 100)
		 << endl;
	return 0;
}

Обсуждение. Поскольку мы используем десятичную систему счисления, то остаток от деления числа на 10 даст нам младший разряд десятичного числа. Аналогичными действиями мы можем получать разряды числа в другой системе счисления (однако делать это лучше в циклах, поскольку не ясно сколько разрядов будет иметь такое число).
Типичным примером задачи на работу с остатками является задачи на определение долей времени.
Постановка задачи. Дано целое число – количество полных дней, прошедших с начала года. Сколько полных недель прошло за этот период? Какой это день недели, если начало года (1 января) пришлось на понедельник (вывести число от 0 до 6: 0 – воскресенье, 1 – понедельник .. 6 – суббота). Так было, например, в 2018 году.
Программа 8.3.3

#include <iostream>
using namespace std;

int main() {
	int n;
	cout << "n = "; cin >> n;
	cout << "Количество полных недель - "
		 << n / 7
		 << "\nДень недели - "
		 << n % 7
		 << endl;
	return 0;
}

Задания

  1. Даны стороны прямоугольника a и b. Найти его площадь S = a·b и периметр P = 2·(a + b).
  2. Дана длина L окружности. Найти ее радиус R и площадь S круга, ограниченного этой окружностью, учитывая, что L = 2·π·R, S = π·R2.
  3. Дано трехзначное число. Вывести число, полученное при прочтении исходного числа справа налево.
  4. С начала суток прошло N секунд (N — целое). Найти количество секунд, прошедших с начала последнего часа.
Print Friendly, PDF & Email

Comments are closed.