Главная страница

Язык Си. Алгоритм Свойства алгоритма дискретность состоит из отдельных шагов (команд) понятность


Скачать 4.66 Mb.
НазваниеАлгоритм Свойства алгоритма дискретность состоит из отдельных шагов (команд) понятность
Дата05.02.2023
Размер4.66 Mb.
Формат файлаppt
Имя файлаЯзык Си.ppt
ТипПрограмма
#921318
страница11 из 11
1   2   3   4   5   6   7   8   9   10   11

Задания





«5»: Два квадрата двигаются в противоположных направлениях и отталкиваются от стенок синего квадрата:





Управление клавишами


Задача: жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш:
влево – 75 вверх – 72 Esc – 27
вправо – 77 вниз – 80
Проблема: как изменять направление движения?
Решение:


if нажата клавиша {
получить код клавиши - code
if (code == 27) break;
if (code == 75) x --;
if (code == 77) x ++;
if (code == 72) y --;
if (code == 80) y ++;
}


( kbhit() )


code = getch();


switch ( code ) {
case 75: x --; break;
case 77: x ++; break;
case 72: y --; break;
case 80: y ++;
}
}


если было нажатие на клавишу, …


получить код клавиши


выход по Esc


перемещение





Программа


void Draw (int x, int y, int color)
{
...
}


if ( kbhit() ) {
...
}


Что плохо?


?


процедура


основной цикл


обработка нажатия на клавишу


main()
{
int x, y, code;
...
while ( 1 ) {
Draw(x, y, COLOR(255,255,0));
delay(20);
Draw(x, y, COLOR(0,0,255));
}
}


Как убрать мигание?


?





Задания


«3»: Квадрат в самом начале стоит в правом нижнем углу, и двигается при нажатии стрелок только вверх или влево:
«4»: Квадрат двигается при нажатии стрелок, однако не может выйти за границы синего квадрата:

Задания





«5»: Квадрат непрерывно двигается, при нажатии стрелок меняет направление и отталкивается от стенок синего квадрата:





Вращение (для 8-11 класса)


Задача: изобразить модель вращения Земли вокруг Солнца.
Проблема: движение по окружности, как изменять координаты?
Решение: использовать в качестве независимой переменной (менять в цикле) угол поворота α


(x0, y0)


α


L


(x, y)


x = x0 + L·cos(α)
y = y0L·sin(α)





Процедура


void Draw( int x, int y, int color )
{
const int r = 10;
setcolor ( color );
circle ( x, y, r );
}


цвет: желтый – рисуем, черный – стираем


установили цвет линий


радиус Земли


(x,y)


r


постоянная





Константы и переменные


#include // математические функции
main()
{
const int rSun = 60, // радиус Солнца
L = 150, // радиус орбиты Земли
x0 = 200, // координаты центра Солнца
y0 = 200;
int x, y, // координаты Земли
code; // код нажатой клавиши
float a, ha; // угол поворота, шаг
initwindow( 500, 500 );
...
}


void Draw ( int x, int y, int color )
{
...
}





Основной цикл


circle ( x0, y0, rSun );
setfillstyle(1, COLOR(255,255,0));
floodfill(x0, y0, COLOR(255,255,255));
a = 0; // начальный угол
ha = M_PI/180; // шаг 1o за 20 мс
while(1) {
x = x0 + L*cos(a);
y = y0 - L*sin(a);
Draw ( x, y, COLOR(0,255,255) );
delay ( 20 );
Draw(x, y, 0);
a = a + ha;
}
closegraph();


рисуем Солнце: белый контур, желтая заливка


if ( kbhit() )
if ( 27 == getch() ) break;


#include // sin, cos, M_PI


!


новые координаты


поворот на ha


ждем 20 мс


выход по Esc





«4»: Изобразить модель Солнца с двумя планетами, которые вращаются в противоположные стороны:
«5»: Изобразить модель системы Солнце-Земля-Луна:


Задания


Тема 13. Функции





Функции


Функция – это вспомогательный алгоритм (подпрограмма), результатом работы которого является некоторое значение.
Примеры:
    вычисление модуля числа, расчет значений по сложным формулам ответ на вопрос (простое число или нет?)

    Зачем?

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


В чем отличие от процедур?


?





Функции


Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования
Функция:


формальные параметры


int Max ( int a, int b )
{
if ( a > b ) return a ;
else return b ;
}


return - вернуть результат функции


тип результата





Функции


Особенности:
    в начале заголовка ставится тип результата
    формальные параметры описываются так же, как и для процедур можно использовать параметры-переменные функции обычно располагаются до основной программы


Max ( int a, int b )


int


float qq ( )


int a, float x, char c


int Vasya (int a, int b )


&


&





Функции


Особенности:
    можно объявлять и использовать локальные переменные


float qq ( int a, int b)
{
...
}


float x, y;


локальные переменные


Локальные переменные недоступны в основной программе и других процедурах и функциях.


!





Программа


main()
{
int a, b, с;
printf ( "Введите два числа\n" );
scanf ( "%d%d", &a, &b );
c = Max ( a, b );
printf ( "Наибольшее число %d", c );
}


int Max ( int a, int b )
{
...
}


фактические параметры


вызов функции


формальные параметры





Задания


«4»: Составить функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования.
Пример:
Введите число:
100
сумма чисел от 1 до 100 = 5050
«5»: Составить функцию, которая определяет, сколько зерен попросил положить на N-ую клетку изобретатель шахмат (на 1-ую – 1 зерно, на 2-ую – 2 зерна, на 3-ю – 4 зерна, …)
Пример:
Введите номер клетки:
28
На 28-ой клетке 134217728 зерен.





Задания (вариант 2 для 9-11 класса)


«4»: Составить функцию, которая определяет наибольший общий делитель двух натуральных и привести пример ее использования.
Пример:
Введите два числа:
14 21
НОД(14,21)=7
«5»: Составить функцию, которая вычисляет функцию синус как сумму ряда (с точностью 0.001)
Пример:
Введите угол в градусах:
45
sin(45) = 0.707


x в радианах!





Логические функции


Задача: составить функцию, которая определяет, верно ли, что заданное число – простое.
Особенности:
    ответ – логическое значение: «да» (1) или «нет» (0)
    результат функции можно использовать как логическую величину в условиях (if, while)

    Алгоритм: считаем число делителей в интервале от 2 до N-1, если оно не равно нулю – число составное.

Как улучшить?


?


count = 0;
for (i = 2; i < N; i ++)
if ( N % i == 0) count ++;
if ( count == 0 )
// число N простое}
else // число N составное





Функция: простое число или нет


int Prime ( int N )
{
int count = 0, i;
for (i = 2; i*i <= N; i++)
if (N % i == 0) count ++;
return (count == 0);
}


if (count == 0) return 1;
else return 0;





Логические функции


#include
main()
{
int N;
printf ( "Введите целое число\n" );
scanf ( "%d", &N );
if ( Prime( N ) )
printf ("%d - простое число", N);
else printf ("%d - составное число", N);
}


int Prime ( int N )
{
...
}


функция


Prime( N )





Задания


«4»: Составить функцию, которая определяет, верно ли, что сумма его цифр – четное число.
Пример:
Введите число:
136
Сумма цифр четная.
«5»: Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по возрастанию.
Пример:
Введите число:
258
Верно.


Введите число:
528
Неверно.


Введите число:
245
Сумма цифр нечетная.


Тема 14. Случайные числа





Случайные числа


Случайные явления: везде…
    бросание монеты («орел» или «решка»)
    падение снега броуновское движение помехи при телефонной связи шум радиоэфира

    Случайные числа – это такая последовательность чисел, для которой невозможно предсказать следующее даже зная все предыдущие.
    Проблема: как получить на компьютере?
    Возможные решения:

    использовать внешний источник шумовых помех с помощью математических преобразований





Псевдослучайные числа


Псевдослучайные числа – это такая последовательность чисел, которая обладает свойствами случайных чисел, но каждое следующее число вычисляется по заданной формуле.
Примеры:
    Случайные целые числа [0,m) (линейный конгруэнтный метод)
    Случайные вещественные числа [0,1]

    Литература:

    Д. Кнут, Искусство программирования для ЭВМ, т.2.


дробная часть числа


a, c, m - целые числа


простое число


230-1


например, k = 5


остаток от деления





Распределение случайных чисел


Модель: снежинки падают на отрезок [a,b]


a


b


a


b


распределение


равномерное


неравномерное


Сколько может быть разных распределений?


?





Распределение случайных чисел


Особенности:
    распределение – это характеристика всей последовательности, а не одного числа
    равномерное распределение одно, компьютерные датчики (псевдо)случайных чисел дают равномерное распределение неравномерных – много любое неравномерное можно получить с помощью равномерного


a


b


a


b


равномерное распределение


равномерное распределение





Генератор случайных чисел в Си


RAND_MAX – максимальное случайное целое число (обычно RAND_MAX = 32767)
rand() – случайное целое число в интервале [0,RAND_MAX]
srand(N) – установить начальное значение последовательности случайных чисел N:


#include // случайные числа


int x, y;
x = rand(); // первое число [0,RAND_MAX]
y = rand(); // уже другое число


srand ( 345 ); // начнем с 345





Целые числа в заданном интервале


Целые числа в интервале [0,N-1]:
Примеры:
Целые числа в интервале [a,b]:


int random(int N) {
return rand()% N;
}


x = random ( 100 ); // интервал [0,99]
x = random ( z ); // интервал [0,z-1]


x = random ( z ) + a; // интервал [a,z-1+a]
x = random (b – a + 1) + a; // интервал [a,b]





Генератор случайных чисел в Си


Вещественные числа в интервале [0,1]
float x;
x = 1.*rand() / RAND_MAX; // интервал [0,1]
Вещественные числа в интервале [0,z]
x = 1.*z*rand() / RAND_MAX;
Вещественные числа в интервале [a,z+a]
x = 1.*z*rand() / RAND_MAX + a;
Вещественные числа в интервале [a,b]
x = 1.*(b-a)*rand() / RAND_MAX + a;


[0,RAND_MAX] = [0,32767]





Случайные числа


Задача: заполнить прямоугольник 400 на 300 пикселей равномерно точками случайного цвета
Как получить случайные координаты точки?
    x = random ( 400 );
    y = random ( 300 );

    Как добиться равномерности?
    обеспечивается автоматически при использовании функции random
    Как получить случайный цвет?

    R = random( 256 ); G = random ( 256 );
    B = random( 256 );


COLOR(R,G,B)





Программа


#include
#include
#include
main()
{
int x, y, R, G, B;
initwindow ( 500, 500 );
// цикл до нажатия на Esc
closegraph();
}


int random(int N) {
return rand() % N;
}


функция для получения случайного числа от 0 до N-1





Основной цикл


while ( 1 ) {
x = random(400);
y = random(300);
R = random(256);
G = random(256);
B = random(256);
putpixel ( x, y, COLOR(R,G,B));
}


if ( kbhit() )
if ( 27 == getch() ) break;


случайные координаты


случайный цвет


выход по Esc


бесконечный цикл???





Задания


«3»: Заполнить квадрат точками случайного цвета. размер квадрата ввести с клавиатуры:
Пример:
Введите размер квадрата:
150
«4»: Заполнить область точками случайного цвета:

Залания





«5»: Заполнить область точками случайного цвета:


или

Конец фильма





ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики высшей категории,
ГОУ СОШ № 163, г. Санкт-Петербург
kpolyakov@mail.ru

1   2   3   4   5   6   7   8   9   10   11


написать администратору сайта