Страница 1 из 2

Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 24 фев 2016, 21:24
Kazanove
имеется несколько строк в каждой строке минимум 5 слов. Нужно Вывести все слова, имеющие три и более одинаковых символа.

Код: Выделить всё

#include <stdio.h>
#include <windows.h>

char* Rus(const char* text);

void main(void){
	int minString = 10;
	int minWord = 5;
	int minSymbol = 5;
	const int maxString = 20;
	const int maxSymbol = 100;
	static char buffer[maxString][maxSymbol];
	char input[maxString][maxSymbol];
	int row = 0;


	printf(Rus("Введите не мение %d строк. В строке не менее %d слов.\nВ слове не менее %d символов. Слова разделены 1 пробелом\n"), minString, minWord, minSymbol);
	printf(Rus("Для прекращения ввода нажмите <Enter> в начале строки.\n\n"));
	while (gets_s(buffer[row]) != NULL && row < maxString){
		if (strcmp(buffer[row], "") == 0){
			if (row < minString){
				printf(Rus("Вы должны ввести не менее %d строк(введено %d)\n"), minString, row);
				continue;
			}
			break;
		}
		strcpy(input[row], buffer[row]);
		char *pWord = strtok(buffer[row], " ");
		int countWord = 0;
		bool error = false;
		while (pWord){
			if (strlen(pWord) < minSymbol){
				printf(Rus("Слово доолжно стоять не мение из %d символов (состоит из %d)\n"), minSymbol, strlen(pWord));
				error = true;
				break;
			}
			pWord = strtok(NULL, " ");
			countWord++;
		}

		if (error){
			continue;
		}
		else if (countWord < minWord){
			printf(Rus("Вы должны ввести не менее %d слов (введено %d)\n"), minWord, countWord);
		}
		else{
			row++;
		}
	}
	/*
вот здесь должно быть решение (мозг вообще плывет).
я понимаю что нужно каждую строчку input-а разбить на слова, 
каждое слово нужно разбить по-символьно и через цикл сравнения проверить есть ли одинаковые символы в слове, если есть и их более или равно 3. вывести это слово на экран. И повторить данное действие с каждым словом в строке и с каждой строкой.
(не получается написать код а точнее после разбития строки на слова с помощью [B]strtok[/B]  а так как она типа [B]char*[/B] немогу ее перевести в одномерный масив массив)
*/




}

char bufRus[256];
char* Rus(const char* text){
	CharToOemA(text, bufRus);
	return bufRus;
}

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 24 фев 2016, 22:58
Romeo
А зачем buffer сделан массивом строк? Достаточно ведь простого одномерного массива символов, то есть одной строки.

Код: Выделить всё

char buffer[maxSymbol];
Проблема с strtok не понятна. Можно подробнее? Как по мне, никаких проблем с её использованием нет.

Ещё не совсем ясно задание. Например, у нас есть следующие слова:
123_1
123_2
123_3
123abc
abc_1
abc_2
abc_3
Обрати внимание, что первые три слова имеют одну общую часть, последние три слова - другую общую часть. А четвёртое слово вообще содержит в себе как общую часть первой группы, так и общую часть второй группы слов. Теперь вопрос - какие слова должны быть выведены программой?

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 25 фев 2016, 06:52
Kazanove
да c buffer наверное вы правы

значит пример
habrahabr developer fdksf
qwerty ghjkbjmj
врезультате должно вывести
habrahabr developer jоhjkbjmj
так как в них есть по три и более одинаковых символов (3-h или 3-a, 3-e, 4-j)

strstk выдает строку - как перебрать посимвольно

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 25 фев 2016, 08:49
Romeo
Kazanove писал(а):habrahabr developer jоhjkbjmj
С твоим примером всё понятно. В нём нет двух разных групп слов и их пересечения. А как с моим примером?

Видимо ты ещё не осознал проблему в построении алгоритма.
Kazanove писал(а):strstk выдает строку - как перебрать посимвольно
Посимвольно строку можно перебрать, используя обычный оператор индексации. Никаких вызовов вспомогательных функций не требуется.

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 25 фев 2016, 20:34
Kazanove
я предстовляю както так, но:

Код: Выделить всё

for (int i = 0; i < row; i++){
		char *p = strtok(input[i], " ");
		char countSymbol[maxSymbol];
		while (p){
			for (int j = 0; j < strlen(p); j++){
				for (int k = j; k < strlen(p);k++){
					if (p[k]==p[i]){
/* как записать что буква  встретилась в этом слове столько раз*/
					}
				}
			}
			p = strtok(NULL, " ");
		}
	}
ни каких групп и пересечений

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 25 фев 2016, 21:11
Romeo
Да погоди ты код писать. Как можно писать код, если не понимаешь, какое у программы должно быть поведение?

Ты мне можешь сказать, какие слова из тех, которые я указал выше, должно вывести приложение? Если сможешь ответить на этот вопрос, а также обосновать почему именно так, а не иначе, то после этого код написать будет проще простого.

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 25 фев 2016, 21:37
Kazanove
ну вот, к примеру пользователь вводит строку, токого содержания
habrahabr developer softodrom mts computer
программа проверяет есть ли в первом слове одинаковые символы если есть и их больше или равно трем то нужно вывести это слово на экран ... затем проверяем второе слово есть ли в нем одинаковые символы если есть и их больше или равно трем выводим и это слово на экран ... и так далее ...

тоесть выводит
habrahabr
так как в нем есть 3 буквы "а",
developer
так как в нем есть 3 буквы "e",
softodrom
так как в нем есть 3 буквы "o",

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 25 фев 2016, 22:55
Romeo
Так, кажется я понял, что программа куда более проста, чем я предполагал раньше. Слова не нужно анализировать и сравнивать друг с другом. Нужно просто найти в каждом отдельном слове повторяющиеся символы.

Вот тебе функция, которая определяет, есть ли в слове три или более повторяющихся символов:

Код: Выделить всё

bool has_three_or_more_equal_symbols(const char* str)
{
   char table[256] = { 0 };

   const int len = strlen(str);
   for (int i = 0; i < len; ++i)
      if (++table[str[i]] >= 3)
         return true;

   return false;
}
Как она работает, предлагаю разобраться самостоятельно.

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 26 фев 2016, 00:14
Kazanove
Большое спасибо выручили во второй раз ... очень приятно с вами работать

Re: Вывести все слова, имеющие три и более одинаковых символа.

Добавлено: 26 фев 2016, 11:37
Decoder
Функция has_three_or_more_equal_symbols(), представленная в посте #8, будет работать корректно только если в строке будут символы с кодом не выше 127 (цифры, латиница, знаки препинания). Но если написать строку русскими буквами, то программа будет аварийно завершаться.
Причина здесь...

Код: Выделить всё

 ++table[str[i]] ... 
Переменная str может иметь отрицательное значение, что недопустимо для индекса массива.
Как вариант, можно сделать так:

Код: Выделить всё

 ++table[128 + str[i]] ...