Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2014, 17:14   #1
Konsyello
Пользователь
 
Регистрация: 14.10.2013
Сообщений: 26
По умолчанию Что означает выражение?

Почему и как с помощью этого выражения k = (in[0] – ‘0’) -1 берется один символ и получается его значение.Где in - указатель на входную строку цифр.
Konsyello вне форума Ответить с цитированием
Старый 29.05.2014, 17:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Классический способ переведения символа-цифры в число.
По факту берется код символа in[0], от него отнимается код первого символа. олицетворяющего число (т.е. "0"),и получается порядковый номер цифры.
Например код символа ноль = 100.
Тогда "5"-"0" даст 105-100 = 5.
А -1 тут зачем я не в курсе. Видимо выравнивание для программы по некоему условию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.05.2014, 17:32   #3
Konsyello
Пользователь
 
Регистрация: 14.10.2013
Сообщений: 26
По умолчанию

Спасибо) Не могу понять почему входной буфер именно без первого символа?И зачем выделять буфер на один символ больше?
Как понимать вот это выражение - k=(In[0]-'0')*10+(In[1]-'0')-1?
Суть задачи по вводимой строке цифр определить что за зашифрованное слово это.
Код:
#include <stdio.h>
#include <string.h>
#include <windows.h>

char *mas = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";  

char bufRus[256];

char* Rus(const char* text) {
      CharToOem(text, bufRus);         
      return bufRus;
      }

/* In - указатель на входную строку цифр
    Out - указатель на строку букв, которые получены в 
           результате расшифровки с начала */
 
void GetVariant(char *In, char *Out)  
{
    int li,lo,k;                     //li – длина входной строки, lo – длина текущей строки
    char *O1,*O2;             //инициализация новых буферов
 
    li=strlen(In);               //берем длину входной строки 
 
    if (li==0)  
    {
        printf("%s\n",Rus(Out)); /* если входная строка исчерпана - печать Out и выход*/
        return;
    }

 /* определяем текущую длину вых. буфера */
lo=strlen(Out);

 /* выделяем буфер, способный вместить на один символ больше */
O1=(char *) calloc((lo+2),1);

 strcpy(O1,Out);      // копируем в новый буфер содержимое Out 
 
    k=(In[0]-'0')-1; /* берем одну цифру и получаем ее значение */

    O1[lo]=mas[k]; /* заносим в хвост буфера */

 /* рекурсивный вызов с новым выходным буфером и со входным без первого символа */
GetVariant(In+1,O1);

  free(O1);              // после возврата освободим буфер 
 
    if (li >= 2)        /* если во входном буфере 2 или более символов */
    {
        k=(In[0]-'0')*10+(In[1]-'0')-1; /* берем двузначное число из первых двух байтов Inp */

 /* выделяем буфер, способный вместить на один символ больше */

        O2=(char *) calloc(lo+2,1); 

 /* копируем в новый буфер содержимое Out */
 strcpy(O2,Out); 

 /* заносим в хвост буфера */
 O2[lo]=mas[k];  

 /* рекурсивный вызов с новым выходным буфером и со входным без первого символа */

        GetVariant(In+2,O2);

   /* после возврата освободим буфер */
    free(O2);
    }
 
}
int main(int argc, char* argv[])
{
    char *Start;                              // инициализация указателя на массив
    char *S1="211221";               // первая входная строка
    char *S2="21221";                // вторая входная строка

    Start=(char *) calloc(1,1);   
  //выделение памяти под массив, количество элементов в массиве – 1,  длина каждого элемента один байт

    Start[0]=0;

    GetVariant(S1,Start);
    //освобождение памяти
    free(Start);                               

    printf("\n");                          //переход на новую строку

// выделение памяти по массив из одного элемента, длина которого один байт
  Start=(char *) calloc(1,1);  
    Start[0]=0;

    GetVariant(S2,Start);                //вызов функции GetVariant
    free(Start);                                // освобождение памяти 
    return 0;
}

Последний раз редактировалось Konsyello; 29.05.2014 в 17:36.
Konsyello вне форума Ответить с цитированием
Старый 29.05.2014, 17:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Как понимать вот это выражение - k=(In[0]-'0')*10+(In[1]-'0')-1?
Ну сам подумай ))
Допустим есть строка "25"
код "2" = 102 код "5" = 105
В результате выражение превращается в (102-100)*10+(105-100)-1.
Итого сколько получается?
Цитата:
по вводимой строке цифр определить что за зашифрованное слово это.
И каков же алгоритм шифрования? превратить строку в число, а потом обратно, выделяя буквы по номерам цифр?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что в формуле означает выражение ="";"" Робин Microsoft Office Excel 5 05.02.2013 22:54
Что означает? ISV-777 Помощь студентам 3 17.01.2012 21:22
Что означает? ISV-777 Общие вопросы по Java, Java SE, Kotlin 1 17.01.2012 21:19
Что означает serg268 C++ Builder 2 04.03.2011 20:44
Что означает? F_A_N_Alex Помощь студентам 1 07.10.2009 22:50