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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2019, 21:54   #1
hienZeit
Пользователь
 
Регистрация: 14.03.2019
Сообщений: 21
По умолчанию Массивы по Ритчи ошибка в книге?

Вот по этому коду:

Код:
#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 ("цифры =");    
       for (i=0; i < 10; ++i)         
       printf(" %d", ndigit[i]);    
        printf (", символы-разделители = %d, прочие = %d\n", nwhite, nother); 
        }
на запрос
123456789101214
выдаёт
numbers = 1421211111, simbols-delimiters = 1, other = 0
Что это такое? Это оригинальный код с книги он запорот?

И ещё не могу понять что это строчка, что оно делает, зачем??

Код:
++ndigit[c - '0' ]
hienZeit вне форума Ответить с цитированием
Старый 13.06.2019, 09:10   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Ну с последним-то понятно: инкрементируется элемент массива, индекс которого равен числовому значению введенного цифрового символа. Напимер, введено '1', код которого в ASCII 0х31, вычитаем код нуля 0x30, имеем 1, инкрементируем ndigit[1].
И ответ совершенно правильлый : нулей во вводе 1, единиц 4, двоек 2 и т.д. Только в формате вывода применена самодеятельность, иначе был бы нормально читаемый вывод 1 4 2 и т.д.
Так что ошибка не у Ритчи, а ... (ясно?)

Последний раз редактировалось digitalis; 13.06.2019 в 09:21.
digitalis вне форума Ответить с цитированием
Старый 13.06.2019, 11:42   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от hienZeit Посмотреть сообщение
Что это такое?
это:

Цитата:
Сообщение от hienZeit Посмотреть сообщение
/* подсчет цифр, символов-разделителей и прочих символов */
тут же вроде по-русски написано, не?


Цитата:
Сообщение от hienZeit Посмотреть сообщение
И ещё не могу понять что это строчка, что оно делает, зачем??
++ndigit[c - '0' ]
эта строчка подсчитывает количество циферок,
которые встретились в исходной строке.

вот например, в строке:
Цитата:
Сообщение от hienZeit Посмотреть сообщение
123456789101214
сколько раз встречается циферка ноль? - 1 раз.
значит ndigitх[0] будет содержать единичку.

а сколько раз встречается циферка 1? 4 раза.
значит ndigitх[1] будет содержать 4.

и тд.

смотрим что у тебя получилось:
Цитата:
Сообщение от hienZeit Посмотреть сообщение
numbers = 1421211111
итого: ответ правильный.
_Bers вне форума Ответить с цитированием
Старый 13.06.2019, 16:09   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Два совпавших мнения (хоть и с разрывом в 2 часа) - это уже истина!
digitalis вне форума Ответить с цитированием
Старый 17.06.2019, 14:32   #5
hienZeit
Пользователь
 
Регистрация: 14.03.2019
Сообщений: 21
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Ну с последним-то понятно: инкрементируется элемент массива, индекс которого равен числовому значению введенного цифрового символа. Напимер, введено '1', код которого в ASCII 0х31, вычитаем код нуля 0x30, имеем 1, инкрементируем ndigit[1].
Благодарю за объяснение! Одно стало понятно, но ещё больше не понятно, но это уже мои проблемы.


Цитата:
Сообщение от digitalis Посмотреть сообщение
Только в формате вывода применена самодеятельность, иначе был бы нормально читаемый вывод 1 4 2 и т.д.
Так что ошибка не у Ритчи, а ... (ясно?)
Та это просто посмотрел что будет)
hienZeit вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пример из книги Керниган Ритчи "язык С" Массивы 1.6 ahsar Помощь студентам 6 05.12.2016 00:35
Упражнения из книги Кернигана и Ритчи 8Observer8 Общие вопросы C/C++ 47 09.07.2015 00:50
Умер Деннис Ритчи ds.Dante Свободное общение 8 14.10.2011 17:37
Ошибка в классической книге Вирта при конвертации чисел??? Granfalloner Помощь студентам 0 04.10.2010 04:11
Начал учить C++, сразу ошибка, хотя делаю все по книге Kn793 Общие вопросы C/C++ 5 03.04.2009 23:56