Страница 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;
      }
До большего ум мой не дошел( Помогите плиз!) :confused:

Re: Работа с массивами

Добавлено: 25 дек 2009, 13:14
Albor
Doox911 писал(а): Вообще не могу справится!
...
До большего ум мой не дошел( Помогите плиз!) :confused:
Должно быть что-то вроде этого. Дополни сам проверку индексов, ну и тем чего не хватает.

Код: Выделить всё

#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
Спасибо огромное) Напиши мне свой номер телефона! Я кину мани!
Только прошу объясни что да как ок? Мне просто не всё понятно) :cool:

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
Спасибо) Постораюсь) :cool: