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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив элементов типа AnsiString 
V
    Опции темы
Voldemar2004
Дата 6.6.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Есть в C++ Builder'e такой тип AnsiString, который сам заботится о выделении памяти. Какая ему соответствует библиотека в Ansi C++? Хотя посмотрел в хелпе:
Цитата
AnsiString is the C++Builder analog for the Delphi long string type.
Цитата
AnsiString - это аналог типа long string для Delphi.


У меня не получается сделать функцию наподобие этой:
Код
AnsiString *clause(char *a, int j)
{

/* код */

return &buffer[0];
}
По идее она должна считывать каждое предложение, разделенное "?.!" в отдельный элемент массива типа AnsiString. При вызове clause(" A. B. C.", 2) должна выводить "В".

Код
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>

#include <vcl.h>
//---------------------------------------------------------------------------

void main(void)
{

char *delimiter = "?!.";

int n=3; /* Число предложений. */

char *a = " A! B. C?"; /* Предложения. */

        AnsiString *buffer = new AnsiString [n];

        int i=0;

        for(int j=0; j<n; j++)
        {
                while( delimiter[0] != a[i-1] && delimiter[1] != a[i-1] && delimiter[2] != a[i-1] )
                {
                buffer[j] += a[i]; i++;
                }
                i++;

        cout<<buffer[j]<<'\n';
        }

        delete[] buffer;

delete a;

getch();
}
 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
_hunter
Дата 6.6.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



в ANSI этому классу (а не типу) соответствует string (std::string) из String.h 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
_hunter
Дата 6.6.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



это можно руками сделать -- заменить "|" на "\n" 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Voldemar2004
Дата 6.6.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



_hunter, я спрашивал про то, как сделать функцию, которая бы возвращала ссылку на нулевой элемент массива. 

Я спрашивал вот про что:
Код
//---------------------------------------------------------------------------    
#include <iostream.h>    
#include <conio.h>    
#include <vcl.h>    
//---------------------------------------------------------------------------

void main(void)
{
char *delimiter = "?!.";  /* Массив разделителей. */

int n=3; /* Число предложений. */

char *a = " A!   B. C?"; /* Само предложение. */

        AnsiString *buffer = new AnsiString [n];

        int i=0, j;
        for(j=0; j<n; j++)
        {
                while( delimiter[0] != a[i-1] && delimiter[1] != a[i-1] && delimiter[2] != a[i-1] )
                {
                buffer[j] += a[i]; i++;
                }
                i++;

        }

        for(int i=0; i<3; i++) cout<<buffer[i]<<'\n'; /* Вывод полученного массива. */

        delete[] buffer;

getch();
}
Как сделать функцию, чтобы она при вызове например 
Код
cout<<split(" A!   B. C?", 2)
 - выводила "В.". Ну то есть, функция в своем теле крутит этот массив символов, каждое предложение записывается в отдельный элемент массива типа AnsiString, а при вызове пользователь заводит предложения и номер элемента (предложения) - и соответственно происходит вывод этого элемента массива. 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
_hunter
Дата 6.6.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



а я следовал правилу "один топик -- один вопрос."...
так же неплохо бы следовать правилу "о минимализации тестового кода"

P.S.
после второго "пояснения" я стал понимать проблему еще меньше... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 6.6.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Voldemar2004, тебе ведь уже ответили: используй std::string. Конечно, интерфейс другой, но все что тебе надо, там есть. Если ты хочешь, чтобы тебе билдеровский код переписали через string, то это в Центр помощи. 


--------------------
...
PM   Вверх
Voldemar2004
Дата 6.6.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не надо мне переписывать билдеровский код. Если все настаивают smile , то буду делать через std::string.  


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
Дата 6.6.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Все! Я сделал все сам. Для начала сделал вот такой набросок:
Код
#include <iostream.h>
#include <conio.h>

int arr(int *array)
{
 return *array;
}

void main(void)
{
const int n=5;
int a[n] = {1,2,3,4,5};

for(int i=0; i<n; i++) cout << arr( (a+i)) << '\n';

getch();
}

Функция возвращает указатель на 1-ый элемент массива (по умолчанию).

А дальше по подобию:
Код
 #include <string>
 #include <conio>

 using namespace std; /* Пространство имен std. */

 int clause_count(char *);

 string split(char *a, int j)
 {
 char *delimiter = "?!."; /* Массив разделителей. */

     /* Число элементов в этом массиве = числу предложений. */
    string *buffer = new string[ clause_count(a) ];

        int i=0;

        for(int j=0; j<clause_count(a); j++)
        {
                while( delimiter[0] != a[i-1] && delimiter[1] != a[i-1] && delimiter[2] != a[i-1] )
                {
                /* Запись в каждый элемент массива нового предложения. */
                buffer[j] += a[i]; i++;
                }
                i++;
        }

    return buffer[j];

 }


 void main(void)
 {
 /* Вот какой результат требуется: */
 cout << split("May.     June!                July?", 2) << '\n';
 cout << split("May.     June!                July?", 1) << '\n';
 cout << split("May.     June!                July?", 0) << '\n';
 getch();

 }

/* Функция определения количества предложений в тексте. */
int clause_count(char *a)
{
/* Символы-разделители, по которым определяется конец предложения. */
char *split = ".!?";

int i=0, clause=0;

        do
        {
                for(int j=0; j<3; j++)
                {
                        if( a[i]==split[j] ) clause++;
                }
        i++;
        }
        while( i!= strlen(a) );
return clause;
}

P.S. А функцию определения количества предложений в тексте я буду еще доделывать, так что не критикуйте строго. smile  


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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