Форум: Форум C++Разное
Новые темы: 00
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: подсчёт количества слов в тексте
 
 автор: ols   (26.03.2007 в 13:37)   письмо автору
 
 

char text;
cout<<"Vvedite text="<<endl;cin>>text;
Как подсчиат все слова в этом тексте и найти максимальное?
}

  Ответить  
 
 автор: rty   (26.03.2007 в 13:40)   письмо автору
 
   для: ols   (26.03.2007 в 13:37)
 

используй функцию strtok

  Ответить  
 
 автор: cheops   (26.03.2007 в 21:12)   письмо автору
 
   для: ols   (26.03.2007 в 13:37)
 

Под максимальным что имеется в виду? Содержащий наибольшее количество символов?

  Ответить  
 
 автор: ols   (27.03.2007 в 20:21)   письмо автору
 
   для: cheops   (26.03.2007 в 21:12)
 

Например дана строка, содержащая текст:

programmirovanie, eto estj nechto klassnoe

Так вот, необходимо найти в этой строке слово, которое содержит максимальное кол-во элементов, и соответственно слово, которое содержит минимальное кол-во символов, ну или букв иными словами.

Может использовать for, который увеличивает на каждый символ слова и сбрасывает его при обнаружении пробела.

  Ответить  
 
 автор: oleg_alexeev   (27.03.2007 в 22:30)   письмо автору
 
   для: ols   (27.03.2007 в 20:21)
 

Вот, весьма эффективное решение:


#include <stdio.h>
#include <limits.h>


inline bool IsDelimiter(char c)
{
    return c==' ' || c==',';
}


void FindMinMax(const char *str, char *maxword, char *minword)
{
    const char *maxp=0, *minp=0;  // pointers to max and min words inside input str
    int maxlen=0, minlen=INT_MAX; // length of max and min words

    while (*str)
    {
        // skip delimiters
        while (IsDelimiter(*str)) str++;

        // get current word
        const char *p=str;  // ptr to current word
        int n=0;            // number of letters in current word
        while (*str && !IsDelimiter(*str)) {str++; n++;}

        // compare with max and min
        if (n>maxlen) {maxlen=n; maxp=p;}
        if (n<minlen) {minlen=n; minp=p;}
    }

    // copy max and min words to output buffers
    for (; maxlen; maxlen--) *maxword++ = *maxp++;
    *maxword = 0;
    if (minlen != INT_MAX) for (; minlen; minlen--) *minword++ = *minp++;
    *minword = 0;
}


int main(int argc, char **argv)
{
    char *string = "programmirovanie, eto estj nechto klassnoe";
    char maxword[100], minword[100];

    FindMinMax(string, maxword, minword);
    printf("max: %s\n", maxword);
    printf("min: %s\n", minword);
}

  Ответить  
 
 автор: ols   (31.03.2007 в 00:56)   письмо автору
 
   для: oleg_alexeev   (27.03.2007 в 22:30)
 

а зачем тут выводит с форматным выводом???
у меня ошибку выдает.
эти строчки

printf("max: %s\n", maxword);
   printf("min: %s\n", minword);

выдают такую ошибку

C:\Program Files\Microsoft Visual Studio\MyProjects\nbnvb\nvvbvb.cpp(45) : error C2065: 'printf' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\MyProjects\nbnvb\nvvbvb.cpp(48) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.

я вот так сделал:

cout<<"Maksimalnoe slovo="<<maxword<<endl;
cout<<"Minimalnoe slovo="<<minword<<endl;

и нармально работает.
p.s. А чем форматный вывод отличается? так и не пойму

  Ответить  
 
 автор: ols   (31.03.2007 в 01:36)   письмо автору
 
   для: ols   (31.03.2007 в 00:56)
 

а как теперь можно сделать так чтобы для указателя char *string можно было задать значение с клавиатры?

  Ответить  
 
 автор: cheops   (31.03.2007 в 14:19)   письмо автору
 
   для: ols   (31.03.2007 в 01:36)
 

Для этого удобно воспользоваться функцией fgets() из библиотеки <stdio>
#include <stdio>
#include <iostream>
using namespace std;

int main()
{
  char input[80];
  int number = 0;

  cout << "Введите строку " << endl;
  fgets(input, 80, stdin);

  while(input[number++]);

  cout << "Строка содержит " << number << " символов " << endl;

  return 0;
}

  Ответить  
 
 автор: oleg_alexeev   (31.03.2007 в 17:37)   письмо автору
 
   для: ols   (31.03.2007 в 00:56)
 

Чтобы компилятор не ругался на функцию printf надо включить её объявление:

#include <stdio.h>


>> p.s. А чем форматный вывод отличается? так и не пойму

printf входит в набор стандартных библиотечных функций языка С. С++ включает в себя С вместе с его стандартными функциями, поэтому в С++ можно пользоваться как объектно-ориентированным вводом-выводом, так и обычным, основанным на функциях. Набор возможностей одного и другого способа одинаков, разный только стиль написания программы.

Кстати я написал этот пример в стиле С. От языка С++ там только тип bool. Если писать в стиле С++, то кроме замены printf на cout надо бы вместо буферов для строк использовать класс std::string.

  Ответить  
 
 автор: ols   (01.04.2007 в 15:43)   письмо автору
 
   для: oleg_alexeev   (31.03.2007 в 17:37)
 

Хм, что-то не получается внедирить код cheopsa в код oleg'a_alexeev'a. Помогите пожалуйста. Еще несовсем ясно

using namespace std;

Это объявления тип'а переменной?

  Ответить  
 
 автор: cheops   (01.04.2007 в 16:36)   письмо автору
 
   для: ols   (01.04.2007 в 15:43)
 

Что вызывает затруднение? Прикрепите к сообщению архив с тем, что у вас сейчас имеется?

  Ответить  
 
 автор: ols   (01.04.2007 в 16:50)   письмо автору
 
   для: cheops   (01.04.2007 в 16:36)
 

Затруднение с указателем *string.

int main(int argc, char **argv)
{
    char *string = "programmirovanie, eto estj nechto klassnoe";
    char maxword[100], minword[100];

    FindMinMax(string, maxword, minword);
    printf("max: %s\n", maxword);
    printf("min: %s\n", minword);
}

Тоесть в данном случае здесь уже задано в программе значение -
char *string = "programmirovanie, eto estj nechto klassnoe";

Я пытался зделать так, чтобы текст (к примеру - programmirovanie, eto estj nechto klassnoe) можно было ввести с клавиатуры. а затем уже далее ясно - программа выводит слово с минимальным и макситмальным значением:

cout<<"Vvedite text="<<endl;cin>>*string;

и в общем случае изменил код вот так:


[/codint main(int argc, char **argv)
{
    char *string;
    cout<<"Vvedite text="<<endl;cin>>*string;
    char maxword[100], minword[100];

    FindMinMax(string, maxword, minword);
    printf("max: %s\n", maxword);
    printf("min: %s\n", minword);
}

Но видимо так нельзя делать, простите, наверное грубая ошибка.

  Ответить  
 
 автор: ols   (01.04.2007 в 16:50)   письмо автору
 
   для: cheops   (01.04.2007 в 16:36)
 

Затруднение с указателем *string.

int main(int argc, char **argv)
{
    char *string = "programmirovanie, eto estj nechto klassnoe";
    char maxword[100], minword[100];

    FindMinMax(string, maxword, minword);
    printf("max: %s\n", maxword);
    printf("min: %s\n", minword);
}

Тоесть в данном случае здесь уже задано в программе значение -
char *string = "programmirovanie, eto estj nechto klassnoe";

Я пытался зделать так, чтобы текст (к примеру - programmirovanie, eto estj nechto klassnoe) можно было ввести с клавиатуры. а затем уже далее ясно - программа выводит слово с минимальным и макситмальным значением:

cout<<"Vvedite text="<<endl;cin>>*string;

и в общем случае изменил код вот так:


[/codint main(int argc, char **argv)
{
    char *string;
    cout<<"Vvedite text="<<endl;cin>>*string;
    char maxword[100], minword[100];

    FindMinMax(string, maxword, minword);
    printf("max: %s\n", maxword);
    printf("min: %s\n", minword);
}

Но видимо так нельзя делать, простите, наверное грубая ошибка.

  Ответить  
 
 автор: oleg_alexeev   (02.04.2007 в 09:12)   письмо автору
 
   для: ols   (01.04.2007 в 16:50)
 


using namespace std;

действительно не объявление переменной. В С++ имеются так называемые пространства имен. Они придуманы для решения проблемы конфликта имен переменных и функций в больших проектах, где в программу включаются десятки заголовочных файлов и есть большая вероятность, что имена могут совпасть. У пространства имен есть свое имя, например std - это пространство имен стандартной библиотеки С++. Есть еще безымянное пространство имен для совместимости с Си. Как это работает?
обычное объявление

void MyFunc();

объявляет функцию в глобальном пространстве имен, а

namespace my
{
void MyFunc();
}

объявляет функцию в пространстве имен my.
Для вызова этих функций надо писать

MyFunc();  // для вызова первой
::MyFunc();  // для вызова первой
my::MyFunc();  // для вызова второй

Директива using позволяет использовать имена из некоторого пространства имен не приписывая к ним имя пространства имен, т.е. писать cout вместо std::cout


Для ввода текста с клавиатуры можно написать еще и так:

char string[256];
cout << "Vvedite text: ";
cin  >> string;

  Ответить  
 
 автор: ols   (02.04.2007 в 11:38)   письмо автору
 
   для: oleg_alexeev   (02.04.2007 в 09:12)
 


char string[256];

256 в даенном случае это кол-во символов допустимых?

  Ответить  
 
 автор: oleg_alexeev   (02.04.2007 в 11:42)   письмо автору
 
   для: ols   (02.04.2007 в 11:38)
 

Да. Если пользователь введет больше, программа аварийно завершится.

  Ответить  
 
 автор: Trianon   (03.04.2007 в 19:38)   письмо автору
 
   для: oleg_alexeev   (02.04.2007 в 11:42)
 

255. Если пользователь введет больше, поведение программы перестанет быть предсказуемым.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования