crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

micro-chipset
  опции профиля:
сообщение 29.1.2011, 10:54
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.1.2011
Пользователь №: 2371

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возникла проблема со следующей задачей. Задача из из книги Б. Керниган, Д. Ритчи "Язык программирования Си" Глава 1.6 упражнение 1.13 Книгу онлайн можно найти Link

Сама задача
Програма должна выводить гистограмму длин слов во входном потоке. т.е. надо чтобы выводился массив допустим длинной 15 первый элемент слово из нуля букв второй символ слово из одной буквы третий символ из 2 букв ну и так далее.


набросок программы

#include <stdio.h>

/*Программа вывода гистограммы длин слов во входном потоке*/

main ()
{
    int i, c, j;
    int length[15];
    
    j = 0;
    
    for (i = 0; i < 15; i++)
        length[i] = 0;
    while ((c = getchar()) != EOF)
        if (c != ' ' || c != '\t' || c != '\n'){
            ++j;
            ++length[c-j];
        }
    printf("Длинна слов =");
    for (i = 0; i < 15; i++)
        printf(" %d", length[i]);
}

Программа компилируется, но выдает не верные результаты. Наверное не верно заполняю массив, как поправить. Зарание спасибо за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
4 страниц V  < 1 2 3 4 >  
Начать новую тему
Ответов (10 - 19)
DEADHUNT
  опции профиля:
сообщение 30.1.2011, 11:27
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


файл utf8, а ты его как ASCII читаешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
micro-chipset
  опции профиля:
сообщение 30.1.2011, 11:34
Сообщение #12


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.1.2011
Пользователь №: 2371

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(DEADHUNT @ 30.1.2011, 11:27) Link
файл utf8, а ты его как ASCII читаешь.

А как поправить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.1.2011, 15:00
Сообщение #13


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(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
  опции профиля:
сообщение 30.1.2011, 15:59
Сообщение #14


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.1.2011
Пользователь №: 2371

Спасибо сказали: 0 раз(а)




Репутация:   0  


А все же что с решением задачки. Работает она не верно же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.1.2011, 16:49
Сообщение #15


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


micro-chipset, покажи алгоритм на обычном русском языке - что ты делаешь. Без алгоритма не напишешь и не отладишь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 30.1.2011, 17:12
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(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
  опции профиля:
сообщение 30.1.2011, 17:37
Сообщение #17


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.1.2011
Пользователь №: 2371

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(DEADHUNT @ 30.1.2011, 17:12) Link
Цитата(micro-chipset @ 30.1.2011, 11:34) Link
А как поправить?

для работы с UTF можешь использовать например ICU.

А поподробней

Алгоритм словами если ну примерно так представляю:
Считываем посимвольно входной поток при помощи getchar(). Начиная с первого символа проверяем слово это или пробел или табуляция или перевод на новую строку если буква увеличиваем переменную на один если следующая снова буква то увеличиваем еще на один в итоге в переменной накопится количество букв слова. Далее нужно вывести в нужную ячейку массива ячейка масива с номером равным количеству букв. и так повторить снова со следующим словом. Может грубо сформулировано но как понимаю она должна работать. Поправьте пожалуйста если что то не так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.1.2011, 17:58
Сообщение #18


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


micro-chipset, это ты уже почти программу пытаешься написать, только словами :) А алгоритм будет примерно такой:

1) инициализировать переменные и массив, в котором хранится текущее содержимое гистограммы
2) считать очередное слово. Определить его длину, инкрементировать нужный счётчик в массиве гистограммы
3) если строка не закончилась, перейти к пункту 2
4) иначе - распечатать гистограмму
5) ждать нажатие клавиши
6) выйти
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
micro-chipset
  опции профиля:
сообщение 30.1.2011, 18:06
Сообщение #19


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.1.2011
Пользователь №: 2371

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 30.1.2011, 17:58) Link
micro-chipset, это ты уже почти программу пытаешься написать, только словами :) А алгоритм будет примерно такой:

1) инициализировать переменные и массив, в котором хранится текущее содержимое гистограммы
2) считать очередное слово. Определить его длину, инкрементировать нужный счётчик в массиве гистограммы
3) если строка не закончилась, перейти к пункту 2
4) иначе - распечатать гистограмму
5) ждать нажатие клавиши
6) выйти


Тут все понятно только наверное не согласен с пунктом 3 думаю не строка а входной поток(проверить через EOF) строк может быть и несколько. И дальше как это реализовать в программе с алгоритмом все ясно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.1.2011, 18:54
Сообщение #20


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


строку можно тоже представить потоком, а новые строки разделены символами возврата каретки и перевода строки .

А дальше берёшь каждый пункт основного плана, так сказать, и детализируешь

1 - это уже сделали выше.

2 - например, сделай процедуру, которая
на вход получает:
-начало потока (вернее, текущее место, откуда начинать),
-максимальная длина, которую разрешено обработать,

возвращает:
-длину слова
-позицию начала ещё не обработанных символов

прототип примерно такой

const char* void F(const char* beg, const int len, int& wordlen);

Сообщение отредактировал Алексей1153 - 30.1.2011, 18:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.8.2025, 8:39