Лекция "Программирование" Линейные алгоритмы
план-конспект урока по информатике и икт по теме
В данной лекции по дисциплине "Программирование" представлен материал для программирования линейных конструкция в языке С++.
Скачать:
Вложение | Размер |
---|---|
lineynyy_algoritmgot.doc | 172.5 КБ |
Предварительный просмотр:
Алгоритм линейного типа
Учеными-программистами Бомом и Якопини было разработано структурное программирование, основной идеей которого является высказывание, что любая программа может быть написана с использованием трех управляющих структур:
- последовательная структура (линейный алгоритм);
- структура выбора (алгоритм с ветвлением);
- структуры повторения (циклический алгоритм).
Последовательная структура встроена в любой язык и является структурой по умолчанию. Все шаги линейного алгоритма выполняются последовательно только по одному разу в том порядке, в котором они записаны в программе. Линейный алгоритм включает команды: присвоения, ввода и вывода.
Команда (оператор) присвоения (=)
Является основным действием в линейном алгоритме.
Формат команды присвоения:
переменная=выражение;
Команда записывает (присваивает) переменной некоторую величину – результат вычисленного выражения. На машинном уровне команда присвоения осуществляет запись в ячейку памяти, выделенную под эту переменную, вычисленную величину. После команды присвоения говорят, что «величина получила свое значение». Команда выполняется в следующей последовательности:
1. полностью вычисляется выражение правой части (получается число);
2. вычисленное значение присваивается переменной левой части.
Команда присвоения имеет следующие особенности:
1. Команда присвоения работает справа налево.
2. Значение, присвоенное переменной, сохраняется в ней до выполнения следующей команды присвоения этой переменной;
3. Новое значение, присваиваемое переменной, заменяет ее прежнее значение.
Команда x y
x=1; 1 -
y=x; 1 1
y=x+1; 2 1
y=x+y; 2 3
Пример: Произвести обмен значениями двух переменных x и y, например, если сначала x=1, а y=2, то после обмена должно получиться x=2, y=1. Пример из жизни: имеются два стакана - один с молоком, другой с водой. Требуется произвести обмен их содержимым. Потребуется третий промежуточный стакан. Последовательность действий будет следующей:
1. перелить из первого стакана в третий;
2. перелить из второго в первый;
3. перелить из третьего во второй.
По аналогии для обмена значениями двух переменных нужна третья дополнительная переменная. Назовем ее z. Тогда последовательность команд для обмена двух переменных будет состоять из трех команд присвоения.
Команда x y z
z=x; 1 2 1
x=y; 2 2 1
y=z; 2 1 1
4. Не допускается константа в левой части команды. Неверно: 10=х;
5. Выражение правой части должно содержать только известные величины.
6. При описании переменной ей сразу можно присвоить начальное значение – инициализация переменной. Например: int y=2, x, y=10; - две переменные получили начальное значение, одна переменная (х) не получила. В дальнейшем по ходу работы программы, инициализированные переменные могут менять свои значения.
7. Понижение и повышение типа
Тип правой части приводится к типу левой части. При этом возможно повышение и понижения типа. Например:
float x;
int y=2;
x=y; - повышение типа. Значение переменной y (2) преобразуется к типу float (2.0) и присваивается переменной х.
float x=5.5;
int y;
y=x; - понижении типа. Значение переменной х (5.5) преобразуется к типу int путем отбрасывание дробной части (5) и присваивается переменной y.
Повышение типа обычно проходит гладко, т.к. при этом не теряется часть информации. Понижение типа приводит к тому, что часть информации теряется (дробная часть), что приводит к трудноуловимым ошибкам. Многие языки программирования не допускают понижение типа.
8. множественное присвоение.
В языке С возможно тройное и т.д. присвоение.
переменная1=переменная2=…=переменнаяN=выражение;
Присвоение выполняется справа налево, т.е. с ближайшего к выражению.
Пример: char c; int i; float f;
f=i=c=’A’; //Повышение типа
В результате получим: c=’A’, i=65; f=65.0.
9. Явное преобразование типов
Язык С содержит правила автоматического преобразования типов. Однако, они не всегда себя оправдывают. Например: int x;
x=1.6+1.7; - автоматическое приведение типов 1.6+1.7 даст 3.3. После этого вещественное число 3.3 автоматически преобразуется к целому 3 (понижение типов) и присваивается переменной х, т.е. х будет равно 3.
В языке С существует операция приведения типов. В общем виде:
(нужный_тип)операнд
Например: x=(int)1.6+(int)1.7;
В результате получим: int(1.6)=1, int(1.7)=1. В результате х=1+1=2.
10. Сравнение == и =
Типичная ошибка даже опытных программистов: случайная замена операции равно == на присвоение = и наоборот. Например: x=5 и x==5.
Различия:
- = является самостоятельной командой, == не является самостоятельной, а участвует в составе другие, например в сравнении if (x==5) …
- после выполнения = переменная меняет свое значение, после == нет;
- допускается 5==х, но не допускается 5=х;
Однако компилятор С не выдает ошибки в следующих командах:
- if (x=5) …
- x==5;
Ошибки не являются синтаксическими, но при выполнении программы порождают неверные результаты. Это связано со следующим:
Для первого случая. Присвоение вырабатывает результат – вычисленная правая часть, следовательно, если результат выражения правой части есть 0, значит, присвоение вырабатывает ложь, если не 0, то истину.
Для второго случая. Компилятор оценивает == как отдельную команду, результат которой истина или ложь (зависит от х), результат никуда не записывает.
? Почему равенство ==, а присвоение =.
! Операция присвоения = используется намного чаще, чем сравнение на равенство.
11. Составное присвоение
В программах часто приходится писать команды вида:
переменная=переменная+величина; Например: x=x+5;
В математике такие выражения неверны, в программировании они имеют смысл и означают «переменная увеличивает свое старое значение на величину». В данном примере переменная х увеличит свое значение на 5.
В языке С имеются дополнительные команды присвоения, которые заменяют подобные конструкции, а именно это можно было записать более компактно:
переменная+=величина;
Для нашего случая: x+=5;
Другие виды: -=, /=, *=, %=
Такие виды оператора присвоения является менее понятными, однако, для них получатся более компактный объектный код.
Например: х/=х; есть запись вида х=х/х; После такого присвоения х=1.
x*=3*y+12; будет соответствовать x=x*(3*y+12); а не x=x*3*y+12;
12. Команды инкремента (++) и декремента (--)
Еще более часто используемая операция – увеличения (уменьшения) на 1. Например: x=x+1; или y=y-1; Такую запись можно записать более компактно
х+=1; или y-=1;
Однако есть еще более компактная форма записи: x++; y++;
Т.е. запись х=х+1; эквивалентна х++;
Запись y=y-1; эквивалентна y--;
Операции являются унарными, т.е. выполняются над одним операндом. Операнд может иметь произвольный тип, к которому можно добавить 1, даже ‘A’++; что означает увеличить код символа A, т.е. переход к следующему символу
Существует две формы каждой операции: префиксная и постфиксная. Отличаются эти формы моментом увеличения своего операнда.
Префиксная форма – ++ (операнд)
Если операция используется в префиксной форме, то переменная сначала увеличивается, а потом участвует в выражении.
Примеры:
x=4;
y=++x; эквивалентно: x=x+1; y=x;
printf(“x=%d y=%d\n”, x, y); 5 5
Постфиксная форма – (операнд)++
Если используется постфиксная форма, то переменная сначала участвует в выражении, а потом только увеличивается.
Примеры:
x=4;
y=x++; эквивалентно: y=x; x=x+1;
printf(“x=%d y=%d\n”, x, y); 5 4
Данные операции могут стоять в более сложных выражениях. Например: пусть всегда изначально x=3, y=2. Тогда какие значения будут в результате:
1. z=x++*y++; x=4 y=3 z=6
2. z=++x*y++; x=4 y=3 z=8
3. z=x++*++y; x =4 y=3 z=9
4. z=++x*++y; x=4 y=3 z=12
5. z=(x++)+(++y); x=4 y=3 z=6 - скобки обязательны
6. z=++x+y++; x=4 y=3 z=6 – скобки не обязательны
Замечания
1.Нельзя так ++(6), т.к. нельзя изменять константу.
2.Писать так нельзя: ++(х + 1). Нельзя применять операцию ++ или – к выражению, можно только к переменной.
3.Если операция применяется только для изменения своего операнда без участия в выражении, то не имеет значения постфиксная или префиксная запись используется: х++; или ++х;.
4.Для уменьшения ошибок, не следует применять данные операции к одной и той же переменной несколько раз в одном выражении.
z=++x+8/x+++2 x=5, z=8 z=4+8/4 +2
Команды вывода
Любая программа выполняет вычисления с информации, хранимой в ОП. Обычными средствами невозможно увидеть содержимое ОП, для этого требуются специальные команды вывода. Вывод – это передача информации из ОП в устройство вывода: монитор, принтер, файла на диске и другие. Основным устройством вывода является монитор.
Монитор может работать в двух режимах: текстовом и графическом. По умолчанию устанавливается текстовый режим, в котором экран разбит на строки длинной 80 символов. Количество строк на экране в текстовом режиме может меняться от 25 до 50. В текстовом режиме отображается курсор, который указывает текущую позицию, в которой осуществляется вывод. После вывода на экран, курсор автоматически перемещается к соседней правой позиции. Дойдя до правой границе монитора, происходит переход на начало следующей строки.
Компилятор языка С не имеет своих команд вывода, поэтому для организации вывода к программе необходимо подключать библиотечные заголовочные файлы. В этих библиотеках содержится много команд вывода, каждая из них имеет свои возможности и недостатки. Основными заголовочными файлами для команд вывода являются следующие:
- stdio.h – стандартный ввода-вывода;
- iostream.h – потоковый ввод-вывод
- iomanip.h – манипуляторы потокового ввода-вывода.
Команда вывода printf
Является самой универсальной и основной командой вывода, т.к. позволяет выводить информацию на экран любого типа. Находится в заголовочном файле stdio.h. В общем виде выглядит:
printf ( “управляющая строка”, список вывода);
Например:
printf(“Величина числа Pi=%f \n”, Pi);
Список вывода содержит любое количество объектов любого типа, значения которых надо вывести на экран. Объектами могут быть:
- константы;
- означенные переменные;
- выражения.
Управляющая строка всегда заключается в “” и показывает, как надо выводить информацию на экран. Управляющая строка может содержать:
- произвольные символы, выводимые на экран без изменения, так как записаны в строке. Например: printf (“ Программа завершилась с ошибкой ”); - строка для вывода на экран сообщений пользователю. Обычно завершающим символом в управляющей строке является управляющий символ \n, который переводит курсор на начало следующей строки, что обеспечивает построчный вывод на экран. Кроме символа \n можно использовать еще некоторые Esc- последовательности: \a – звонок; \t – горизонтальная табуляция.
- спецификации преобразования начинаются с символа %. Он указывает, в какую позицию в строке надо вывести значение аргумента из списка вывода. Количество спецификаций должно совпадать с количеством и последовательностью выводимых величин в списке вывода. В общем виде спецификация преобразования выглядит: % [-][ширина][.точность]тип
Обязательным является только тип, который указывает, в каком типе должно быть выведено значение из списка вывода. Остальные элементы используются для форматированного вывода. Тип может принимать значения:
d – целое со знаком в 10 с/с
u – целое без знака в 10 с/с
ld – длинное целое со знаком в 10 с/с
lu – длинное целое без знака в 10 с/с
o – целое в 8 с/с
x (Х)– целое в 16 с/с малыми (a-f) или большими (A-F).
F – вещественное число в виде [±]целая_часть.дробная_часть
Lf – для типа long double
e – вещественное число в экспоненциальной форме (в целой части только одна цифра) [±]целая.мантиссаЕ[±]порядок
s – строка символов
c – одиночный символ
p – адрес ячейки памяти (значение указателя)
Одну и ту же величину можно выводить в разных форматах
printf (“%d %o %x %c \n”, 67, 67, 67, 67);
На экране будет:67 103 43 с
Форматированный вывод
“-“ означает, что аргумент будет выводиться с левой позиции поля, заданной ширины. Если не указывать “-“, то вывод будет заканчиваться в самой правой позиции поля.
Ширина – задает минимальную ширину поля для значения аргумента. Если аргумент не помещается в это поле, оно автоматически расширяется. По умолчанию ширина поля равна количеству цифр в записи аргумента
Примеры:
printf(“%d \n”, 455); вывод:455 – по умолчанию
printf(“%2d \n”, -455); вывод:-455 – автоматическое расширение поля
printf(“%2u \n”, -455); вывод:65081 – преобразование отрицательного в беззнаковый
printf(“%10o \n”, 455); вывод:707 – печать заканчивается справа
printf(“%-10x \n”, 123); вывод:1c7 – печать начинается слева
точность – количество цифр после десятичной точки для вывода вещественных чисел. По умолчанию 6 цифр после десятичной точки. Если все цифры не умещаются, происходит округление.
Примеры:
printf(“%f \n”,1234.56); вывод:1234.560000 - по умолчанию
printf(“%4.2f \n”,1234.56); вывод:1234.56 –
printf(“%3.1f \n”,1234.56); вывод:1234.6 - округление
printf(“%10.3f \n”,1234.56); вывод:1234.560
Вывод символа
%c для переменных типа char. Например: char c=’*’;
printf(“Символ %c имеет код %d\n”, c, c);
!!! Символ не должен заключаться в “”, т.к. это будет уже строка, а строку нельзя выводить в формате %c.
Вывод строки
#define STR “This is troke”
printf (“Строка = %20s\n”, STR); This is stroke
printf (“Строка = %20.7s\n”, STR); This is
Изменяемые форматы
Ширину поля и (или) точность можно представлять значениями из списка вывода, что позволяет задавать форматирование пользователем. В этом случае вместо ширины поля и (или точности) указывает *, а само значение выбирается из списка вывода. Например:
printf (“%*.*f ”, 7, 2, 98.736);
ширина вывода будет 7, точность – 2 цифры после десятичной точки, выравнивание по правому краю. Если ширина поля указана отрицательным числом, то выравнивание по левому краю.
Команда вывода cout
Так же является универсальной командой вывода. Относится к языку программирования С++. Описание команды находится в заголовочном файле iostream.h. В общем виде выглядит:
cout<<элемент_вывода1<<элемент_вывода2<<…<<элемент_выводаN;
Например: cout<<“Величина числа Pi=”<<Pi<<’\n’;
Каждый элемент вывода сопровождается впереди стоящим символом << - направление потока на вывод. В качестве элемента вывода может быть:
- строковая константа в “” для вывода поясняющего текста;
- идентификаторы означенных переменных и констант;
- управляющие символы типа ‘\n’, ‘\t’, ‘\a’ и другие;
- выражения, которые надо помещать в скобки. Например: cout<<(10+5)<<’\n’;
- манипуляторы для форматированного вывода.
Указывать спецификаторы преобразования не требуется, т.к. сами операции << преобразуют их к нужному типу.
Манипуляторы для форматированного вывода
Для использования некоторых манипуляторов (манипуляторов с параметром) в команде cout надо подключить заголовочный файл iomanip.h. Приведем некоторые из таких манипуляторов форматирования:
- endl соответствует выводу символа ‘\n’ – перевод курсора на начало следующей строки. Например: cout<<“Величина числа Pi=”<<Pi<<endl;
- dec, hex, oct, setbase(система_счисления) – указывают, в какой системе счисления вывести следующее за ними целую величину. По умолчанию установлен манипулятор dec. Модификатор действует до тех пор, пока его не отменит другой модификатор из этой группы. Например:
cout<<“Восьмеричная ”<<oct<<10<<endl;
cout<<“Шестнадцатиричная ”<<hex<<10<<endl;
cout<<“Десятичная ”<<dec<<10<<endl;
cout<<“Опять 8 с/с ”<<setbase(8)<<10<<endl;
Последним остался манипулятор setbase(8), следовательно, следующий вывод будет в 8 с/с.
- setw(ширина) – ширина поля, т.е. число позиций на экрана, в пределах которого надо вывести следующую за манипулятором величину. В случае если выводимая величина занимает меньше место, чем ширина, то в оставшихся позициях размещается символ-заполнитель. В случае если ширина поля недостаточна для вывода всей величины, ширина поля автоматически расширяется (при этом будет выведено в неудобочитаемом виде). Установленное значение ширины действует только на следующее за ним величину, а топом сбрасывается в 0 (т.е. выводимое значение занимает нужную им ширину). Например:
cout<<setw(5)<<10<<endl; Вывод:10
- setprecision(точность) – точность представления вещественных чисел, т.е. количество цифр после десятичной точки. Действуют, пока не будет указана другая точность этим манипулятором. Например:
cout<<setw(10)<<setprecision(5)<<sqrt(2)<<endl; Вывод:1.41421
- setiosflags(флаг) – манипулятор используется для установки флагов. В качестве флагов можно использовать:
- ios::left – выравнивание слева;
- ios::right – выравнивание справа;
- ios::scientific – вывод вещественных чисел в экспоненциальной форме;
- ios::fixed – вывод вещественного числа в фиксированном формате
Например:
cout<<setiosflags(ios::scientific)<<sqrt(2)<<endl; Вывод: 1.414214е+00 cout<<setiosflags(ios::fixed)<<setprecision(2)<<sqrt(2)<<endl; Вывод: 1.41
- setfill(символ) – определяет символ-заполнитель при выравнивании данных в поле. По умолчанию заполнителем является пробел. Действует до следующей отмены манипулятором setfill. Например:
cout<<setw(5)<<setfill(‘*’)<<setiosflags(ios::left)<<10<<endl; Вывод:10***
Команды ввода
Любая программа не обходится без входных данных. Они могут поступать из разных источников: клавиатура и мышь (от пользователя), файл с данными (ОС, диск) и другие. Ввод данных – это передача информации от внешних устройств в ОП для обработки этих данных процессором. Основным устройством ввода является клавиатура.
Компилятор языка С не имеет своих команд ввода, поэтому для организации ввода в программе необходимо подключать библиотечные заголовочные файлы. В этих библиотеках содержится много команд ввода, каждая из них имеет свои возможности и недостатки. Основными заголовочными файлами для команд вывода являются следующие:
- stdio.h – стандартный ввода-вывода;
- iostream.h – потоковый ввод-вывод
- iomanip.h – манипуляторы потокового ввода-вывода.
Команда ввода scanf- команда языка С
Является самой универсальной и основной командой ввода, т.к. позволяет вводить информацию с клавиатуры любого типа. Находится в заголовочном файле stdio.h. В общем виде выглядит:
csanf ( “управляющая строка”, список ввода);
Например:
int day, mes,god;
printf(“Введите текущую дату ”);
scanf(“%d%d%d”,&day,&mes,&god);
Действия по команде scanf
- Прерывается работа программы и ЦП обращается к клавиатуре.
- Ожидает от пользователя ввода на клавиатуре нужных ему значений для переменных в списке ввода.
- Для контроля вводимые значения высвечиваются на мониторе.
- Преобразование вводимой информации к типу, указанному после % (контроль типов выполняется только при выполнении программы).
- Полученные от пользователя значения размещаются по адресу ячейки памяти переменных, указанных в списке ввода.
Отличия между использованием команд printf и scanf.
- Список ввода содержит только имена переменных, нельзя константы и выражения.
- Перед каждым именем переменной обязательно стоит знак & - операция взятия адреса. Данное действие означает: «Считанное значение с клавиатуры разместить по адресу переменной». Исключение составляет спецификация s.
- В управляющей строке содержаться только спецификаторы преобразования без форматирования и других символов, в том числе и пробелы.
- Спецификации %f и %e эквивалентны.
Вводимая информация может занимать несколько строк. Вводимые величины разделяются символами: пробела (одним или несколькими), табуляцией (клавиша Tab) или символом «новая строка» (клавиша Enter). Исключение составляет спецификация %c, которая считывает любой из этих символов. Запятую при разделении данных использовать нельзя. Завершают ввод всегда клавишей Enter.
Например
float f;
int x;
scanf(“%f%d”,&f,&x);
На клавиатуре такие данные можно ввести следующими вариантами:
1. 0.5100[Enter]
2. 0.5[Tab]100[Enter]
3. 0.5[Enter]
100[Enter]
Допускается ввод целых чисел в 8-ричной и 16-ричной с/с. При вводе в 8 с/с перед числом надо указывать 0, для 16 с/с надо указывать 0х. Например:
int x, y, z;
scanf(“%d%o%x”,&x,&y,&z);
printf(“x=%d, y=%d, z=%d\n”,x,y,z);
На экране будет отображено:70 070 0х70[Enter]
x=70 y=56 z=112
Возможные ошибки при использовании scanf
- Не указан символ & перед именем переменной. Синтаксической ошибки нет, однако значение этой переменной неопределенно – мусор.
- Количество % в управляющей строке больше объектов в писке ввода – ожидает ввода для лишних форматов, никуда их не размещая.
- Количество % в управляющей строк меньше объектов в списке ввода – лишние объекты в списке ввода игнорируются, значения их не определены.
- Контроль типов производится только при выполнении программы.
int x;
scanf(“%f”, &x); //Аварийное завершение программы
- При вводе происходит преобразование введенной пользователем информации к указанному в спецификации преобразованию типу. Например:
int x;
scanf(“%d”,&x);
Пользователь при вводе с клавиатуры ввел: -7.67[Enter]
Программе преобразует число -7.67 к целому типу (-7) и запишет в ячейку х.
Не разрешается при вводе цифровой информации вводить с клавиатуры символы. Исключением является формат f или e. Например:
float f;
scanf(“%f”,&f);
Пользователь может ввести с клавиатуры: -4.45е04.
Команда ввода cin - команда языка С++
Является универсальной и основной командой ввода, т.к. позволяет вводить информацию с клавиатуры любого типа. Находится в заголовочном файле iostream.h. В общем виде выглядит:
cin>>вводимая величина1>>…>>вводимая величинаN;
Например:
int day, mes,god;
cout<<“Введите текущую дату ”;
cin>>day>>mes>>god;
cout<<”Day=”<<day<<”Mes=”<<mes<<”God=”<<god;
Операторы << сами преобразуют введенную информацию к нужному типу.
Сравнение использования команды присвоения и ввода
Команда присвоения и ввода выполняют одну задачу – записать в ячейки памяти переменной необходимую информацию для обработки ее ЦП.
? Когда лучше применять присвоение, а когда ввод.
- Ввод является более универсальным действием, т.к. в ячейку помещается любое нужное пользователю значение, а не конкретное, указанное в присвоении. Ввод делает программу более массовой, расширяет область ее применения. Например: решение квадратного уравнения.
2х2 +3х – 8=0
Неэффективное решение с использованием команды присвоения, т.к. в этом случае будет решаться только конкретно это уравнение.
a=2; b=3; c=-8;
d=b*b-4*a*c;
x1=(-b-sqrt(d))/(2*a);
x2=(-b+sqrt(d))/(2*a);
Более эффективным является ввод коэффициентов с клавиатуры:
printf (“Input a, b, c ”);
scanf(“%f%f%f”,&a,&,&c);
В этом случае можно решить любое квадратное уравнение.
- Ввод – это самый опасный момент в программе. Различный уровень подготовки и внимательности пользователя может привести к аварийным сбоям в программе из-за неверно введенной информации. Ввод требует от пользователя дополнительных действий, что не всегда бывает удобным. Программа должна максимально облегчать, а не усложнять работу пользователя с программой.
Вывод
Если величины имеют заранее известные значения (банковский процент, стоимость 1 Квт энергии и т.д.) или получаются в результате вычислений, то их не надо вводить с клавиатуры, а задают такие величины командой присвоения. Если значения заранее не известны (начальный вклад, показания счетчиков электричества и т.д.), то такие величины должны вводиться только пользователем.
Примеры решения задач с линейными алгоритмами
1. Вводится угол в градусах (ugol), перевести его в радианы (rad).
2. Вычислить расстояние между двумя точками, заданными своими координатами (X1,Y1) ,(X2,Y2). Потребуется 4 входные величины и одна выходная - расстояние. S=
3. По длинам сторон треугольника a,b,c. Вычислить площадь этого треугольника, используя формулу Геррона.
S=, где
4. Розничная цена костюма составляет Р рублей. Торговая наценка в пользу магазина составляет Т=20% розничной цены. Найти оптовую цену костюма OPT. Розничная цена больше оптовой на торговую наценку, т.е. Р=ОРТ+0,2*ОРТ
5. Коктейль готовят из малинового и ананасового сока. 10 л малинового сока стоят 30 рублей, 15 л ананасового сока стоят 60 рублей. Сколько литров каждого сока надо взять, чтобы приготовить 30 л коктейля на сумму 100 рублей.
Составляем систему: x – л малинового сока, y – л ананасового сока. Получаем
- система линейных уравнений
Решим систему линейных уравнений в общем виде:
, , где
Задание для самостоятельной работы.
1. Вычислить площадь кольца, образованного двумя вложенными друг в друга соосными кругами.
2. Известна длина окружности (c). Найти площадь круга (s), ограниченного этой окружностью.
3. Считая, что Земля - идеальная сфера с радиусом R=6350 км, определить расстояние до линии горизонта от точки с заданной высотой над Землей.
4. Вычислить площадь огорода, имеющего форму неправильного четырехугольника. Стороны a, b образуют прямоугольный треугольник
5. Найти время встречи t двух движущихся равноускоренно навстречу друг другу двух автомобилей. Задаются: скорости (V1, V2), ускорения (а1, а2) и S – исходное расстояние между автомобилями. Формула вычисления пройденного пути:
, s=s1+s2, s1=s-s2, подставляются формулы, из которых выражается t. Составляется квадратное уравнение относительно t
Получение случайных чисел
Часто в программах моделирования или игровых программах необходимо получить последовательность случайных чисел (например, смоделировать погоду, случайные позиции солдат, выпадение игральных костей и т.д.). Для этого ПК должен сам создать случайную величину. Обычно случайные величины задают в некотором диапазоне, например, случайные числа для температур – это от –50 до 30, для солдат – разрешение экрана.
В stdlib.h содержатся команды работы со случайными числами.
1. rand() получить целое случайное число в диапазоне от 0 до RAND_MAX=32767. Общий формат применения команды:
int r;
r=rand();
printf(“Случайное число=%d\n”,r);
Можно было и так: printf(“Случайное число=%d \n”, rand() );
Возможные значения: 346, 1279 и другие.
Недостатком данной команды является то, что она вырабатывает случайное число всегда в диапазоне от 0 до 32767. Иногда надо получать случайные числа в другом диапазоне: игральные кости от 1 до 6, координаты на экране в графическом режиме от 0 до 800, координаты в текстовом режиме 1 до 80 и т.д.
2. random(диапазон) - получить целое случайное число в диапазоне от 0 до (диапазон-1). Общий формат применения команды:
int r;
r=random(800); {Случайное число в диапазоне от 0 до 799}
printf(“Случайное число=%d\n”,r);
Можно было и так: printf(“Случайное число=%d \n”, random(10) );
Возможные значения: 455, 10, 678, 0, 799 и другие.
Для получения любых случайных чисел на отрезке [a,b], в том числе и отрицательных (для температур), надо воспользоваться формулой:
r=a+random(b-a+1);
Например: Получить целое случайное число из [-100;100].
r=-100+random(201);
Возможные значения для Х могут быть:
-89, 5, 98 и другие.
Возникают ситуации получения вещественных случайных чисел. Для вещественных чисел требуется указать отрезок [a; b] получения случайных чисел, а так же количество цифр после десятичной точки (d). Тогда общая формула для получения таких чисел равна
float r;
r=a+random( 10d *(b-a)+1)/10d.
Например: получить случайное число на [-20; 20] c 3-мя числами после точки
r=-20+random(103*(20-(-20))+1) /103
Окончательно: r=-20+random(4 001)/1000.;
Примеры: Получить случайные числа:
- Целые на [1,80]. 1+random(81)
- Целые на [-20;0] -20+random(21)
- Целые на [0;1] random(2)
- Вещественные на [0;30] c 1 знаком после точки: random(301)/10.
- Вещественные на [-50;50] c 2 знаками: -50+random(10 001)/100.
- Веществен. на [0;1] с 5 знаками после точки: random(100 001)/100 000.
При каждом запуске программы каждый раз будут получаться одинаковые случайные числа (для игры это означает, что солдаты всегда выскакивают в определенные позиции при каждом запуске программы). Иногда это удобно (можно легко выиграть такую игру, запомнив как выскакивают солдаты). Когда надо получать разные случайные числа при запуске программы, надо задать базу, от которой стартуют случайные числа – инициализировать датчик случайных чисел. Обычно датчик инициализируют один раз в самом начале программы. Для этого можно использовать одну из двух команд:
- randomize() - использует для старта датчика системный таймер (поэтому для ее использования дополнительно надо подключить заголовочный файл time.h.- не надо)
#include <stdlib> //Для random
#include <time.h> //Для получения показания системного таймера
#include <stdio.h>//Для ввода-вывода на экран
#include <conio.h>//Для команды getch()
main()
{ int r,a,b;
randomize;
printf(“Введите границы для датчика “);
scanf(“%d%d”,&a,&b);
r:=a+random(b-a+1);
printf(“Получено случайное число из [%d;%d]=%d\n”,a,b,r);
getch();
}
(не надо)
2. srand(начало) – стартовать датчик случайных чисел от целого числа «начало». Заголовочный файл time.h подключать не требуется.
Например: srand(100);
По теме: методические разработки, презентации и конспекты
Открытый урок - Алгоритмы. Исполнители алгоритмов.
Материалы можно использовать на уроке информатики при изучении темы: "Алгоритмы". По учебнику Босовой Л.Л "Информатика и ИКТ "6 класс. Презентация, конспект урока, а также практическая работа и демонс...
Презентация по теме "Алгоритмы. Свойства. Способы записи алгоритмов. Линейные алгоритмы"
В данной презентации представлен материал к разделу "Алгоритмизация". В презентации рассмотрены понятия: алгоритм, свойства алгоритма, способы записи алгоритмов, линейные алгоритмы. Представлены задач...
Конкурсная программа для учащихся 5–7 классов «АХ, АЛГОРИТМ, АЛГОРИТМ, АЛГОРИТМ…»
«Ах, алгоритм, алгоритм, алгоритм…»(конкурсная программа для учащихся 5–7 классов)...
План - конспект урока в 9 классе «Алгоритмы, понятия алгоритма, свойства алгоритма. Исполнители алгоритма»
Понятие алгоритмов, свойства алгоритма. Исполнители алгоритмов, система команд исполнителя. Способы записей алгоритмов. Формальное исполнение алгоритмов....
План - конспект урока в 9 классе «Алгоритмы, понятия алгоритма, свойства алгоритма. Исполнители алгоритма»
Понятие алгоритмов, свойства алгоритма. Исполнители алгоритмов, система команд исполнителя. Способы записей алгоритмов. Формальное исполнение алгоритмов....
Презентация "Понятие алгоритма. Исполнители алгоритма. Свойства алгоритма".
Презентация подготовленна для 8 класса к учебнику информатики Босовой Л.Л....
Дистанционный урок "Алгоритмы. Свойства алгоритмов, графическое описание и виды алгоритмов"
Предоставленный материал позволит обучающемуся познакомиться с краткой историей появления слова алгоритм, сфомировать понятие алгоритма, его основных свойств, освоить правила описания алгоритмов с пом...