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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2016, 20:19   #1
ahsar
 
Регистрация: 04.12.2016
Сообщений: 5
По умолчанию Пример из книги Керниган Ритчи "язык С" Массивы 1.6

Добрый день! Вот пример кода:

Код:
#include <stdio.h>
main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i]= 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9' )
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf ("digits =");
for (i=0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf (", white space =%d\n, other = %d\n", nwhite, nother);
}

После компиляции выводит цифры:
digits = 9 3 0 0 0 0 0 0 0 1, white space =81
, other = 303

С white space все понятно, но вот каким образом он выводит цифры в digit?? В качестве входных данных в программу был введен ее же код.

Последний раз редактировалось Alex11223; 04.12.2016 в 21:56.
ahsar вне форума Ответить с цитированием
Старый 04.12.2016, 20:29   #2
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от ahsar Посмотреть сообщение
но вот каким образом он выводит цифры в digit??
9 - нулей,
3 - '1',
1 - '9'

У вас есть какие-то возражения?
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 20:37   #3
ahsar
 
Регистрация: 04.12.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от olej.tsil Посмотреть сообщение
У вас есть какие-то возражения?
Спасибо, а зачем он производит вот эту операцию: ++ndigit[c - '0'];
Почему нельзя оставить просто ++ndigit[c] ?
ahsar вне форума Ответить с цитированием
Старый 04.12.2016, 20:44   #4
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от ahsar Посмотреть сообщение
Спасибо, а зачем он производит вот эту операцию: ++ndigit[c - '0'];
Почему нельзя оставить просто ++ndigit[c] ?
Элементарно, Ватсон...
Просто потому, что с - это код символа (от 30 до 39 для символов цифр), а значение символа - это код минус 30 (код '0').
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 21:36   #5
ahsar
 
Регистрация: 04.12.2016
Сообщений: 5
По умолчанию

А почему так происходит? Почему от 30?
ahsar вне форума Ответить с цитированием
Старый 04.12.2016, 22:04   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что кто-то так решил когда-то.
http://www.asciitable.com/

Только 48-57, а не 30-39 же.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.12.2016, 00:35   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Только 48-57, а не 30-39 же.
30 16-ричное - это и есть 48
olej.tsil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать запрос в MS Access 2007. БД "Книги". Вывести название и возраст книги самой старой книги в каждом из залов NikoLotus Microsoft Office Access 1 19.09.2016 06:02
как из файла "Пример Меню" не очень подкованный пользователь сможет сделать файл устроенный так же как "Пример импорта" qaws Помощь студентам 2 10.09.2016 14:49
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Пример из книги "Библия делфи" Aleksey1989 Помощь студентам 2 16.11.2010 14:29
Пример из книги Керниган, Ричи. Язык C. Массивы hukola Общие вопросы C/C++ 16 26.05.2009 18:04