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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2009, 21:53   #1
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
Вопрос Минимальная длинна слова в строке

Написал программу по нахождению минимальной длинны слова в строке. Программа работает правильно, но огромное количество условий не есть правильным подходом в программировании. Таков вопрос, можно ли упростить мою программу ?
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int min,slen,b,c,d,p,i;
char *st[10];
int main ()
{
  clrscr ();
  min=100;
  p=0; d=0;
  st[0]="aaaa aa aaa aaaaa";
  slen=strlen (st[0]);
  for (i=0; i<slen+1; i++)
  {
     if (*(st[0]+i)==' ')
     {
	b=i;      //первое слово, далее будет служить...
                   //...как сохранение позиции пробела
	if (p>0)
	   d=b-p-1;   //размер последующих слов
	p=i;    //позиция предыдущего пробела, для... 
                 //...вычисления размера следующего слова
	if (b<min)
	   min=b;      
	if (d>0)
	   if (d<min)
	      min=d;
     }
     if (i==slen)
     {
	c=i-b-1;    //последнее слово
	if (c<min)
	   min=c;
     }
  }
  printf ("\n min=%d",min);
  getch ();
  return 0;
}
Просьба изменить только внутренние операции в цикле если возможно. Код довольно сложный, надеюсь вы в нём разберетесь
Anarki вне форума Ответить с цитированием
Старый 23.09.2009, 22:45   #2
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Код:
int size = 0;
for (i=0; i<slen+1; i++)
{
     if (*(st[0]+i)==' ')
     {
	if (size>0 && size<min)
	   min=size;
             size = 0;
     }
     else size++;
     if (i==slen)
     {
	if (size<min)
	   min=size;
     }
  }
Svetlag вне форума Ответить с цитированием
Старый 23.09.2009, 23:08   #3
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Svetlag Посмотреть сообщение
Код:
int size = 0;
for (i=0; i<slen+1; i++)
{
     if (*(st[0]+i)==' ')
     {
	if (size>0 && size<min)
	   min=size;
             size = 0;
     }
     else size++;
     if (i==slen)
     {
	if (size<min)
	   min=size-1;
     }
  }
Небольшая ошибочка
Спасибо.
Anarki вне форума Ответить с цитированием
Старый 23.09.2009, 23:13   #4
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Вам виднее. Пожалуйста.
Svetlag вне форума Ответить с цитированием
Старый 23.09.2009, 23:19   #5
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
По умолчанию

При st[0]="aaaa aaaa aaa aa";
Минимальное слово размером 3.
Но если:
st[0]="aaaa aaaa aaaa aa";
То минимальное находит верно. То есть 2
Честно пока не понял суть вашего метода, может вы знаете как исправить эту ошибку ?
Anarki вне форума Ответить с цитированием
Старый 23.09.2009, 23:20   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Anarki это
Код:
 st[0]="aaaa aa aaa aaaaa";
есть ошибка..

PS. На С++ меньше мороки..
Код:
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

template < typename T >
class my_less: public std::binary_function<T, T, bool>{
public:
	bool operator () (const T &lhs, const T &rhs){
		return lhs.size() < rhs.size();
	}
};
int main()
{
	std::string line = "testing line blaa min blaa";
	std::stringstream ss(line);

	std::cout << "Min: " 
		<< *std::min_element(
				std::istream_iterator<std::string>(ss),
				std::istream_iterator<std::string>(), 
				my_less<std::string>())
		<< std::endl;

	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 23.09.2009, 23:26   #7
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
По умолчанию

ISergeyN Спасибо
Но мне нужно изменить только то что находится в цикле моей программы, так как это часть другой более крупной программы. Если я напишу по другому как предлагаете вы, то мне придется и изменить всю другую часть программы.
Anarki вне форума Ответить с цитированием
Старый 24.09.2009, 20:39   #8
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Метод прост: size - длина каждого слова, которая инкрементируется при каждом символе, не равном пробелу. Как только встречается пробел сравнивается эта длина с минимальной, выполняются необходимые действия и size обнуляется.
По поводу ошибки - посмотрите в отладке это место.
Svetlag вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена одного слова в string строке. Samopal Паскаль, Turbo Pascal, PascalABC.NET 8 19.04.2009 08:03
Удалить из второй строки те слова, которые есть в первой строке innaa639 Паскаль, Turbo Pascal, PascalABC.NET 2 26.11.2008 15:43
Си - Написать функцию, проверяющую наличие в строке заданного слова Cvetok Помощь студентам 1 14.05.2008 05:44
написать с помощью рекурсии функцию поиска последнего слова в строке? - Си Cvetok Помощь студентам 1 13.05.2008 15:43
Минимальная заработная плата Cantana Свободное общение 15 24.12.2007 18:28