Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Приложения.doc
Скачиваний:
6
Добавлен:
09.11.2019
Размер:
374.78 Кб
Скачать

Приложения

к конспекту лекций по дисциплине

Программирование

Оглавление

Приложения 1

к конспекту лекций по дисциплине 1

Программирование 1

Оглавление 2

Приложение 1. Некоторые полезные примеры и иллюстрации к разделам конспекта 3

Примеры к разделу 5 3

Вычисление факториала числа 3

Быстрое возведение чисел в целую степень 4

Нахождение наибольшего общего делителя (алгоритм Евклида) 5

Примеры к разделу 7 6

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

Библиотека функций по работе с массивами общего назначения 7

Библиотека функций сортировки массивов 12

Библиотека функций поиска в массивах 14

Приложение 2. Функции стандартного ввода/вывода в стиле C (printf, scanf) 17

Введение 17

Функция стандартного вывода printf() 17

Примеры программ. 19

Функция стандартного ввода scanf() 22

Примеры программ. 25

Приложение 3. Библиотека консольного ввода-вывода 28

Приложение 4. Библиотека управления консолью (MyCrt.h) 30

Приложение 5. Библиотека Menu.h и пример ее использования 34

Библиотека Menu.h 34

Пример использования библиотеки Menu.h 35

Приложение 1. Некоторые полезные примеры и иллюстрации к разделам конспекта

Все программы, приведенные в этом разделе, реализованы в среде MS Visual C++ 2010.

Примеры к разделу 5 Вычисление факториала числа

// Различные реализации функций для вычисления факториала числа

#include "stdafx.h"

#include <iostream>

#include <iomanip> // для манипулятора setw()

#include <limits.h> // для ULONG_MAX - максимальное значение типа unsigned long

using namespace std;

unsigned Factorial_Err(unsigned n)

// При n > 12 значение n! превышает максимальное значение ULONG_MAX типа unsigned

// и функция возвращает неправильные значения

{

unsigned i = 0; // Текущее значение i

unsigned F = 1; // Текущее значение i!

while (i < n)

{

++ i; // i = i + 1

F *= i; // F = F * i - Текущее значение i!

}

return F; // Возвращаем значение n!

}

unsigned Factorial(unsigned n)

// При переполнении возвращает 0 с сообщением об ошибке

// Реализация с помощью цикла while

{

unsigned i = 0; // Текущее значение i

unsigned F = 1; // Текущее значение i!

while (i < n)

{

++ i; // i = i + 1

if (ULONG_MAX / i < F)

{

F = 0;

cout << "Ошибка. При вычислении n! максимальное "

"значение n не может превышать " << --i << endl;

break;

}

F *= i; // F = F * i - Текущее значение i!

}

return F; // Возвращаем значение n!

}

unsigned Factorial_1(unsigned n)

// При переполнении возвращает 0 с сообщением об ошибке

// Реализация с помощью цикла for

{

unsigned F = 1; // Значение 0!

for (unsigned i = 1; i < n; ++i, F *= i)

if (ULONG_MAX / i < F)

{

F = 0;

cout << "Ошибка. При вычислении n! максимальное "

"значение n не может превышать " << --i << endl;

break;

}

return F; // Возвращаем значение n!

}

unsigned Factorial_2(unsigned n)

// При переполнении возвращает 0 без сообщения об ошибке

// Реализация с помощью цикла for

{

unsigned F = 1; // Значение 0!

for (unsigned i = 1; (i < n) && F; ++i, F = (ULONG_MAX / i < F) ? 0 : F * i);

return F; // Возвращаем значение n!

}

int main()

// Для проверки работы одного из вариантов необходимо

// снять комментарии с соответствующей строки цикла for

// и закомментировать остальные

{

for (int i = 0; i <= 13; ++ i)

{

cout << setw(2) << right << i << "! = " << Factorial_Err(i) << endl;

// cout << setw(2) << right << i << "! = " << Factorial(i) << endl;

// cout << setw(2) << right << i << "! = " << Factorial_1(i) << endl;

// cout << setw(2) << right << i << "! = " << Factorial_2(i) << endl;

}

system ("Pause");

return 0;

}

Быстрое возведение чисел в целую степень

//

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

double IntPow(double b, int k, int &Count)

{

// Инвариант: (b ^ k) * p = a ^ n

// Цикл заканчивается при k = 0, тогда p = a ^ n

double p = 1;

Count = 0;

while (k != 0)

{

if (k & 1) // k не четно

{

-- k; // k = k - 1

p *= b; // p = p * b

}

else

{

k /= 2; // k = k / 2

b *= b; // b = b * b

}

++ Count;

}

return p;

}

double IntPow1(double a, int n, int &Count)

{

double p = 1;

double b = a;

for (int i = n, Count = 0; i; (i % 2) ? (p *= b, --i) : (b *= b, i /= 2),

++ Count);

return p;

}

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)

{

double a;

int n, N;

cout << "\nОснование степени: ";

cin >> a;

cout << "Целая степень: ";

cin >> n;

cout << '\n' << a << " в степени " << n << " равно " << fixed

<< IntPow(a, n, N) << ".\n";

cout << "Количество шагов: " << N << endl;

cout << '\n' << a << " в степени " << n << " равно " << fixed

<< IntPow1(a, n, N) << ".\n";

cout << "Количество шагов: " << N << endl;

}

return 0;

}