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

Тема в разделе "C/C++/C#", создана пользователем Fobos, 2 фев 2011.

  1. Fobos

    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. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (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;
    }
    }
     
  3. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (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 );
    }
    Как разлиновать сам подумай.
     

Поделиться этой страницей