Консультация № 188863
28.02.2016, 12:40
0.00 руб.
0 19 1
Здравствуйте! Прошу помощи в следующем вопросе:

Дана задача: В строке найти символы, встречающиеся ровно один раз и вывести слова, состоящие из этих букв. Хотелось бы программу без использования строковых подпрограмм. Часть программы по поиску уникальных символов есть, но как найти слова состоящие из этих букв не знаю

Приложение:
#include <stdio.h>
#include <locale.h>
int main ()
{
char str[50], dopstr[50];
int i, j, k = 0, size, flag;
setlocale(LC_ALL, "rus");
puts("Введите строку на латинице\n");
gets(str);
for ( i = 0; str[i] != 0; i++ )
size = i;
printf("Размер строки %d \n", size);
for ( i = 0; i < size; i++ )
{
flag = 1;
for ( j = 0; j < size; j++ )
{
if ( (str[i] == str[j]) && i != j)
flag = 0;
}
if ( flag )
{
dopstr[k] = str[i];
k++;
}
}
dopstr[k] = 0;
for ( i = 0; i < k; i++ )
printf("%c ", dopstr[i]);
printf("\n");
return 0;
}

Обсуждение

давно
Посетитель
7438
7205
28.02.2016, 14:00
общий
это ответ
Здравствуйте, ksenya241!
Вариант 1: Выводятся все слова, в которых встречается хотя бы один из символов, встречающихся один раз
[code h=200]
#include <stdio.h>
#include <locale.h>
int main ()
{
char str[50], dopstr[50];
int i, j, k = 0, size, flag;
setlocale(LC_ALL, "rus");
puts("Введите строку на латинице\n");
gets(str);
for ( i = 0; str[i] != 0; i++ ); //длина считалась на 1 меньше
size = i;
printf("Размер строки %d \n", size);
for ( i = 0; i < size; i++ )
{
flag = 1;
for ( j = 0; j < size; j++ )
{
if ( (str[i] == str[j]) && i != j)
flag = 0;
}
if ( flag )
{
dopstr[k] = str[i];
k++;
}
}
dopstr[k] = 0;
for ( i = 0; i < k; i++ )
printf("%c ", dopstr[i]);
printf("\n");

int ist;
for (ist=i=0; i<size; i++)
{
if (str[i] == ' ')
{
ist = i+1;
continue;
}

for (j=0; (j<k)&&(str[i]!=dopstr[j]); j++);

if (j!=k)
{
for (; (ist<size)&&(str[ist]!=' '); ist++)
printf("%c%", str[ist]);
printf(" ");
i = ist-1;
}
}
printf("\n");

return 0;
}[/code]
Вариант 2: Выводятся слова, целиком состоящие из символов, встречающихся один раз
[code h=200]
#include <stdio.h>
#include <locale.h>
int main ()
{
char str[50], dopstr[50];
int i, j, k = 0, size, flag;
setlocale(LC_ALL, "rus");
puts("Введите строку на латинице\n");
gets(str);
for ( i = 0; str[i] != 0; i++ ); //длина считалась на 1 меньше
size = i;
printf("Размер строки %d \n", size);
for ( i = 0; i < size; i++ )
{
flag = 1;
for ( j = 0; j < size; j++ )
{
if ( (str[i] == str[j]) && i != j)
flag = 0;
}
if ( flag )
{
dopstr[k] = str[i];
k++;
}
}
dopstr[k] = 0;
for ( i = 0; i < k; i++ )
printf("%c ", dopstr[i]);
printf("\n");

int ist;
for (flag=ist=i=0; i<size; i++)
{
if (str[i] == ' ')
{
if (flag && (flag == (i-ist)))
{
for (; ist<=i; ist++)
printf("%c%", str[ist]);
}
ist = i+1;
flag = 0;
}
else
{
for (j=0; j<k; j++)
{
if (str[i] == dopstr[j])
break;
}
flag += (j!=k);
}
}
if (flag && (flag == (i-ist)))
{
for (; ist<i; ist++)
printf("%c%", str[ist]);
printf(" ");
}
printf("\n");
return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
02.03.2016, 15:40
общий
Там, где программа должна искать слова, состоящие из символов, встречающихся один раз, она печатает всю строку без изменений
давно
Посетитель
7438
7205
02.03.2016, 15:58
общий
Адресаты:
Приведите пример строки, и что должно получиться в итоге
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
02.03.2016, 16:10
общий
Адресаты:
Может, надо было найти слова, целиком состоящие из символов, встречающихся один раз?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
02.03.2016, 16:12
общий
Адресаты:
Сейчас программа выводит все слова, в которых встречается хотя бы один из символов, встречающихся один раз
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
02.03.2016, 16:24
общий
С этой задачей программа отлично справляется. Мне следовало бы уточнить задачу, да вывести надо слова только те, которые целиком состоят из этих букв. К примеру Bell is my friend - уникальные символы b, s, m, y, f, r,n, d а распечатаем только my
давно
Посетитель
7438
7205
02.03.2016, 16:45
общий
Адресаты:
Легко! Сейчас нарисую
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
02.03.2016, 17:16
общий
Адресаты:
Возьмите в ответе второй вариант
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
02.03.2016, 17:18
общий
огромное спасибо
давно
Посетитель
399275
16
02.03.2016, 17:37
общий
этот оператор (flag && (flag == (i-ist))) проверяет какое условие?
давно
Посетитель
7438
7205
02.03.2016, 17:45
общий
Адресаты:
Во-первых, в переменной flag (использовал ту, что есть, можно было, конечно, новую, типа count)
считается, сколько совпадающих символов из текущего слова и из массива одиночных символов.
Во-вторых, в данном условии проверяется, чтобы было хоть одно совпадение, и чтобы число совпадений совпало с
длиной текущего слова (как разность между позицией пробела (или за последним символом) и позицией начала слова.
Почему проверяю еще и на "не 0"? Чтобы отсечь пробелы в начале строки, например...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
02.03.2016, 18:01
общий
ясно, но что-то слова все-равно не выводит
давно
Посетитель
7438
7205
02.03.2016, 18:03
общий
Адресаты:
Давайте строку, которая не срабатывает...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
03.03.2016, 08:54
общий
все работает, но пример Bell is my friend он выводит весь, а не слово my. Блок поиска слов из уникальных букв проходит по всем словам и выводит всю строку
давно
Посетитель
7438
7205
03.03.2016, 11:12
общий
Адресаты:
Весьма странно, у меня все работает
Прикрепленные файлы:
f5c8f80406be59132320cb2c9836454c.GIF
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
03.03.2016, 11:46
общий
Сейчас ввела и заработало. Весьма странно
давно
Посетитель
399275
16
03.03.2016, 11:46
общий
и еще один вопрос можно ли эту программу реализовать с стандартными подпрограммами?
давно
Посетитель
7438
7205
03.03.2016, 12:24
общий
Адресаты:
Можно использовать, например:
strlen - для получения длины строки
strpbrk - для определения, состоят ли слова из одиночных символов, например, так:
Код:

else
{
/*
for (j=0; j<k; j++)
{
if (str[i] == dopstr[j])
break;
}
flag += (j!=k);
*/
flag += ( strpbrk(&str[i], dopstr) == &str[i]);
}

При желании, можно еще что-нибудь придумать
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399275
16
03.03.2016, 14:54
общий
strpbrk пробовала, для этой задачи она все-таки не подходит, она ведь проверяет есть ли символы в нашей строке, совпадающие с символами из dopstr, в данном случае, и мы получаем что в каждом слове такие символы присутствуют. За решение еще раз огромное мпасибо
Форма ответа