Не знаю, как «вернуть ch[c-‘A’]»

#c

Вопрос:

Я не знаю, что «вернуть ch[c-‘A’];amp;вернуть ch[c-‘1’ 26]; «делает. Ниже приведен некоторый код для uva401 — палиндромов в c .

 char ch[36]={'A',' ',' ',' ','3',' ',' ','H','I','L',
             ' ','J','M',' ','O',' ',' ',' ','2','T',
             'U','V','W','X','Y','5','1','S','E',' ',
             'Z',' ',' ','8',' '};
char rev(char);

char rev(char c){
  if (isalpha(c)){
    return ch[c-'A'];//this line I don't know what it means.
  } else {
    return ch[c-'1' 26];//this line I don't know what it means.
  } 
}
 

Комментарии:

1. Таблица ASCII все прояснит. Каждый символ имеет значение ASCII. При работе с альфа-символами, если вам нужен номер символа (или смещение, индекс, отклонение Хэмминга и т. Д.) В верхнем или нижнем регистре символов, вы просто вычитаете 'a' либо 'A' из текущего символа, либо из него.

Ответ №1:

Я предполагаю, что тот, кто написал эту функцию, ПРЕДПОЛАГАЛ

  • ASCII или совместимый набор символов, И;
  • Ввод-это либо заглавная буква, либо цифра между '1' и '9'

В соответствии с этими предположениями c - 'A' будут отображаться прописные буквы от 'A' до 0 , 'B' до 1 , 'C' до 2 , …. 'Z' до 25 и c-'1' 26 будут отображаться цифры '1' до 26 , '2' до 27 , …. '9' до 34 .

Проблема в том, что ни одно из этих предположений не является гарантированно верным.

Существуют наборы символов реального мира, которые не являются ASCII (и не содержат прописных букв в качестве последовательного набора).

Даже с набором символов, совместимым с ASCII (совместимым), в коде нет ничего, что могло бы помешать вызывающему абоненту передать значение функции, находящейся за пределами диапазона входных данных, для которых имеет смысл сопоставление.

Нетрудно написать код, который был бы более понятным и читаемым, проверял бы правильность ввода, выполнял (предположительно) предполагаемое сопоставление и вел бы себя так, как ожидалось, даже в реализациях, которые не поддерживают набор символов ASCII (или совместимый). Я оставлю написание такого кода в качестве упражнения.

Комментарии:

1. Вместо ASCII некоторые компьютеры, такие как AS/400, используют EBCDIC , где код был бы ошибочным.

Ответ №2:

Переменные Char в C также представлены значениями ASCII, например, » A » в ASCII равно 65. Таким образом, если символ c = «B», равный 65 в ASCII, увеличивается упорядоченно в алфавитном порядке, c — «A» будет означать 66-65, что равно 1. Это значение 1 затем используется в качестве индекса массива ch для обхода элемента по этому индексу.

 char ch[36]={'A',' ',' ',' ','3',' ',' ','H','I','L',
             ' ','J','M',' ','O',' ',' ',' ','2','T',
             'U','V','W','X','Y','5','1','S','E',' ',
             'Z',' ',' ','8',' '};

int c = 'B';
cout << ch[c - 'B']; //Output: A
 

Диаграмма ASCII для всех переменных char

Ответ №3:

Символы в C представлены 8-разрядными целыми числами (пока оставим в стороне все более сложное, чем ASCII). Например, 'a' есть 97 и 'z' есть 122 .

Мы можем посчитать с ними, и они автоматически преобразуются в целые числа. Массивы индексируются числами, поэтому мы можем использовать результат этой математики для поиска записи в массиве.

Подумайте, что 'A' это 65 так . Если мы вычтем это из другого заглавного символа, у нас останется количество символов в алфавите, которым мы являемся. Так 'E' - 'A' оценивает 4 К.