Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 6.3 Решение приведённой задачи. Вопросы по реализации / 16 сообщений из 16, страница 1 из 1
05.04.2014, 09:15
    #38605971
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Здравствуйте.
В главе 6.3 K&R предлагается разобрать решение следующей задачи(своими словами, ибо распечатанный вариант книги на работе, а pdf-варианта сейчас нет):

У нас есть keyword языка C, такие как fe : {else,if,then, ..., smth_else}.
У нас есть какой-то текст.
Задача: Найти число вхождений каждого слова из keyword в данном тексте.

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

Данные предлагают хранить следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
struct keyword
{
char* name;
int count;
} word[]={"if",0,"else",0,"then",0};



Окей, пусть будем хранить так, хотя я не уверен что это моветон хранить подобным образом массив word (ведь я явным образом не указываю размерность массива, хоть K&R и говорит, что компилятор сам определит размерность и переживать не стоит).

Решать эту задачу я решил в лоб. Для начала в лоб, а потом буду пытаться улучшить алгоритм. При решение в лоб я делаю цикл между каждым отдельно взятым словом из char* buf cо всеми word.name(1 слова из char* buf на n слов word.name). И вот этим то и проблема, я не знаю как его сделать, ведь мне неизвестна размерность массива. Могу конечно определить сколько выделено байт на массив, и исходя из этого рассчитать размерность. Но не хочу так.
Подскажите как лучше сделать ?
...
Рейтинг: 0 / 0
05.04.2014, 09:32
    #38605973
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercury,

в конце каждой строки (массива char'ов) будет символ \0. Следовательно, идём в цикле по строке, пока не встретится ноль.
...
Рейтинг: 0 / 0
05.04.2014, 09:41
    #38605975
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercuryИ вот этим то и проблема, я не знаю как его сделать, ведь мне неизвестна размерность массива. Могу конечно определить сколько выделено байт на массив, и исходя из этого рассчитать размерность. Но не хочу так.
Подскажите как лучше сделать ?

Код: plaintext
1.
elem_count = sizeof(words) / sizeof(words[0]); // words - массив
...
Рейтинг: 0 / 0
05.04.2014, 11:37
    #38606017
smald
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercury

Где такие простые задачки задают?
Лучше реализуйте ls -l, полезнее для развития.
...
Рейтинг: 0 / 0
05.04.2014, 11:42
    #38606020
smald
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercury
А вообще Вам или сюда или сюда
...
Рейтинг: 0 / 0
05.04.2014, 15:58
    #38606121
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Anatoly Moskovsky, а количество байт выделенных для каждого words будет одинаковым ? Слова ведь разной длины. Или произойдет выравнивание по максимуму ?
...
Рейтинг: 0 / 0
05.04.2014, 16:12
    #38606130
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercuryAnatoly Moskovsky, а количество байт выделенных для каждого words будет одинаковым ? Слова ведь разной длины. Или произойдет выравнивание по максимуму ?

Конечно, там же указатель.
...
Рейтинг: 0 / 0
05.04.2014, 16:21
    #38606132
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
То есть у меня будет 100 элементов в массиве структур, и в 99 максимум будет три символа, а в одном 10 символов в с концом строки, и в итоге я потрачу 1000 байт для хранения этого массива ?
...
Рейтинг: 0 / 0
05.04.2014, 16:31
    #38606134
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercuryТо есть у меня будет 100 элементов в массиве структур, и в 99 максимум будет три символа, а в одном 10 символов в с концом строки, и в итоге я потрачу 1000 байт для хранения этого массива ?
Нет, вы не поняли.
Размер элементов одинаковый не потому что выравниваются по размеру строк, а потому что в массиве хранятся не сами строки, а указатели на них. А указатели все одного размера.
...
Рейтинг: 0 / 0
05.04.2014, 16:33
    #38606135
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Да и вообще массив - это по определению коллекция из одинаковых элементов :)
...
Рейтинг: 0 / 0
05.04.2014, 16:41
    #38606138
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Балбес:( ну конечно вы правы, только адрес хранится ! Понял, спасибо C:
...
Рейтинг: 0 / 0
06.04.2014, 20:34
    #38606622
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
smaldГде такие простые задачки задают?

SashaMercuryВ главе 6.3 K&R ...
...
Рейтинг: 0 / 0
07.04.2014, 04:43
    #38606788
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Сегодня решил эту задачу, потратил около 60 минут, с учётом исправления ошибок. Это много, но лучше чем раньше. Плохо что целый месяц не занимался конечно. Проверьте пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
//count C keywords
#include "stdafx.h"

//Функция сравнивает "C строку" с открытым диапазоном [s_w2,e_w2)
bool compare2w(const char* w1, const char* s_w2, const char* e_w2)
{
	while (*w1 == *s_w2)
	{
		if (*(w1+1) == '\0' && e_w2-1 == s_w2) return true;
		w1++;
		s_w2++;
	}
	return false;
}
struct key
{
	char* word;
	int count;
} tab[] = { "break", 0, "case", 0, "char", 0, "continue", 0, "default", 0, "unsigned", 0, "while", 0 , "if", 0 };


int _tmain(int argc, _TCHAR* argv[])
{
        //1
        char* buf = "break wordbreak if if if break char else cahr alligator if" ; 
	//2
        int tab_power = sizeof(tab) / sizeof(*(tab + 0)); 
	printf("tab_power = %i \n", tab_power); 
	char* buf_curst = buf;
	while (*buf!='\0')
	{
		if (*(buf+1) == ' ' || *(buf+1)=='\0')
		{
			printf("%c \n", *buf_curst);
			//умножаю один выделенный участок памяти на весь словарь 
			for (int i = 0; i < tab_power; i++)
			{
                              //3
				if (compare2w(tab[i].word, buf_curst, buf+1))
				{
					++tab[i].count;
					break;
				}
			} //end for
			buf_curst = buf + 2;
		}//end if		
		++buf;
	}
	for (int i = 0; i < tab_power; i++)
	{
		printf("%i %s \n", tab[i].count, tab[i].word);
	}
	return 0;
}



Также у меня возникли вопросы:
1) Возможно ли написать buf в несколько строк ?
2)Всё-же мне не очень нравится строка
Код: plaintext
1.
int tab_power = sizeof(tab) / sizeof(*(tab + 0));


выше я писал о том что не уверен что это моветон. Насколько эта запись безопасна ? Пока не знаю как работает sizeof, нужно будет посмотреть исходный код. Меня терзают сомнения, по поводу этой строчки.
3)Хотел обратиться к tab[i].word по-нормальному, через указатели, не получилось. Подскажите как это сделать ?


Мне не очень нравится мой код. fe, не нравится как я назвал переменную в которой хранится текущее начало диапазона buf_curst. Не очень доволен именованием переменных в функции для сравнения слова и полуоткрытого диапазона. Далее, код слишком большой, мне кажется что его можно уменьшить. На что ещё обратить внимание ?

Далее, касаемо алгоритма. Очевидно, он не оптимален. Пока не понятно в какую сторону копать чтобы его улучшить. Но улучшать нужно. Какие-то слова, fe, нужно отметать сразу. Возможно стоит сравнивать только с теми словами в алфавите, длина которых равна длине найденного диапазона символов. Для длины, ввести третью размерность. Пока что так.


И теперь касаемо первой страницы K&R 6.3. Пока прочитал только её.

1. Выводы по структурам: поля - есть атрибуты, и по факту структура описывает схему отношений в РМД. Структуры используются для работы с таблицами при написании СУБД ?

2. Вот как K&R задают структуру:
K&RSTRUCT KEY {
CHAR *KEYWORD;
INT KEYCOUNT; };
STRUCT KEY KEYTAB [NKEYS];


Мне не нравится эта избыточность, к чему она тут ?зачем везде добавлять key ? Их читают, и остальные могут так начать делать.

Дочитаю 6.3
...
Рейтинг: 0 / 0
07.04.2014, 04:57
    #38606789
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Видимо smald уже подсказал мне как улучшить алгоритм, использовать алгоритм Бойера — Мура. Тоже почитаю
...
Рейтинг: 0 / 0
07.04.2014, 09:28
    #38606885
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
SashaMercuryПока не знаю как работает sizeof, нужно будет посмотреть исходный код. Меня терзают сомнения, по поводу этой строчки.исходник чего ты хочешь посмотреть, компилятора? ))) sizeof - оператор языка, а не функция, он вычисляет размер типа данных в момент компиляции.
SashaMercuryзачем везде добавлять key ? Их читают, и остальные могут так начать делать.это синтаксис языка С для типа данных "структура". struct key; Стандартная идиома, кстати, описывать структуры в С, такая:
Код: plaintext
1.
2.
3.
typedef struct key {...};
// теперь можно задавать экземпляры так:
key a;


PS в С++ typedef не нужен, ещё одно отличие языков
...
Рейтинг: 0 / 0
07.04.2014, 09:34
    #38606889
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K&R 6.3 Решение приведённой задачи. Вопросы по реализации
Egorych, спасибо. Я имел ввиду добавление префикса key к членам структуры, плохо объяснил в предыдущем посте
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 6.3 Решение приведённой задачи. Вопросы по реализации / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]