[Си] Упражнения

  • Автор темы Fobos
  • Дата начала
F

Fobos

#1
Пожалуйста, помогите кто чем может!
Заранее благодарен.

Оригинал задания.

Упражнение №1

Ниже приведен пример программы, которая выполняет очистку экрана и вывод текстовых символов путем непосредственного обращения к видеопамяти:

<!--shcode--><pre><code class='c'>#include <conio.h>
#include <dos.h>

// Создание указателя на видеопамять
unsigned char far *screen = (unsigned char *) MK_FP(0xB800, 0);

// Очистка экрана
void ClearScreen()
{
int i;
for(i=0; i<80*25; i++)
{
screen[2*i] = ' '; // заполнить экран пробелами
screen[2*i+1] = 0x0F; // символы белые, фон черный
}
}

// Вывод символа
void OutChar(int x, int y, char CharCode, unsigned char Color)
{
screen[(80*y+x)*2] = CharCode;
screen[(80*y+x)*2+1] = Color;
}

// Главный модуль
void main()
{
ClearScreen();
OutChar(0,0,'A',0x1E);
OutChar(1,2,'B',0x2D);
getch();
}[/CODE]

Функция OutChar имеет следующие параметры:
x и y – координаты символа;
CharCode – код символа;
Color – цвет символа и фона.

Требуется выполнить следующую последовательность действий:
1) Ввести, откомпилировать и запустить программу.
2) Изменить программу таким образом, чтобы вместо очистки экрана выполнялась раскраска фона в виде шахматной доски с коричневыми и желтыми клетками (использовать по два знакоместа на каждую клетку, чтобы клетки были квадратными).
3) Вывести «бегущий ноль». При запуске в левом верхнем углу экрана выводится символ ‘0’. Далее при каждом нажатии на клавишу Enter символ должен перемещаться в следующую колонку, а при достижении конца строки – в следующую строку. Работа программы должна прекращаться по достижении конца третьей строки.


Упражнение №2

Ниже приведен пример программы, которая работает в графическом режиме с разрешением 320x200 точек. В программе используются следующие функции: SetMode – установка видеорежима; ClearScreen – очистка экрана; Pixel – вывод точки заданного цвета в указанную позицию экрана.
Функция установки видеорежима SetMode имеет один параметр – код режима. Для установки 256-цветного режима с разрешением 320x200 точек используется код 0x13, для возврата в текстовый режим – код 0x03.
Функция вывода точки Pixel имеет следующие параметры:
x и y – координаты точки;
Color – цвет точки.

<!--shcode--><pre><code class='c'>#include <conio.h>
#include <dos.h>

// Создание указателя на видеопамять
unsigned char far *screen = (unsigned char *) MK_FP(0xA000, 0);

// Установка видеорежима
void SetMode(int Mode)
{
union REGS regs;
regs.h.ah = 0;
regs.h.al = Mode;
int86(0x10, &regs, &regs);
}

// Очистка экрана
void ClearScreen()
{
unsigned i;
for(i=0; i<64000l; i++) screen = 0;
}

// Вывод точки заданного цвета в заданную позицию экрана
void Pixel(unsigned x, unsigned y, unsigned char Color)
{
screen[320*y+x] = Color;
}

// Главный модуль
void main()
{
unsigned x, y;
SetMode(0x13); // установить графический режим с разрешением 320x200
ClearScreen(); // очистить экран
// Отобразить всю палитру цветов в виде вертикальных линий
for(y=0; y<100; y++) for(x=0; x<256; x++) Pixel(x,y,x);
getch(); // ожидать нажатия любой клавиши
SetMode(3); // восстановить текстовый режим
}[/CODE]


Требуется выполнить следующую последовательность действий:
1) Ввести, откомпилировать и запустить программу.
2) Добавить в программу функцию, рисующую горизонтальные отрезки заданного цвета с заданной координатой Y от левого до правого края экрана.
3) Добавить в программу функцию, рисующую вертикальные отрезки заданного цвета с заданной координатой X от верхнего края экрана до нижнего..
4) С помощью добавленных функций разлиновать экран линиями светло-серого цвета таким образом, чтобы получились клетки 8x8 точек
5) Создать маску изображения в виде массива 8x8 типа unsigned char.
6) Организовать цикл вывода изображения таким образом, чтобы оно перемещалось от левого края экрана до правого с шагом в одну точку при каждом нажатии клавиши Enter.
7) Добавить массив 8x8 типа unsigned char для хранения фона и усовершенствовать цикл вывода изображения, чтобы фон восстанавливался после перемещения изображения.
8) Добавить в программу функцию синхронизации вывода изображения с частотой кадров WaitSync.Изменить цикл вывода изображения так, чтобы изображение перемещалось не по нажатию Enter, а по началу обратного хода луча.
9) Изменить программу таким образом, чтобы слева направо перемещался не один, а несколько одинаковых объектов – строем (цепью).


Упражнение №3.

Ниже приведен пример программы, которая работает в режиме TrueColor32 1024768.

<!--shcode--><pre><code class='c'>#include <stdio.h>
#include <conio.h>
#include <dos.h>

// Создание указателя на видеопамять
unsigned char far *screen = (unsigned char *) MK_FP(0xA000, 0);

// Установка режима TrueColor32 с разрешением 1024x768
void SetTrueColorMode(void)
{
union REGS regs;
regs.x.ax = 0x4F02;
regs.x.bx = 0x118;
int86(0x10, &regs, &regs);
}

// Восстановление текстового режима
void SetTextMode(void)
{
union REGS regs;
regs.h.ah = 0;
regs.h.al = 3;
int86(0x10, &regs, &regs);
}

// Переключение окон
void SetPage(unsigned Page)
{
union REGS regs;
regs.x.ax = 0x4F05;
regs.x.bx = 0;
regs.x.dx = Page;
int86(0x10, &regs, &regs);
}

// Заливка экрана заданным цветом
void FillScreen(unsigned char B, unsigned char G, unsigned char R)
{
unsigned i,j;
for(i=0; i<48; i++)
{
SetPage(i);
for(j=0; j<0x4000; j++)
{screen[j*4] = B; screen[j*4+1] = G; screen[j*4+2] = R;}
}
}

// Главный модуль
void main()
{
SetTrueColorMode(); // установить графический режим
FillScreen(255,0,0); // окрасить экран в синий цвет
getch();
SetTextMode(); // восстановить текстовый режим
}[/CODE]

В программе используются следующие функции: SetTrueColorMode – установка графического режима, SetTextMode – восстановление текстового режима, SetPage – установка заданного окна видеопамяти, FillScreen – заливка экрана заданным цветом.
Параметры обозначены следующим образом:
• Page – номер окна видеопамяти;
• B – яркость по синей цветовой компоненте;
• G – яркость по зеленой компоненте;
• R – яркость по красной компоненте.

Требуется выполнить следующую последовательность действий:
1) Ввести, откомпилировать и запустить программу.
2) Добавить в программу функцию, рисующую горизонтальные отрезки заданного цвета с заданной координатой Y от левого до правого края экрана, а также функцию, рисующую вертикальные отрезки заданного цвета с заданной координатой X от верхнего края экрана до нижнего. С помощью добавленных функций разлиновать экран линиями белого цвета, чтобы получить клетки 3232.
3) Добавить описатель структуры заголовка файла BMP. В главном модуле отрыть для чтения двоичный файл rgb1.bmp. Прочитать из файла заголовок.
4) Добавить в программу массив из 4096 элементов типа unsigned char для промежуточного хранения строки изображения. Используя информацию о ширине и высоте изображения, построчно читать и выводить на экран данные из файла.
5) Добавить указатель для работы с видеопамятью как c массивом типа unsigned long, чтобы можно было передавать точку изображения за одну операцию.
6) Добавить функцию, переворачивающую изображение слева направо. Перевернуть изображение, ожидать нажатия любой клавиши, вернуть изображение в исходное состояние, ожидать нажатия клавиши.
7) Добавить функцию, переворачивающую изображение сверху вниз. Перевернуть изображение, ожидать нажатия клавиши, вернуть в исходное состояние, ожидать нажатия клавиши.
8) Добавить функцию, преобразующую изображение в черно-белое (с 256 градациями яркости).
9) Изменить программу таким образом, чтобы имя файла передавалось из командной строки через параметры функции main().
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
2) Изменить программу таким образом, чтобы вместо очистки экрана выполнялась раскраска фона в виде шахматной доски с коричневыми и желтыми клетками (использовать по два знакоместа на каждую клетку, чтобы клетки были квадратными).
C++:
void ClearScreen()
{
int x, y;
for ( int y = 0; y < 25; y++ )
for ( int x = 0; x < 80; x++ ) {
screen[(80*y+x)*2] = ' ';	// заполнить экран пробелами
screen[(80*y+x)*2+1] = ((x >> 1) + y) & 1 ? 0x6f : 0xef;
}
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#3
2) Добавить в программу функцию, рисующую горизонтальные отрезки заданного цвета с заданной координатой Y от левого до правого края экрана, а также функцию, рисующую вертикальные отрезки заданного цвета с заданной координатой X от верхнего края экрана до нижнего. С помощью добавленных функций разлиновать экран линиями белого цвета, чтобы получить клетки 3232.
C++:
void pixel( int x, int y, int r, int g, int b )
{
int i;
i = (1024 * y + x) * 3;
SetPage( i >> 16 );
i &= 0xffff;
screen[i] = r;
screen[i+1] = g;
screen[i+2] = b;
}

void hline( int y )
{
for ( int i = 0; i < 1024; i++ ) pixel( i, y, 255, 255, 255 );
}

void vline( int x )
{
for ( int i = 0; i < 768; i++ ) pixel( x, i, 255, 255, 255 );
}
Как разлиновать сам подумай.