Код программы  :
Содержание файла 44.PRJ:
44.C
USER.LIB
/*****
Файл:       44.C
Содержание: Реализация функции GPutHexLong
Компилятор: Turbo C, v.2.0
Автор:      
Версия:     1.0
Дата:       
*****/
#define TEST 1
#include <STRING.H>
#include <STDLIB.H>
#include <GRAPHICS.H>
#include "ustring.h"
/*-------------------------- LIBRARY PART
*/
/*------------------------ PUBLIC ROUTINES
*/
int far GPutHexLong( int x, int y, /* координаты вывода */
                     long num,     /* число для вывода */
                     int term,     /* символ-разделитель тетрад */
                     int dcolor,   /* цвет цифр */
                     int tcolor    /* цвет символа-разделителя */
                   )
/*****
Вход:       См. аргументы.
Действие:   В графическом режиме в координатах (x, y) выводит
            число num в шестнадцатеричной системе счисления
            группами по 4 цифры (тетрадами), отделяя их друг от
            друга символом term. Цифры и символ-разделитель
            выводятся соответственно цветами dcolor и tcolor.
            Разбиение на тетрады происходит справа налево. Левая
            тетрада дополняется нулями слева до 4-х символов (если
            она неполная).
Выход:      НОРМА:   0.
            ОШИБКА: -1 при входе с (dcolor & 0x000F) = 0;
                    -2 при входе с (tcolor & 0x000F) = 0;
                    -3, если символ-разделитель является цифрой
                        для данной системы счисления;
                    -4 при неверном задании координат;
                    -5 при ошибке инициализации графического
                       режима.
*****/
{
int g_driver, g_mode, g_error, i, /* рабочие переменные */
    len, /* длина записи числа в шестнадцатеричной системе */
    n0;  /* количество недостающих символов в неполной (левой)
            тетраде */
char buf[12], /* буфер для записи числа в шестнадцатеричной
                 системе */
     buf1[5], /* буфер для второй тетрады */
     *s;      /* указатель на запись числа в шестнадцатеричной
                 системе */
    dcolor &= 0x000F;
    if ( dcolor == 0 )
        return -1;
    tcolor &= 0x000F;
    if ( tcolor == 0 )
        return -2;
    term &= 0x00FF;
    if ( ((term >= '0') && (term <= '9'))
         || ((term >= 'a') && (term <= 'f'))
         || ((term >= 'A') && (term <= 'F')) )
        return -3;
    if ( (x < 0) || (y < 0) || (y > 472) )
        return -4;
    s = buf + 3;
    ltoa( num, s, 16 );
    len = strlen( s );
    if ( (len % 4) > 0 )
        n0 = 4 - (len % 4);
    else
        n0 = 0;
    if ( len > 4 )
        len++;
    len += n0;
    if ( x > (640 - len * 8) )
        return -4;
    for ( i = 0; i < n0; i++ )
    {
        s--;
        *s = '0';
    }
    StrNCpy( buf1, s + 4, 4 );
    *(s + 4) = '\0';
    g_driver = DETECT;
    detectgraph( &g_driver, &g_mode );
    if ( g_driver < 0 )
        return -5;
    initgraph( &g_driver, &g_mode, "" );
    g_error = graphresult();
    if ( g_error < 0 )
        return -5;
    settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );
    setcolor( dcolor );
    outtextxy( x, y, s );
    if ( len > 4 )
    {
        setcolor( tcolor );
        buf[0] = term;
        buf[1] = '\0';
        outtextxy( x + 32, y, buf );
        setcolor( dcolor );
        outtextxy( x + 40, y, buf1 );
    }
    return 0;
} /* GPutHexLong */
/*--------------------------- TEST PART
*/
#ifdef TEST
#include <STDIO.H>
#include <LIMITS.H>
#include "uvideo.h"
#include "utinout.h"
#include "ukbrd.h"
void main( void )
/*****
Вход:     Нет.
Действие: Очищает экран, выводит заголовок "Тестирование функции
          GPutHexLong", запрашивает входные параметры для функции
          GPutHexLong, тестирует ее с указанными параметрами,
          ожидает нажатия любой клавиши, после чего выводит
          информацию о возврате функции GPutHexLong и выдает
          запрос на повторный прогон.
Выход:    Нет.
*****/
{
int x, y,     /* координаты вывода */
    term,     /* код символа-разделителя тетрад */
    dcolor,   /* цвет цифр */
    tcolor,   /* цвет символа-разделителя */
    ret;      /* возврат функции */
long num;     /* число для вывода */
char buf[21]; /* буфер для строки с информацией о возврате
                 функции */
    VmSet();
    do
    {
        VmClear( 0, 0, 79, 24, 0x07 );
        VmPuts( 25, 1, "Тестирование функции GPutHexLong" );
        CursorPos( 1, 2 );
        num = T_DoubleGetC( "Число для вывода", 65537L, LONG_MIN,
                                         LONG_MAX, 7, 0, 12, 0 );
        x = T_DoubleGetC( "Координата x", 284 , INT_MIN, INT_MAX,
                                                   7, 0, 12, 0 );
        y = T_DoubleGetC( "Координата y", 236, INT_MIN, INT_MAX,
                                                  7, 0, 12, 0 );
        term = T_DoubleGetC( "Код символа-разделителя", '-',
                            INT_MIN, INT_MAX, 7, 0, 12, 0 );
        dcolor = T_DoubleGetC( "Цвет цифр", 14, INT_MIN, INT_MAX,
                                                   7, 0, 12, 0 );
        tcolor = T_DoubleGetC( "Цвет символа-разделителя", 10,
                              INT_MIN, INT_MAX, 7, 0, 12, 0 );
        ret = GPutHexLong( x, y, num, term, dcolor, tcolor );
        if ( ret == 0 )
        {
            KbWaitKey();
            closegraph();
            VmPuts( 25, 1, "Тестирование функции GPutHexLong" );
        }
        sprintf( buf, "Возврат функции = %d", ret );
        VmPuts( 1, 10, buf );
        CursorPos( 1, 23 );
    } while ( T_YesNoC( "Повторить", 7, 0 ) );
} /* main */
#endif
/*--------------------------- end of 44.C
*/
Теперь вопросы: (1)Как в данной программе после перевода строки в 16тиричную систему записать строку s в массив, (2)повернуть массив зеркально и (3)добавить уже через каждые 3 символа символ разделитель,  (4)дополнить левую триаду 0 если нужно.