Консультация № 187041
24.12.2012, 13:45
100.51 руб.
0 1 1
Здравствуйте! Прошу помощи в следующем вопросе:
во вложении задание. Сделал все, кроме 3 пункта. Осталось задать память динамически, создать копирующий конструктор и переопределить экземпляр класса.


Приложение:
Код:
#include<conio.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iomanip.h>


class alphabet {private: int n;char c[100];
public:alphabet();
alphabet(int,int);
alphabet(char*);
friend istream& operator>>(istream& in,alphabet& p);
friend ostream& operator<<(ostream& on,alphabet& p);
alphabet& operator+(alphabet&);
alphabet& operator+=(char);
char* cipher(char*,int);
char* decipher(char*,int);
int check (char);
int checkall(char*);
int over();
};

alphabet::alphabet(){n=0;c[0]=NULL;}

alphabet::alphabet(int c0,int k){int i;
n=k;
for(i=0;i<n;i++)c[i]=c0+i;c[n]=0;}

alphabet::alphabet(char* s){int i;n=strlen(s);
strcpy(c,s);}

int alphabet::over(){int i,j;for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(c[i]==c[j])
return 0;
return 1;}

istream& operator>>(istream& in,alphabet& s){int i;
cout<<"Enter String=";in.getline(s.c,80);
s.n=strlen(s.c);
return in;}

ostream& operator<<(ostream& on,alphabet& s){int i;
on<<"You See Current Alphabet of "<<s.n<<" characters : "<<endl;
on<<s.c;return on;}

alphabet& alphabet:: operator+(alphabet& b){
strcat(c,b.c);n=n+b.n;
return *this;}

alphabet& alphabet::operator+=(char s){
if(check(s)){cout<<"Symbol Alredy Exists,";return *this;}
c[n]=s;c[n+1]=0;n++;
return *this;}


int alphabet::check(char t){int i; for(i=0;i<n;i++)
if(t==c[i])return 1;return 0;}

int alphabet::checkall(char*t){int i,j;
for(j=0;j<strlen(t);j++){
for(i=0;i<n;i++)
if(!check(t[j]))return 0;}
return 1;}

char* alphabet::cipher(char*s,int t){int i;
for(i=0;i<strlen(s);i++)
s[i]=s[i]+t;
return s;};

char* alphabet::decipher(char*s,int t){
int i;for(i=0;i<strlen(s);i++)
s[i]=s[i]-t;return s;};

void main(){alphabet my;int key,c0,k;char tst[100];char t;
textmode(C80);
do{ textattr(0x1F);
clrscr();
cprintf("1-Make1,2-Make2,3-Make3,4-Enter,5-Show,6-Sum,Esc-Quit\n\r");
cprintf("7-Add,8-Cipher,9-Decipher\n\r");
switch(getch()){
case'1':cout<<my;break;
case'2':cout<<"C0=";cin>>c0;cout<<"K=";cin>>k;
alphabet my(c0,k);cout<<my;break;
case'3':cout<<"Enter String=";cin>>tst;cin.ignore();
alphabet b(tst);cout<<b;
if(!(b.over()))
cout<<"\nAlphabet Not Correct!";break;
case'4':cin>>my;
cout<<my;
if(!(my.over()))
cout<<"\nAlphabet Not Correct!";break;
case'5':cout<<my;break;
case'6':cout<<"Enter Alphabet N2,";cin>>b;cout<<(my=my+b);
if(!(my.over()))
cout<<"\nAlphabet Not Correct!";break;
case'7':cout<<"Enter Character=";cin>>t;cout<<(my+=t);
break;
case'8':cout<<"Enter String=";cin>>tst;cout<<"Enter Key=";cin>>key;
if (my.checkall(tst))cout<<my.cipher(tst,key);
else {cout<<"String Incorrect!";break;}
if (!(my.checkall(tst)) )
cout<<"\nString Is Not In Alphabet";
break;
case'9':cout<<"Enter Key=";cin>>key;cout<<my.decipher(tst,key);break;
case 27:exit(0);
}
getch();}
while(1);
}

Обсуждение

Неизвестный
26.12.2012, 19:33
общий
это ответ
Здравствуйте, Соловьев!
Изменений немного. В самом описании класса:
Код:
class alphabet {
private:
int n;
char *c;
void IncSize (int size); //увеличивает размер массива на заданное значение
public:
alphabet();
alphabet(const alphabet&); //конструктор копирования
alphabet(int,int);
alphabet(char*);
friend istream& operator>>(istream& in,alphabet& p);
friend ostream& operator<<(ostream& on,alphabet& p);
alphabet& operator+(alphabet&);
alphabet& operator+=(char);
alphabet operator= (const alphabet& a); //оператор присваивания
char* cipher(char*,int);
char* decipher(char*,int);
int check (char);
int checkall(char*);
int over();
};

И вот в этих функциях:
Код:
alphabet::alphabet(){n=0;c=NULL;}

alphabet::alphabet(int c0,int k){int i;
n=k;
c = new char [n+1]; //выделяем память
for(i=0;i<n;i++)c[i]=c0+i;c[n]=0;}

alphabet::alphabet(char* s){int i;n=strlen(s);
c = new char [n+1];//выделяем память

strcpy(c,s);}
alphabet& alphabet:: operator+(alphabet& b){
IncSize (b.n);
strcat(c,b.c);
return *this;}

alphabet& alphabet::operator+=(char s){
if(check(s)){cout<<"Symbol Alredy Exists,";return *this;}
IncSize (1);
c[n]=s;c[n+1]=0;
return *this;}

И новые функции:
Код:
alphabet::alphabet(const alphabet& a)
{
n = a.n;
if (n>0) {
c = new char [n+1];
strcpy (c, a.c);
}
else c = NULL;

}

alphabet alphabet::operator= (const alphabet& a)
{
if (n>0) delete [] c;
n = a.n;
if (n>0) {
c = new char [n+1];
strcpy (c, a.c);
}
else c = NULL;
return *this;
}

void alphabet::IncSize (int size)
{
n+=size;
char *tmp = new char [n+1];
strcpy (tmp, c);
delete [] c;
c = new char [n+1];
strcpy (c, tmp);
delete [] tmp;
c[n] = 0;
}

Кроме того, не помещает описать деструктор:
Код:
 alphabet::~alphabet ()
{
if (n>0) delete [] c;
}


Удачи!
5
Форма ответа