Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Программа Си (http://forum.oszone.net/showthread.php?t=309571)

kennydzzze 24-12-2015 15:26 2588014

Программа Си
 
Прошу помочь. Нужно написать программу, которая выводила бы повторяющиеся слова 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 2590189

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

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");



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


Время: 21:58.

Время: 21:58.
© OSzone.net 2001-