Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Среднее количество слов в строке 
V
    Опции темы
ioManip
  Дата 17.5.2013, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) ioManip - 17.5.2013, 11:16
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
volatile
Дата 17.5.2013, 12:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

(double) кол-во_слов_в_файле) / кол-во_строк_в_файле
PM MAIL   Вверх
ioManip
  Дата 19.5.2013, 04:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



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 первым делом я ищу кол - во слов, а затем кол - во строк. Но проблема в том, что если эти два алгоритма работают вместе, то они работают неправильно(подсчет неверный), если по отдельности, то все впорядке. + если вынести в отдельные циклы, то вовсе не работают.

Это сообщение отредактировал(а) ioManip - 19.5.2013, 04:47
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
volatile
Дата 20.5.2013, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

PM MAIL   Вверх
ioManip
Дата 20.5.2013, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



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




--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 20.5.2013, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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( ... ) { ... }
          }


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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 20.5.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Вот так?
Код

 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 Найти цитируемый пост)
И такой вопрос - если слова в файле разделяются табуляцией? 

Думаю, что табуляция как пробел считаться не будет => кол - во слов не будет меняться
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
volatile
Дата 21.5.2013, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

зачем это? 
PM MAIL   Вверх
feodorv
Дата 21.5.2013, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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 Найти цитируемый пост)
Думаю, что табуляция как пробел считаться не будет

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 21.5.2013, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Цитата(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 
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 21.5.2013, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 24.5.2013, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Цитата(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



--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 24.5.2013, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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');
}
или воспользуйтесь std::isspace что ли...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.