• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

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

Fobos

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



Упражнение №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().
 
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;
}
}
 
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 );
}
Как разлиновать сам подумай.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!