Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2012, 00:49   #1
Shurachka
Новичок
Джуниор
 
Регистрация: 26.01.2012
Сообщений: 5
Вопрос Си задача

Условие: Дана строка – предложение. Определить слово в строке, встречающееся наибольшее количество раз, и вывести его на экран. Если таких слов несколько, то все из них. Если все слова в строке встречаются одинаковое количество раз, то ничего не выводить.
=================
пока ничего не придумывается
вот все что на данный момент написано на листке
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
int main()

{ int i;
char s1[50], s2[50];
printf ( "vvedite stroku \n" ); 
gets(s1);
i=0;
    for (i = 0;  i <= strlen(s1); i++) // почему то условие пока не '\0' не прокатывает
s2[i]=s1[i];
puts ( s2 );
}
1.) допустим берем "новый массив" и вписываем в него элементы исходного до пробела, сделали поиск какого то слова в предложении и определили что оно встречается к примеру 3 раза, как сделать чтобы когда это слово встретится снова (вписываем в "новый массив" следующее слово начального массива) снова не делать поиск того слова которое уже было. Нужно както удалить эти слова из первоначального массива ? если да то как это делать.
2.) как делать проверку встречается ли слово в предложении.
сравнивая каждый элемент ? как это реализовать циклом.
или лучше использовать strcmp ?
Shurachka вне форума Ответить с цитированием
Старый 27.01.2012, 01:38   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Вот код, который я даже не компилил. Время у меня полпятого утра, поэтому за качество не отвечаю.

P.S.
Чтобы не проверять слово второй раз надо каждый раз считывая слово, пробегаться по массиву ArrayOfWords в поисках такого же. Если не найдется, то дописать его в конец массива. Таким образом вы получите массив с неповторяющимися словами.
Код:
#include <stdio.h>
#include <string.h>

int ONum(char* Sentence, char* Word);

int main(void)
{
   char InputString[80];
   char ArrayOfWords[40][80];
   
   printf("%s",InputString);
   int i = 0, j = 0;
   while(InputString[i] != '\0' && InputString[i] != '\n)
   {
      int k = 0;
      While(InputString[i] != ' ')
      {
         ArrayOfWords[j][k] = InputString[i];
         i++;
         k++; 
      }
      j++;
      i++;
      
   }
   
   int mas[j] = {0};
   for(int a = 0; a < j; a++)
   {
      mas[a] = Onum(InputString, ArrayOfWords[a]);
   }
   
   int AllEqualFlag = 1;
   int max = 0;
   for(i = 0; i < j; i++)
   {
      if((mas[i] != mas[max]) && AllEqualFlag) AllEqualFlag = 0;
      if(mas[i] > mas[max]) max = i;
   }
   
   if( !AllEgualFlag ) 
   {
      for(i = 0; i < j; i++)
          if(mas[i] == mas[max]) printf("%s",ArrayOfWords[i]);
   }
   getch();   
}

int Onum(char* Sentense, char* Word)
{
    char temp[80];
    int  num = 0;
    while((*Sentence != '\0') && (*Sentence != '\n'))
    {
        int i = 0;
        while(*Sentence++ != ' ')
          temp[i++] = *Sentence;
        temp[i] = '\0';
        if( strcmp(temp,word) == 0) num++;
        Sentence++;
    }
    return num;
}
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 27.01.2012, 01:39   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

А вообще всё можно сделать в 2 раза проще. Но почему-то мне это в голову пришло только сейчас и писать уже что-нибудь глаза слипаются
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 27.01.2012, 16:22   #4
Shurachka
Новичок
Джуниор
 
Регистрация: 26.01.2012
Сообщений: 5
По умолчанию

да хорошо бы по проще )

вот мне тут поткинули одну идею :
"Создаём новый массивДальше добавляете слова в этом массив, (если слова там уже присутствует, то увеличиваете счетчик).
Потом сортируете массив по полю count по убыванию."

как я понимаю берем новый массив и добавляем в него по порядку каждое слово из исходного массива, если в исходном массиве встретилось слово которое уже есть в новом массиве то его не добавляем а увеличиваем счетчик для этого слова.
а вот как это сделать ? счетчик для каждого слова.
Shurachka вне форума Ответить с цитированием
Старый 27.01.2012, 17:38   #5
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

Цитата:
а вот как это сделать ? счетчик для каждого слова.
посоветовал бы обратиться к структурам (записям). и сделать массив из этих записей. или же если без структуры, то делать паралельно и числовой массив, такой же изменяющейся размерности, и индексы у них что бы были одиаковые... словом ссдеать структуру без структуры)
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 27.01.2012, 18:26   #6
Shurachka
Новичок
Джуниор
 
Регистрация: 26.01.2012
Сообщений: 5
По умолчанию

вот что удалось придумать за время после последнего поста
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
int main()

{ 
char s1[50], s2[50], sp[50];      //s1 первоначальная строка, s2 строка куда будут вписываться слова, sp промежуточная строка.
int i,j;
printf ( "vvedite stroku \n" ); 
gets(s1);
i=0;  while ( i<strlen(s1);)  {                           // цикл перебора символов первоначальной строки.
		j=0; while (s1[i] != ' ' )                      //  сброс щетчика текущего элемента промежуточной строки;   пока не встретим пробел добавляем символ из первоначальной строки в промежуточную                     
		        { sp[j]=s1[i]; i++; j++; }             // присваивание текущего символа первоначальной строки в промежуточную              
	               i++;                                        // после выхода со второго while увеличиваем щетчик символов первоначальной строки чтобы перескочить через пробел и в следующий раз вписывать в промежуточную строку с 1-й буквы следующего слова первоначальной строки
	               p=strstr(s2, sp);                      // проверяем есть ли в строке-результате слово которое только что записали в промежуточную строку, первый раз в s2 ничего нет                     
	               if ( p== NULL) { strcat (s2,sp); }    // если слово не найдено добавляем в строку-результат(s2) слово из промежуточной строки
	               else                                       // здесь повидимому должен будет быть щетчик и какие то условия пока незнаю =))
                                                                                }
puts ( s2 );
}
есть вопросы по моему коду. p=strstr(s2, sp); в блоках описания переменных куда то засобачить это P нужно ?
в строке j=0; while (s1[i] != ' ' ) перед началом цикла повидимому нужно както обнулить строку sp ато вдруг следующее слово будет короче чем sp а в sp уже есть символы и в конце слова останутся старые символы, как это сделать (обнулить строку sp) ?
Shurachka вне форума Ответить с цитированием
Старый 27.01.2012, 20:22   #7
Shurachka
Новичок
Джуниор
 
Регистрация: 26.01.2012
Сообщений: 5
По умолчанию

допустим перевели строку в двумерный массив.
получили слова записанные "в столбик" что дальше делать с этой матрицей
Shurachka вне форума Ответить с цитированием
Старый 27.01.2012, 22:05   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А мне кажется задачу эту нужно решать так:
Код:
// dfsdf.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <string>
#include <list>
#include <iostream>

using namespace std;

struct itm{string s; int cnt;};
list<itm> v;

void search(string s){
	for(list<itm>::iterator  i = v.begin(); i!=v.end(); i++){
		itm l=*i;
		if(l.s==s) { l.cnt++; *i=l;};
	}
}

void print(){
	for(list<itm>::iterator  i = v.begin(); i!=v.end(); i++){
		itm l=*i;
		cout<<l.s<<'\t'<<l.cnt<<'\n';
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	string s="Perfect world in world of sorrow";
	string k="";
	for(int i=0;i<s.length();i++){
		if(s[i]!=' '){
			k+=s[i];
		} else {
			itm a;
			a.s=k;
			a.cnt=0;
			v.push_back(a);
			search(k);
			k="";
		}
	}
	print();
	getchar();
	return 0;
}
P.S. это согласие с мнением VIK_aka_TOR
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача о стрелках (задача Майхелла) Silly Student Помощь студентам 0 14.12.2011 22:20
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51