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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с двумерным динамическим массивом строк. А точнее массивами... 
:(
    Опции темы
Atij
Дата 13.5.2008, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем добрый день, я уже поднимал эту тему, но так и не дождался ответа, решил поработать сам, вот что из этого получилось:

Существует уже сформированный двумерный динамический массив строк. Так как он сформирован мной, новичком, он немного "неправильный", дело в том что он у мну всегда следующего типа:

аа\0
а\0
\0 - здесь всегда пустая строка.

Ну это на самом деле думаю не суть, просто для общего ознакомления=)

Итак: мне нужно создать из этого массива ещё 3 динамических массива. По следующему принципу:
Положим у нас имеется такой изначальный текст (находиться в исходном массиве):

ааа!аа
аа.а
а!а.ааа
!а?аа?
а

Первый созданный массив должен иметь следующий вид:

аааа.
а.

Второй:

ааа!
аа!
ааа!

Третий:

а?
аа?

Думаю суть ясна.

Теперь то, что удалось состряпать в виде кода:

Код

//сформировал массив array[][] - динамический (иходные данные)

int j=0;
int i1=0;
int i2=0;
int i3=0;
int Pi=0; //здесь буду хранить кол-во элементов массива с точками
int Vi=0; //здесь буду хранить кол-во элементов массива с восклицательными знаками
int Qi=0;  //здесь буду хранить кол-во элементов массива с вопросительными знаками

char *beginPtr,*endPtr,*p; // назначение beginPtr и EndPtr ниже. А в р храню очередную строку

char **Parray; // указатель для массива указателей для точек
char **Varray; // указатель для массива указателей для восклицательных знаков
char **Qarray; // указатель для массива указателей для вопросительных знаков

Parray = new char *[k]; // массив указателей для точек char *
Varray = new char *[k]; // массив указателей для восклицательных знаков char *
Qarray = new char *[k]; // массив указателей для вопросительных знаков char *


beginPtr=&array[0][0]; //указываю на начало массива, самый первый символ
endPtr=&array[0][0];

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

while (*endPtr!='\0'&&i1!=k) // пока endPtr не будет явлвяться одновременно символом перехода на новую строку и строка не будет последней (условие полного окончания работы)
{

endPtr++; // здесь всё таки скорее нуно в конец перебросить, а то не будет работать для случая када у мну на очередной строке только точка.

if (*endPtr=='.') // если дошёл до точки
    {

p = new char [255]; // выделяю память под неё

j=0;

endPtr++; // точка включительно
        while (beginPtr!=endPtr) //  и пока не дойду до точки
        {
            if (*beginPtr=='\0') если встрчаю переход на новую стору, перехожу=)
                    {i3++; beginPtr=&array[i3][0];}
                        

            p[j] = *beginPtr;// собираю в p всё что находилось между первой встретевшейся мне буквой и точкой
            beginPtr++;
            j++;
        
        }

p[j]='\0';

Parray[Pi]=p; // записываю в массив укзателей полученную строку
Pi++;


    }

// тоже для "!" и "?"   
else if (*endPtr=='\0') //если конец очередной строки, увеличиваю i1 для перехода endPtr на следующую строку.
{
i1++;

endPtr=&array[i1][0]; 

}
}

//вывожу, удаляю=)
return 0;
} /* Не могу понять почему не работает, пробегаю в пошаговом режиме, и оказывается что: while (*endPtr!='\0'&&i1!=k) не выполняется, вылетает раньше. Вообщем при вводе:
а.
а
а.
результат:
1)а.
Остальные случаи не проверял.*/



Ну что-то в этом духе. Прикрепляю мой исходник =)

ЗЫ: Спс за внимание=)



Это сообщение отредактировал(а) Atij - 13.5.2008, 06:01

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  4.rar 24,15 Kb
PM MAIL   Вверх
Oleg_Ci
Дата 15.5.2008, 16:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Цитата
Положим у нас имеется такой изначальный текст (находиться в исходном массиве):

ааа!аа
аа.а
а!а.ааа
!а?аа?
а

Первый созданный массив должен иметь следующий вид:

аааа.  // помойму до точки здесь 7 букв "а"
а.      // здесь понятно

Второй:

ааа!    // понятно
аа!      // должна быть либо она либо шесть букв "а"
ааа!    // а здесь 4 или ни одной...

поясни почему массивы именно такие у тебя получаются.
PM MAIL   Вверх
rrrFer
Дата 15.5.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Думаю суть ясна.

не ясна
PM MAIL WWW ICQ   Вверх
Oleg_Ci
Дата 15.5.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Во как извернулся smile 
Код

// MS 2005
//#include <iostream>
#include <fstream>
using namespace std;

template <typename type>
class CArray{ // класс массив
public:
    int x; // количество элементов в массиве
    type *ar; // массив
    CArray(): x(), ar(NULL){;} // конструктор
    ~CArray(){ if (x) delete [] ar; x=0;    } // деструктор
    CArray & operator=( const CArray & sourse ){ // оператор присвоения
        if( this == &sourse ) return *this;
        copy(sourse);
    }
    CArray(const CArray & sourse ):x(){ //копи конструктор
        copy(sourse);
    }
    void copy(const CArray & sourse ){ // функция копирования
        if(x) delete [] ar;
        x = sourse.x;
        ar = new type[x];
        for( int i=0; i<x; i++ )
            ar[i] = sourse.ar[i];
    }
    void add( const type sourse ){
        type *tmp = new type[x+1];
        int i;
        for( i=0; i<x; i++ )
            tmp[i] = ar[i];
        tmp[i] = sourse;
        if(x) delete [] ar;
        ar = tmp;
        x ++;
    }
    type & operator[]( int index ){
        return ar[index];
    }
};

//////////////////////////////////////////  MAIN /////////////////////////////////////
int main(void)
{
    ifstream input("input.txt");
    //if (!input.is_open())

    CArray<char> tmp; // одномерный массив символов
    CArray<CArray<char> > mas; // двумерный массив символов
    CArray<CArray<CArray<char> > > txt; // здесь будет 3 двухмерных массива
    char c;

    // считываем
    for( char *str = ".!?"; *str; str++ ){
        while( input>>c ){
            tmp.add(c); // добавляем символ в массив
            if( c == *str ){
                mas.add(tmp); // доб. строку в двухмер. массив
                tmp.~CArray(); // очищаем массив
            }
        }// end while
        txt.add(mas); // добавляем слова
        tmp.~CArray();
        mas.~CArray();
        input.clear();
        input.seekg(0);
    }// end for

    // записываем
    ofstream output("output.txt");
    for( int i=0; i<txt.x; i++ ){ // 3 массива
        for( int j=0; j<txt[i].x; j++ ){ // массивы слов
            for( int y=0; y<txt[i].ar[j].x; y++ ){ // массивы символов
                output<<(char)txt[i].ar[j].ar[y];
            }
            output<<"\n";
        }
        output<<"\n";
    }
    
    return 0;
}

Исходник:

ааа!аа
аа.а
а!а.ааа
!а?аа?
а


Результат:

ааа!аааа.
аа!а.

ааа!
аааа.аа!
а.ааа!

ааа!аааа.аа!а.ааа!а?
аа?



PM MAIL   Вверх
Atij
Дата 15.5.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



очень приятно, за то, что этот топик подняли=) Спасибо всем кто обратил на него внимание и дочитал до конца.
2 Oleg_Ci
Замечательная программа, но не совсем то, что нужно=)

Пока ждал ответов. решил всё таки разобратся сам. Вот что получилось:
Код

input:

aaa.aaa?
aaaa!aaaa.aaa!a
a?aaa!aaaaa.

output:

The generated array of offers coming to an end a point:
1)aaa.
2)aaaa.
3)aaaaa.

The generated array of offers coming to an end an exclamation mark:
1)aaa?
2)aa?

The generated array of offers coming to an end a question mark:
1)aaaa!
2)aaa!
3)aaa!


Казалось бы именно то, что мне нужно, но осталось не доработанным 2 момента:
1 - если 
Код



input:
aaaaaaaa.aaaa!aaa?aaaa.aaaa.aaaa!aaa?aaaaaaaa.aaaa!aaa?aaaaaaaa.aaaa!aaa?aaaaa!aaa.aaaa!aaa?aaa!aaaaa.aaaa!aaa?aaaaaaaa.aaaa!aaa?
output:
The generated array of offers coming to an end a point:
1)F*>(J+aa.
2)aaaa.
3)aaaa.
4)aaaaaaaa.
5)aaaaaaaa.
6)aaa.
7)aaaaa.
8)aaaaaaaa.

The generated array of offers coming to an end an exclamation mark:
1)aaaaa!
2)aaaa!
3)aaa!
4)aaaa!
5)aaaa!
6)aaa?
7)aaa?

The generated array of offers coming to an end a question mark:
1)aaaaaaaa.
2)aaa.
3)aaaaa.
4)aaaaaaaa.
5)aaaaa!
6)aaaa!
7)aaa!
8)aaaa!
9)aaaa!

Всё рушится.

2 - не работает для случаев када первый символ в строке: . || ! || ?

прикрепляю свой исходник.
Спс всем=)


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  4.2.rar 24,20 Kb
PM MAIL   Вверх
bsa
Дата 15.5.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробуй расшифровать исходное задание:
есть набор символов. Нужно из него вычленить все поднаборы, которые заканчиваются на определенные знаки препинания (точка, восклицательный и вопросительный знаки). Проще говоря, есть текст, нужно выделить из него обычные, вопросительные и восклицательные предложения. Язык программирования С++. Так?

Это сообщение отредактировал(а) bsa - 15.5.2008, 21:54
PM   Вверх
Atij
Дата 15.5.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да=)
PM MAIL   Вверх
bsa
Дата 15.5.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string source;
    //читаем данные с клавитуры, пока не будет нажата Ctrl-Z (для Windows) или Ctrl-D (для *nix)
    //в одну строку, заменяя все символы перевода строки на пробелы
    while(cin.good()) {
        std::string tmp;
        std::getline(cin, tmp);
        if ( !tmp.empty() )
           source += " " + tmp;
    }
    std::string::size_type pos = 0;
    std::string dotSen;
    std::string excSen;
    std::string queSen;
    while(true) {
       std::string::size_type dotPos = source.find(pos, '.');
       std::string::size_type excPos = source.find(pos, '!');
       std::string::size_type quePos = source.find(pos, '?');
       std::string::size_type mPos = std::min(dotPos, std::min(excPos, quePos)); //минимальная позиция
       if (mPos == std::string::npos) //the end
           break;
       std::string sen = source.substr(pos, mPos - pos + 1) + "\n";
       switch(source[mPos]) {
       case '.':
           dotSen += sen;
           break;
       case '!':
           excSen += sen;
           break;
       case '?':
           queSen += sen;
           break;
       default:
           //error
           break;
       }
       pos = mPos + 1;
    }
    std::cout << "Regular sentences:\n" << dotSen;
    std::cout << "Exclamation sentences:\n" << excSen;
    std::cout << "Question sentences:\n" << queSen;
    return 0;
}
Может не очень оптимально, зато, думаю, наглядно.

Это сообщение отредактировал(а) bsa - 15.5.2008, 22:38
PM   Вверх
Atij
Дата 15.5.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, отписал в личку.

Фишка в том что именно в это коде нуно найти ошибку =) Всё равно огромное спасибо за содействие.
Жду ответов=)


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

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

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

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

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


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

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


 




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


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

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