Код программы :
Содержание файла 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 если нужно.