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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как подсчитать одинаковых букв 
:(
    Опции темы
Аброр
Дата 22.7.2006, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.5.2006

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



Помогите решить задачу пожалуйста





Задан некоторый текст, заканчивающийся точкой. Текст состоит из произвольного количества строк. Каждая строка заканчивается “;”. Слова в тексте разделены хотя бы одним пробелом. Подсчитать с помощью функции количество одинаковых букв в тексте и вывести результат обработки в виде: 
<буква>  .  < количество >. <номер строки текста>.
 
PM MAIL   Вверх
Earnest
Дата 22.7.2006, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Самое простое - завести массив размером 256 (чтобы не напрягаться). Читаешь файл, инкрементируешь соответствующий элемент для каждого символа. Выводишь.
Если тебе нужна именно программная реализация - обращайся в центр помощи.

Добавлено @ 08:30 
Насчет номера строки не очень понятно: одинаковые буквы могут встретиться в разных строках. Так что задача требует уточнения. 


--------------------
...
PM   Вверх
chaos
Дата 22.7.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



я бы не думая сделал так, экспромт типо:
Код

#include <algorithm>
#include <iostream>
using namespace std;

class CFinderSymbol
{
    char m_nFindSymbol;
    unsigned int m_nCount, m_nLine;

public:
    CFinderSymbol(char nFindSymbol)
        :m_nFindSymbol(nFindSymbol), m_nCount(0), m_nLine(1)
    {}

    void operator()(char ch)
    {
        if (';' == ch || '.' == ch)
        {
            cout << (char)m_nFindSymbol << " . " <<  m_nCount << " . " <<m_nLine << endl;

            m_nLine++;
            m_nCount = 0;
        }
        else if (ch == m_nFindSymbol)
            m_nCount++;
    }
};


void main()
{
    string soStr = "abcsa;wetSDAaqa;arwasaaaaaaaad;a.";
    for_each(soStr.begin(), soStr.end(), CFinderSymbol('a'));
}
 
PM WWW   Вверх
Droll
Дата 22.7.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 10.11.2004

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



Решил тоже своим вариантом поделиться (закоментировал почти все строчки  smile  ):
Код

#include <iostream>

using namespace std;

void CountChars(char *String);
// Функция считает количество букв

void FillZero(int Letters[256]);
// Заполнение массива нулями

void CountOut(int Letters[256], const int StrNum);
// Вывод результата (для строки с номером StrNum)

int main()
{
    // Cтрока
    char *myStr = "First string;Here are:3h(hh);DUMUD;The End.<-Here is the end of text.(This will not count).;hh";
    
   // Подсчет
    CountChars(myStr);
   
   // Перед выходом сделаем паузу (чтобы прочитать результат)
    system("pause");
    
   // Готово
    return 0;
}

void CountChars(char *String)
// Подсчет
{
    // Массив (содержит количество встречающихся символов)
   int Letters[256];
   // Номер текущей строки
   int StrNum = 1;
   // Длина текста
   int Len = strlen(String);
   // Очищаем массив
   FillZero(Letters);
   for  (int i = 0; i < Len; i++)
   {
        if (String[i] == ';')
        // Конец строки
        {
            // Выводим результат
            CountOut(Letters, StrNum);
            // Следующая строка
            StrNum++;
        }
        else if (String[i] == '.')
        // Конец текста
        {
            // Выводим результат
            CountOut(Letters, StrNum);
            // Завершаем функцию
            return;
        }
        else
        {
            // Увеличиваем значение массива для данной буквы
            Letters[String[i]]++;
        }
    }
}
   
void FillZero(int Letters[256])
// Очистка массива
{
   for (int i = 0; i < 256; i++)
   {
      Letters[i] = 0;
   } 
}

void CountOut(int Letters[256], const int StrNum)
// Вывод результата
{
    for (int i = 0; i < 256; i++)
    {
        if (Letters[i])
        {
            cout << (char)i << "." << Letters[i] << "." << StrNum << endl;
        }
    }
    FillZero(Letters);
}

  

Это сообщение отредактировал(а) Droll - 22.7.2006, 12:09
PM   Вверх
Rockie
Дата 22.7.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



задание действительно не понятно. если нужно для каждого символа запоминать строки в которых он упоминается, то тут imho следует использовать динамическое программирование. то о чем говорила Earnest  выглядит примерно так:

Код
#include<iostream>
#include<fstream>
#include<conio>

using namespace std;

int letters[256];

int main()
{ char temp;

  ifstream read_file("1.txt");

  while(!read_file.get(temp).eof())       // count
     letters[(int)temp]++;

  read_file.close();

  for(int i=0;i<256;i++)                  // display
   { cout<<(char)i<<' '<<letters[i]<<'\n';
     if(i%20==0) getch();
   }

  getch();
  return 0;
}
 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Oleg_Ci
Дата 22.7.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Подсчитывает количество букв и строки в которых они находятся.
Код
#include <iostream>
#include <cctype>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;


void main()
{
  string str = "asd;df_=\45;dgfe345-; 5jt93j fe-43'."; // тест-строка
  int kchar = 0, // количество совпавших символов
   numstring=1;  // номер строки в которой найден символ
  vector<int> stroka; // здесь номера строк

// проверяем все символы ASCII-хотя все ненадо... лень соображать было...
  for ( int i=-128; i<128; i++, kchar=0, numstring=1)
  {
    for ( size_t j=0; j<str.length(); j++ )
      if ( str[j] == ';' ) { numstring++; continue; }
      else if ( isalpha(i) && i == str[j] ) // символ англ. алфавита?
      {
        kchar++; // количество символов
        if ( stroka.empty() || numstring != stroka[stroka.size()-1])
          stroka.push_back(numstring);// Добавляем номер строки
      }

    if (kchar) 
    {
      cout<<(char)i<<"  kol-wo:  "<<kchar<<"  Nuber string:  ";
      for ( vector<int>::iterator x=stroka.begin(); x!=stroka.end(); x++ )
        cout<<*x<<ends;  // вывод номеров строк
      cout<<endl;
    }
    stroka.clear();
  }

  system("PAUSE");
}
Только программа проверяет принадлежность символа к английскому алфавиту, а для того чтоб проверяла принадлежность к русскому вроде так можно(ASCII), хотя возможно и подругому проверяется.
Код

char c = 'ы';
if((c>='А' && c<='п')||(c>='р' && c<='ё')   /*|| isalpha(c)*/)
 { ... };
 
Кстати, подсчитывать надо только буквы алфавита, а не все символы подряд, я так понял. 

Это сообщение отредактировал(а) Олег4 - 22.7.2006, 13:11
PM MAIL   Вверх
Oleg_Ci
Дата 22.7.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Droll, твоя программа подсчитывает количество повторяющихся символов в каждой строке отдельно, а у меня подсчитывает сколько вообще в файле(тексте) повторяющихся символов(букв алфавита), и выводит номера строк в которых они встречились. 
И как по правильному надо ? smile 
Помойму правильно - это как я сделал. smile 
Хотя моя программка долека от совершенства.

Rockie что ты обьясняеш, то и сделал Droll, хотя программка твоя подсчитывает количество символов в файле, а не в страчках, это как я пытался сделать. 
Код
if(i%20==0) getch();   // строчка-загадка...
 

Это сообщение отредактировал(а) Олег4 - 22.7.2006, 14:40
PM MAIL   Вверх
Rockie
Дата 23.7.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Олег4 @  22.7.2006,  14:11 Найти цитируемый пост)
Rockie что ты обьясняеш, то и сделал Droll

а что я объяснял?

Цитата(Олег4 @  22.7.2006,  14:11 Найти цитируемый пост)
 хотя программка твоя подсчитывает количество символов в файле

ну да, пример этого я и приводил

Цитата(Олег4 @  22.7.2006,  14:11 Найти цитируемый пост)
if(i%20==0) getch();   // строчка-загадка... 

на случай старого компилятора - поэкранный вывод, чтобы строчки не убегали ввысь  smile 

Цитата(Олег4 @  22.7.2006,  14:11 Найти цитируемый пост)
И как по правильному надо ?  
Помойму правильно - это как я сделал.  

аа
Цитата(Аброр @  22.7.2006,  05:41 Найти цитируемый пост)
Подсчитать с помощью функции количество одинаковых букв в тексте

 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Oleg_Ci
Дата 23.7.2006, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Цитата
    
Цитата
Rockie что ты обьясняеш, то и сделал Droll
    

а что я объяснял?
А вот что: smile 
Цитата
... то тут imho следует использовать динамическое программирование. то о чем говорила Earnest  выглядит примерно так:
Код

int letters[256];
...
while(!read_file.get(temp).eof())       // count
//___________________________________________________    
     letters[(int)temp]++;  // <--  вот это самое  <<<<----
//___________________________________________________
Кстати такую "фишку" в программировании в первые вижу, сам я не додумался-бы никогда. 
PM MAIL   Вверх
slava72
Дата 24.7.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.6.2006

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



Цитата

Код

char temp;    
while(!read_file.get(temp).eof())       // count    
   letters[(int)temp]++;



мдя... оч граблевидный код smile
   letters[(unsigned char)(temp)]++; 
имхо надежнее 

 
PM MAIL   Вверх
Rockie
Дата 24.7.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а там int скорее для очистки совести. там вообще не нужно явного приведения.
Код
letters[temp]++;

и все.. 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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