Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- void executable_program(char* input_str) {
- //word_array - массив со словами, которые употреблены хотя бы единожды
- char** word_array = (char**) malloc(sizeof(char*) * 30);
- //count_using - массив с числа, которые обозначают то, сколько раз слово было употреблено
- //count_using[i] - сколько раз было употреблено word_array[i]
- int* count_using = (int*) malloc(sizeof(int) * 30);
- //инициализирование массивов
- for (int i = 0; i < 30; i++) {
- word_array[i] = (char*) malloc(sizeof(char) * 11);
- count_using[i] = 0;
- }
- //cur_word - текущее слово, т.е. слово, которое в данный момент обрабатывается функцией strtok().
- //Выделение первого слова во входной строке input_str с помощью функци strtok().
- //Разделители - те, которые указаны в задаче
- char* cur_word = strtok (input_str, " .");
- //ind - текущий индекс в массиве word_array
- int ind = 0;
- // cur_word == NULL <=> все слова во входящей строке обработаны
- while (cur_word != NULL) {
- //ind_in_past - индекс слова в массиве word_array. Если индекс = -1,
- //мы еще не обработали данное слово, т.е. оно встречется впервые
- int ind_in_past = -1;
- //поиск слова в массиве word_array с уже обработанными словами
- for (int i = 0; i < ind; i++) {
- //Если текущее слово cur_word и некоторое слово word_array[i] равны,
- //strcmp() вернет 0
- if (!strcmp(cur_word, word_array[i])) {
- ind_in_past = i;
- }
- }
- //Если ind_in_past != -1, текущее слово встречается не впервые.
- if (ind_in_past != -1) {
- //увеличиваем количество употреблений данного слова в массиве
- //count_using с количествами использований употребленных слов
- count_using[ind_in_past]++;
- }
- //Если ind_in_past == -1, слово встретилось впервые
- else {
- //Записываем его в массив с употребленными словами word_array с текущим индексом ind
- strcpy(word_array[ind], cur_word);
- //Количество употреблений данного слова меняем с нуля на единицу
- count_using[ind]++;
- //Увеличиваем текущий индекс на 1
- ind++;
- }
- //strtok() изменяет текущее слово cur_word на следующее во входной строке input_str
- cur_word = strtok(NULL, " .");
- }
- //ind_in_result - индекс в массиве result_words со словами, которые употреблены не единожды
- int ind_in_result = 0;
- //Цикл до ind - количества различных слов во входной строке
- for (int i = 0; i < ind; i++) {
- printf("%s, %d\n", word_array[i], count_using[i]);
- }
- return;
- }
- int main() {
- //input_str - входящая строка, begin_str - это строка, в которую скопируется
- //begin_str. begin_str нужна для того, чтобы по требованию пользователя
- //выводить исходную строку. input_str вывести в этом случае невозможно,
- //т.к. strtok() ее преобразует
- char* input_str = (char*) malloc(sizeof(char) * (30*11 + 100));
- // 30 - максимальное количество слов,
- // 10 - максимальное количество символов в них (+1 для возможного '\0'),
- // 100 - максимальное количество символов под разделитители
- // (с учетом того, что между словами всего по одной запятой, это количество даже преувеличено)
- printf("Введите строку\nМаксимальное количество слов - 30\nМаксимальное количество символов в слове - 10\n");
- printf("Между соседними словами пробелы, за последним словом точка\n");
- printf("Программа выведет количество употребелений каждого из слов\n");
- //считываем вводимую пользователем строку в input_str, копируем ее в begin_str
- scanf("%s", input_str);
- //count_res_words - количество слов, записанное в result_words, т.е. количество слов
- //в input_str, которые употреблены чаще, чем единожды
- executable_program(input_str);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement