Лекция 4_ОАИП_2020

Содержание

Слайд 2

27.09.2020

Романькова Т.Л.

Линейный - алгоритм, в котором все указанные действия выполняются один раз

27.09.2020 Романькова Т.Л. Линейный - алгоритм, в котором все указанные действия выполняются
в том порядке, в котором они записаны.

Ввод в консоли

Для ввода данных в консоли может использоваться функция scanf(). Эта функция определена в заголовочном файле stdio.h 

int scanf(форматная строка, список аргументов)

scanf() возвращает число, равное значений, которые были действи­тельно присвоены переменным. В это количество не входят значения, которые были считаны, но их значения не были ничему присвоены вследствие использования модификатора * для подавления присваивания. Если до присвоения значения первого поля произошла ошибка, возвращается EOF.

Слайд 3

27.09.2020

Романькова Т.Л.

Форматная строка содержит спецификации преобразования, которые определяют вводимые данные.
Общий вид

27.09.2020 Романькова Т.Л. Форматная строка содержит спецификации преобразования, которые определяют вводимые данные.
спецификаций преобразования:
% * ширина_поля модификатор спецификатор

Знак процента % и спецификатор обязательны, остальные элементы – нет.

Символ * позволяет пропустить при вводе водимые символы для типа, указанного через спецификатор.
Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.

Функция scanf должна считать текст из консоли, преобразовать его в данные нужного типа и разместить их в соответствующие ячейки памяти. Поэтому аргументы функции scanf должны быть указателями на соответствующие переменные.

Слайд 4

27.09.2020

Романькова Т.Л.

27.09.2020 Романькова Т.Л.

Слайд 5

27.09.2020

Романькова Т.Л.

Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие модификаторы:
h: для

27.09.2020 Романькова Т.Л. Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие
ввода значений типа short int (%hd)
l: для ввода значений типа long int (%ld) или double (%lf, %le)
L: для ввода значений типа long double (%Lf, %Le)

В качестве аргументов в функцию scanf() передаются адреса переменных, которые нужно вводить.
Для получения адреса переменной перед ее именем ставится знак амперсанда &. 

int age;
char name[10];
printf("Как вас зовут? ");
scanf("%10s", &name);
printf("Сколько вам лет? ");
scanf("%d", &age);

Слайд 6

27.09.2020

Романькова Т.Л.

Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях

27.09.2020 Романькова Т.Л. Функция scanf( ) является функцией незащищенного ввода, т.к. появилась
языка Си. Поэтому, чтобы разрешить работу данной функции в современных компиляторах, необходимо в начало программы добавить строчку

#define _CRT_SECURE_NO_WARNINGS

Можно сразу вводить несколько значений. В этом случае в качестве разделителя используется пробел.

int age;
char name[10];
printf("Введите ваше имя и возраст\n");
scanf("%s %d", &name, &age);

Слайд 7

27.09.2020

Романькова Т.Л.

Если необходимо ввести значение строковой переменной, то перед ее именем ставить

27.09.2020 Романькова Т.Л. Если необходимо ввести значение строковой переменной, то перед ее
символ & не обязательно.

Математические функции
Описание математических функций находятся в библиотеках , и

Слайд 8

27.09.2020

Романькова Т.Л.

27.09.2020 Романькова Т.Л.

Слайд 9

27.09.2020

Романькова Т.Л.

Пример 1. Разработать консольное приложение для вычисления значения функции

По умолчанию значения

27.09.2020 Романькова Т.Л. Пример 1. Разработать консольное приложение для вычисления значения функции
функций и их аргументы имеют тип double. Вещественные литералы также по умолчанию double.

Слайд 10

27.09.2020

Романькова Т.Л.

начало

Ввод
a, m, x

Вывод
a, m, x,f

конец

27.09.2020 Романькова Т.Л. начало Ввод a, m, x Вывод a, m, x,f конец

Слайд 11

27.09.2020

Романькова Т.Л.

27.09.2020 Романькова Т.Л.

Слайд 12

27.09.2020

Романькова Т.Л.

27.09.2020 Романькова Т.Л.

Слайд 13

27.09.2020

Романькова Т.Л.

Пример 2. Написать программу, которая позволяет ввести целое трехзначное число, выводит

27.09.2020 Романькова Т.Л. Пример 2. Написать программу, которая позволяет ввести целое трехзначное
его на экран, находит сумму цифр введенного числа и выводит эту сумму.
Пример вывода:

Слайд 14

27.09.2020

Романькова Т.Л.

27.09.2020 Романькова Т.Л.

Слайд 15

27.09.2020

Романькова Т.Л.

Генерирование псевдослучайных чисел

Задача генерации случайных чисел на классическом процессоре не может

27.09.2020 Романькова Т.Л. Генерирование псевдослучайных чисел Задача генерации случайных чисел на классическом
быть решена, так как работа компьютера детерминирована по определению. Но можно сгенерировать очень длинные наборы чисел такие, что их распределение будет иметь те же свойства, что и наборы истинно случайных чисел.

Cначала необходимо инициализировать генератор случайных чисел (ГСЧ, или RNG - random number generator), задать начальное значение, на основе которого в дальнейшем будет происходить генерация. Для этого используем функцию
void srand(unsigned seed);
Функция srand() устанавливает исходное число для последовательности, генерируемой функцией rand().

Слайд 16

27.09.2020

Романькова Т.Л.

Важно, что для одного и того же начального значения генератор будет

27.09.2020 Романькова Т.Л. Важно, что для одного и того же начального значения
возвращать одни и те же числа.

Функция 
int rand(void)
 генерирует последовательность псевдослучайных чисел. При каждом обращении к функции возвращается целое в интервале между нулем и значением RAND_MAX, которое в любой реализации должно быть не меньше числа 32 767.

srand(24);
int num1 = rand();
int num2 = rand();
printf(" %d %d \n", num1, num2);
printf(" RAND_MAX = %d\n", RAND_MAX);

Каждый раз при новом запуске результат будет тем же.

Слайд 17

27.09.2020

Романькова Т.Л.

Для того, чтобы при следующем запуске получить новый набор чисел, нужно

27.09.2020 Романькова Т.Л. Для того, чтобы при следующем запуске получить новый набор
инициализировать генератор каждый раз разными значениями.

Для этого можно использовать системное время:

srand(time(NULL));

Для работы с системной датой и временем нужно подключить заголовочный файл time.h.

Для определения текущего календарного времени используется функция
time_t  time(NULL);

Данная функция возвращает время в секундах начиная с 1 января 1970 г.