- •Программирование на языке Си Часть II
- •Программирование на языке Си Часть II
- •Массивы
- •Объявление массивов
- •Массивы
- •Программирование на языке Си
- •Программа
- •Программирование на языке Си
- •Программирование на языке Си
- •Программирование на языке Си
- •Линейный поиск
- •Программирование на языке Си
- •Программирование на языке Си
- •Программирование на языке Си
- •Ввод символьных строк
- •Сравнение строк
- •Проверка пароля
- •Указатели
- •Программирование на языке Си
- •Процедура
- •Программирование на языке Си
- •Программирование на языке Си
Программирование на языке Си
Часть II
Тема 7. Практикум
(моделирование)
© К.Ю. Поляков, 2007
52
Моделирование кипения воды
Задача: Построить компьютерную модель кипения воды.
Хранение данных: координаты (центров) пузырьков хранятся в массивах X и Y:
X[i], Y[i] – координаты центра пузырька с номером i.
53
Структура программы
#include <graphics.h> |
глобальные |
|
#include <conio.h> |
константы и |
|
#include <dos.h> |
переменные |
|
#include <stdlib.h> |
объявления |
|
const N = 100; |
||
процедур |
||
int X[N], Y[N], r = 3; |
||
|
void Init |
(); // начальное положение |
||
void Draw |
( |
int color ); // рисуем, стираем |
|
void Sdvig ( int dy ); |
// летят вверх |
||
void Zamena |
(); |
// ушли, пришли |
|
void main() |
|
|
|
{ |
|
|
|
int d = |
DETECT, m; |
|
initgraph ( &d, &m, "c:\\borlandc\\bgi" );
... // здесь основная часть программы closegraph();
}
... // здесь сами процедуры
основная
программа
54
Основная программа
Init(); |
// начальная расстановка |
|
while ( |
1 ) |
выход по Esc |
{ |
|
(код 27) |
if ( kbhit() ) |
|
|
if ( getch() == 27 ) break; |
||
Draw ( YELLOW ); |
// рисуем все пузырьки |
|
delay |
( 10 ); |
|
Draw ( BLACK ); |
// стираем все пузырьки |
|
Sdvig |
( 4 ); |
// вверх на 4 пикселя |
Zamena(); |
// если за пределами экрана… |
|
} |
|
|
55
Процедура Init
Начальная расстановка:
случайное положение в пределах экрана.
|
640 |
Интервал для x: [r, 640-r] |
|
|
|
r |
|
X[i] = random(640 - 2*r) + r; |
480
void Init()
{
Интервал для y: [r, 480-r]
Y[i] = random(480 - 2*r) + r;
int i;
for ( i = 0; i < N; i ++ )
{
X[i] = random(640 - 2*r) + r;
Y[i] = random(480 - 2*r) + r;
}
}
56
Процедуры Draw, Sdvig
Рисование и стирание:
void Draw ( int color )
{
int i;
setcolor ( color );
for ( i = 0; i < N; i ++ ) circle ( X[i], Y[i], r );
}
Сдвиг вверх:
void Sdvig ( int dy )
{
int i;
for ( i = 0; i < N; i ++ )
Y[i] -= dy;
}
57
Процедура Zamena
Замена вышедших за границы экрана:
|
|
Условие выхода: |
|
Y[i]< r |
if ( Y[i] < r ) { ... } |
480 |
|
|
Y[i] = 480 - r |
Перебросить вниз: |
|
|
X[i] = random(640 - 2*r) + r; |
|
|
|
Y[i] = 480 – r;
void Zamena ()
{
int i;
for ( i = 0; i < N; i ++ ) if ( Y[i] < r ) {
X[i] = random(640 - 2*r) + r; Y[i] = 480 - r;
}
}
58
Задания
"4":
"5":
Моделирование кипения воды в стакане (синий фон, рамка):
Моделирование двустороннего потока: часть частиц двигаются влево, часть – вправо.
Программирование на языке Си
Часть II
Тема 8. Символьные строки
© К.Ю. Поляков, 2007
60
Чем плох массив символов?
Это массивы символов:
char A[4] = { 'A', '3', '[', 'Ж'}; char B[10];
Для массива:
•каждый символ – отдельный объект;
•массив имеет длину N, которая задана при объявлении
Что нужно:
•обрабатывать последовательность символов как единое целое
•строка должна иметь переменную длину
61
Символьные строки
char s[80];
s[3]
0
признак окончания строки: символ с кодом 0
П р и в е т ! \0 ¤ ¤ … ¤ ¤ ¤
|
|
|
часть |
|
|
|
s[0] s[1] |
! |
|
||||
|
|
|||||
|
Символ '\0' имеет код 0 |
|||||
|
|
|
|
|
|
символ '0' имеет код 48 |
|
|
|
|
|
|
|
Символьная строка – это последовательность символов, которая заканчивается символом '\0'.
62
Объявление символьных строк
Объявить строку = выделить ей место в памяти и
присвоить имя. выделяется 80 байт, в
строке – «мусор» (если она |
|
глобальная, то нули '\0‘) |
|
char s[80]; |
выделяется 80 байт, |
|
|
|
занято 4 байта |
char s1[80] = "abc"; |
(с учетом '\0') |
|
|
|
выделяется 5 байт |
char qqq[] = "Вася"; |
(с учетом '\0') |
|
!• При выделении памяти надо учитывать место для '\0'.
•В строку нельзя записывать больше символов, чем выделено памяти.
63
Ввод и вывод символьных строк
Задача: ввести слово с клавиатуры и заменить все буквы "а" на буквы "б".
void main() |
%s – формат для ввода и |
|
{ |
вывода символьных строк |
|
q[80]; |
(выводится только часть до '\0' |
|
начали с |
|
|
q[0] |
пока не дошли до |
&: |
|
||
"%s" |
конца строки |
q &q[0] |
|
|
|
i = 0; |
|
|
while ( q[i] != '\0' ) { |
|
|
if ( |
|
переход к |
i ++; |
|
|
|
следующему |
|
} |
|
|
|
символу |
printf ( "Результат: %s ", q );
}