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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с програмкой, Она должна подсчитывать знаки препинания 
V
    Опции темы
Ksonatos
Дата 25.5.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!!

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

Я кое чего накалякал.. Сделал, что бы текст из файла в Memo переписываляся, а дальше думаю, как сделать что бы в мемо посчитать знаки и результат выписать либо в другой мемо либо в лабел
Код

#include <vcl.h>
#include <iostream>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->FileName == "";
OpenDialog1->Execute();

TOpenDialog *od = new TOpenDialog(this);
od->Filter = "Текстовые файлы|*.txt";
if (od->Execute()) {
  Memo1->Lines->LoadFromFile(od->FileName);
}
delete od;
od = NULL;
}
//---------------------------------------------------------------------------


А вот это я думаю подойдёт для подсчёта:

Код

char ch;
int a=0, b=0, c=0;

if (ch == ',')
    a++;
else
if (ch == '.')
    b++;
else
if (ch == '?')
    c++;
else


Надеюсь кто то откликнется и за ранее спасибо = )



PM MAIL   Вверх
borisbn
Дата 25.5.2011, 10:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Memo1->Lines - это TStrings. У него есть свойство Text, которое возвращает строку, содержащую все строки из TStrings, разделённые переводом строки.
Код

AnsiString text = Memo1->Lines->Text;
const char * c_str = text.c_str();
int str_len = text.Length();
for ( int i = 0; i < str_len; i++ ) {
  char ch = c_str[ i ];
// а дальше так, как ты и написал. можно не через кучу if'ов, а один switch
}

можно (да и нужно) с использованием готовых алгоритмов
Код

// Для всех знаков
bool isDelimeter( char ch ) {
    return ch == '.'
          || ch == ','
          || ch == '?'
// <--- добавлять сюда
    ; 
}
// Для точки
bool isPoint( char ch ) {
    return ch == '.';
}
// Для запятой
bool isComma( char ch ) {
    return ch == ',';
}

...
std::string text = Memo1->Lines->Text.c_str();
int pointsCount = count_if( text.begin(), text.end(), isPoint );
int commasCount = count_if( text.begin(), text.end(), isComma );
int allSignsCount = count_if( text.begin(), text.end(), isDelimeter );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 25.5.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



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

int main(int argc, char *argv[])
{
   if (argc < 2) {
       std::cerr << "Usage:\n\t" << argv[0] << "<filename>" << std::endl;
       return 1;
   }
   std::ifstream file(argv[1]);
   if (!file.is_open()) {
      std::cerr << "Failed to open file \"" << argv[1] << "\"" << std::endl;
      return 1;
   }
   char c;
   int punct = 0;
   while(file.get(c)) {
      switch(c) {
      case '.':
      case ',':
      case '!':
      case '?':
      case '-':
      case ';':
      case ':':
         ++punct;
         break;
      }
   }
   std::cout << "Found " << punct << " punctuator(s)" << std::endl;
   return 0;
}


Это сообщение отредактировал(а) bsa - 25.5.2011, 10:48
PM   Вверх
Ksonatos
Дата 25.5.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот так правильно? А то он ошибку выдаёт: [BCC32 Error] Unit1.cpp(54): E2268 Call to undefined function 'count_if'

Код

AnsiString text = Memo1->Lines->Text;
const char * c_str = text.c_str();
int str_len = text.Length();
for ( int i = 0; i < str_len; i++ ) {
  char ch = c_str[ i ];
}

char ch;
int a=0, b=0, c=0;

if (ch == 'a')
    a++;
else
if (ch == 'b')
    b++;
else
if (ch == 'c')
    c++;
else

std::string text = Memo1->Lines->Text.c_str();
int pointsCount = count_if( text.begin(), text.end(), isPoint );
int commasCount = count_if( text.begin(), text.end(), isComma );
int allSignsCount = count_if( text.begin(), text.end(), isDelimeter );


Может надо библиотеку добавить какую? 

Это сообщение отредактировал(а) Ksonatos - 25.5.2011, 11:50
PM MAIL   Вверх
boostcoder
Дата 25.5.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Ksonatos @  25.5.2011,  11:36 Найти цитируемый пост)
Call to undefined function 'count_if'

#include <algorithm>

Добавлено через 2 минуты и 5 секунд
Цитата(Ksonatos @  25.5.2011,  11:36 Найти цитируемый пост)
AnsiString text = Memo1->Lines->Text;
const char * c_str = text.c_str();
int str_len = text.Length();
for ( int i = 0; i < str_len; i++ ) {
  char ch = c_str[ i ];
}
char ch;
int a=0, b=0, c=0;
if (ch == 'a')
    a++;
else
if (ch == 'b')
    b++;
else
if (ch == 'c')
    c++;
else

это все выброси. borisbn, показал рабочий код.

PM WWW   Вверх
Ksonatos
Дата 25.5.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вставил библиотеку #include <functional>, теперь пишет: [BCC32 Error] Unit1.cpp(56): E2316 'begin' is not a member of 'AnsiString'

Добавлено через 4 минуты и 1 секунду
Цитата(boostcoder @  25.5.2011,  12:07 Найти цитируемый пост)
это все выброси. borisbn, показал рабочий код.


Компилятор ругается на

Код

bool isDelimeter( char ch ) {


[BCC32 Error] Unit1.cpp(42): E2141 Declaration syntax error

Скобочки все стоят нормально.. Не пойму чего не нравится


PM MAIL   Вверх
borisbn
Дата 25.5.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ksonatos, выкладывай весь cpp-шник


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ksonatos
Дата 25.5.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @  25.5.2011,  12:41 Найти цитируемый пост)
Ksonatos, выкладывай весь cpp-шник 


Ну вот то, что есть..

Код

#include <vcl.h>
#include <iostream>
#include <algorithm>



#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->FileName == "";
OpenDialog1->Execute();

TOpenDialog *od = new TOpenDialog(this);
od->Filter = "Текстовые файлы|*.txt";
if (od->Execute()) {
  Memo1->Lines->LoadFromFile(od->FileName);
}
delete od;
od = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
AnsiString text = Memo1->Lines->Text;
const char * c_str = text.c_str();
int str_len = text.Length();
for ( int i = 0; i < str_len; i++ ) {
  char ch = c_str[ i ];
}

bool isDelimeter( char ch ) {
    return ch == '.' ;


}




std::string text = Memo1->Lines->Text.c_str();
int pointsCount = count_if( text.begin(), text.end(), isPoint );
int commasCount = count_if( text.begin(), text.end(), isComma );
int allSignsCount = count_if( text.begin(), text.end(), isDelimeter );

}


Я пока с точкой только пробую.. Но не компилирует, говорит что: [BCC32 Error] Unit1.cpp(45): E2141 Declaration syntax error



Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Rabora1.cpp 1,54 Kb
PM MAIL   Вверх
borisbn
Дата 25.5.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. В Си++ нельзя написать ф-цию внутри другой ф-ции. У тебя isDelimeter описана внутри TForm1::Button2Click. Вынеси её наружу.
2. Ф-ция count_if описана в namespace std. Чтобы использовать её нужно либо указать
using namespace std;
либо явно вызывать std::count_if( ...
3. Ты написал
Код

int pointsCount = count_if( text.begin(), text.end(), isPoint );
int commasCount = count_if( text.begin(), text.end(), isComma );

а сами ф-ции isPoint и isComma нигде не определены



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ksonatos
Дата 25.5.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1)Чего то я не до понял, куда перенести isDelimeter.. В начало программы? И как это реализовать.

2)Можете подсказать, за что отвечают функции isPoint и isComma.. Я с такими не работал еще = )
PM MAIL   Вверх
bsa
Дата 25.5.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Ksonatos, это функции написанные borisbn. Их реализация во втором сообщении темы. Что тут непонятного?
PM   Вверх
borisbn
Дата 25.5.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ksonatos @  25.5.2011,  15:24 Найти цитируемый пост)
куда перенести isDelimeter.. В начало программы? И как это реализовать.

подводишь курсор к началу ф-ции (bool isDeli...) - перед буквой b
нажимаешь Shift, не отпуская нажимаешь стрелку вниз пока не будет выделена закрывающая фигурная скобка
нажимаешь Ctrl+X
переводишь курсор за пределы функции TForm1::Button2Click (на одну строку выше описания этой функции)
нажимаешь Ctrl+V

Цитата(Ksonatos @  25.5.2011,  15:24 Найти цитируемый пост)
за что отвечают функции isPoint и isComma.. Я с такими не работал еще


Цитата(borisbn @  25.5.2011,  10:42 Найти цитируемый пост)

// Для всех знаков
bool isDelimeter( char ch ) {
    return ch == '.'
          || ch == ','
          || ch == '?'
// <--- добавлять сюда
    ; 
}
// Для точки
bool isPoint( char ch ) {
    return ch == '.';
}
// Для запятой
bool isComma( char ch ) {
    return ch == ',';
}


IMHO если с isDelimeter понятно, то и с этими должно быть понятно



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ksonatos
Дата 25.5.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Блин, извиняюсь. Я туплю.. 

Можно последний(надеюсь) вопрос? 

Вот эта ошибка: [BCC32 Error] Unit1.cpp(49): E2316 'begin' is not a member of 'AnsiString'
PM MAIL   Вверх
borisbn
Дата 25.5.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ksonatos @  25.5.2011,  16:03 Найти цитируемый пост)
'begin' is not a member of 'AnsiString'

'begin' не является членом класса 'AnsiString'
IMHO всё ясно. В коде, который ты привёл выше, такая ошибка появиться не может, т.к. там begin вызывается у std::string, а не у AnsiString.

Короче говоря, вот этот код
Код

std::string text = Memo1->Lines->Text.c_str();
int allSignsCount = std::count_if( text.begin(), text.end(), isDelimeter );

должен компилироваться без ошибок


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ksonatos
Дата 25.5.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ага, разобрался.. Всё компилирует.

Вот, вроде так всё:
Код

#include <vcl.h>
#include <iostream>
#include <algorithm>



#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
using namespace std;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->FileName == "";
OpenDialog1->Execute();

TOpenDialog *od = new TOpenDialog(this);
od->Filter = "Текстовые файлы|*.txt";
if (od->Execute()) {
  Memo1->Lines->LoadFromFile(od->FileName);
}
delete od;
od = NULL;
}
//---------------------------------------------------------------------------
bool isDelimeter( char ch ) {
    return ch == '.';
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{

std::string text = Memo1->Lines->Text.c_str();
int allSignsCount = count_if( text.begin(), text.end(), isDelimeter );

}


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

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

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

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

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


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

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


 




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


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

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