Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ1_Си_Builder.doc
Скачиваний:
20
Добавлен:
02.06.2015
Размер:
4.54 Mб
Скачать

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;

}

}

Вопросы и упражнения

  1. Сколько циклов нужно для просмотра всех элементов n-мерного массива?

  2. Запишите циклы для инвертирования матрицы m х n (замена строк столбцами).

  3. Поясните следующий фрагмент программы обработки матрицы а размером n x n:

for( j = 0; j < n; j++ )

for( i = n-1; i > j; i-- ) а[i][j] = а[ i - j ] [ n-1 - j ]

  1. Составьте функцию для удаления: а) k- го столбца матрицы; б) k-ой строки матрицы.

  2. Поясните алгоритм сортировки в функции sort_columns(). Модифицируйте функцию для сортировки по методу «пузырька».

  3. Как выполнить перемещение строк в функции 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();

}

Вопросы и упражнения

  1. На какие группы делятся клавиши и комбинации клавиш по коду, посылаемому в буфер клавиатуры?

  2. Поясните расширенный код, поступающий в буфер клавиатуры. Примеры использования таких кодов.

  3. Составьте функцию, которая заполняет строку на экране заданным цветом фона в течение 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();

}

Вопросы и упражнения

  1. Как установить в программе графический режим?

  2. Как можно удалить с экрана изображение линии или фигуры?

  3. Составьте функцию, демонстрирующую мерцание звёзд на небе.

  4. Как в программе выйти из графического режима и продолжить работу в текстовом режиме?

ПРИЛОЖЕНИЕ 2

Пример ОФОРМЛЕНИЯ ОТЧЁТА

Работа 1. Вычисление площади и периметра геометрической фигуры

Цель работы: выработка умений составления, отладки и тестирования программ линейной структуры и оформления отчетов лабораторного практикума по программированию.

Задание 1. Дано на плоскости кольцо (рис. 1), образованное двумя окружностями с радиусами r1 и r2 и с центрами в точке С(xc, yc). Cоставить программу для определения площади кольца и расстояния от начала координат до центра кольца.