Быстрое возведение чисел в целую степень — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

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

2018-01-04 125
Быстрое возведение чисел в целую степень 0.00 из 5.00 0 оценок
Заказать работу

Приложения

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

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


Оглавление

Приложение 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


Приложение 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;

}

 

Примеры к разделу 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;

}

 

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

Автор: Бардин П.Б.

Введение

Стандартная библиотека C/C++ включает ряд функций для чтения и записи на консоли (клавиатура и монитор). Эти функции читают и пишут данные, как простой поток символов.

Понятие потока (stream), использованное в программировании, тесно связано с обычным, бытовым пониманием этого слова. Поток ввода можно сравнить с трубой, по которой вода (информация) поступает в бассейн (память компьютера), поток вывода - с трубой, по которой вода выходит из бассейна. Важной особенностью этой трубы является то, что в каждый момент времени данные могут двигаться только в одном направлении. Даже если одна и та же труба используется для ввода и вывода, это не может происходить одновременно: для переключения направления потока его нужно остановить, выполнить некие действия и лишь затем направить поток в обратном направлении. Другой особенностью потока является то, что он почти никогда не иссякает. Иногда он высыхает, но этот период не может быть долгим, если система функционирует нормально.

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

/* Пример 1 */
#include <stdio.h>

void main(void)
{
int a,b,c; // Объявление переменных a,b,c

a=5;
b=6;
c=9;
printf("a=%d, b=%d, c=%d",a,b,c);
}

Результат работы программы:
a=5, b=6, c=9

/* Пример 2 */
#include <stdio.h>

void main(void)
{
float x,y,z;

x=10.5;
y=130.67;
z=54;

printf("Координаты объекта: x:%.2f, y:%.2f, z:%.2f", x, y, z);
}

Результат работы программы:
Координаты объекта: x:10.50, y:130.67, z:54.00

/* Пример 3 */
#include <stdio.h>

void main()
{
int x;

x=5;
printf("x=%d", x*2);
}

Результат работы программы:
x=10

/* Пример 4 */
#include <stdio.h>

void main(void)
{
printf("\"Текст в кавычках\"");
printf("\nСодержание кислорода: 100%%");
}

Результат работы программы:
"Текст в кавычках"
Содержание кислорода: 100%

/* Пример 5 */
#include <stdio.h>

void main(void)
{
int a;

a=11; // 11 в десятичной равно b в шестнадцатеричной
printf("a-dec=%d, a-hex=%X",a,a);
}

Результат работы программы:
a-dec=11, a-hex=b

/* Пример 6 */
#include <stdio.h>

void main(void)
{
char ch1,ch2,ch3;

ch1='A';
ch2='B';
ch3='C';

printf("%c%c%c",ch1,ch2,ch3);
}

Результат работы программы:
ABC

/* Пример 7 */
#include <stdio.h>

void main(void)
{
char *str="Моя строка.";

printf("Это %s",str);
}

Результат работы программы:
Это Моя строка.

/* Пример 8 */
#include <stdio.h>

void main(void)
{
printf("Здравствуйте!\n");
// После печати будет переход на новую строку - \n
printf("Меня зовут Павел.");
// Это будет напечатано на новой строке
}

Результат работы программы:
Здравствуйте!
Меня зовут Павел.

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

 

Пример 1.
Эта программа выводит на экран запрос " Сколько вам лет?: " и ждёт ввода данных. Если, например, ввести число 20, то программа выведет строку " Вам 20 лет. ". При вызове функции scanf (), перед переменной age мы поставили знак &, так как функции scanf () нужны адреса переменных. Функция scanf () запишет введённое значение по указанному адресу. В нашем случае введённое значение 20 будет записано по адресу переменной age.

/* Пример 1 */

#include <stdio.h>

void main(void)
{
int age;

printf("\nСколько вам лет?:");
scanf("%d",&age);
printf("Вам %d лет.", age);
}

Пример 2.
Программа калькулятор. Этот калькулятор может только складывать числа. При вводе 100+34 программа выдаст результат: 100+34=134.

/* Пример 2 */

#include <stdio.h>

void main(void)
{
int x, y;

printf("\nКалькулятор:");
scanf("%d+%d", &x, &y);
printf("\n%d+%d=%d", x, y, x+y);
}

Пример 3.
Этот пример показывает, как установить ширину поля считывания. В нашем примере ширина поля равна пяти символам. Если вы введёте строку с большим количеством символов, то все символы после 5 -го будут отброшены. Обратите внимание на вызов функции scanf (). Знак & не стоит перед именем массива name, так как имя массива name является адресом первого элемента массива.

/* Пример 3 */

#include <stdio.h>

void main(void)
{
char name[5];

printf("\nВведите ваш логин (не более 5 символов):");
scanf("%5s", name);
printf("\nВы ввели %s", name);
}

Пример 4.
Последний пример в этой статье показывает, как можно использовать множество поиска. После запуска программы введите число от 2 до 5.

/* Пример 4 */

#include <stdio.h>

void main(void)
{
char bal;

printf("Ваша оценка 2,3,4,5:");
scanf("%[2345]", &bal);
printf("\nОценка %c", bal);
}


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

 

Эта библиотека будет постепенно дополняться новыми функциями.

 

/*

Это библиотека функций консольного ввода-вывода. Протестирована в среде MS Visual C++ 2010.

Для ее использования необходимо сохранить этот текст с файле с именем my_conio.h. Поместить

этот файл в каталог проекта и в тексте программы использовать директиву #include "my_conio.h"

*/

 

#pragma once

 

#include <windows.h> // Для CharToOemA

#include <conio.h> // Для getch()

#include <iostream>

 

using namespace std;

 

//

// Прототипы функций

//

 

char *Rus(char *sfrom, char *sto);

/*

Вывод текста, содержащего русские символы.

Использование:

char s[100];

cout << Rus("Это текст на русском языке!\n", s);

*/

char *Rus(char *s);

/*

Вывод текста, содержащего русские символы.

Использование:

char s[] = "И это текст на русском языке!\n";

cout << Rus(s);

 

*/

void out_Text(char *s);

/*

Вывод текста (и русского) без перехода на новую строку.

Использование:

out_Text("Это текст");

Ограничение: длина текста не более 255 символов

*/

void out_Text_ln(char *s);

/*

Вывод текста (и русского) с переходом на новую строку.

Использование:

out_Text_ln("Это текст");

Ограничение: длина текста не более 255 символов

*/

void Pause();

/*

Приостановка выполнения программы

*/

 

//

// Реализация функций

//

 

char *Rus(char *sfrom, char *sto)

{

CharToOemA(sfrom, sto);

return sto;

}

 

char *Rus(char *s)

{

CharToOemA(s, s);

return s;

}

 

void out_Text(char *s)

{

char S[256];

if (strlen(s) <= 255)

CharToOemA(s, S);

else

CharToOemA("Ошибка. Длина текста больше 255 символов", S);

cout << S;

}

 

void out_Text_ln(char *s)

{

out_Text(s);

cout << endl;

}

 

void Pause()

{

out_Text("Для продолжения нажмите любую клавишу...\n");

_getch();

}

 

 


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

 

 

#include "stdafx.h"

#include <iostream>

#include <Windows.h>

 

using namespace std;

 

#pragma once;

 

short MaxX();

short MaxY();

void ConWidth(int W);

void ConHeight(int H);

void ConSize(int W, int H);

void ScrollVert(int P);

void ScrollHor(int P);

void ScrSize(int W, int H);

void ScrGoTo(int X, int Y);

void CursorVisible(bool Visible);

void GoToXY(short x, short y);

unsigned short WhereX();

unsigned short WhereY();

void WhereXY(unsigned short &x, unsigned short &y);

unsigned short GetTextColors();

void TextBackground(unsigned short Color);

void TextForeground(unsigned short Color);

void TextColor(unsigned short Colors);

void ChangeTextAttribute(unsigned short Attr, unsigned short x, unsigned short y, unsigned short len);

void ClrScr();

bool ReadKey(wchar_t &c);

 

 

HANDLE hMWin = GetStdHandle(STD_OUTPUT_HANDLE);

 

void ColorMap()

{

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

{

int b = i << 4;

for (int f = 0; f < 16; ++ f)

{

SetConsoleTextAttribute(hMWin, b | f);

cout << '*';

}

cout << endl;

}

}

 

short MaxX()

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

return ConInfo.dwSize.X;

}

 

short MaxY()

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

return ConInfo.dwSize.Y;

}

 

void ConWidth(int W)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

COORD c = {W, ConInfo.dwSize.Y};

SetConsoleScreenBufferSize(hMWin, c);

}

 

void ConHeight(int H)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

if (H < 25)

H = 25;

COORD c = {ConInfo.dwSize.X, H};

SetConsoleScreenBufferSize(hMWin, c);

}

 

void ConSize(int W, int H)

{

if (H < 25)

H = 25;

COORD c = {W, H};

SetConsoleScreenBufferSize(hMWin, c);

}

 

void ScrSize(int W, int H)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

SMALL_RECT WRect = ConInfo.srWindow;

COORD c = GetLargestConsoleWindowSize(hMWin);

if (W > c.X)

W = c.X;

if (H > c.Y)

H = c.Y;

if (W > ConInfo.dwSize.X)

W = ConInfo.dwSize.X;

if (H > ConInfo.dwSize.Y)

H = ConInfo.dwSize.Y;

WRect.Right = WRect.Left + W - 1;

WRect.Bottom = WRect.Top + H - 1;

SetConsoleWindowInfo(hMWin, true, &WRect);

}

 

void ScrGoTo(int X, int Y)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

SMALL_RECT WRect = ConInfo.srWindow;

WRect.Right = X + WRect.Right - WRect.Left;

WRect.Bottom = Y + WRect.Bottom - WRect.Top;

WRect.Left = X;

WRect.Top = Y;

SetConsoleWindowInfo(hMWin, true, &WRect);

GoToXY(X, Y);

}

 

void ScrollVert(int P)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

SMALL_RECT WRect = ConInfo.srWindow;

WRect.Top += P;

WRect.Bottom += P;

SetConsoleWindowInfo(hMWin, true, &WRect);

GoToXY(WhereX(), WhereY() + P);

}

 

void ScrollHor(int P)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

SMALL_RECT WRect = ConInfo.srWindow;

WRect.Left += P;

WRect.Right += P;

SetConsoleWindowInfo(hMWin, true, &WRect);

GoToXY(WhereX() + P, WhereY());

}

 

void CursorVisible(bool Visible)

{

CONSOLE_CURSOR_INFO CursorInfo;

GetConsoleCursorInfo(hMWin, &CursorInfo);

CursorInfo.bVisible = Visible;

SetConsoleCursorInfo(hMWin, &CursorInfo);

}

 

void GoToXY(short x, short y)

{

COORD c = {x, y};

SetConsoleCursorPosition(hMWin, c);

}

 

unsigned short WhereX()

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

return ConInfo.dwCursorPosition.X;

}

 

unsigned short WhereY()

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

return ConInfo.dwCursorPosition.Y;

}

 

void WhereXY(unsigned short &x, unsigned short &y)

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

GetConsoleScreenBufferInfo(hMWin, &ConInfo);

x = ConInfo.dwCursorPosition.X;

y = ConInfo.dwCursorPosition.Y;

}

 

unsigned short GetTextColors()

{

CONSOLE_SCREEN_BUFFER_INFO ConInfo;

if (GetConsoleScreenBufferInfo(hMWin, &ConInfo))

return ConInfo.wAttributes;

else

return 0;

}

 

void TextBackground(unsigned short Color)

{

if (Color >= 16)

return;

Color = Color << 4;

Color = GetTextColors() & 0xFF0F | Color;

SetConsoleTextAttribute(hMWin, Color);

}

 

void TextForeground(unsigned short Color)

{

if (Color >= 16)

return;

Color = GetTextColors() & 0xFFF0 | Color;

SetConsoleTextAttribute(hMWin, Color);

}

 

void TextColor(unsigned short Colors)

{

if (Colors >= 256)

return;

SetConsoleTextAttribute(hMWin, Colors);

}

 

void ChangeTextAttribute(unsigned short Attr, unsigned short x, unsigned short y, unsigned short len)

{

COORD c = {x, y};

DWORD l;

FillConsoleOutputAttribute(hMWin, Attr, len, c, &l);

}

 

void ClrScr()

{

COORD c = {0, 0};

DWORD Chr;

CONSOLE_SCREEN_BUFFER_INFO ConInfor;

DWORD ConSize;

if (!GetConsoleScreenBufferInfo(hMWin, &ConInfor))

return;

ConSize = ConInfor.dwSize.X * ConInfor.dwSize.Y;

if (!FillConsoleOutputCharacter(hMWin, (TCHAR) ' ', ConSize, c, &Chr))

return;

if (!FillConsoleOutputAttribute(hMWin, ConInfor.wAttributes, ConSize, c, &Chr))

return;

SetConsoleCursorPosition(hMWin, c);

}

 

bool ReadKey(wchar_t &c)

{

bool b = 0;

c = _getwch();

if (c == 224 ||!c)

c = _getwch();

else

b = 1;

return b;

}

 


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

 

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

 

 

#include "MyCrt.h"

#include <string.h>

 

using namespace std;

 

#pragma once;

 

struct sMenu {

// Количество команд NumberComands <= 20; Текст команды <= 60 символов

int NormAttr; // Цвет не выбранного элемента меню

int ActiveAttr; // Цвет выбранного элемента меню

int SelectedComand; // Номер выбранного элемента меню (от 1 до NumberComands)

int NumberComands; // Количество элементов меню

wchar_t Comands[20][61]; // Тексты элементов меню

int X; // Положение меню на экране

int Y; // Положение меню на экране

};

 

int ComandMaxLen(sMenu &M)

// Возвращает длину самой длинной команды меню

{

size_t Max = wcslen(M.Comands[0]);

for (int i = 1; i < M.NumberComands; ++i)

if (wcslen(M.Comands[i]) > Max)

Max = wcslen(M.Comands[i]);

return Max;

}

 

void SetActiveComand(sMenu &M, short ActCom)

// Выделяет в меню выбранную команду

{

int CL = ComandMaxLen(M);

ChangeTextAttribute(M.NormAttr, M.X, M.Y + M.SelectedComand - 1, CL);

ChangeTextAttribute(M.ActiveAttr, M.X, M.Y + ActCom - 1, CL);

GoToXY(M.X + CL, M.Y + ActCom - 1);

M.SelectedComand = ActCom;

}

 

void DisplayMenu(sMenu &M, int X, int Y)

// Выводит меню на экран

{

M.X = X;

M.Y = Y;

for (int i = 0; i < M.NumberComands; ++i)

{

GoToXY(X, Y + i);

wcout << M.Comands[i] << endl;

}

SetActiveComand(M, M.SelectedComand);

}

 

int MenuNavigator(sMenu &M, int X, int Y, wchar_t &c)

// Осуществляет перемещение по меню и возвращает номер выбранной команды.

// Параметр "с" соответствует коду клавиши, с помощью которой была выбрана команда

{

CursorVisible(false);

DisplayMenu(M, X, Y);

do

{

if (!ReadKey(c))

{

if (c == 72) // Up

if (M.SelectedComand > 1)

SetActiveComand(M, M.SelectedComand - 1);

else

SetActiveComand(M, M.NumberComands);

if (c == 80) // Dn

if (M.SelectedComand < M.NumberComands)

SetActiveComand(M, M.SelectedComand + 1);

else

SetActiveComand(M, 1);

}

}

while (c!= 27 && c!= 13);

CursorVisible(true);

return M.SelectedComand;

}

 

int MenuChoice(sMenu &M, int X, int Y, wchar_t &c)

// Чистит экран и выводит меню в точку (X, Y)

{

ClrScr();

return MenuNavigator(M, X, Y, c);

}

 

int MenuChoice(sMenu &M, wchar_t &c)

{

// Экран не чистится. Выводит меню в точку, где находится курсор

return MenuNavigator(M, WhereX(), WhereY(), c);

}

 

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

 

// MenuExample.cpp: определяет точку входа для консольного приложения.

//

 

#include "stdafx.h"

#include <MyCrt.h>

#include <Menu.h>

 

using namespace std;

 

void InitMenu(sMenu &M)

{

sMenu B = {

0x9F, // Цвет не выбранного элемента меню

0x70, // Цвет выбранного элемента меню

1, // Начальный номер выбранного элемента меню

7, // Количество элементов меню

// Тексты элементов меню:

L" Команда 1 ",

L" Команда 2 ",

L" Команда 3 ",

L" Команда 4 ",

L" Команда 5 ",

L" Команда 6 ",

L" Выход "

};

M = B;

}

 

void InitMenu1(sMenu &M)

{

sMenu B = {

0x9F, // Цвет не выбранного элемента меню

0x70, // Цвет выбранного элемента меню

1, // Начальный номер выбранного элемента меню

2, // Количество элементов меню

// Тексты элементов меню:

L" Команда 31 ",

L" Команда 32 ",

};

M = B;

}

 

void ComandExecute1(int Com, wchar_t c)

{

switch (Com)

{

case 1:;

case 2:;

ClrScr();

cout << 3 << Com << " " << c << endl;

_getwch();

break;

}

}

 

void ComandExecute(int Com, wchar_t c)

{

switch (Com)

{

case 1:;

case 2:;

case 4:;

case 5:;

case 6:;

case 7:

ClrScr();

cout << Com << " " << c << endl;

_getwch();

break;

case 3:

sMenu M1;

InitMenu1(M1);

cout << "->";

Com = MenuChoice(M1, c);

if (c!= 27)

ComandExecute1(Com, c);

break;

}

}

 

int _tmain(int argc, _TCHAR* argv[])

{

setlocale (LC_ALL, ".866");

ConSize(80, 25);

ScrSize(80, 25);

TextColor(0x9F);

ClrScr();

sMenu M;

InitMenu(M);

wchar_t c;

int Key;

do

{

Key = MenuChoice(M, 20, 5, c);

if (c!= 27)

ComandExecute(Key, c);

}

while (Key!= 7);

return 0;

}

 

 

Приложения

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

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


Оглавление

Приложение 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


Приложение 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;

}

 

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

 

#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


Поделиться с друзьями:

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.715 с.