实验二作业

Part 2:

一、函数重载编译练习

实现对int型,double型,Complex型数据的加法,代码如下:

(只形式上测试,比较简陋并不智能)

#include<iostream> 
using namespace std; 
struct Complex 
{    
    double real;    
    double imaginary; 
};
int add(int, int); 
double add(double,double); 
Complex add(Complex, Complex); 
int main()
{
    int m,n;
    cout<<"Enter two integer: ";
    cin>>m>>n;
    cout<<"Their sum of square:"<<add(m,n)<<endl;
    
    double x,y;
    cout<<"Enter two integer:";
    cin>>x>>y;
    cout<<"Their sum of square:"<<add(x,y)<<endl;
    
    Complex p,q;
    cout<<"Enter two integer:";
    cin>>p.real>>p.imaginary;
    cin>>q.real>>q.imaginary;
    cout<<"Their sum of square:"<<(add(p,q)).real<<'+'<<(add(p,q)).imaginary<<'i'<<endl;
    return 0;
 } 
 int add(int a,int b)
 {
     return a+b;
 }
 double add(double a,double b)
 {
     return a+b;
 }
 Complex add(Complex a,Complex b)
 {
     Complex r;
    r.real=a.real+b.real;
    r.imaginary=a.imaginary+b.imaginary;
    return r;     
}
 

程序结果如下:

此次进行的复数加减是根据老师提供的结构体实现的。对于复数的加减也有专门的类来实现。更多了解参考博客https://blog.csdn.net/qq_40955914/article/details/80836119

二、快速排序

简述快速排序法:快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:

      1、从数列中取出一个数作为基准数(枢轴,pivot)。 

      2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。

     3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素

      (参考博客https://www.cnblogs.com/miracleswgm/p/9199124.html)

(一)我的第一次试验代码在算法上走偏,(随机选取一个数a,从又开始遇到比a大的进行一次交换,进行过一次交换后就从另一侧开始比较,左边遇到比a小的交换,直到左右前进相遇)且自己个儿能力实现不了,此处便不贴了。只贴其中一点心得:交换数组元素位置名来交换元素,如果交换次数多理不清楚此法便着实险恶。

#include<iostream>
using namespace std;
void exchange(int &,int &);
int main()
{
    int a[2]={1,2};
    int b=0,i=1;
    exchange(b,i);
    cout<<a[b]<<a[i];
    return 0;
}
void exchange(int &x,int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

(二)第二次试验,意识到自己算法错误后的重新编写(选择基准数,进行基准数左右两边的交换)。身心俱疲,只完成一次快速排序,之后以冒泡收尾。未完待续······

#include<iostream>
using namespace std;
void exchange(int &,int &);
void quicksort(int ,int ,int a[]);
void sort(int ,int ,int b[]);
int main()
{
    int a[10]={52,45,80,36,14,75,58,96,23,61},i;
    quicksort(0,9,a);
        sort(0,4,a);
    sort(5,9,a);
    for(i=0;i<10;i++)
    cout<<a[i]<<endl;
    return 0;
}
void exchange(int &x,int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}    
void quicksort(int r,int l,int a[])
{
    int m,n,p,i=0;
    for(m=r+1;l>m;l--)
    {
        if(a[l]>a[r])
            continue;
        else if(a[l]<a[r])
        {
            while(m<l)
            {
                if(a[m]<a[r])
                    m++;
                else if(a[m]>a[r])
                {
                    exchange(a[m],a[l]);
                    m++;
                    break;
                }
            }
        }
    }
    exchange(a[r],a[m]);
}
void sort(int x,int y,int b[])
{
    int i,j,k;
    k=y-x+1;
    for(j=0;j<k-1;j++)
    {
        for(i=x;i<k-j-1+x;i++)
        {
            if(b[i]>b[i+1])
            exchange(b[i],b[i+1]);
        }
    } 
}

程序结果如下:

 

(三)我的第三次试验,检验出来并纠正了第二次实验中存在的错误。仍存有难解之处——在我这种算法中函数的递归存在问题,所以此处进行了强制固定分区。以下就是这个比较牵强的代码,测试成功但仍希望给予帮助。结果如第二次实验结果。

#include<iostream>
using namespace std;
void exchange(int &,int &);
void quicksort(int ,int );
int a[10]={52,45,80,36,14,75,58,96,23,61};
int main()
{
    int i,n=0,p=9,q;
    quicksort(0,9);
    q=(p-n)/2;p=n+q;
    while((p-n)>=1)
    {
        quicksort(n,p);
        n=p;
        if(((9-p-q)==1)||((9-p-q)==0))
            p=9;
        else
            p=n+q;
        if(p>9)
        {
            q=(p-n)/2;
            n=0;
            p=n+q;
        }
    }
    for(i=0;i<10;i++)
    cout<<a[i]<<endl;
    return 0;
}
void exchange(int &x,int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}    
void quicksort(int r,int l)
{
    int m,i=0;
    for(m=r+1;l>m;l--)
    {
        if(a[l]>a[r])
            continue;
        else
        {
            while(m<l)
            {
                if(a[m]<a[r])
                    m++;
                else
                {
                    exchange(a[m],a[l]);
                    m++;
                    break;
                }
            }
        }
    }
    if(a[r]<a[m])
    exchange(a[r],a[m-1]);    
    else
    exchange(a[r],a[m]);
}

 

三、用户类

实验要求:

1、每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。

2、支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。

3、支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。

4、支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。 如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。

5、在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信息)

我的代码如下:

#include<iostream>
#include<string>
#include<windows.h>
using namespace std;
class User
{
    public:
        void setlnfo(string n,string p="111111",string e=""); //设置用户信息
        string getn();//获取用户名字 
        string getp();//获取用户密码 
        string gete();//获取用户邮箱 
        void printlnfo();//修改密码 
        void changepasswd();//打印用户信息
    private:
        string name;//用户名字 
        string passwd;
        string email;//用户密码及邮箱 
};
void User::setlnfo(string n,string p,string e)
{
    name=n;
    passwd=p;
    email=e;
}//成员函数setlnfo的实现
string User::getn(){
    return name;
}//成员函数getn的实现
string User::getp(){
    return passwd;
}//成员函数getp的实现
string User::gete(){
    return email;
}//成员函数gete的实现
void User::printlnfo(){
    cout<<"name:"<<name<<endl;
    cout<<"passwd:"<<"******"<<endl;
    cout<<"email:"<<email<<endl;
}
void User::changepasswd(){
    string p1,p2,p3;//定义p1为输入的原密码,p2为输入的新密码,p3为再次输入的新密码
    while(true)
    {
        int i=1;
        cout<<"Enter the original passwd:";
        cin>>p1;
        while(p1!=passwd)
        {
            cout<<"Passwd input error, please re-enter again:";
            cin>>p1;
            i++;
            if(i==3)
            {
                cout<<"Please try after 3 seconds."<<endl;
                break;
            }
        }
        if(i==3)
        {
            Sleep(3000);
            continue;
        }
        if(p1==passwd)
        {
            cout<<"Please input your new passwd:";
            cin>>p2;
            cout<<"Please comfirm your passwd:";
            cin>>p3;
            while(p3!=p2)
            {
                cout<<"Input error,please input again:";
                cin>>p3;
            }
            if(p3==p2){
                cout<<"Passwd changed successfully!"<<endl;
                passwd==p3;
            }
            break;
        }
    }  
}
int main()
{
    cout<<"Test 1"<<endl;//测试一 
    User A;
    A.setlnfo("Leonard");
    A.printlnfo();
    A.changepasswd();
    A.printlnfo();
cout << endl << "Testing 2" << endl << endl;    // 测试2    
User B;   
B.setInfo("Jonny","92197","xyz@hotmail.com");   
B.printInfo();
return 0; }

程序结果如下:

 

此题中出现的问题以及一些新的东西:

    1、字符数组赋值'1','\0',空字符串的初始化:string e="",初始化形式错误会出现以下提示:Terminate called after throwing an instance of ‘std::logic_error’

    2、时间间隔函数(“睡眠”?)头函数为#include<windows.h>函数实现Sleep(3000);

总结:

1、对于程序主架自己的算法一定要写好经得起推敲才敢下手敲代码。

2、认真浏览题目,过两天也要看题目,符合要求。

3、要有平和的心态。

 

针对实验一的评价网址:

https://www.cnblogs.com/csl-40/p/10541550.html

https://www.cnblogs.com/knight04/p/10541527.html

https://www.cnblogs.com/sq102217/p/10527710.html

 

 

       

posted @ 2019-03-24 10:48  红杏小姐  阅读(312)  评论(3编辑  收藏  举报