Страница 1 из 1
Работа с массивами
Добавлено: 25 дек 2009, 01:45
Doox911
Составить описания классов одномерных массивов строк, каждая строка задаётся длиной и уазателем на выделенную для неё память. Предусмотреть возможность обращения к отдельным строкам массива по индексам, контроль выхода за пределы индексов ,выполнения операций поэлементно сцепления двух массивов с образованием нового массива,слияние двух массивов с исключением повторяющихся элементов , печать (вывод на экран) элементов массива и всего массива
Вообще не могу справится!
Код: Выделить всё
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <iostream.h>
class D_mas {
public:
};
void main()
{
int i; //Размер матрицы
clrscr();
char **mas = new char*[4]; // n строк
for (i=0;i<10;i++)
{
mas[i] = new char[100]; // Под каждую строку выделяем массив в 100 символов
}
cout<<"Vvedi data\n";
for(i=0;i<4;i++)
cin>>mas[i];
for(i=0;i<4;i++)
cout<<mas[i]<<"\n";
getch();
for (i=0;i<4;i++)
{
delete[] mas[i];
}
delete[] mas;
}
До большего ум мой не дошел( Помогите плиз!)

Re: Работа с массивами
Добавлено: 25 дек 2009, 13:14
Albor
Doox911 писал(а):
Вообще не могу справится!
...
До большего ум мой не дошел( Помогите плиз!)
Должно быть что-то вроде этого. Дополни сам проверку индексов, ну и тем чего не хватает.
Код: Выделить всё
#include <string.h>
#include <iostream.h>
class StringArray
{
char ** m_pString; // указатель на массив строк
unsigned int m_size;// размер массива строк
void Clear() // функция очистки объекта
{
if(m_pString) // если не равен 0, значит память выделялась
{
for(unsigned int i=0;i<m_size;i++)
{
if(m_pString[i]) // нужно уничтожить строки, если они есть
{
delete [] m_pString[i];
m_pString[i]=NULL;
}
}
delete [] m_pString;// освобождаем память, занимаемую массивом указателей
m_pString=NULL;
m_size=0; // размер, после всего сделанного, естественно равен 0
}
}
public:
StringArray(): m_pString(NULL), m_size(0) { } //конструктор по умолчанию
StringArray(int sizeArray) // конструирует массив из sizeArray строк
{
m_size=sizeArray;
m_pString= new char * [m_size]; // выделяем память под массив указателей на строки
for(unsigned int i=0;i<m_size;i++)
m_pString[i]=NULL; // обнуляем указатели, так как содержимого ещё нет
}
StringArray(const StringArray & sa) // копирующий конструктор, нужен обязательно, т.к. динамически выделяется память и используются указатели
{
m_size=sa.GetSize();
m_pString= new char * [m_size];
int sizeString;
for(unsigned int i=0;i<m_size;i++)
{
sizeString=sa.GetStringLen(i);
if(sizeString>0)
{
m_pString[i]=new char[sizeString+1];
strcpy(m_pString[i],sa.GetAt(i));
}
}
}
~StringArray()// деструктор. освобождает память при уничтожении объекта
{
Clear();
}
StringArray & operator=(const StringArray & sa) // чтобы можно было написать StringArray a; StringArray b;... a=b;
{
Clear();
m_size=sa.GetSize();
m_pString= new char * [m_size];
int sizeString;
for(unsigned int i=0;i<m_size;i++)
{
sizeString=sa.GetStringLen(i);
if(sizeString>0)
{
m_pString[i]=new char[sizeString+1];
strcpy(m_pString[i],sa.GetAt(i));
}
}
}
unsigned int GetStringLen(unsigned int index) const // чтобы вычислить длину строки в соответствии с индексом, т.к. это у нас не матрица и строки могут быть разной длины
{
return strlen(m_pString[index]);
}
unsigned int GetSize() const { return m_size;} // m_size недоступна извне, а размерчик знать иногда охота, поэтому данный метод.
const char * GetAt(unsigned int index) const {return m_pString[index];}// получить строку по индексу
void SetAt(unsigned int index, const char * pch) // записать строку в массив
{
if(m_pString[index]) delete [] m_pString[index];
m_pString[index] = new char [strlen(pch) +1];
strcpy(m_pString[index],pch);
}
};
int main()
{
StringArray sa(2);
sa.SetAt(0,"Hello, ");
sa.SetAt(1,"World!");
cout<<sa.GetAt(0)<<sa.GetAt(1)<<endl;
return 0;
}
Re: Работа с массивами
Добавлено: 25 дек 2009, 20:52
Doox911
Спасибо огромное) Напиши мне свой номер телефона! Я кину мани!
Только прошу объясни что да как ок? Мне просто не всё понятно)

Re: Работа с массивами
Добавлено: 25 дек 2009, 20:55
Doox911
Если можешь то по классам ну например что делает 1 клас и до последнего класса)
Doox911@yandex.ru
Re: Работа с массивами
Добавлено: 25 дек 2009, 23:45
Albor
Мани не нужно. Добавил в код комментарии. Класс там один и реализует он массив строк. Для большей компактности не разбивал его на два файла. Но можешь добавить ещё и класс String, например, тогда можно будет добавить в StringArray полноценный operator [].
Re: Работа с массивами
Добавлено: 27 дек 2009, 00:01
Doox911
Спасибо огромное но осталось несколько неуансиков(
контроль выхода за пределы индексов - не могу сделать(
выполнения операций поэлементно сцепления двух массивов с образованием нового массива-не вижу где это делается
и последнее :
1 sa.SetAt(0,"Hello, ");
2 sa.SetAt(1,"World!");
3 cout<<sa.GetAt(0)<<sa.GetAt(1)<<endl;
в первой ты записываешь впозицию ноль слово ....
в пункте 2 аналогично так?
3 выводишь это на экран
вопрос: ты выводишь исходный массив?
если да то где новый?
+ не вижу где происходит слияние слов в одну строку
Re: Работа с массивами
Добавлено: 27 дек 2009, 09:58
Albor
Albor писал(а): Дополни сам проверку индексов, ну и тем чего не хватает.
Код: Выделить всё
int main()
{
StringArray sa(2);//создаём обект "Массив строк", который может содержать две строки
sa.SetAt(0,"Hello, ");// добавляем одну строку
sa.SetAt(1,"World!");// добавляем вторую строку
sa.SetAt(2,"Crush!"); // будет авария, т.к. нет проверки валидности индекса в методе SetAt()
cout<<sa.GetAt(0)<<sa.GetAt(1)<<endl;
return 0;
}
Проверить индексы не так уж и сложно. Можно изменить ф-цию GetAt(), например, так:
Код: Выделить всё
const char * GetAt(unsigned int index) const // получить строку по индексу
{
if(index<m_size) return m_pString[index];//если индекс в пределах от 0 до m_size-1 включительно, то всё в порядке
return "Bad Index";// иначе сработает эта строка и на выходе ф-ции появится сообщение об ошибке
}
Данный вариант не лучшее решение (лучше бросить исключение, а то вдруг в массиве строк будет храниться строка "Bad Index", разбирайся тогда - была ошибка или нет

), но для понимания вопроса пойдёт.
"Сцепку" массивов можно сделать, добавив, для начала, в класс метод с прототипом void Merge(const StringArray & sa); где и изменить размер и содержание вызывающего данный метод объекта. Потом можно добавить operator +=() и т. д. Добавляя методы мы расширяем функционал класса. Дальше шевели мозгами сам. Ты создал тему в разделе С++, а не "Решите мне задачку". Подсказку ты получил, полное решение за тобой!
Re: Работа с массивами
Добавлено: 27 дек 2009, 11:21
Doox911
Спасибо) Постораюсь)
