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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 04:05   #1
allmax
 
Регистрация: 17.01.2010
Сообщений: 3
По умолчанию Неисправность в подсчете символов в строке(С++)

Здравствуйте. Имеется задание: "Написать программу, которая позволяет вводить с клавиатуры строку, содержащую более одного слова, и определять: а) количество символов введённой строки; б) количество символов самого длинного слова; в) количество символов самого короткого слова. Необходимо учесть, что при вводе строки, могут использоваться не только пробелы, но и знаки пунктуации."

И имеется проблема: при вводе одного символа, не правильно считается кол-во символов самого длинного слова.
Код:
# include <iostream.h>
# include <conio.h>
# include <string.h>
int main()  {
const int N=100;
char s[N];
int i, n=0, j=0, z=0, p, k=0, min, max;
cout<<"Vvedite stroky:";
cin.get(s,N);

for(i=0;i<strlen(s);i++) {
if(s[i]==' ') j++;
}
cout<<"V stroke "<<strlen(s)-j<<" simvolov"<<endl;
for(i=0;s[i]!=' ';i++){
k++;
if(ispunct(s[i])) z++; }n=k;
if(z>0)k=k-1;
min=k; max=k;
do{ p=0; z=0;
for(i=n+1;s[i]!=' '&& i<strlen(s);i++){
p++; if(ispunct(s[i])) z++;
}
if(z>0) p=p-z;
if(p>max) max=p; if (p<min) min=p;
n=i;
} while(n<strlen(s));
cout<<"V samom korotkom slove "<<min<<" simvolov"<<endl;
cout<<"V samom dlinnom slove "<<max<<" simvolov"<<endl;
getch();
return 0;
}
allmax вне форума Ответить с цитированием
Старый 17.01.2010, 14:11   #2
allmax
 
Регистрация: 17.01.2010
Сообщений: 3
По умолчанию

никто не может помочь?
allmax вне форума Ответить с цитированием
Старый 17.01.2010, 15:47   #3
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

http://programmersforum.ru/showthread.php?t=79432

см последнее сообщение. там есть решение по вытаскиванию слов, разделенных не только пробелами. вместо сортировки слова веди нужную тебе статистику по словам.
длина слова определяется разницей: (wordEnd - iter) - можеть быть 0.
если нужно само слово, то его можно создать так: std::string word(iter, wordEnd) и дальше делать с классом std::string все, что он позволяет делать с собой.
_Ч_ вне форума Ответить с цитированием
Старый 17.01.2010, 16:06   #4
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Код:
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <string>
#include <functional>

using namespace std;

bool IsWordSeparator(char ch)
{
  // если сивмол не буква и не цифра, то это разделитель слов
  return !isalpha(ch) && !isdigit(ch);
}

void GetMinMaxWords(const string& str, std::string& minWord, std::string& maxWord)
{
  minWord.clear();
  maxWord.clear();

  const char* minWordStart = 0;
  size_t minWordLen = 0;

  const char* maxWordStart = 0;
  size_t maxWordLen = 0;

  for (string::const_iterator iter = str.begin(), end = str.end(); iter != end;)
  {
    // ищем первый не разделитель слов
    iter = find_if(iter, end, not1(ptr_fun(IsWordSeparator)));
    if (iter == end)
      break;

    // нашли. теперь ищем разделитель слов, начиная со следующего за неразделителем символа
    string::const_iterator wordEnd = find_if(iter + 1, end, &IsWordSeparator);
    // полученные итераторы (iter и wordEnd) - это итераторы на начало и конец слова.

    const size_t wordLen = wordEnd - iter;

    if ((minWordLen == 0) || (wordLen != 0 && minWordLen > wordLen))
    {
      minWordStart = &*iter;
      minWordLen = wordLen;
    }

    if ((maxWordLen == 0) || (wordLen != 0 && maxWordLen < wordLen))
    {
      maxWordStart = &*iter;
      maxWordLen = wordLen;
    }

    // подготовка к следующей итерации
    iter = wordEnd;
    if (iter != end)
      ++iter;
  }

  if (minWordStart)
    minWord.assign(minWordStart, minWordStart + minWordLen);

  if (maxWordStart)
    maxWord.assign(maxWordStart, maxWordStart + maxWordLen);
}

int main()
{
  // вместо этого надо вставить код получения строки при вводе.
  string str = "32133443, dsf, dfd,  gdfs gda;,";

  std::string minWord;
  std::string maxWord;
  GetMinMaxWords(str, minWord, maxWord);
  cout << "Source string is '" << str << "' with length = " << str.length() << endl;
  cout << "Min word is '" << minWord << "' with length = " << minWord.length() << endl;
  cout << "Max word is '" << maxWord << "' with length = " << maxWord.length() << endl;
  return 0;
}

Последний раз редактировалось _Ч_; 17.01.2010 в 16:20.
_Ч_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление символов в строке makc101 Помощь студентам 1 09.12.2009 23:01
замена символов в строке euhenia Помощь студентам 3 30.11.2009 20:59
Удаление символов в строке. papoose Общие вопросы C/C++ 8 03.06.2009 19:22
Преобразование символов в строке ZeroQl Помощь студентам 12 17.02.2009 23:06
Количество символов в строке Ivan357 Паскаль, Turbo Pascal, PascalABC.NET 0 09.12.2008 17:06