Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Среднее количество слов в строке


Автор: ioManip 17.5.2013, 11:16
Здравствуйте! Подскажите, чему равно среднее количество слов в строке? (Т.е. что то вроде формулы Сред.кол = делим это на это)

Автор: volatile 17.5.2013, 12:13
Цитата(ioManip @  17.5.2013,  11:16 Найти цитируемый пост)
что то вроде формулы Сред.кол = делим это на это

(double) кол-во_слов_в_файле) / кол-во_строк_в_файле

Автор: ioManip 19.5.2013, 04:45
volatile,  Ясно, спасибо! А вот смотрите:
Код

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream text_file("file.dat");
    
    int leng, temp = 0;
    int k = 0;
    string str, line;
    
    while ( !text_file.eof() )
    {
        text_file >> str;
        
        leng = str.length();
        
        for (int i = 0; i < leng - 1; i++)
             if ( (str[i] == ' ' ) && (str[i+1] != ' ') ) 
                   temp++;
        
             if (str[0] != ' ') 
                   temp++;
        
        getline(text_file, str);
        k++;
    }
    
    cout << "Количество слов в файле: " << temp - 1 << endl;   
    cout << "Количество строк в файле: " << k - 1 << endl;
    cout << "Cрежнее количество строк в строке: " << double((temp - 1) / k) << endl;
    
    text_file.close();
   
    return 0;
}


В цикле while первым делом я ищу кол - во слов, а затем кол - во строк. Но проблема в том, что если эти два алгоритма работают вместе, то они работают неправильно(подсчет неверный), если по отдельности, то все впорядке. + если вынести в отдельные циклы, то вовсе не работают.

Автор: volatile 20.5.2013, 00:00
ioManip, читаете строку, потом эту строку разбираете на слова.

Автор: ioManip 20.5.2013, 09:58
volatile, извините не совсем понял к чему это было сказано. 

Вот смотрите что получилось
Код

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    ifstream inFile("file.dat");
    
    int leng;
    int countWord = 0;
    int countLine = 0;
    string str;
    
    while ( !inFile.eof() )
    {
        inFile >>  str;
        
        leng = str.length();
        
        for (int i = 0; i < leng - 1; i++)
        
             if ( (str[i] == ' ') && (str[i+1] != ' ') ) 
                   countWord++;

             if (str[0] != ' ') 
                   countWord++;
        
             if ( getline(inFile,str) )    //getline - бежит по строке, пока не '\n'
                  countLine++;
    }
        
    
    cout << "Количетво слов в файле: " << countWord << endl; 
    cout << "Количетво строк в файле: " << countLine << endl;
    cout << "Среднее количество слов в строке: " << double(countWord) / countLine << endl;
    
    inFile.close();
    
    return 0;
}


Только знаете, количество слов через раз считает, иногда верно иногда нет.
Например:
Код

privet ka u teba dela
u mena vse xoroho
poka

Количетво слов в файле: 4
Количетво строк в файле: 3

/--------------------------------------/
privet ka u teba dela u mena vse otlicno
privet ka u teba dela u mena vse otlicno


Количетво слов в файле: 10
Количетво строк в файле: 2




Автор: feodorv 20.5.2013, 10:24
Цитата(ioManip @  20.5.2013,  10:58 Найти цитируемый пост)
volatile, извините не совсем понял к чему это было сказано. 

Цитата(ioManip @  19.5.2013,  05:45 Найти цитируемый пост)
Но проблема в том, что если эти два алгоритма работают вместе, то они работают неправильно(подсчет неверный)



Цитата(ioManip @  20.5.2013,  10:58 Найти цитируемый пост)
Только знаете, количество слов через раз считает, иногда верно иногда нет.

Удивительно, что бывает, что считает верно...
Цитата(ioManip @  20.5.2013,  10:58 Найти цитируемый пост)
        inFile >>  str;


Цитата(ioManip @  20.5.2013,  10:58 Найти цитируемый пост)
         for( ... ) 
           if ( getline(inFile,str) )    //getline - бежит по строке, пока не '\n'
                  countLine++;


Зачем одновременно считывать слово, а потом в цикле строчку? Нужно же считать из файла строчку, а потом в ней подсчитать количество слов:
Код

          if ( getline(inFile,str) )
          {
                  countLine++;
                  for( ... ) { ... }
          }


И такой вопрос - если слова в файле разделяются табуляцией?

Автор: ioManip 20.5.2013, 15:22
Вот так?
Код

 while ( !inFile.eof() )
    {   
        if ( getline(inFile, str) )    //getline - бежит по строке, пока не '\n'
        {
           countLine++;
        
           for (int i = 0; i < str.length(); i++)
           
                if ( (str[i] == ' ') && (str[i+1] != ' ') ) 
                      countWord++;
           
                if (str[0] != ' ') 
                      countWord++;  
        }
    }


Но так не выходит! smile 
Цитата(feodorv @  20.5.2013,  10:24 Найти цитируемый пост)
И такой вопрос - если слова в файле разделяются табуляцией? 

Думаю, что табуляция как пробел считаться не будет => кол - во слов не будет меняться

Автор: volatile 21.5.2013, 00:17
Цитата(ioManip @  20.5.2013,  15:22 Найти цитируемый пост)
            if (str[0] != ' ') 
                      countWord++;  
        }

зачем это? 

Автор: feodorv 21.5.2013, 01:17
Цитата(volatile @  21.5.2013,  01:17 Найти цитируемый пост)
зачем это?  

Если строка начинается не пробелом, то условие 
Цитата(ioManip @  20.5.2013,  16:22 Найти цитируемый пост)
                if ( (str[i] == ' ') && (str[i+1] != ' ') ) 

оставляет за бортом первое слово (согласно этому условию слову должен предшествовать пробел)... То есть маленький такой фиксап (если строка пустая, то что будет с этим фиксапом?)


Ну а если строка заканчивается пробелом, то при проверке
Цитата(ioManip @  20.5.2013,  16:22 Найти цитируемый пост)
                if ( (str[i] == ' ') && (str[i+1] != ' ') ) 

происходит выход за конец строки...


Цитата(ioManip @  20.5.2013,  16:22 Найти цитируемый пост)
Думаю, что табуляция как пробел считаться не будет

Должна считаться, я так полагаю...

Автор: ioManip 21.5.2013, 10:57
Цитата(feodorv @  21.5.2013,  01:17 Найти цитируемый пост)
Должна считаться, я так полагаю... 


Код

while ( !inFile.eof() )
    {   
        if ( getline(inFile, str) )    //getline - бежит по строке, пока не '\n'
        {
           countLine++;
        
           for (i = 0; i < str.length(); i++)
           
                if ( ((str[i] == ' ') || (str[i] == '\t')) && ((str[i+1] != ' ') || (str[i+1] != '\t')) ) 
                      countWord++;
           
                if ( (str[0] != ' ') && (str[0] != '\t') ) 
                      countWord++;
        }
    }


На текст
Код

    privet    privet privet
privet    privet pora vstavat kak dela
vse    xoroho
poka poka

poka    457


выдал

Код

Количетво слов в файле: 16
Количетво строк в файле: 6
Среднее количество слов в строке: 2.66667


вроде верно выглядит, хотя smile 

Автор: feodorv 21.5.2013, 13:39
Цитата(ioManip @  21.5.2013,  11:57 Найти цитируемый пост)
вроде верно выглядит

Не выглядит (реально 15 слов). Возможно, пустая строка считается как слово из-за 
Цитата(ioManip @  21.5.2013,  11:57 Найти цитируемый пост)
                if ( (str[0] != ' ') && (str[0] != '\t') ) 
                      countWord++;

Хотя здесь длина строки может быть нулевой (тогда Вы никак не имеете право делать str[0]). Тоже относится к значению i, равному str.length()-1, в следующем отрывке кода:
Цитата(ioManip @  21.5.2013,  11:57 Найти цитируемый пост)
               if ( ((str[i] == ' ') || (str[i] == '\t')) && ((str[i+1] != ' ') || (str[i+1] != '\t')) ) 


Выдайте отладочную информацию на экран, сравните с тем, что должно быть  smile 

Автор: ioManip 24.5.2013, 09:15
Цитата(feodorv @  21.5.2013,  13:39 Найти цитируемый пост)
Выдайте отладочную информацию на экран


Вообщем такие дела. На текст
Код

Privet kak dela fdsfsd fsdfsd
fsdfsd fsds
    fsdfsdf fsfsdfsd fsdfsdfsd fsdfsd
f sdfsd sdfsd fdsfwf w
f sdfsd    32 gg43
    fsdfds    
dasfsdf    fdsfsd    fdsf


Ответ таков
Код

Количетво слов в файле: 24
Количетво строк в файле: 7


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

if ( ((str[i] == ' ') || (str[i] == '\t')) && ((str[i+1] != ' ') || (str[i+1] != '\t')) )

этой строке 
Код

Получен сигнал: SIGSEGV (Segmentation fault)
Для программы bgpu_prog_9, PID 6 054



Автор: feodorv 24.5.2013, 09:55
Цитата(ioManip @  24.5.2013,  10:15 Найти цитируемый пост)
Получен сигнал: SIGSEGV 

Гм. Такое впечатление, что Вы читаете избирательно)))
Цитата(feodorv @  21.5.2013,  14:39 Найти цитируемый пост)
Хотя здесь длина строки может быть нулевой (тогда Вы никак не имеете право делать str[0]). Тоже относится к значению i, равному str.length()-1, в следующем отрывке кода:
Цитата(ioManip @  21.5.2013,  11:57 Найти цитируемый пост)
               if ( ((str[i] == ' ') || (str[i] == '\t')) && ((str[i+1] != ' ') || (str[i+1] != '\t')) ) 

И чему равна str.length() для пустой строки? Чему равно str для пустой строки? Отладочной информации как не было, так и нет(((


PS Пожалуйста, сделайте уже функцию my_isspace:
Код
inline bool my_isspace( char c )
{
  return (c == ' ' || c == '\t' || c == '\n' || c == '\r');
}
или воспользуйтесь http://www.cplusplus.com/reference/locale/isspace/ что ли...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)