Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Fobo5
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 12
#1

Вывод текстовых символов путем непосредственного обращения к видеопамяти - C (СИ)

27.01.2011, 02:07. Просмотров 2695. Ответов 4
Метки нет (Все метки)

Помогите пожалуйста срочно выполнить упражнения!
Заранее благодарен.
C.rar

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

Ниже приведен пример программы, которая выполняет очистку экрана и вывод текстовых символов путем непосредственного обращения к видеопамяти:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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();
}
Функция OutChar имеет следующие параметры:
x и y – координаты символа;
CharCode – код символа;
Color – цвет символа и фона.

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


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

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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[i] = 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);    // восстановить текстовый режим
}

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


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

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#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();       // восстановить текстовый режим
}
В программе используются следующие функции: 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().

C.rar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 02:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывод текстовых символов путем непосредственного обращения к видеопамяти (C (СИ)):

Кодировка текста путем сдвига символов
#include &lt;stdio.h&gt; char code(char *c, int n) { int i; for (i=0; c!=0;...

Заполнить массив из одиночных символов путем ввода с клавиатуры
надо заполнить массив из одиночных символов путем ввода с клавиатуры. Если...

Исходные данные определяются путем обращения к датчику случайных чисел
1. Исходные данные: расход каждого из К материалов на единицу каждой из М ...

Локальный чат путем обмена сообщений с помощью текстовых файлов
Доброго времени суток. Решил написать простенький чат для локальной сети. Идея...

Вывод объема видеопамяти
Вот уже сутки пытаюсь отыскать не просторах интернета способ вывода объема...

Вывод содержания видеопамяти
Как вывести на экран содержимое видеопамяти в DOS? По какому адресу она...

4
easybudda
27.01.2011, 02:13
  #2

Не по теме:

пишите адрес, куда перфоленту с программой выслать...

2
Fobo5
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 12
27.01.2011, 08:13  [ТС] #3

Не по теме:

Если это была не ирония, то: fob.exe@gmail.com )



Добавлено через 5 часов 41 минуту
Актуально.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
27.01.2011, 08:36 #4
На почте по этому адресу отказались бандероль отправлять.
А если серьёзно, за последние 15 лет и сама ОС от Микрософт, и принципы написания программ под неё несколько изменились. Теперь уже нельзя обращаться на прямую к видеопамяти, а настройками вывода в консоль, в окно, или ещё куда-нибудь заведуют функции API системы. Больше скажу - уже и система сама давно не DOS называется, да и заголовок dos.h в более-менее современные компиляторы уже не входит...
Очень информативный сайт про программирование в OS Windows
2
Fobo5
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 12
27.01.2011, 20:34  [ТС] #5
У брата C++ в универе и он тоже чертыхался над этой работой. Не работал у него компилятор с этим кодом.
Но мы работаем в досе, поэтому писать надо именно так.

Добавлено через 7 часов 30 минут
Ребят, очень нужна помощь, буквально горю.
0
27.01.2011, 20:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2011, 20:34
Привет! Вот еще темы с решениями:

Вывод двумя страницами видеопамяти
Всем привет:) Подскажите, плиз, как в паскале работать с видеопамятью...

Вывод изображения двумя страницами видеопамяти
Всем привет) Подскажите, пожалуйста, как вывести анимацию, используя две...

Вывод строки используя прямой доступ к видеопамяти
CSEG segment org 100h begin: mov ax,dx mov es,ax mov al, 02h ...

Чтение непосредственного значения из памяти
Здравствуйте. Мне необходимо представить числа с плавающей точкой двойной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru