Алгоритм – это четко определенный план действий для исполнителя.
Команда – это описание действий, которые должен выполнить компьютер.
откуда взять исходные данные?
что нужно с ними сделать?
куда поместить результат?
вызов стандартной функции
printf = print format
(форматный вывод)
этот текст будет на экране
файл conio.h: описание функций для работы с клавиатурой и монитором
ждать нажатия на любую клавишу
комментарий до конца строки
комментарий между /* и */
getch();
\n
Какие имена правильные?
AXby R&B 4Wheel Вася “PesBarbos” TU154 [QuQu] _ABBA A+B
main()
{
int a;
float b, c;
int Tu104, Il86=23, Yak42;
float x=4.56, y, z;
char c, c2='A', m;
}
целая переменная a
вещественные переменные b и c
целые переменные Tu104, Il86 и Yak42
Il86 = 23
вещественные переменные x, y и z
x = 4,56
·
целая и дробная части отделяются точкой
символьные переменные c, c2 и m
c2 = 'A'
a = 5;
x = a + 20;
y = (a + x) * (x – a);
5
25
600
умножение
деление
остаток от деления
имя переменной = выражение;
куда записать
что
Простейшее решение:
#include подсказка для ввода ввод двух чисел с клавиатуры вывод результата
#include
main()
{
int a, b, c;
printf("Введите два целых числа\n");
scanf ("%d%d", &a, &b);
c = a + b;
printf("%d", c);
getch();
}
Формат – символьная строка, которая показывает, какие числа вводятся (выводятся).
%d – целое число
%f – вещественное число
%c – 1 символ
%s – символьная строка
12
7652
a – значение переменной a
&a – адрес переменной a
ждать ввода с клавиатуры двух целых чисел (через пробел или Enter), первое из них записать в переменную a, второе – в b
&a
%d%d
&a, &b
убрать пробел
%d%d
printf ("Результат: %d", c);
printf ("%d+%d=%d", a, b, c );
формат вывода
список значений
a, b, c
printf ("%d+%d=%d", a, b, a+b );
арифметическое выражение
1234
всего 9 позиций
или "%i"
или "%9i"
5
4
123.456
всего 9 позиций,
3 цифры в дробной части
printf ("%e", x);
1.234560e+02
стандартный вид:
1,23456·102
printf ("%10.2e", x);
1.23e+02
всего 10 позиций,
2 цифры в дробной части мантиссы
Протокол:
Введите два целых числа
25 30
25+30=55
это выводит компьютер
это вводит пользователь
блок «процесс»
блок «вывод»
блок «конец»
Какие операторы неправильные?
имя переменной должно быть слева от знака =
целая и дробная часть отделяются точкой
при записи вещественного значения в целую переменную дробная часть будет отброшена
1
0
1.75
1.75
a += b;
a = a - 1;
a--;
a = a – b;
a -= b;
a = a * b;
a *= b;
a = a / b;
a /= b;
a = a % b;
a %= b;
z = (5*a+c)/a*(b-c)/ b;
x =(5*c*c-d*(a+b))/((c+d)*(d-2*a))
1 2 4 5 3 6
2 3 5 4 1 10 6 9 8 7
5
7
28
5
3
4
4
?
?
список
вывода
элементы списка разделяются запятыми
форматы вывода начинаются с %
выражения (элементы без кавычек) вычисляются и выводится их результат
1+3=4
формат
вывода
1=F(3)
int a = 1, b = 3;
printf("a=F(%d);", b);
int a = 1, b = 3;
printf("%d>%d!", a+b, b);
int a = 1, b = 3;
printf("F(%d)=X(%d)", b, a);
a=F(3);
4>3!
F(3)=X(1)
X(3)=1
4=1+3
f(1)>f(3)
<1<>3>
1+3=?
int a = 1, b = 3
printf("%d=%d+%d",a+b,a,b);
int a = 1, b = 3
printf("f(%d)>f(%d)", a, b);
int a = 1, b = 3
printf("<%d<>%d>", a, b);
int a = 1, b = 3
printf("%d+%d=?", a, b);
Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися.
max = a;
max = b;
полная форма условного оператора
Особенности:
вторая часть (else …) может отсутствовать (неполная форма)
если в блоке один оператор, можно убрать { }
if ( a > b ) {
a = b;
else
b = a;
if ( a > b )
else
b = a;
if ( a > b )
a = b;
c = 2*a;
else
b = a;
}
}
{
a = b;
max = b;
неполная форма условного оператора
Вариант 2Б. Программа
max = a;
a > b
сложное условие
равно
не равно
Сложные условия
1
1
0
(-∞, 6)
∅
(6, 10)
(10, ∞)
(-∞, 10)
(-∞, 6) ∪ (10,∞)
(-∞, ∞)
(6, ∞)
x < 6
x > 10
x < 10
x > 6
1
1
всё ли сделали
считаем очередной шаг
цикл
N++;
main()
{
int N;
N = 5;
while ( N != ??? )
{
printf("Привет!\n");
???;
}
}
0
N = N - 1;
N --;
1
2
3
4
5
1
3
5
N += 2;
2
4
6
8
10
12
14
16
...
1
8
27
64
125
125
64
27
8
1
обнулить счетчик цифр
ввод n
выполнять «пока n != 0»
n1 = n;
n1,
выполнять «пока n != 0»
, n1;
Особенности:
можно использовать сложные условия:
если в теле цикла только один оператор, скобки {} можно не писать:
while ( a < b && b < c ) { ... }
while ( a < b ) a ++;
a = 4; b = 6;
while ( a > b ) a = a– b;
a = 4; b = 6;
while ( a < b ) d = a + b;
2 раза
a = 6
a = 4; b = 6;
while ( a < b ) a += b;
1 раз
a = 10
a = 4; b = 6;
while ( a > b ) a ++;
0 раз
a = 4
a = 4; b = 6;
while ( a < b ) b = a - b;
1 раз
b = -2
a = 4; b = 6;
while ( a < b ) a --;
зацикливание
Перебор:
Записать в переменную k минимальное из двух чисел.
Если a и b без остатка делятся на k, то стоп.
Уменьшить k на 1.
Перейти к шагу 2.
это цикл с условием!
Заменяем большее из двух чисел разностью большего и меньшего до тех пор, пока они не станут равны. Это и есть НОД.
НОД (14, 21) = НОД (14, 21-14) = НОД (14, 7)
НОД (1998, 2) = НОД (1996, 2) = … = 2
Пример:
много шагов при большой разнице чисел:
= НОД (7, 7) = 7
Надо: вычислить наибольший общий делитель (НОД)
чисел a и b.
Заменяем большее из двух чисел остатком от деления большего на меньшее до тех пор, пока меньшее не станет равно нулю. Тогда большее — это НОД.
НОД (14, 21) = НОД (14, 7) = НОД (0, 7) = 7
Пример:
Еще один вариант:
НОД(2·a,2·b)= 2·НОД(a, b)
НОД(2·a,b)= НОД(a, b) | при нечетном b
an = n
a1 = 1, an+1 = an+1
a1 = 1, an+1 = an + n
an = 2n-1
a1 = 1, an+1 = 2an
b1 = 1, bn+1 = bn+1
c1 = 2, cn+1 = 2cn
Элемент последовательности (начиная с №2):
b = b+1;
c = 2*c;
z = -z;
начальные значения
a = z*b/c;
b = b + 1;
c = 2*c; z = -z;
первый элемент
a = 1;
S = 0;
новый элемент
изменение
переход к следующему слагаемому
начальные значения
увеличение суммы
расчет элемента последовательности
математические функции
fabs – модуль вещественного числа
, b;
чтобы не было округления при делении
Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.
условие
Особенности:
тело цикла всегда выполняется хотя бы один раз
после слова while («пока…» ) ставится условие продолжения цикла
3 раза
a = 7
a = 4; b = 6;
do { a += b; } while ( a <= b );
1 раз
a = 10
a = 4; b = 6;
do { a += b; } while ( a >= b );
зацикливание
a = 4; b = 6;
do b = a - b; while ( a >= b );
2 раза
b = 6
a = 4; b = 6;
do a += 2; while ( a >= b );
зацикливание
main()
{
int N, cubeN;
N = 1;
while ( N <= 8 ) {
cubeN = N*N*N;
printf("%4d\n", cubeN);
N++;
}
}
N = 1;
N <= 8
N++;
3 действия с N
for (N=1; N<=8; N++)
{
cubeN = N*N*N;;
printf("%4d %4d\n", N, cubeN);
}
переменная цикла
начальное значение
конечное значение
изменение на каждом шаге:
i=i+1
ровные столбики
цикл работает, пока это условие верно
цикл
начало цикла
конец цикла
заголовок цикла
for (N=1; N<=8; N++)
cubeN = N*N*N;
printf("%4d %4d\n", N, cubeN);
тело цикла
for ( )
{
cubeN = N*N*N;
printf("%4d %4d\n", N, cubeN);
}
N = 8; N >= 1; N --
Примеры:
for (a = 2; a < b; a+=2) { ... }
for (a = 2, b = 4; a < b; a+=2) { ... }
for (a = 1; c < d; x++) { ... }
for (; c < d; x++) { ... }
for (; c < d; ) { ... }
for(i=1; i<8; i++) { i--; }
for (i = 1; i < 8; i++) a += b;
for (i=1; i<=8; i++)
printf("Привет");
printf("i=%d", i);
i=9
i=0
a = 7
a = 1;
for(i=1; i >= 3; i--)a = a+1;
a = 1
a = 1;
for(i=1; i<= 4; i--)a ++;
зацикливание
a = 1;
for(i=1; i<4; i++) a = a+i;
a = 7
i = 1;
while ( i <= 10 ) {
// тело цикла
i ++;
}
for ( i=a; i>=b; i--)
{
// тело цикла
}
i = a;
while ( i >= b ) {
// тело цикла
i --;
}
D = 28;
да
нет
M = 12?
D = 31;
да
вывод D
ошибка
ни один вариант не подошел
break;
break;
break;
выйти из
switch
main()
{
char c;
printf("Введите первую букву названия животного:\n");
scanf("%c", &c);
switch ( c ) {
case 'а': printf("Антилопа"); break;
case 'б': printf("Бизон"); break;
case 'в': printf("Волк"); break;
default: printf("Я не знаю!");
}
}
switch ( i+3 ) {
case 1: a = b; break;
case 2: a = c;
}
switch ( x ) {
case 1: a = b; break;
case 1: a = c;
}
// X *= X + 2;
/* while ( X > 5 ) {
...
} */
комментарий до конца строки //
закомментированный блок /* … */
initwindow ( 400, 300 );
closegraph();
Структура графической программы
открыть окно для графики
закрыть окно
чтобы посмотреть результат
библиотека для работы с графикой
ширина
высота
Red
красный
0..255
Blue
синий
0..255
Green
зеленый
0..255
R = 218
G = 164
B = 32
R = 135
G = 206
B = 250
256·256·256 = 16 777 216 (True Color)
0 – выключить 3..6 – наклонные линии
1 – сплошная 7..8 – сетка 9..11 – точечная
номер цвета
R
G
B
putpixel (x, y, 9);
setcolor ( 12 );
moveto (x1, y1);
lineto (x2, y2);
lineto (x3, y3);
lineto (x4, y4);
lineto (x5, y5);
цвет
setfillstyle ( 1, 12 );
bar (x1, y1, x2, y2);
setcolor ( 9 );
rectangle (x1, y1, x2, y2);
цвет
стиль
(1 - сплошная)
стиль
(1 - сплошная)
цвет границы
цвет заливки
setcolor ( 9 );
outtextxy ( x, y, "Вася" );
Sharik's house
rectangle(x1, y1, x2, y2);
h = (x2 – x1) / (N + 1.);
for (x = x1+h; x < x2; x += h)
line(x, y1, x, y2);
x
дробная часть x отбрасывается
x
результат – дробное число
прямоугольник
штриховка
N
h = (x2 – x1) / (N + 1.);
for (x = x1+h; x < x2; x += h)
line(x, y1, x, y2);
h = (x3 – x2) / (N + 1.);
a = x2 – x1;
x = x1 + h;
for (i = 1; i <= N; i ++, x += h )
line(x, y1, x-a, y2);
x
x-a
i ++, x += h
после каждого шага выполняются две команды
hx = (x2 – x1) / (N + 1.);
hy = (y2 – y1) / (N + 1.);
x = x1 + hx; y = y1 + hy;
for (i=1; i <= N; i++) {
line( x1, y, x, y );
x += hx; y += hy;
}
или
цвет границы
Шаг изменения c:
серый: R = G = B
Цвет:
Изменение c: 0, ..., 255
N
c = 0;
COLOR(c,c,c)
c += hc;
правая
граница полосы
(x1, y1)
(x2, y2)
(x-1, y1+1)
xэ = a + kx
yэ = b - ky
2π
h – шаг изменения x
w – длина оси ОХ в пикселях
координаты точки на экране
оси координат
Программа:
выбор варианта действий
переменная-флаг (1 или 0)
int first;
...
first = 1;
for (x = xmin; x < xmax; x += h)
{
...
if ( first ) {
moveto(xe, ye);
first = 0;
}
else lineto(xe, ye);
...
}
начальное значение
(x+100, y)
(x, y-60)
void Tr( int x, int y, int c )
{
...
}
имя
процедуры
тело
координаты
цвет
void – «пустой» (некоторые действия)
тело процедуры
формальные
параметры
«Формальные параметры» могут изменяться, заранее неизвестны (обозначаются именами, как переменные).
(100,100)
100
60
фактические параметры
вызовы процедуры
void Tr( int x, int y, int c)
{
...
}
формальные параметры
процедура
void Tr( int x, int y, int c )
Tr ( 200, 100, COLOR(255,0,0));
x
y
c
void A ( int x, float y, char z ) { ... }
void A ( int x, float y, char z )
{
int a2, bbc = 345;
...
}
локальные переменные
int a2, bbc = 345;
4
6
?
4
6
4
x
y
c
c = x;
x = y;
y = c;
x = y;
y = x;
3
2
1
main()
{
int x = 1, y = 2;
Swap ( x, y );
printf ( "x = %d, y = %d", x, y );
}
void Swap ( int a, int b )
{
int c;
c = a; a = b; b = c;
}
эта процедура работает с копиями параметров
x = 1, y = 2
void Swap ( int & a, int & b )
{
int c;
c = a; a = b; b = c;
}
&
параметры могут изменяться
&
Проблема: как изобразить перемещение объекта на экране?
Привязка: состояние объекта задается координатами (x,y)
Принцип анимации:
рисуем объект в точке (x,y)
задержка на несколько миллисекунд
стираем объект
изменяем координаты (x,y)
переходим к шагу 1
if ( kbhit() )
printf("Нажата какая-то клавиша...");
else printf("Нет нажатия...");
if ( kbhit() ) {
printf("Нажата какая-то клавиша...");
c = getch();
printf("Код клавиши %d", c);
}
int c;
if ( kbhit() != 0 )
если нажата клавиша ...
если нажата клавиша с кодом 27 (Esc), выйти из цикла
для kbhit() и getch()
пока не вышли за границу синего квадрата
x + 20 < 400
(x, y)
(x+20, y+20)
Идеи
одна процедура рисует и стирает
стереть = нарисовать цветом фона
границу квадрата отключить (в основной программе)
цвет: желтым рисуем, синим стираем
сплошная заливка цветом color
залитый прямоугольник
процедура
начальные координаты
синий фон
выход по клавише Esc
ждем 20 мс
пока не вышли из синего квадрата
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
перемещение
процедура
основной цикл
обработка нажатия на клавишу
main()
{
int x, y, code;
...
while ( 1 ) {
Draw(x, y, COLOR(255,255,0));
delay(20);
Draw(x, y, COLOR(0,0,255));
}
}
(x0, y0)
α
L
(x, y)
x = x0 + L·cos(α)
y = y0 – L·sin(α)
цвет: желтый – рисуем,
черный – стираем
установили цвет линий
радиус Земли
(x,y)
r
постоянная
void Draw ( int x, int y, int color )
{
...
}
рисуем Солнце: белый контур, желтая заливка
if ( kbhit() )
if ( 27 == getch() ) break;
новые координаты
поворот на ha
ждем 20 мс
выход по Esc
Задания
формальные параметры
int Max ( int a, int b )
{
if ( a > b ) return a ;
else return b ;
}
return - вернуть результат функции
тип результата
int Max ( int a, int b )
{
...
}
фактические параметры
вызов функции
формальные параметры
x в радианах!
count = 0;
for (i = 2; i < N; i ++)
if ( N % i == 0) count ++;
if ( count == 0 )
// число N простое}
else // число N составное
if (count == 0) return 1;
else return 0;
int Prime ( int N )
{
...
}
функция
Prime( N )
Введите число:
528
Неверно.
Введите число:
245
Сумма цифр нечетная.
дробная часть числа
a, c, m - целые числа
простое число
230-1
например, k = 5
остаток от деления
a
b
a
b
равномерное распределение
равномерное распределение
#include int x, y; srand ( 345 ); // начнем с 345
x = rand(); // первое число [0,RAND_MAX]
y = rand(); // уже другое число
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,RAND_MAX] = [0,32767]
COLOR(R,G,B)
int random(int N) {
return rand() % N;
}
функция для получения случайного числа от 0 до N-1
if ( kbhit() )
if ( 27 == getch() ) break;
случайные координаты
случайный цвет
выход по Esc
бесконечный цикл???
Это сайт презентаций, где можно хранить и обмениваться своими презентациями, докладами, проектами, шаблонами в формате PowerPoint с другими пользователями. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами.
Email: Нажмите что бы посмотреть