![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
micro-chipset |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 27.1.2011 Пользователь №: 2371 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Возникла проблема со следующей задачей. Задача из из книги Б. Керниган, Д. Ритчи "Язык программирования Си" Глава 1.6 упражнение 1.13 Книгу онлайн можно найти Link
Сама задача Програма должна выводить гистограмму длин слов во входном потоке. т.е. надо чтобы выводился массив допустим длинной 15 первый элемент слово из нуля букв второй символ слово из одной буквы третий символ из 2 букв ну и так далее. набросок программы
Программа компилируется, но выдает не верные результаты. Наверное не верно заполняю массив, как поправить. Зарание спасибо за помощь. |
|
|
![]() |
DEADHUNT |
![]()
Сообщение
#11
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
файл utf8, а ты его как ASCII читаешь.
|
|
|
micro-chipset |
![]()
Сообщение
#12
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 27.1.2011 Пользователь №: 2371 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(DEADHUNT @ 30.1.2011, 11:27) Link файл utf8, а ты его как ASCII читаешь. А как поправить? |
|
|
Алексей1153 |
![]()
Сообщение
#13
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 29.1.2011, 22:16) Link фразу-то не закончил. Какую область видимости будет иметь константа? как то есть где, в том блоке, где определена Цитата(DEADHUNT @ 29.1.2011, 22:22) Link не понятно чему ты учишь, но в C нету memory.h, функция memset определёна в string.h/cstring. по поводу arrlen*sizeof(*length), проще так: memset(arr, 0, sizeof(arr)); Link тут два заголовочника. Можно любой ![]() Насчёт "проще" - я выше написал, почему я именно так сделал - а то он и динамический массив так инициализировать будет |
|
|
micro-chipset |
![]()
Сообщение
#14
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 27.1.2011 Пользователь №: 2371 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А все же что с решением задачки. Работает она не верно же
|
|
|
Алексей1153 |
![]()
Сообщение
#15
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
micro-chipset, покажи алгоритм на обычном русском языке - что ты делаешь. Без алгоритма не напишешь и не отладишь
|
|
|
DEADHUNT |
![]()
Сообщение
#16
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(micro-chipset @ 30.1.2011, 11:34) Link А как поправить? для работы с UTF можешь использовать например ICU. Цитата(Алексей1153 @ 30.1.2011, 15:00) Link Link тут два заголовочника. Можно любой ![]() Насчёт "проще" - я выше написал, почему я именно так сделал - а то он и динамический массив так инициализировать будет когда я начинал писать программы на C, я подключал <malloc.h> вместо <stdlib.h>(когда мне были нужны malloc/realloc/calloc/free). Да работает, но это не правильно. И в один момент компилятор может выдать ошибку, потому-что это не стандартный заголовочный файл. Сообщение отредактировал DEADHUNT - 30.1.2011, 17:13 |
|
|
micro-chipset |
![]()
Сообщение
#17
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 27.1.2011 Пользователь №: 2371 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(DEADHUNT @ 30.1.2011, 17:12) Link Цитата(micro-chipset @ 30.1.2011, 11:34) Link А как поправить? для работы с UTF можешь использовать например ICU. А поподробней Алгоритм словами если ну примерно так представляю: Считываем посимвольно входной поток при помощи getchar(). Начиная с первого символа проверяем слово это или пробел или табуляция или перевод на новую строку если буква увеличиваем переменную на один если следующая снова буква то увеличиваем еще на один в итоге в переменной накопится количество букв слова. Далее нужно вывести в нужную ячейку массива ячейка масива с номером равным количеству букв. и так повторить снова со следующим словом. Может грубо сформулировано но как понимаю она должна работать. Поправьте пожалуйста если что то не так. |
|
|
Алексей1153 |
![]()
Сообщение
#18
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
micro-chipset, это ты уже почти программу пытаешься написать, только словами
![]() 1) инициализировать переменные и массив, в котором хранится текущее содержимое гистограммы 2) считать очередное слово. Определить его длину, инкрементировать нужный счётчик в массиве гистограммы 3) если строка не закончилась, перейти к пункту 2 4) иначе - распечатать гистограмму 5) ждать нажатие клавиши 6) выйти |
|
|
micro-chipset |
![]()
Сообщение
#19
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 27.1.2011 Пользователь №: 2371 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Алексей1153 @ 30.1.2011, 17:58) Link micro-chipset, это ты уже почти программу пытаешься написать, только словами ![]() 1) инициализировать переменные и массив, в котором хранится текущее содержимое гистограммы 2) считать очередное слово. Определить его длину, инкрементировать нужный счётчик в массиве гистограммы 3) если строка не закончилась, перейти к пункту 2 4) иначе - распечатать гистограмму 5) ждать нажатие клавиши 6) выйти Тут все понятно только наверное не согласен с пунктом 3 думаю не строка а входной поток(проверить через EOF) строк может быть и несколько. И дальше как это реализовать в программе с алгоритмом все ясно. |
|
|
Алексей1153 |
![]()
Сообщение
#20
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
строку можно тоже представить потоком, а новые строки разделены символами возврата каретки и перевода строки .
А дальше берёшь каждый пункт основного плана, так сказать, и детализируешь 1 - это уже сделали выше. 2 - например, сделай процедуру, которая на вход получает: -начало потока (вернее, текущее место, откуда начинать), -максимальная длина, которую разрешено обработать, возвращает: -длину слова -позицию начала ещё не обработанных символов прототип примерно такой const char* void F(const char* beg, const int len, int& wordlen); Сообщение отредактировал Алексей1153 - 30.1.2011, 18:55 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.8.2025, 8:39 |