- •А.П. Новоселов программирование на языке Си
- •1.1. Порядок создания программы
- •1.2. Ввод и выполнение программы
- •1.3. Модификация программы
- •1.4. Пошаговое выполнение программы
- •1.5. Сообщения компилятора и компоновщика
- •1.6. Действия в случае ошибки выполнения
- •1.7. Ошибки в форматах ввода/вывода
- •1.8. Вычисления с вещественными числами
- •2.1. Лексемы
- •2.2. Идентификаторы
- •2.3. Ключевые слова
- •2.4. Константы
- •3.2. Арифметические операции
- •3.3. Операции отношения и логические операции
- •3.4. Операции присваивания
- •3.5. Поразрядные операции
- •3.6. Библиотека функций
- •1. Вычисление площади и периметра геометрической фигуры
- •2. Вычисления по формулам с вещественными числами
- •3. Арифметические операции для целочисленных данных
- •4. Циклы с заданным числом повторений
- •5. Алгоритмы с разветвлениями
- •6. Циклы с условием окончания
- •7. Последовательная обработка данных
- •8. Поразрядные операции
- •9. Обработка массивов
- •10. Обработка матриц
- •11. Сортировка массивов
- •12. Сортировка матриц
- •1.1. Математическая постановка
- •1.4.2. Содержание результатов работы программы на экране
- •Выполнил: Иванов и.П., гр. Ут – 11, вариант 13(2)
- •1.4.3. Текст программы
- •Выводы по работе
12. Сортировка матриц
Цель работы: изучение приёмов сортировки двумерных массивов данных, выработка умений алгоритмизации и программирования задач сортировки массивов, отладки и тестирования программ с массивами.
/* Программа 12. Программа демонстрирует типовые процедуры сортировки двумерных массивов по заданным условиям: поиск строки матрицы, сортировка столбцов по возрастанию значений чисел заданной строки, перемещение строк или столбцов. Задачи решаются без использования дополнительных массивов. */
// Прототипы функций программы:
void in_matr(int x[ ][10], int m, int n); // ввод матрицы размером m *n
// с клавиатуры
void in_matr_rand(int x[ ][10], int m, int n); // заполнение матрицы размером
// m*n случайными числами из интервала [-10, 10].
void out_matr(int x[ ][10], int m, int n); // вывод матрицы размером m*n
// на экран.
void processing(int x[ ][10], int *y, int m, int n); // функция заменяет // в матрице размером m*n строки, не содержащие "+"-ых элементов, // элементами массива y[ ].
void sort_columns(int x[ ][10], int m, int n); // располагает столбцы матрицы
// размером m*n в порядке возрастания элементов первой строки.
void rows_move(int x[ ][10], int m, int n); // перемещение строк с первым 0-м
// элементом на место последних строк матрицы.
#include <stdio.h>
#include <conio.h>
void main( )
{ int m, n, x[10][10], y[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
char ch;
printf(" *** Matrix Sort *** ");
printf("\n\n Введите размеры матрицы m<=10, n<=10: ");
scanf("%d %d", &m, &n);
printf("\n Ввод матрицы с клавиатуры - 'c' или заполнение \
случайными числами - 'r'? - ");
scanf("%c%c", &ch, &ch);
if((ch=='c') || (ch=='C')) in_matr( x, m, n);
else { randomize(); in_matr_rand( x, m, n);}
printf("\n Исходная матрица: %d*%d \n", m, n);
out_matr( x, m, n );
processing(x, y, m, n);
printf("\n Замена строк с отрицательными элементами числами \
заданного массива: \n");
out_matr( x, m, n );
sort_columns(x, m, n);
printf("\n Сортировка столбцов матрицы в порядке возрастания \
элементов первой строки: \n");
out_matr( x, m, n );
printf("\n перемещение строк с первым 0-м элементом на место \
последних строк матрицы: \n");
rows_move( x, m, n );
out_matr( x, m, n );
getch();
return 0;
} /* Коды функций in_matr( ), in_matr_rand( ) и out_matr( ) приведены в программе 10. Модификацию функций для матрицы размером m х n выполните самостоятельно. */
Функция processing( ) заменяет в матрице размером m х n строки с отрицательными элементами числами массива y[ ].
ТЕСТ: m = 4, n = 4, y[ ] = { 10, 9, 8, 7 },
-1 -1 -1 -1 10 9 8 7
x = -2 2 -2 -2 => -2 2 -2 -2
-3 -3 -3 -3 10 9 8 7
4 -4 4 4 4 -4 4 4
void processing( int x[ ][10], int *y, int m, int n )
{ int i, j, k;
for ( i = 0; i < m; i++ ) // проверка всех строк
{ j = -1;
do // поиск в строке 'i' элемента x[i][j] >= 0
{ j++;
if( x[i][j] >= 0 && j != n) break; // то элемент найден
if( j == n ) // строка 'i' с "-"-ми элементами
for ( k=0; k<n; k++) x[i][k] = y[k];
}
while ( j != n );
}
/* Функция rows_move( ) перемещает строки с первым 0-м элементом на место последних строк матрицы размером m*n.
ТЕСТ: m = 4, n = 4,
0 1 1 1 4 4 4 4
x = 2 2 2 2 => 2 2 2 2
0 3 3 3 0 3 3 3
4 4 4 4 0 1 1 1
*/
void rows_move(int x[ ][10], int m, int n)
{ int ii = 0, // номер строки с первым нулевым элементом
kk = n-1, // номер строки с первым ненулевым элементом
// от последней строки
i, j, k, w;
while( ii < kk )
{ for ( i = ii; i < m-1; i++) // поиск строки с первым нулевым элементом
if( x[i][0] == 0 ) break;
ii = i;
for ( k = kk; k > ii; k- -) // поиск строки с первым ненулевым элементом
if( x[k][0] != 0 ) break; // от последней строки
kk = k;
if( ii < kk ) // меняем строки ii и kk местами
for ( j = 0; i < n; j++) // столбцы j и k
{ w = x[ii][j];
x[ii][j] = x[kk][j];
x[kk][j] = w;
}
ii++, kk--;
}
}
/* Функция sort_columns( ) располагает столбцы матрицы размером m*n
впорядке возрастания элементов первой строки.
ТЕСТ: m = 4, n = 4,
3 1 2 0 0 1 2 3
x = 3 1 2 0 => 0 1 2 3
3 1 2 1 1 1 2 3
3 1 2 2 2 1 2 3
*/
void sort_columns(int x[ ][10], int m, int n)
{ int i, j, k, z;
for ( j = 0; j < n-1; j++)
for ( k = j+1; k < n; k++)
if ( x[0][j] > x[0][k] ) // меняем местами
for ( i = 0; i < m; i++) // столбцы j и k
{ z = x[i][j];
x[i][j] = x[i][k];
x[i][k] = z;
}
}
Вопросы и упражнения
Сколько циклов нужно для просмотра всех элементов n-мерного массива?
Запишите циклы для инвертирования матрицы m х n (замена строк столбцами).
Поясните следующий фрагмент программы обработки матрицы а размером n x n:
for( j = 0; j < n; j++ )
for( i = n-1; i > j; i-- ) а[i][j] = а[ i - j ] [ n-1 - j ]
Составьте функцию для удаления: а) k- го столбца матрицы; б) k-ой строки матрицы.
Поясните алгоритм сортировки в функции sort_columns(). Модифицируйте функцию для сортировки по методу «пузырька».
Как выполнить перемещение строк в функции rows_move( ) сохранив последовательность строк с ненулевым первым элементом относительно друг друга?
Работа 13. Работа с экраном в текстовом режиме
Цель работы: изучение функций библиотеки консольного ввода и вывода данных, выработка умений алгоритмизации и программирования задач организации оконного интерфейса средствами MS DOS, отладки и тестирования программ с функциями.
/* Программа 13.1 выводит окно меню для изображения трех окон с различным цветом фона. Функциональные клавиши, клавиши управления курсором и некоторые другие клавиши и комбинации клавиш посылают в буфер клавитуры расширенные коды, которые состоят из двух символов: первый - символ с кодом 0 ('\0') и второй – байт-код расширенного кода. */
#include <stdio.h>
#include <conio.h> // библиотека функций для работы
// с экраном в текстовом режиме
void main()
{ char ch;
textbackground(BLACK); // демонстрация окон на черном фоне
gotoxy(20, 24); // курсор в позицию экрана х=20, y=24
cprintf("В окна можно вводить символы с клавиатуры.");
gotoxy(20, 25); // следующая строка:
cprintf("Выход из программы: кл _F4 или кл_Esc");
clrscr();
window(1, 1, 15, 11); // окно меню в верхнем левом углу экрана
textbackground(LIGHTGRAY); // цвет фона окна меню
textcolor(YELLOW); // установка цвета символов для всех окон
clrscr(); // установка заданных выше атрибутов окна меню
// Вывод надписей пунктов меню в окне меню:
gotoxy(2, 3); сprintf(" F1 - окно_1");
gotoxy(2, 5); сprintf(" F2 - окно_2");
gotoxy(2, 7); сprintf(" F3 - окно_3");
gotoxy(2, 9); сprintf(" F4 - выход");
_setcursortype(_NOCURSOR); // убрать курсор из окна меню
do
{ ch = getch();
if (ch == '\0') // ..., то код расширенный
{ ch = getch(); // и считывается второй символ расширенного кода
switch (int(ch)) // В этот блок попадаем при нажатии
// одной из четырёх клавиш: F1,F2,F3 или F4 !
{
case 59: // F1 – изображение окна_1:
{ window(22, 1, 32, 10); textbackground(BLUE);
_setcursortype(_NORMALCURSOR); // Установить курсор
clrscr(); break; }
case 60: // F2 - изображение окна _2:
{ window(34, 1, 44, 15); textbackground(RED);
clrscr(); break; }
case 61: // F3 - изображение окна _3:
{ window(46, 1, 56, 20); textbackground(GREEN);
clrscr(); break; }
case 62: exit(0); // Выход из программы
}// конец switch
} // конец if в части < then >
else putch(ch); // вывод символов в выбранное окно
}
while ( int(ch) != 27 ); // код клавиши Esc
}
/* Программа 13.2 демонстрирует функции библиотеки conio:
clrscr() gotoxy() textcolor()
cputs() insline() textmode()
delline() kbhit() wherex()
getch() putch() wherey()
gettextinfo() textbackground() window()
Функции программы:
1. initialize():
устанавливается видеорежим С4350: фонт 8х8 ( 43/50 строк для EGA/VGA );
устанавливаются размеры экрана (last_col и last_row) для вывода окон, последняя строка на экране сохраняется для сообщения;
инициализируется генератор случайного числа ( randomize() ).
2. makewindow() - создание окна со случайными размерами.
3. randomtext() - генерирование случайной последовательности символов, кроме управляющих символов, и вывод в активное окно.
3. main():
вызов функции initialize( );
цикл обработки нажатия клавиш до нажатия кл_Esc:
символы выводятся в текущем окне, окна автоматически переносят текст на другую строку и прокручивают строки.
Использование специальных клавиш:
кл_Ins - вставка строки,
кл_Del - удаление строки,
кл_Enter - переход на другую строку,
<клавиши-стрелки> - позиционирование курсора в окне,
кл_Alt-R - генерация случайного текста до нажатия клавиши,
кл_Alt-W - другое окно,
кл_Esc - выход из программы.
#include <stdio.h>
#include <conio.h> // функции текстового видеорежима
#include <stdlib.h> // функция random(int num) -
// генератор случайных чисел в интервале (0, num-1)
#include <dos.h> // Включает функцию delay(ms) - задержка
// исполнения программы в миллисекундах (ms)
#include <time.h> // Для работы функций randomize() и random()
int last_col, last_row; // Глобальные
struct text_info ti; // переменные
void randomtext();
void initialize();
void makewindow();
main()
{ char ch;
int done, wx, wy;
initialize();
done = 1; // условие продолжения цикла: (done = = 1)
do
{ ch = getch();
if ( ch == '\0') // ..., то код расширенный
{ ch = getch();
switch (int(ch))
{ case 17: { makewindow(); break; } // Alt-W
case 19: { randomtext(); break; } // Alt-R
case 45: { done = 1; break; } // Alt-X
case 72: { wx=wherex(); wy=wherey()-1;
gotoxy(wx, wy); break; } // Up - вверх
case 75: { wx=wherex()-1; wy=wherey();
gotoxy(wx, wy); break; } // Left - влево
case 77: { wx=wherex()+1; wy=wherey();
gotoxy(wx, wy); break; } // Right - вправо
case 80: { wx=wherex(); wy=wherey()+1;
gotoxy(wx, wy); break; } // Down - вниз
case 82: { insline(); break; } // Ins - вставить строку
case 83: { delline(); break; } // Del - удалить строку
}
}
else // обычный код клавиши
switch (int(ch))
{ case 13: { putch('\n'); putch('\r'); break; } // Enter – переход
// на другую строку
case 27: { done = 0; break; } // Esc - выход из программы
default: { putch(ch); break; } // ввод символа в окно
}
} while ( done == 1 );
textmode(LASTMODE); // установить предыдущий режим
} // конец main()
void initialize()
{ char ch;
clrscr(); // очистка и заполнение окна установленным цветом фона
textmode(C4350); // установить видеорежим 43/50 строк для EGA/VGA
gettextinfo( &ti ); // информация о текущем окне, атрибутах текста,
// экране, видеорежиме и позиции курсора
last_col = ti.winright; // ширина окна (число столбцов символов)
last_row = ti.winbottom; // высота окна (число строк символов)
gotoxy(1,last_row); // переход на первую позицию строки сообщения
textbackground(BLACK); // цвет фона строки сообщения - черный,
textcolor(WHITE); // цвет текста - белый
// вывод строки сообщения:
cputs(" Ins-InsLine Del-DelLine "); // вывод строки "..."
ch = char(27); putch(ch); // стрелка влево
ch = char(24); putch(ch); // стрелка вверх
ch = char(25); putch(ch); // стрелка вниз
ch = char(26); putch(ch); // стрелка вправо
cputs(" - cursor ");
cputs("Alt-W-Window Alt-R-Random Esc-Exit");
last_row--; // уменьшаем размер экрана до строки сообщения
randomize(); // инициализация генератора случайного числа
} // конец initialize()
void makewindow()
{ int x, y, width, height, xw, yh, col;
width = random(last_col-2)+2; // ширина окна,
height = random(last_row-2)+2; // высота окна - случайные
x = random(last_col-width)+1; // x, y - координаты верхней
y = random(last_row-height)+1; // левой точки окна
xw = x+width; yh = y+height;
window(x, y, xw, yh); // создание окна
col = random(8);
textbackground(col); // случайный фон окна
col= random(7)+9;
textcolor(col); // случайный цвет символов
clrscr();
} // конец makewindow()
void randomtext()
{ char ch;
do
{ ch = char(random(224)+32);
// случайный символ, кроме управляющих ( код < 32 )
putch(ch); delay(20); // вывод символов с паузой 20 ms
} while ( !kbhit() ); // ..., пока не нажата клавиша
}
/* Программа 13.3. Демонстрирует использование меню «курсорная планка».
Пункты меню:
"Ввод ch" – построение окна и ввод символов только до первой цифры, функция win1();
"Справка" – сообщение о работе программы по пункту меню "Ввод ch", функция win2();
"ВЫХОД" – команда выхода из программы, функция win3(). */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void win1(); // Построение окна и ввод символов только до первой цифры
void win2(); // Сообщение о работе программы по пункту меню "Ввод ch"
void win3(); // Восстановление атрибутов экрана и выход из программы
void win_menu(COLORS Col, int k); // Построение окна k -го пункта
// меню, Col – цвет фона окна
void main()
{ int k=1,f=0; char ch;
clrscr(); // Построение меню с курсорной планкой:
_setcursortype(_NOCURSOR);
textcolor(YELLOW);
win_menu(LIGHTGRAY, 1);
win_menu(BLUE, 2);
win_menu(BLUE, 3);
do { // Работа с меню и окнами
ch=getch();
if(ch=='\0') // Перемещение по меню
{ win_menu(BLUE,k);
ch=getch();
switch(ch)
{ case 77: { k++; if(k>3) k=1; break; }
case 75: { k--; if(k<1) k=3; break; }
}
win_menu(LIGHTGRAY, k);
}
if(ch==13) // Выбор пункта меню по нажатию кл_Enter
switch(k)
{ case 1: { win1(); break; }
case 2: { win2(); break; }
case 3: win3(); // Команда меню ВЫХОД
ch = 27;
}
} while( ch != 27 ); // выход из программы – кл_Esc
// Восстановление атрибутов экрана, если выход из программы по кл_Esc // из меню, но не по команде ВЫХОД:
_setcursortype(_NORMALCURSOR);
textattr(0x7);
window(1, 1, 80, 25);
clrscr();
} // конец main()
void win_menu(COLORS Col, int k)
{ textbackground(Col);
window((k-1)*10+1, 1, k*10, 1); clrscr();
if(k==1) cprintf(" Ввод ch");
if(k==2) cprintf(" Справка");
if(k==3) cprintf(" ВЫХОД");
} конец win_menu()
void win1()
{ int f=1; char ch;
textbackground(3);
window(10,3,50,12);
clrscr();
cprintf("\n Введите текст: \n\r");
while(ch!=27)
{ ch=getch();
if(f)
cprintf("%c", ch);
if(ch>='0' && ch<='9') f=0;
}
} // конец win1()
void win2()
{ char ch;
textbackground(2);
window(10,14,70,25);
clrscr();
cprintf(" О к н о с п р а в к и");
cprintf("\n\r Введите текст в окно 1");
cprintf("\n\r Текст будет вводиться только до первой цифры");
cprintf("\n\r Ввод текста возможен при повторных входах в окно 1");
cprintf("\n\r Спасибо за тестирование программы!");
cprintf("\n\r Нажмите кл_Esc для возврата в меню");
ch=getch();
while(ch!=27)
} // конец win2()
void win3()
{ char ch;
_setcursortype(_NORMALCURSOR);
textattr(0x7);
window(1, 1, 80, 25); clrscr();
}
Вопросы и упражнения
На какие группы делятся клавиши и комбинации клавиш по коду, посылаемому в буфер клавиатуры?
Поясните расширенный код, поступающий в буфер клавиатуры. Примеры использования таких кодов.
Составьте функцию, которая заполняет строку на экране заданным цветом фона в течение 5 секунд.
Работа 14. Работа с экраном в графическом режиме
Цель работы: изучение библиотеки функций управления экраном в графическом режиме, выработка умений отладки и тестирования программ с функциями.
// Программа 14.1. Демонстрация построения окон, изображения шрифтов, орнаментов заполнения фигур и типов линий.
#include <graphics.h> // функции управления экраном в графическом
// режиме
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
void init_graph() // инициализация графического режима
{ int gr_driver, // графический драйвер
gr_mode, // графический режим
error_code; // код ошибки
gr_driver = DETECT; // автораспознавание драйвера
initgraph(&gr_driver, &gr_mode, "c:\\bc31\\bgi");
error_code = graphresult();
if (error_code != grOk ) // ...,то произошла ошибка
printf("Ошибка инициализации графики: %s", grapherrormsg(error_code));
exit(1); // прерывание выполнения программы
} // конец init_graph()
void main()
{ int Pause = 500, // длительность просмотра кадра
X = 50, Y = 100, // координаты окна
XX = 550, YY = 450;
clrscr(); gotoxy(1,10);
printf("\n\t Нажимая любую клавишу, проследите последовательность");
printf("\n\t кадров формирования графического окна с рамкой");
getch(); // конец просмотра - нажать любую клавишу !
init_graph(); getch();
// Изобразим окно двойной рамкой с разными цветами
// путем наложения двух окрашенных прямоугольников
setfillstyle(SOLID_FILL,RED); // сплошная закраска красным цветом
bar(X-5,Y-5,XX+5,YY+5); // построение закрашенного
getch(); // прямоугольника
setfillstyle(SOLID_FILL,GREEN); // второй
bar(X,Y,XX,YY); // прямоугольник
getch();
setviewport(X+5,Y+5,XX-5,YY-5, 1); // установка графического окна
// с отсечением изображения на границах окна
setbkcolor(BLUE); // цвет фона
setcolor(WHITE); getch(); // цвет контура фигур
clearviewport(); getch(); // очистка окна
// Используемые шрифты
int Font, // тип шрифта
CharSize, // коэффициент размера символов i;
for (Font=0; Font < 5; Font++) // изменяется текущий шрифт
for (i=1; i <= 5; i++) // увеличивается изображение букв
{ clearviewport();
CharSize = 2*i;
settextstyle(Font, HORIZ_DIR, CharSize); // задание типа, // начертания шрифта и коэффициента размера символов
settextjustify(CENTER_TEXT, CENTER_TEXT); // задание
// способа выравнивания текста
outtextxy(250,175,"АаBbC"); // вывод с заданных координат
delay(Pause); // задержка кадра для просмотра
} getch();
// Заданные орнаменты
int Pattern; // орнамент заполнения фигур
for (Pattern=0; Pattern <= 11; Pattern++)
{ clearviewport();
setfillstyle(Pattern,WHITE); // установка типа орнамента и его цвета
circle((XX-X)/2,(YY-Y)/2,YY/3); // построение окружности
// с центром в точке ((XX-X)/2,(YY-Y)/2) и с радиусом YY/3
floodfill((XX-X)/2,(YY-Y)/2, WHITE); // закрасить область, // содержащую точку ((XX-X)/2,(YY-Y)/2) и ограниченную белой линией
delay(Pause+200);
} getch();
// Типы линий
int LineType;
clearviewport();
setwritemode(COPY_PUT); // режим записи при вычерчивании линии
for (LineType=0, i=0; LineType < 5; LineType++)
{ setlinestyle(LineType,0,1); // задание параметров линии:
// стиль, шаблон, толщина ( 1 = NORM_WIDTH, 3 = THICK_WIDTH )
line(5,15+15*i,500,15+15*i); i++; // нормальная линия
setlinestyle(LineType,0,3);
line(5,15+15*i,500,15+15*i); i++; // жирная линия
delay(Pause);
} getch();
closegraph();
}
// Программа 14.2. Построение в оцифрованных осях семейства // кривых y = exp(-k*x)*sin(x), k = 0.1*j, j = 1,2,...,5
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>
// !!! Здесь поместить функцию init_graph() из программы 1
main()
{ int i, j Pause = 500, // длительность просмотра кадра
X0, Y0, // начало координат
dy; // длина отрезка оцифровки оси Y
double x, y, // текущие значения аргумента и функции
DE=0.1;
clrscr(); gotoxy(1,10);
printf("\n\t Нажимая любую клавишу, проследите последовательность");
printf("\n\t кадров формирования изображений");
getch(); // конец просмотра - нажать любую клавишу !
init_graph();
X0 = 20; Y0 = getmaxy() / 2; // центр начала координат
setbkcolor(BLACK); setcolor(WHITE);
line(X0,20,X0,getmaxy()-20); // ось Y
line(X0,Y0,getmaxx()-20,Y0); // ось Х
settextjustify(RIGHT_TEXT,CENTER_TEXT); // оцифровкa оси Y
// cправа по центру от указанной ниже точки
settextstyle(DEFAULT_FONT,VERT_DIR,1); // фонт 8х8,
// вертикальное расположение текста, коэффициент размера 1
dy = (Y0-20) / 2; // длина отрезка оцифровки оси Y
// Оцифровка оси Y
for (i = 0; i < 5; i++)
{ moveto(X0-5,20+i*dy);
switch (i)
{ case 0: { outtext("1.0"); break; }
case 1: { outtext("0.5"); break; }
case 2: { outtext("0"); break; }
case 3: { outtext("-0.5"); break; }
case 4: { outtext("-1.0"); break; }
}
} getch();
// Построение графиков
for (j = 0; j <= 5; j++) // семейство кривых
{ moveto(X0,Y0);
for ( i = 1; i < getmaxx()-40; i++) // построение кривой
{ x = i*4*M_PI/(getmaxx()-40);
y = exp(-DE*j*x)*sin(x);
lineto(X0+i, Y0-int(y*220));
} getch();
} getch();
closegraph();
}
// Программа 14.3. Построение изображения увеличивающегося
// четырехугольника: все стороны последовательно изменяются на
// увеличивающуюся величину increment.
// Просмотр изображения по нажатию клавиш:
// "Y" - предыдущие изображения сохраняются ("эффект глубины"),
// "N" - предыдущие изображения не сохраняются.
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>
#include <ctype.h> // функция toupper() - возвращает заглавный
// эквивалент строчной буквы
// !!! Здесь поместить функцию init_graph() из программы 1
main()
{ int i, k, increment = 0, Pause = 100,
arr[10] = {310,230,330,230,330,250,310,250,310,230};
// в массиве координаты углов исходного четырёхугольника,
// координаты первой точки должны замыкать массив
char ch;
clrscr(); gotoxy(1,10);
printf("\t Для просмотра рисунка с сохранением всех изображений");
printf("\n\t нажмите клавишу Y, иначе - N");
ch = getch(); ch = toupper(ch);
init_graph();
setbkcolor(BLACK); setcolor(WHITE);
drawpoly(5,arr); // вывод исходного изображения
delay(2*Pause);
if ( ch == 'N' ) // убрать изображение цветом фона
{ setcolor(BLACK); drawpoly(5, arr); }
for (i = 1; i < 25; i++) // построение изображений
{ increment++;
for (k = 1; k < 5; k++) // последовательное увеличение сторон
// четырехугольника
{ switch ( k )
{ case 1: { arr[1] = arr[1] - increment;
arr[9] = arr[1]; break; } // вверх
case 2: { arr[2] = arr[2] + increment;
break;} // вправо
case 3: { arr[5] = arr[5] + increment;
break;} // вниз
case 4: { arr[6] = arr[6] - increment;
break;} // влево
}
setcolor(WHITE);
drawpoly(5, arr);
delay(Pause);
if ( ch == 'N') // убрать предыдущее изображение
{ setcolor(BLACK); drawpoly(5, arr); }
}
} getch(); // просмотр изображения до нажатия клавиши
closegraph();
}
// Программа 14.4. Изображение движущейся фигуры
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h> // прототипы функций для динамического
// распределения памяти malloc() и free()
#include <dos.h>
// !!! Здесь поместить функцию init_graph() из программы 1
main()
{ int i, size;
void *pnter; // указатель на область памяти с изображением круга
clrscr(); gotoxy(1,10);
printf("\n\t Выполнение программы необходимо сопровождать");
printf("\n\t нажатием на любую клавишу");
getch();
init_graph();
setbkcolor(BLACK);
setcolor(RED); // цвет для изображения контура круга
setfillstyle(1, RED); // заполнить круг красным цветом
circle(20, 200, 10); // рисует круг
floodfill(20, 200, RED); // закрашивает круг красным цветом
size = imagesize(10,190,30,210); // число байт, необходимых
// для сохранения прямоугольной области экрана с изображением круга
pnter = malloc(size); // выделение памяти size байт
getimage(10,190,30,210, pnter); // сохранение в буфере
// двоичного образа участка экрана с изображением круга
getch();
for (i = 1; i < 400; i++) // круг летит
{ putimage(10+(i-1), 190, pnter, XOR_PUT); // стирание
// предыдущего изображения круга
putimage(10+i, 190, pnter, XOR_PUT); // вывод изображения
delay(5);
} getch();
free(pnter); // освобождение памяти
closegraph();
}
Вопросы и упражнения
Как установить в программе графический режим?
Как можно удалить с экрана изображение линии или фигуры?
Составьте функцию, демонстрирующую мерцание звёзд на небе.
Как в программе выйти из графического режима и продолжить работу в текстовом режиме?
ПРИЛОЖЕНИЕ 2
Пример ОФОРМЛЕНИЯ ОТЧЁТА
Работа 1. Вычисление площади и периметра геометрической фигуры
Цель работы: выработка умений составления, отладки и тестирования программ линейной структуры и оформления отчетов лабораторного практикума по программированию.
Задание 1. Дано на плоскости кольцо (рис. 1), образованное двумя окружностями с радиусами r1 и r2 и с центрами в точке С(xc, yc). Cоставить программу для определения площади кольца и расстояния от начала координат до центра кольца.