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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пожалуйста помогите реализовать задумку=) 
:(
    Опции темы
Atij
Дата 27.4.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день, уважаемые форумчани =)
Помогите мне пожалуйста в усвоение работы с указателями. 
Я хочу решить слудующую задачу:
Дан текст (в текстовом документе). 1 - необходимо заполнить этот текст в массив, по следующему принципу: каждый элемент массива это строка, соответственно символ перехода не следующую строку будет являться признаком конца очередного эл-та массива, причём строка может состоять более чем из 255 символов. Я бы хотел создать массив указателей каждый элемент кот-го соответственно являлся бы указателем на первый символ очередной строки, ну и признаком конца очередного эл-та массива будет '\n'.
2 - Создать 2 указателся beginPtr и EndPtr, кот-ые бы изначально указывали на самый первый символ первого эл-та массива, далее реализовать следующее: мы бегаем указателем EndPtr по очередному эл-ту массива. В случае если указтелю присваевается адресс в кот-ом храниться "." "!" "?" мы начинаем считывать от указтеля beginPtr до EndPtr включительно, значения вписывая всё что встретиться на на пути в один из массивов аналогичных уже созданному, за тем лишь исключение что в зависимости от того какой символ разделитель нам стретился элемент записывается соответсвенно как элемент массива для символа разделителя ".", "!" или "?". 
3 - вывожу в выходной файл поочереди массив для ".", "!", "?". С пронумерованными элементами.
Например, на входе:

"мама мыла раму?
рама мыла мама! или 
нет?
точно.
да!"

Главный массив, кот-ый служит только для хранения данных, текущее состояние:

*array[0]=мама мыла раму?
*array[1]=рама мыла мама! или 
*array[2]=нет?
*array[3]=точно.
*array[4]=да!"

массив для точек, текущее состояние:

*.Ar[0]= точно.

массив для восклицательных знаков, текущее состояние:

*!Ar[0]=рама мыла мама!
*!Ar[1]=да!

массив для вопросительных знаков, текущее состояние:

*?Ar[0]=мама мыла раму?
*?Ar[1]=или нет?

Выходной файл:

1) точно.
1) рама мыла мама!
2) да!
1) мама мыла раму?
2) или нет?

Вот то, что удалось набросать, помогите пожалуйста разобраться=)

Код

#include<fstream.h>
#include<conio.h>

ifstream input("input.txt", ios::in);
ofstream output("output.txt", ios::out);

void main()
{

char *.array[]; // это всеголишь символическое обозначение, так чтоб пока читабельнее было=)
char *!array[]; // те самые массивы для точек, восклицательных знаков и вопросительных=)
char *?array[];
int .i=0; // это суматоры (кол-во строк в каждом из этих массивов)
int !i=0;  
int ?i=0;

char *array[5]; // тот самый, "основной массив, в кот-ом всё и храниться"
char s; // сюды пихаю очередной символ из файла=)
char *beginPtr,*endPtr; // указатели начала и конца очередно предложения
char *p = new char [255]; // переменная указатель служащая для накопления очередной строки в себе
int i=0,j=0,i2; 



while (!input.eof()) // заполняю array=)
{
s=input.get();
if (s=='\n')
{
    array[i]=p;
    output<<p;
    i++;
    delete [] p;//Воть! это один из 2-ух основных вопросов кот-ые мну мучают =) как обнулить, то, что накопилось в p?
    j=0;

}
else
{
    p[j] = s;
    j++;
}

}


beginPtr=&array[0]; // кидаю в самое начало оба указателя.
endPtr=&array[0];

int i1=0;

while (*endPtr!='\n'&&i1!=i) // пока я не дойду до очередного символа конца строки кот-ый соответственно будет я вляться последним,
{

endPtr++; // передвигаю указатель конца строки
j=0;

if (*endPtr=='.') // если встречаю точку,

delete [] p;//??? // так как продолаю пользоваться *р пытаюсь опять же обнулить его канибудь (та же проблема) 
j=0;

    {
    while (beginPtr!=endPtr) // заполняю очередной элемент .array символами от beginptr до endptr
        {
        beginPtr++;
        p[j] = *beginPtr;
        j++;
        } //beginptr доходит до endptr
.array[.i]=p;
.i++;

    }


else if (*endPtr=='!') // тоже самое
    {

delete [] p;//???
j=0;

    while (beginPtr!=endPtr)
        {
        beginPtr++;
        p[j] = *beginPtr;
        j++;
        }
!array[!i]=p;
!i++;

    }

else if (*endPtr=='?')
    {

delete [] p;//???
j=0;

    while (beginPtr!=endPtr)
        {
        beginPtr++;
        p[j] = *beginPtr;
        j++;
        }
?array[?i]=p;
?i++;

    }

else if (*endPtr=='/n') // и вот второй вопрос: предоложим мои указатели дошли до последнего символа очередной строки, какие значения они будут иметь после очередного ptr++? перейдут ли они автоматически на следующую строку?
i1++;

for (i2=0;i2<.i1;i2++)
output<<i2+1<<")"<<.array[i2]<<endl;
        
for (i2=0;i2<?i1;i2++)
output<<i2+1<<")"<<?array[i2]<<endl;
        
for (i2=0;i2<!i1;i2++)
output<<i2+1<<")"<<!array[i2]<<endl;
    
} // буду очень признателен за исправление моих синтаксических и ошибок в алгоритме, большое спасибо =)

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


Шустрый
*


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

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



Эх=( Может никто не хочет отвечать потому-что странно набран код... Вот тот же код тока с нормальными обозначениями массивов и переменных (коменты переписывать не стал):

Код

#include<fstream.h>
#include<conio.h>

ifstream input("input.txt", ios::in);
ofstream output("output.txt", ios::out);

void main()
{

char *Parray[5];
char *Varray[5];
char *Qarray[5];
int Pi=0;
int Vi=0;
int Qi=0;

char *array[5];
char s;
char *beginPtr;
char *endPtr;
char *p = new char [255];
int i=0,j=0,i2;

delete [] p;//знаю что так не мона, но не могу понять как освобождать накопившиеся в *p значения=(

while (!input.eof())
{
s=input.get();
if (s=='\n')
{
    array[i]=p;
    output<<p;
    i++;
    *p=' ';
    j=0;

}
else
{
    p[j] = s;
    j++;
}

}


beginPtr=array[0]; 
endPtr=array[0];

int i1=0;

while (*endPtr!='\n'&&i1!=i)
{

endPtr++;
j=0;

if (*endPtr=='.')
    {
delete [] p;//
j=0;


    while (beginPtr!=endPtr)
        {
        beginPtr++;
        p[j] = *beginPtr;
        j++;
        }
Parray[Pi]=p;
Pi++;

    }


else if (*endPtr=='!')
    {

delete [] p;//???
j=0;

    while (beginPtr!=endPtr)
        {
        beginPtr++;
        p[j] = *beginPtr;
        j++;
        }
Varray[Vi]=p;
Vi++;

    }

else if (*endPtr=='?')
    {

delete [] p;//???
j=0;

    while (beginPtr!=endPtr)
        {
        beginPtr++;
        p[j] = *beginPtr;
        j++;
        }
Qarray[Qi]=p;
Qi++;

    }

else if (*endPtr=='\n')
i1++;

for (i2=0;i2<Pi;i2++)
output<<i2+1<<")"<<Parray[i2]<<endl;

for (i2=0;i2<Qi;i2++)
output<<i2+1<<")"<<Qarray[i2]<<endl;

for (i2=0;i2<Vi;i2++)
output<<i2+1<<")"<<Varray[i2]<<endl;

}
}// всё это дело компилиться, но результат выдаёт естественно не верный=(

PM MAIL   Вверх
mes
Дата 28.4.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



для начала:
"delete" используются для возврашения памяти системе  (в противоположность "new"), a не для обнуления накопившихся значений
Цитата(Atij @  28.4.2008,  18:44 Найти цитируемый пост)
 p[j] = s;

для p выделено всего 255 символов - нет уверености что в потоке строки будут всегда короче
Цитата(Atij @  27.4.2008,  14:38 Найти цитируемый пост)
  array[i]=p;

указатели массива будут указывать на память принадлежашую p - а должны копировать значения оттуда

в виндоуз символ окончания строки "\r\n"

Это сообщение отредактировал(а) mes - 28.4.2008, 20:00


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


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

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