|
Условие задачи
Составить описание класса для определения одномерных массивов целых чисел (векторов). Предусмотреть возможность обращения к отдельному элементу массива с контролем выхода за пределы массива, возможность задания произвольных границ индексов при создании объекта, и выполнения операций поэлементного сложения и вычитания массивов с одинаковыми границами индексов, умножения и деления всех элементов массива на скаляр, вывода на экран элемента массива по заданному индексу и всего массива.
Алгоритм работы
Создадим класс Massiv который имеется следующую структуру:
private:
int *a; - массив
public:
void Sozd(int k); - выделение памяти под массив.
void Vvod_Sl(int k,int k1,int k2); - создание массива
void Obrash(int k1, int k2); - обращение к элементу массива по индексу
void Slozh(Massiv b,Massiv c,int k1,int k2,int h1,int h2); - сложение двух массивов с одинаковыми граничными индексами
void Vichit(Massiv b, Massiv c,int k1, int k2, int h1, int h2); - вычитание двух массивов с одинаковыми граничными индексами
void Umnozh(int k1, int k2); - умножение элементов массива на скаляр
void Delen(int k1, int k2); - деление элементов массива на скаляр
void Print_el(int k1, int k2); - вывод на печать элемента массива по индексу
void Print(int k1, int k2); - вывод на экран всего массива
void Del(); - удаление массива
Все поля, содержащие данные, поместили в раздел private, чтобы изменение данных могло происходить только методами самого класса, а методы обработки данных поместили в раздел public, для свободного доступа к ним других классов.
Рассмотрим подробнее методы обработки.
Метод Vvod_Sl создает один экземпляр класса и заполняет его данными, случайным образом, конструктор вызывается автоматически.
Метод print выводит на экран все поля экземпляра.
Остальные методы изменяют содержание соответствующих полей класса.
Для демонстрации работы программы было разработано меню, которое работает следующим образом: при нажатии соответствующей клавиши вызывается определенный метод. Для организации такого метода используется оператор switch.
Листинг программы
#include <iostream.h> #include <stdlib.h> #include <time.h>
class Massiv{
int *a;
public:
void Sozd(int k);
void Vvod_Sl(int k,int k1,int k2);
void Obrash(int k1, int k2);
void Slozh(Massiv b,Massiv c,int k1,int k2,int h1,int h2);
void Vichit(Massiv b, Massiv c,int k1, int k2, int h1, int h2);
void Umnozh(int k1, int k2);
void Delen(int k1, int k2);
void Print_el(int k1, int k2);
void Print(int k1, int k2);
void Del();
};
void main()
{
Massiv a,b,c;
int n,m,n1,n2,m1,m2;
randomize();
int punkt;
cout<<"MENU:"<<endl;
cout<<"sozdat massiv______________________(1)"<<endl;
cout<<"Obrashenie k elementu massiva______(2)"<<endl;
cout<<"Slozhenie__________________________(3)"<<endl;
cout<<"Vichitanie_________________________(4)"<<endl;
cout<<"Umnozhenie_________________________(5)"<<endl;
cout<<"Delenie____________________________(6)"<<endl;
cout<<"Vivod elementa massiva_____________(7)"<<endl;
cout<<"Vivod massiva______________________(8)"<<endl;
cout<<"Udalenie massiva___________________(9)"<<endl;
cout<<"Otmena_____________________________(0)"<<endl;
cout<<endl;
cout<<"Viberite punkt menu ";
cin>>punkt;
cout<<endl;
while (punkt != 0)
{
switch (punkt)
{
case 1:
{
cout << "vvedite nachalnuu granizu indeksa massiva1: ";
cin >> n1;
cout << "vvedite konechnuu granizu indeksa massiva1: ";
cin >> n2;
n=n2-n1+1;
cout << "vvedite nachalnuu granizu indeksa massiva2: ";
cin >> m1;
cout << "vvedite konechnuu granizu indeksa massiva2: ";
cin >> m2;
m=m2-m1+1;
a.Vvod_Sl(n,n1,n2);
b.Vvod_Sl(m,m1,m2);
};break;
case 2:
{
cout<<"Viberite massiv (1 or 2): ";
int r;
cin>>r;
switch (r)
{
case 1:
{
a.Obrash(n1,n2);
}; break;
case 2:
{
b.Obrash(m1,m2);
}; break;
default:cout<<"Massivov s takimi nomerami net"<<endl;
}
cout<<endl;
};break;
case 3:
{
c.Vvod_Sl(n,n1,n2);
a.Slozh(b,c,n1,n2,m1,m2);
c.Del();
};break;
case 4:
{
c.Vvod_Sl(n,n1,n2);
a.Vichit(b,c,n1,n2,m1,m2);
};break;
case 5:
{
cout<<"Viberite massiv (1 or 2): ";
int r;
cin>>r;
switch (r)
{
case 1:
{
a.Umnozh(n1,n2);
}; break;
case 2:
{
b.Umnozh(m1,m2);
}; break;
default:cout<<"Massivov s takimi nomerami net"<<endl;
}
};break;
case 6:
{
cout<<"Viberite massiv (1 or 2): ";
int r;
cin>>r;
switch (r)
{
case 1:
{
a.Delen(n1,n2);
}; break;
case 2:
{
b.Delen(m1,m2);
}; break;
default:cout<<"Massivov s takimi nomerami net"<<endl;
}
//a.Delen();
};break;
case 7:
{
cout<<"Viberite massiv (1 or 2): ";
int r;
cin>>r;
switch (r)
{
case 1:
{
a.Print_el(n1,n2);
}; break;
case 2:
{
b.Print_el(m1,m2);
}; break;
default:cout<<"Massivov s takimi nomerami net"<<endl;
}
cout<<endl;
//a.Print_el();
};break;
case 8:
{
cout<<"1-ii massiv:"<<endl;
a.Print(n1,n2);
cout<<endl;
cout<<"2-oi massiv:"<<endl;
b.Print(m1,m2);
};break;
case 9:
{
a.Del();
b.Del();
};break;
case 0:
{
punkt=0;
};break;
default:cout<<"Vi nechego ne vibrali. Prilozhenie bydet zakrito"<<endl;
}
cout<<endl;
cout<<"sozdat-(1), Obr-(2), Slozh-(3), Vich-(4), Umn-(5), Delen-(6), Viv_el-(7),
Viv-(8), Ud-(9), Otm-(0)"<<endl;
cout<<endl;
cout<<"Viberite punkt menu ";
cin>>punkt;
cout<<endl;
}
}
void Massiv::Sozd(int k)
{
a=(int *) malloc (sizeof(int) * (k+3));
}
void Massiv :: Vvod_Sl(int k,int k1 ,int k2)
{
Sozd(k);
for (int i=k1; i <= k2; i++)
{ *(a+i)= random(10); }
}
void Massiv :: Obrash(int k1, int k2)
{
int in;
cout<<"Vvedite indeks vivodimogo el-ta";
cin>>in;
if ((in>=k1)&&(in<=k2))
{
cout<<"element s indeksom ";cout<<in; cout<<" : ";
cout << *(a+in) << " ";
}
else
cout<<"Vi vishli za granici indeksa"<<endl;
}
void Massiv :: Slozh(Massiv b,Massiv c,int k1, int k2, int h1, int h2)
{
if ((k1==h1)&&(k2==h2))
{
for (int i=k1; i<=k2; i++)
{
(c.a[i])=(*(a+i))+(b.a[i]);
}
cout<<"res:"<<endl;
c.Print(k1,k2);
}
else
cout<<"Indeksi massivov ne sovpadaut"<<endl;
}
void Massiv :: Vichit(Massiv b, Massiv c, int k1, int k2, int h1, int h2)
{
if ((k1==h1)&&(k2==h2))
{
for (int i=k1; i<=k2; i++)
{
(c.a[i])=(*(a+i))-(b.a[i]);
}
cout<<"res:"<<endl;
c.Print(k1,k2);
}
else
cout<<"Indeksi massivov ne sovpadaut"<<endl;
}
void Massiv :: Umnozh(int k1, int k2)
{
int k;
cout<<"Vvedite skalyar: ";
cin>>k;
for (int i=k1; i <= k2; i++)
{ *(a+i)= *(a+i)*k; }
}
void Massiv :: Delen(int k1, int k2)
{
int k;
cout<<"Vvedite skalyar: ";
cin>>k;
while (k==0)
{
cout<<"Delenie na nul nevozmozhno. Vvedite drugoe znachenie.";
cin>>k;
}
for (int i=k1; i <= k2; i++)
{ *(a+i)= *(a+i)/k; }
}
void Massiv :: Print_el(int k1, int k2)
{
int k;
cout<<"Vvedite nomer el-ta, kot-ii sled-et vivesti: ";
cin>>k;
if ((k>=k1)&&(k<=k2))
{
cout<<"element s indeksom ";
cout<<k;
cout<<" :";
cout<< *(a+k)<<endl;
}
else cout<<"Vi vishli za granici indeksa"<<endl;
}
void Massiv::Print(int k1, int k2)
{
for (int i=k1; i <= k2; i++) { cout << *(a+i) << " ";}
cout << endl;
}
void Massiv :: Del()
{ free(a); }
|
Набор тестов к программе
Задача решена:
Автор: Фёдорова Татьяна
группа: 121Ми
год: 2008
|