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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2012, 21:20   #1
DeIVIiurg
Новичок
Джуниор
 
Регистрация: 11.04.2012
Сообщений: 2
По умолчанию Строки и буквы

По условию задачи, вводится строка со словами, необходимо вывести на экран слово, в котором наименьшее число повторяющихся букв. Т.е. например, слово бегемот, барабан, сын, мама...Вывести должно мама. Если таких слов несколько вывести первое.
Вот мой кусок кода, понимаю, что работает неправильно, но как переделать догнать не могу(( Логика в том,что когда встречается одинаковая буква, то я её заменяю на символ $ , а потом дополнительно проверяю совпадение с данным символом

Код:
#include <iostream>
#include <cstring>
 
int main()
{
        char str[80];
        char *strPtr;
		char *strProm;
        char *word = 0;
        int count = 80;
        bool gate = false;
 std::cout<<"Vvedite stroku"<<std::endl;
        std::cin.getline(str,80);
 
        strPtr = strtok(str," ");
 
        while(strPtr != NULL)
        {
                int temp = 0;
				strProm=new char[200];
				strcpy(strProm,strPtr);
                for(int i = 0; *(strPtr + i) != '\0'; i++)
				{
					 for(int j = i + 1; *(strPtr + j) != '\0'; j++)
						{
							if (*(strPtr+i)=='$')
							{ i++;
								if (*(strPtr+i+1)=='\0')
								{goto m1;
									i++;
								}
							
							}
                                if((*(strPtr + i) == *(strPtr + j))||(*(strPtr+j)=='$'))
								{
									*(strPtr+j)='$';
								}
						}
                    temp++;
				}
m1: if(count > temp)
                {
                        if(gate)
                                delete[] word;
 
                        word = new char[strlen(strPtr)+1];
                        strcpy(word,strProm);
                        count = temp;
 
                        gate = true;
                }
 
                strPtr = strtok(NULL," ");
 
        }
 
        std::cout << word << std::endl;
 
        delete[] word;
 
        return 0;
}

Последний раз редактировалось ACE Valery; 12.04.2012 в 13:20.
DeIVIiurg вне форума Ответить с цитированием
Старый 12.04.2012, 01:12   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

ужос нах !

Код:
        char s[] = "werwe qer qwe fge werg qerg eqeeeeee geqrgqerg erg erg r2eg";
	int buf[255] = {0};

	int count = 0;
	int min_count = 999;
	char* word = 0;

	char* p = strtok(s," \t\n");

	while (p) {
		
		for (char* pp = p; *pp; pp++) {
			if (buf[*pp] == 0)
				count++;
			
			buf[*pp] = 1;
		}

		if (count < min_count) {
			word = p;
			min_count = count;
		}

		memset(&buf,0,sizeof(int)*255);
		count = 0;

		p = strtok(0," \t\n");

	}

	printf("%s : %d", word, min_count);

	getchar();
только без с++
onewho вне форума Ответить с цитированием
Старый 12.04.2012, 01:23   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

memset(&buf,0,sizeof(int)*255);
наверное не нужен, если int buf[255] = {};
занести в тело цикла while.
зы.
Что будет производительнее?

Последний раз редактировалось EUGY; 12.04.2012 в 01:27.
EUGY вне форума Ответить с цитированием
Старый 12.04.2012, 02:42   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2onewho
у тебя вроде как выведет слово с наименьшим числом уникальных букв (т.е неповторяющихся)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 12.04.2012, 02:43   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
memset(&buf,0,sizeof(int)*255);
наверное не нужен, если int buf[255] = {};
занести в тело цикла while.
зы.
Что будет производительнее?
В целом да, тем более, что вызов неправильный, амперсанд убрать нужно. Но разницы не будет, декларации вроде int buf[255] = {0}; состоят из выделения памяти и всё того же memset'а, только безопаснее с точки зрения случайных ошибок, вроде той, что допустил onewho, передав адрес указателя на первый элемент массива.
netrino вне форума Ответить с цитированием
Старый 12.04.2012, 03:14   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2onewho
у тебя вроде как выведет слово с наименьшим числом уникальных букв (т.е неповторяющихся)
Дык, это и надо по условию или нет.
"мама" - всего две буквы.
_____________
Я тут глянул, при вызове memset выполняется команд поболее....
Код:
int buf[255] = {};  // зачем писать ноль {0}, ведь лишняя команда? 
  mov         ecx,0FFh 
  xor         eax,eax 
  lea         edi,[buf] 
  rep stos    dword ptr [edi]
EUGY вне форума Ответить с цитированием
Старый 12.04.2012, 03:51   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Я тут глянул, при вызове memset выполняется команд поболее....
У меня код одинаковый получается, что с использованием memset, что инициализации массива, от компилятор зависит, но всё равно ощутимой разницы не будет.
Цитата:
Сообщение от EUGY Посмотреть сообщение
Код:
int buf[255] = {};  // зачем писать ноль {0}, ведь лишняя команда?
Затем, чтобы было видно, что нулём инициализируется. Безусловно, можно не писать, но мне лично больше нравится с нулём (всё равно ведь разницы нет).

Последний раз редактировалось netrino; 12.04.2012 в 03:53.
netrino вне форума Ответить с цитированием
Старый 12.04.2012, 13:02   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2EUGY
Цитата:
Дык, это и надо по условию или нет.
тогда у автора либо условие некорректно, либо пример
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 12.04.2012, 14:09   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Мда, можно двояко понимать.
Раз уж решили докапаться до кода, то с русские символами тоже облом.
buf[*pp] трактуется как отрицательный индекс.
Так что-ли. переделать:
Код:
for (unsigned char* pp = (unsigned char*) p; *pp; pp++)
EUGY вне форума Ответить с цитированием
Старый 13.04.2012, 12:31   #10
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <cstdio>
#include <cstring>

int ccount(const char* s) {
  const char* p;
  int n = 0;
  for(;*s; *s++) {
    for(p = s + 1; *p != *s && *p; *p++);
    if(! *p)
      n++;
  }
  return n;
}


int main(void) {
   char s[] = "бегемот, барабан, сын, мама...";
   char* a, *b;
   char* p;
   int n, k;

   k = 0;
   a = b = NULL;
   for(p = strtok(s, " \t.,"); p; p = strtok(NULL, " \t.,")) {
      if((n = ccount(p)) < k || ! k) {
         k = n;
         a = p;
         b = p + strlen(p);
      }
   }
   if(a && b)
      for(;a < b; putchar(*a++));
   return 0;
}
Тест: http://codepad.org/xVhIWPqJ
Nuklon вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычеркните из введенной строки буквы, стоящие на нечётных местах. nikitok000 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 04.12.2011 19:23
строки(поменять местами буквы) sllh_111 Помощь студентам 2 25.11.2010 19:41
pascal. строки.заглавные буквы parovoz121 Помощь студентам 1 22.09.2010 08:06
Строки. преобразовать прописные латинские буквы в строчные Antonio_getscool Помощь студентам 5 12.03.2010 09:43
Строки. Заглавные буквы после точки (Delphi) ekzobyte Помощь студентам 8 27.05.2009 22:38