Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Программа Си

Ответить
Настройки темы
C/C++ - Программа Си

Пользователь


Сообщения: 55
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 31-12-2015
Описание: Язык же C++
Прошу помочь. Нужно написать программу, которая выводила бы повторяющиеся слова 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"); 
}

Отправлено: 15:26, 24-12-2015

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Хороший вопрос. Надо подумать, но разбивать предложение на лексемы можно и лучше с помощью функции 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;
}

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:52, 31-12-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 55
Благодарности: 0

Профиль | Отправить PM | Цитировать


Drongo, Спасибо за ответ. Программу уже написал как смог. Если интересно, то вот код
Скрытый текст
PHP код: Выделить весь код

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

int main()
{
    
char str[100], O[100][100], T[100][100];
    
int ii2jksnflag;
    
    
printf(" Введите слова через пробел: ");
    
gets(str);
    
    
s=strlen(str);
    
i=0;
    
j=0;
    
k=0;
    for (
i=0<= si++)    // разбиваем строку на слова
    
{
        if (
str[i] == ' '  || str[i] == '\0')
        {
            
O[j][k]='\0';
            
j++;
            
k=0;
        }
        else
        {
            
O[j][k]=str[i];    
            
k++;
        }
    }


    
n=0;
    for (
i=0ji++)            // 
    
{                                //    пузырек
        
for (k=i+1jk++)        //            
        
{
             
flag=0;
             if (
strcmp(O[i],O[k])==0)    // проверка на совпадение слов
            

                  for (
s=0js++)            // проверка на повторение слов
                  
{
                      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=0ni++)
    {
        
puts(T[i]);
    }
    
system("pause");



Довольно странный способ у меня и не совсем очевидный, но рабочий.

Отправлено: 20:21, 01-01-2016 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Программа Си

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Программа, которая вычисляет площадь и периметр круга, прямоугольника, треугольник Си partisanus Программирование и базы данных 2 20-12-2012 03:07
C/C++ - Паскаль-си Drago56 Программирование и базы данных 3 24-12-2010 19:09
C/C++ - Создание ОС на Си и Си++ morph-x Программирование и базы данных 2 26-10-2010 20:35
C/C++ - Random в C (Си) ganselo Программирование и базы данных 12 21-11-2008 10:16
Почему большинство проектов Open Source написаны на СИ, а не на СИ++ Mr666 Программное обеспечение Linux и FreeBSD 2 20-02-2008 23:17




 
Переход