- •Приложение 1. Некоторые полезные примеры и иллюстрации к разделам конспекта
- •Примеры к разделу 5 Вычисление факториала числа
- •Быстрое возведение чисел в целую степень
- •Нахождение наибольшего общего делителя (алгоритм Евклида)
- •Примеры к разделу 7 Библиотека функций случайных чисел
- •Библиотека функций по работе с массивами общего назначения
- •Библиотека функций сортировки массивов
- •Библиотека функций поиска в массивах
- •Приложение 2. Функции стандартного ввода/вывода в стиле c (printf, scanf) Автор: Бардин п.Б. Введение
- •Функция стандартного вывода printf()
- •Int printf(char *управляющая строка, ...);
- •Примеры программ.
- •Функция стандартного ввода scanf()
- •Int scanf(char *управляющая строка);
- •Int scanf(char *управляющая строка);
- •Примеры программ.
- •Приложение 3. Библиотека консольного ввода-вывода
- •Приложение 4. Библиотека управления консолью (MyCrt.H)
- •Приложение 5. Библиотека Menu.H и пример ее использования Библиотека Menu.H
- •Пример использования библиотеки Menu.H
Нахождение наибольшего общего делителя (алгоритм Евклида)
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int NOD_1(int n, int m, int &Count)
// Известно, что: НОД(n, m) = НОД(n - m, m) при n > m и
// НОД(n, m) = НОД(n, m - n) при n < m.
{
int r, a = n, b = m;
Count = 0;
// Инвариант: НОД(a, b) = НОД(n, m)
// Цикл заканчивается при a = b, тогда НОД(n, m) = НОД(a, a) = a
while (a != b)
{
if (a > b)
a = a - b;
else
b = b - a;
++ Count;
}
return a;
}
int NOD_2(int n, int m, int &Count)
// Известно, что: НОД(n, m) = НОД(m, r), где r - остаток от деления n на m.
{
int r, a = n, b = m;
Count = 0;
// Инвариант: НОД(a, b) = НОД(n, m)
// Цикл заканчивается при b = 0, тогда НОД(n, m) = НОД(a, 0) = a
while (b)
{
r = a % b;
a = b;
b = r;
++ Count;
}
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0, "");
cout << " Алгоритм Евклида для нахождения наибольшего общего делителя.\n";
cout << " ------------------------------------------------------------\n";
for (char b = '1'; b != 27; cout << "\n\t\t\tПродолжим? (нет - Esc) ",
b = _getch(), cout << endl)
{
int Count;
int n, m;
cout << "\n Введите два целых числа больших 0: ";
cin >> n >> m;
cout << "\n Значение НОД чисел " << n << " и " << m << " равно "
<< NOD_1 (n, m, Count) << endl;
cout << "Число итераций: " << Count << endl;
cout << "\n Значение НОД чисел " << n << " и " << m << " равно "
<< NOD_2 (n, m, Count) << endl;
cout << "Число итераций: " << Count << endl;
}
return 0;
}
Примеры к разделу 7 Библиотека функций случайных чисел
/*
Датчик случайных чисел
Сохраните этот текст в файле с именем my_rand.h. Поместите
этот файл в каталог проекта и в тексте программы используйте директиву
#include "my_rand.h"
*/
#pragma once
#include <iostream>
#include <time.h>
using namespace std;
//
// Прототипы функций
//
void RandInit();
// Инициализация датчика случайных чисел с помощью системного времени
// Необходимо однократно вызвать при запуске программы
int MyRand(int d);
// Возвращает случайное целое в диапазоне от 0 до d
int MyRand(int ng, int vg);
// Возвращает случайное целое в диапазоне от ng до vg
//
// Реализация
//
void RandInit()
{
srand(_time32(NULL));
}
int MyRand(int d)
{
return rand() % (d + 1);
}
int MyRand(int ng, int vg)
{
return rand() % (vg - ng + 1) + ng;
}
Библиотека функций по работе с массивами общего назначения
/*
Смешанные функции по работе с массивами
Сохраните этот текст в файле с именем arr_common.h. Поместите
этот файл в каталог проекта и в тексте программы используйте директиву
#include " arr_common.h"
*/
#pragma once
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include "my_rand.h"
using namespace std;
//
// Прототипы функций
//
void RandMakeArr(double A[], int n, int d);
// Для массивов с эелементами типа double
// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d
void RandMakeArr(double A[], int n, int ng, int vg);
// Для массивов с эелементами типа double
// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg
void RandMakeArr(int A[], int n, int d);
// Для массивов с эелементами типа double
// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d
void RandMakeArr(int A[], int n, int ng, int vg);
// Для массивов с эелементами типа double
// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg
void ArrOut(double A[], int n);
// Вывод на экран массива А из n элементов типа double
void ArrOut(int A[], int n);
// Вывод на экран массива А из n элементов типа int
void Swap(double &a, double &b);
// Обмен значений переменных a и b
void Swap(int &a, int &b);
// Обмен значений переменных a и b
void Swap(int a[], int b[], int n);
// Обмен значений массивов a и b из n элементов типа int
void Swap(double a[], double b[], int n);
// Обмен значений массивов a и b из n элементов типа double
void ArrInit(int A[], int n, int Val);
// Заполнение массива А из n элементов типа int значениями Val
void ArrInit(double A[], int n, double Val);
// Заполнение массива А из n элементов типа double значениями Val
void ArrCopy(int Src[], int Dst[], int n);
// Копирование значений массива Src и Dst из n элементов типа int
void ArrCopy(double Src[], double Dst[], int n);
// Копирование значений массива Src и Dst из n элементов типа double
void MinMax(int A[], int n, int &iMax, int &iMin);
// Поиск минимального и максимального значений в массиве А из n элементов.
// Возвращает индексы первого минимального iMin и первого максимального iMax элементов
void MinMax(int A[], int n, int &iMax, int &iMin, int &cMax, int &cMin);
// Поиск минимального и максимального значений в массиве А из n элементов.
// Возвращает индексы первого минимального iMin и первого максимального iMax элементов и
// количества максимальных cMax и минимальных cMin элементов в массиве
void ArrDelItem(int A[], int &n, int di);
// Удаление элемента с индексом di из массива А с n элементами,
// что эквивалентно сдвигу элементов массива на 1 элемент в сторону меньших значений индексов элементов.
// Возвращает измененный массив А и его количество элементов n, уменьшенное на 1.
// Контроль корректности входных данных не осуществляется.
void ArrInsItem(int A[], int &n, int ii, int Val);
// Вставка элемента со значением Val на позицию с индексом ii в массив А с n элементами,
// что эквивалентно сдвигу элементов массива на 1 элемент в сторону больших значений индексов элементов и
// записи в элемент с идексом ii значения Val.
// Возвращает измененный массив А и его количество элементов n, увеличенное на 1.
// Контроль корректности входных данных не осуществляется.
void ArrConcat(int A1[], int n1, int A2[], int n2, int R[], int &n);
// Слияние двух отсортированных по возрастанию массивов А1 и А2 с количеством элементов n1 и n2 соответственно
// в массив R. Возвращает массив R (также отсортированный по возрастанию) и его количество элементов n
//
// Реализация
//
void RandMakeArr(double A[], int n, int d)
// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d
{
for (int i = 0; i < n; ++i)
A[i] = MyRand(d);
}
void RandMakeArr(double A[], int n, int ng, int vg)
// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg
{
for (int i = 0; i < n; ++i)
A[i] = MyRand(ng, vg);
}
void RandMakeArr(int A[], int n, int d)
// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d
{
for (int i = 0; i < n; ++i)
A[i] = MyRand(d);
}
void RandMakeArr(int A[], int n, int ng, int vg)
// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg
{
for (int i = 0; i < n; ++i)
A[i] = MyRand(ng, vg);
}
void ArrOut(double A[], int n)
// Вывод на экран массива А из n элементов типа double
{
for (int i = 0; i < n; ++i)
cout << A[i] << " ";
cout << endl;
}
void ArrOut(int A[], int n)
// Вывод на экран массива А из n элементов типа double
{
for (int i = 0; i < n; ++i)
cout << A[i] << " ";
cout << endl;
}
void Swap(double &a, double &b)
// Обмен значений переменных a и b
{
double c = a;
a = b;
b = c;
}
void Swap(int &a, int &b)
// Обмен значений переменных a и b
{
int c = a;
a = b;
b = c;
}
void Swap(int a[], int b[], int n)
// Обмен значений массивов a и b из n элементов типа int
{
for (int i = 0; i < n; ++i)
Swap(a[i], b[i]);
}
void Swap(double a[], double b[], int n)
// Обмен значений массивов a и b из n элементов типа double
{
for (int i = 0; i < n; ++i)
Swap(a[i], b[i]);
}
void ArrInit(int A[], int n, int Val)
// Заполнение массива А из n элементов типа int значениями Val
{
for (int i = 0; i < n; ++i)
A[i] = Val;
}
void ArrInit(double A[], int n, double Val)
// Заполнение массива А из n элементов типа double значениями Val
{
for (int i = 0; i < n; ++i)
A[i] = Val;
}
void ArrCopy(int Src[], int Dst[], int n)
// Копирование значений массива Src и Dst из n элементов типа int
{
for (int i = 0; i < n; ++i)
Dst[i] = Src[i];
}
void ArrCopy(double Src[], double Dst[], int n)
// Копирование значений массива Src и Dst из n элементов типа double
{
for (int i = 0; i < n; ++i)
Dst[i] = Src[i];
}
void MinMax(int A[], int n, int &iMax, int &iMin)
// Поиск минимального и максимального значений в массиве А из n элементов.
// Возвращает индексы первого минимального iMin и первого максимального iMax элементов
{
int Max, Min;
iMax = iMin = 0;
Max = Min = A[0];
for (int i = 1; i < n; ++i)
{
if (A[i] > Max)
{
iMax = i;
Max = A[i];
}
if (A[i] < Min)
{
iMin = i;
Min = A[i];
}
}
}
void MinMax(int A[], int n, int &iMax, int &iMin, int &cMax, int &cMin)
// Поиск минимального и максимального значений в массиве А из n элементов.
// Возвращает индексы первого минимального iMin и первого максимального iMax элементов и
// количества максимальных cMax и минимальных cMin элементов в массиве
{
int Max, Min;
iMax = iMin = 0;
cMax = cMin = 1;
Max = Min = A[0];
for (int i = 1; i < n; ++i)
{
if (A[i] > Max)
{
cMax = 1;
iMax = i;
Max = A[i];
}
else
if (A[i] == Max)
++cMax;
if (A[i] < Min)
{
cMin = 1;
iMin = i;
Min = A[i];
}
else
if (A[i] == Min)
++cMin;
}
}
void ArrDelItem(int A[], int &n, int di)
// Удаление элемента с индексом di из массива А с n элементами,
// что эквивалентно сдвигу элементов массива на 1 элемент в сторону меньших значений индексов элементов.
// Возвращает измененный массив А и его количество элементов n, уменьшенное на 1.
// Контроль корректности входных данных не осуществляется.
{
--n;
for (int i = di; i < n; ++i)
A[i] = A[i + 1];
}
void ArrInsItem(int A[], int &n, int ii, int Val)
// Вставка элемента со значением Val на позицию с индексом ii в массив А с n элементами,
// что эквивалентно сдвигу элементов массива на 1 элемент в сторону больших значений индексов элементов и
// записи в элемент с идексом ii значения Val.
// Возвращает измененный массив А и его количество элементов n, увеличенное на 1.
// Контроль корректности входных данных не осуществляется.
{
if (ii > n) // Если индекс вставки больше индекса последнего элемента массива более чем на 1, то
// новый элемент вставляется сразу за последним элементом массива.
ii = n;
for (int i = n; i > ii; --i)
A[i] = A[i - 1];
A[ii] = Val;
++n;
}
void ArrConcat(int A1[], int n1, int A2[], int n2, int R[], int &n)
// Слияние двух отсортированных по возрастанию массивов А1 и А2 с количеством элементов n1 и n2 соответственно
// в массив R. Возвращает массив R (также отсортированный по возрастанию) и его количество элементов n.
{
int i, j;
n = i = j = 0;
while (n < n1 + n2)
{
while ((i < n1) && ((A1[i] <= A2[j]) || (j == n2)))
{
R[n] = A1[i];
++i;
++n;
}
while ((j < n2) && ((A2[j] <= A1[i]) || (i == n1)))
{
R[n] = A2[j];
++j;
++n;
}
}
}
