|
Условие задачи
Составить описание класса для определения одномерных массивов строк фиксированной длины. Предусмотреть возможность
- обращения к отдельным строкам массива по индексам, контроль выхода за пределы массива,
- выполнения операций поэлементного сцепления двух массивов с образованием нового массива,
- сцепление двух массивов с исключением повторяющихся элементов,
- вывод на экран элемента массива по заданному индексу и всего массива.
Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
Алгоритм работы
В программе описан класс с именем Massiv, в нем 4 параметра (n – количество строк, *a – указатель на массив строк, min – максимальное количество элементов в строках массива, *b – указатель на длину одномерных массивов) и 7 методов – функций.
class Massiv
{
int *a,*b,n,min;
public:
void Sozd();
void Vvod_Sl();
void Form(int n1, int n2);
void Form_2(int n3, int n4);
void Print();
void Print_2(int number);
void Print_3(int rec, int field);
};
В основной части программы объявлены объекты a, b типа Massiv.
При запуске программы предоставляется меню из 7 пунктов
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
Описание функций:
1. void Sozd();
void Massiv :: Sozd()
{
int m;
cout<<"kolvo strok?";cin>>n;
int min=0;
for (int i=0;i<n;i++)
{
cout<<"kolvo elementov v "<< i+1 <<" stroke?";cin>>m;
*(b+i)=m;
if (min<m) min=m;
}
a=(int*)malloc(sizeof(int)*n*min);
}
Создает массив из строк одномерных массивов фиксированной длины.
2. void Vvod_Sl();
void Massiv::Vvod_Sl()
{
Sozd();
for(int i=0;i<n;i++)
for (int j=0; j<*(b+i); j++)
{
*(a+i+j)=-20+random(41);
}
}
Формирует элементы одномерных массивов.
3. void Print();
void Massiv :: Print()
{
for(int i=0;i<n;i++)
{
for (int j=0; j<*(b+i);j++)
{
cout<<setw(6)<<*(a+i+j);
}
cout<<endl;
}
}
Выводит все строки массива на экран.
4. void Print_2(int number);
void Massiv :: Print_2(int number)
{
for(int i=0;i<n;i++)
{
for (int j=0; j<*(b+i);j++)
{
if (i==number) cout<<setw(6)<<*(a+i+j);
}
cout<<endl;
}
}
Печать конкретной строки, по заданному индексу.
5. void Print_3(int rec, int field);
void Massiv :: Print_3(int rec, int field)
{
for(int i=0;i<n;i++)
{
for (int j=0; j<*(b+i);j++)
{
if ((i==rec)&&(j==field)) cout<<"Danii element= "<<setw(6)<<*(a+i+j);
else "Massiv s takimi dannimi ne naiden!";
}
cout<<endl;
}
}
Вывод на экран конкретного элемента конкретной строки (rec – номер строки выводимого массива, field – номер элемента в строке).
6. void Form(int n1, int n2);
void Massiv :: Form(int n1,int n2)
{
int m1,m2,k,j,l,p;
int c[20];
//zapominaem kolvo elementov v strokah
m1=*(b+n1);
m2=*(b+n2);
// *(b+n1)=m1+m2;
int m3=m1+m2;
k=0;
for (l=0;l<m3;l++)
if(l<m1)
{c[l]=*(a+n1+l);
cout<<setw(6)<<c[l];
}
else if((l>=m1)&&(l<m3))
{
c[l]=*(a+n2+k);
cout<<setw(6)<<c[l];
k++;
}
}
Значениям дополнительных переменных m1 и m2 присваиваются длины строк, которые необходимо сцепить соответственно. Их сумма есть длина нового массива.
7. void Form_2(int n3, int n4);
void Massiv :: Form_2(int n3,int n4)
{
int m1,m2,k,j,l,p,l1;
int c[20],f[20];
//zapominaem kolvo elementov v strokah
m1=*(b+n3);
m2=*(b+n4);
int m3=m1+m2;
k=0;
for (l=0;l<m3;l++)
{
if(l<m1)
{c[l]=*(a+n3+l);
}
else if((l>=m1)&&(l<m3))
{
c[l]=*(a+n4+k);
k++;
}
}
l1=0;
f[l1]=c[l1];
cout<<setw(6)<<f[l1];
//sliyanie
for(p=1;p<m3;p++)
if(f[l1]!=c[p])
{ l++;
f[l1]=c[p];
cout<<setw(6)<<f[l1];
}
}
Сначала осуществляем операцию сцепления двух строк, затем вводим дополнительный массив f[20] и сравниваем поочередно элементы массива, полученного сцеплением, если элементы не равны, то заносим в новый массив f.
Листинг программы
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <stdlib.h>
class Massiv
{
int *a,*b,n,min;
public:
void Sozd();
void Vvod_Sl();
void Form(int n1, int n2);
void Form_2(int n3, int n4);
void Print();
void Print_2(int number);
void Print_3(int rec, int field);
};
void main()
{
Massiv a,b;
int number,punkt,rec,field,kol,n1,n2,n,n3,n4;
clrscr();
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt;
while (punkt!=7)
{
switch(punkt)
{
case 1: {randomize(); //sozdanie massiva
a.Vvod_Sl();
cout<<endl;
a.Print();
cout<<endl;
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt;
}
break;
case 2: {a.Print(); //pechat massiva
cout<<endl;
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt; }
break;
case 3: { //pechat stroki po indeksu
cout<<"Vvedite nomer massiva (numeracia s 0!): ";cin>>number;
cout<<endl;
a.Print_2(number);
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt;
}
break;
case 4: { //sceplenie dvuh massivov
cout<<"Vvrdite nomer 1-go massiva(numeracia s 0!): ";cin>>n1;cout<<endl;
cout<<"Vvedite nomer 2-go massiva(numeracia s 0!): ";cin>>n2;cout<<endl;
a.Form(n1,n2);
cout<<endl;
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt;}
break;
case 5: { //sliyanie dvuh massivov
cout<<"Vvrdite nomer 1-go massiva(numeracia s 0!): ";cin>>n3;cout<<endl;
cout<<"Vvedite nomer 2-go massiva(numeracia s 0!): ";cin>>n4;cout<<endl;
a.Form_2(n3,n4);
cout<<endl;
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt;}
break;
case 6: { //pechat konkretnogo elementa konkretnoi stroki
cout<<"Vvedite nomer stroki massiva(numeraciya s 0!): ";cin>>rec;
cout<<endl;
cout<<"Vvedite nomer stolbca: ";cin>>field;
cout<<endl;
a.Print_3(rec,field);
cout<<"1 - sozdanie massiva";cout<<endl;
cout<<"2 - pechat vseh strok";cout<<endl;
cout<<"3 - pechat stroki po indeksu";cout<<endl;
cout<<"4 - sceplenie dvuh massivov";cout<<endl;
cout<<"5 - sliyanie dvuh massivov";cout<<endl;
cout<<"6 - pechat konkretnogo elementa konkretnoi stroki";cout<<endl;
cout<<"7 - vihod";cout<<endl;
cout<<"Vvedite punkt menu "; cin>> punkt;}
break;
case 7:
break;
}
}
}
void Massiv :: Sozd()
{
int m;
cout<<"kolvo strok?";cin>>n;
int min=0;
for (int i=0;i<n;i++)
{
cout<<"kolvo elementov v "<< i+1 <<" stroke?";cin>>m;
*(b+i)=m;
if (min<m) min=m;
}
a=(int*)malloc(sizeof(int)*n*min);
}
void Massiv::Vvod_Sl()
{
Sozd();
for(int i=0;i<n;i++)
for (int j=0; j<*(b+i); j++)
{
*(a+i+j)=-20+random(41);
}
}
void Massiv :: Print()
{
for(int i=0;i<n;i++)
{
for (int j=0; j<*(b+i);j++)
{
cout<<setw(6)<<*(a+i+j);
}
cout<<endl;
}
}
void Massiv :: Print_2(int number)
{
for(int i=0;i<n;i++)
{
for (int j=0; j<*(b+i);j++)
{
if (i==number) cout<<setw(6)<<*(a+i+j);
}
cout<<endl;
}
}
void Massiv :: Print_3(int rec, int field)
{
for(int i=0;i<n;i++)
{
for (int j=0; j<*(b+i);j++)
{
if ((i==rec)&&(j==field)) cout<<"Danii element= "<<setw(6)<<*(a+i+j);
else "Massiv s takimi dannimi ne naiden!";
}
cout<<endl;
}
}
void Massiv :: Form(int n1,int n2)
{
int m1,m2,k,j,l,p;
int c[20];
//zapominaem kolvo elementov v strokah
m1=*(b+n1);
m2=*(b+n2);
// *(b+n1)=m1+m2;
int m3=m1+m2;
k=0;
for (l=0;l<m3;l++)
if(l<m1)
{c[l]=*(a+n1+l);
cout<<setw(6)<<c[l];
}
else if((l>=m1)&&(l<m3))
{
c[l]=*(a+n2+k);
cout<<setw(6)<<c[l];
k++;
}
}
void Massiv :: Form_2(int n3,int n4)
{
int m1,m2,k,j,l,p,l1;
int c[20],f[20];
//zapominaem kolvo elementov v strokah
m1=*(b+n3);
m2=*(b+n4);
int m3=m1+m2;
k=0;
for (l=0;l<m3;l++)
{
if(l<m1)
{c[l]=*(a+n3+l);
}
else if((l>=m1)&&(l<m3))
{
c[l]=*(a+n4+k);
k++;
}
}
l1=0;
f[l1]=c[l1];
cout<<setw(6)<<f[l1];
//sliyanie
for(p=1;p<m3;p++)
if(f[l1]!=c[p])
{ l++;
f[l1]=c[p];
cout<<setw(6)<<f[l1];
}
}
|
Набор тестов к программе
Задача решена:
Автор: Фролова Лена
группа: 121Ми
год: 2008
|