Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Устройство и оснащение процедурного кабинета: Решающая роль в обеспечении правильного лечения пациентов отводится процедурной медсестре...
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Дисциплины:
2018-01-04 | 125 |
5.00
из
|
Заказать работу |
|
|
Приложения
к конспекту лекций по дисциплине
Программирование
Оглавление
Приложение 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!