Войти

Показать полную графическую версию : Программа Си


kennydzzze
24-12-2015, 15:26
Прошу помочь. Нужно написать программу, которая выводила бы повторяющиеся слова 1 раз. В моем коде получается, что если какое то слово будет написано более двух раз, то соответственно программа выведет это слово минимум 2 раза. Никак не могу додумать код...

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
char str[100], O[100][100];
int i, i2, j, k, s;

printf(" Введите слова через пробел: ");
gets(str);

s=strlen(str);
i=0;
j=0;
k=0;
for (i=0; i <= s; i++) // Разбиваем строку на слова
{
if (str[i] == ' ' || str[i] == '\0')
{
O[j][k]='\0';
j++;
k=0;
}
else
{
O[j][k]=str[i];
k++;
}
}

printf(" Вывод повторяющихся слов: \n");
for (i=0; i < j; i++)
{
for (i2=i+1; i2 < j; i2++)
{
if (strcmp(O[i],O[i2])==0)
{
puts(O[i]);
}
}
}

system("pause");
}

Drongo
31-12-2015, 17:52
Хороший вопрос. Надо подумать, но разбивать предложение на лексемы можно и лучше с помощью функции strtok, а сравнивать две строки с помощью функции strcmp

//Строки, использование strtok
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;
#include <cstring.h>
int main()
{
system("chcp 1251");
char string[] = "Это предложение, тест, содержит несколько тестовых строк: тест - тест";
char *chLeksem[100]; // массив указателей, храним лексемы: один элемент - одно слово
char *tokenPtr;
int chIndex = 0;

cout << "Строка разбивается на лексемы:\n" << string <<"\n\nЛексемы: \n\n";
tokenPtr = strtok(string, " .,-:"); // Разбивка предложения по пробелу, точке, запятой, тире, двоеточие

while(tokenPtr != NULL){
chLeksem[chIndex] = tokenPtr; // Разбиваем предложение на лексемы и сохраняем в массив
chIndex++;
tokenPtr = strtok(NULL, " .,-:");
}

for(int i = 0; i < chIndex; i++)
cout << chLeksem[i] << endl;

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

system("pause");
return 0;
}

kennydzzze
01-01-2016, 20:21
Drongo, Спасибо за ответ. Программу уже написал как смог. Если интересно, то вот код
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
char str[100], O[100][100], T[100][100];
int i, i2, j, k, s, n, flag;

printf(" Введите слова через пробел: ");
gets(str);

s=strlen(str);
i=0;
j=0;
k=0;
for (i=0; i <= s; i++) // разбиваем строку на слова
{
if (str[i] == ' ' || str[i] == '\0')
{
O[j][k]='\0';
j++;
k=0;
}
else
{
O[j][k]=str[i];
k++;
}
}


n=0;
for (i=0; i < j; i++) //
{ // пузырек
for (k=i+1; k < j; k++) //
{
flag=0;
if (strcmp(O[i],O[k])==0) // проверка на совпадение слов
{
for (s=0; s < j; s++) // проверка на повторение слов
{
if (strcmp(O[i],T[s])==0)
{
flag=0;
break;
}
else
{
flag=1;
}
}
}
if (flag==1) // если слово не повторялось, то копируем его в массив, который будем выводить
{
strcpy(T[n],O[i]);
n++;
}
}
}

printf(" Вывод повторяющихся слов: \n");
for(i=0; i < n; i++)
{
puts(T[i]);
}

system("pause");
}
Довольно странный способ у меня и не совсем очевидный, но рабочий.




© OSzone.net 2001-2012