Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование строки в массив и обратно  (Прочитано 12076 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ZOOMIK
Гость
« : 27-07-2008 06:22 » 

Код:
Код программы  :
Содержание файла 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 если нужно. 
Библиотека юзер либ вот: http://files.akado.ru/16SA9AF1WM
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #1 : 27-07-2008 09:21 » 

строка уже и будет мыссивом... она ж массивом в памяти хранится. Соответственно ты можешь обрпщпться к каждому элементу массива и делать что там тебе нужно.
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #2 : 27-07-2008 09:23 » 

char buf[21] - вот он массив. тЫ ж его сам массивом и объявил.
Записан
ZOOMIK
Гость
« Ответ #3 : 27-07-2008 09:32 » 

char buf[21] - вот он массив. тЫ ж его сам массивом и объявил.
К сожелению я не сам делал эту прогу и не представляю как с этим буфером работать. И при этом нужно не в мейне дописывать а в GPutHexLong. Так ты можешь подсказать как обойти представленное решение, чтоб обрабатывались случаи при длинне более 6 символов. (А точнее до 12 + символы разделитель через каждые 3 и концевой маркер)
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 27-07-2008 09:44 » new

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

http://lib.ru/CPPHB/cpptut.txt
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines