C++课程设计.docx
《C++课程设计.docx》由会员分享,可在线阅读,更多相关《C++课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
C++课程设计
《C++语言程序设计》课程设计
一、实习题目:
设计菜单选择程序
二、设计思想:
1、实现循环和功能选择:
编写一个菜单函数menu(),用whlie循环控制菜单的重复选择,用switch语句对应用户的选择,并且实现相应的功能。
2、设计各个选择的功能:
对于选择1,运用克莱姆法则求解线性方程组,用了多个循环和if判断语句,其中两个函数调用,其主要功能是求解行列式的数值;选择二,统计一篇英语文章的单词数,使用了函数getchar()和gets(str),用于输入英文文章。
三、程序代码:
#include
#include
usingnamespacestd;
#defineN10000
voidmenu();//菜单选项函数
voidequation();//求线性方程组
voidenglish();//统计英文文章的单词数
///////////////主函数的执行///////////////
intmain()
{
inta,t=1;
while(t)
{
menu();
cout<<"请选择1-3:
";
cin>>a;
cout<switch(a)
{
case1:
equation();
break;
case2:
english();
break;
case3:
t=0;
break;
}
}
}
/////////////////菜单选项函数//////////////////
voidmenu()
{
cout<<"\n\t\t\t-----------菜单选择------------"<cout<<"\t\t\t1.利用克莱姆法则求解线性方程组"<cout<<"\t\t\t2.统计一篇英文文章的单词数"<cout<<"\t\t\t3.退出程序"<cout<<"\t\t\t-------------------------------"<}
////////////利用克莱姆法则求解线性方程组/////////////
staticinta[N][N],b[N];
intdi[N],c[N];
doublex[N];
intterm(intn,intk[])
{
intp,q,t=1;
for(p=1;pfor(q=0;q
if(k[q]>k[p])
t=-t;
for(p=0;pt*=a[p][k[p]];
return(t);
}
intdet(intn)
{
intj0,j1,j2,j3,j4,j5,d=0,k[N];
for(j0=0;j0{
if(a[0][j0]==0)continue;
k[0]=j0;
for(j1=0;j1{
if(j1==j0)continue;
if(a[1][j1]==0)continue;
k[1]=j1;
if(n==2)
d+=term(n,k);
for(j2=0;j2{
if(j2==j0)continue;
if(j2==j1)continue;
if(a[2][j2]==0)continue;
k[2]=j2;
if(n==3)
d+=term(n,k);
for(j3=0;j3{
if(j3==j0)continue;
if(j3==j1)continue;
if(j3==j2)continue;
if(a[3][j3]==0)continue;
k[3]=j3;
if(n==4)
d+=term(n,k);
for(j4=0;j4{
if(j4==j0)continue;
if(j4==j1)continue;
if(j4==j2)continue;
if(j4==j3)continue;
if(a[4][j4]==0)continue;
k[4]=j4;
if(n==5)
d+=term(n,k);
for(j5=0;j5{
if(j5==j0)continue;
if(j5==j1)continue;
if(j5==j2)continue;
if(j5==j3)continue;
if(j5==j4)continue;
if(a[5][j5]==0)continue;
k[5]=j5;
}
}
}
}
}
}
return(d);
}
voidequation()
{
inti,j,n,d;
charch;
A:
cout<<"请输入线性方程组的未知数个数(n<=6)n=";
cin>>n;
cout<<"请输入线性方程组的增广矩阵(即未知数的系数与常数项组合成的矩阵,为n*(n+1)阶矩阵):
"<for(i=0;i{
for(j=0;j{
cin>>a[i][j];
}
cin>>b[i];
}
d=det(n);
for(j=0;j{
for(i=0;i{
c[i]=a[i][j];
a[i][j]=b[i];
}
di[j]=det(n);
for(i=0;ia[i][j]=c[i];
}
cout<<"最后求得线性方程组的解为:
"<for(i=0;i{
x[i]=(di[i])/d;
cout<<"x("<
}
B:
cout<<"您是否要继续(Y/N)?
"<cin>>ch;
if(ch=='y'||ch=='Y')
gotoA;
elseif(ch=='n'||ch=='N')
gotoC;
else
gotoB;
C:
system("pause");
}
/////////统计英文文章的单词数////////////////
voidenglish()
{
charstr[N],c;
inti,word=0,num=0;
cout<<"\n请输入需要统计单词数的英文文章:
"<getchar();/*输入英文文章*/
gets(str);
for(i=0;(c=str[i])!
='\0';i++)
{
if((c>0&&c<65)||(c>90&&c<97)||c>122&&c<255)word=0;/*用空格区分新单词的产生*/
else
{
if(word==0)
{
word=1;/*新单词产生*/
num++;
}
}
}
cout<<"这篇文章共有"<}
四、测试用例及测试结果
1.解线性方程组:
2.统计英文文章的单词数:
五、程序不足及升级方向
这个程序只能解未知数的个数n<=6时的恰定方程组,实用性受到限制,还需要以后再完善。
六、参考文献
[1]姚全珠.C++面向对象程序设计[M].北京:
电子工业出版社,2010.
[2]郑莉.C++语言程序设计[M].北京:
清华大学出版社,2007.
一、实习题目:
职工信息表设计
二、设计思想:
1、类的结构:
这里把worker作为基类,由它派生类list和simplelist。
2、多态性:
将worker的display()成员函数设计为虚函数,printer()函数使用基类worker对象的引用作为参数,即可实现多态性。
3、设计主函数:
要求编写最多输入10000个职工的信息表,并且可以随时停止。
运用循环,增强程序的灵活性。
三、程序代码:
#include
#include
#defineMAX10000
usingnamespacestd;
classworker//信息表基类
{
public:
stringnum;
stringname;
charsex;//性别用F(女)和M(男)表示。
intage;
virtualvoiddisplay(){}
};
classlist:
publicworker//完整信息表类
{
public:
virtualvoiddisplay();
};
classsimplelist:
publicworker//信息简表类
{
public:
virtualvoiddisplay();
};
intnemu();//菜单选择函数
voidadd(lista[],int&n);//增加职工记录
floatcreat(listy[],simplelistx[],int&n);//生成信息简表
floatprinter(worker*p,int&n);//显示完整信息简表
/////////////////主函数的执行//////////////////
intmain()
{
simplelistc[MAX];//定义简表数组
listd[MAX];//定义信息表数组
intlastnum=0,t=1;
boolexit=false;
do
{
switch(nemu())
{
case1:
//1.增加职工记录
add(d,lastnum);
break;
case2:
//2.显示原始记录
printer(d,lastnum);
cout<"<break;
case3:
//3.显示简表记录
creat(d,c,lastnum);
printer(c,lastnum);
cout<"<break;
case4:
//4.结束程序运行
exit=true;
break;
}
}
while(exit==false);
cout<<"\n程序结束!
\n"<return0;
}
/////////////菜单选择函数/////////////
intnemu()
{
intcn=5;
do
{
cout<<"\t\t\t-----------------------------"<cout<<"\t\t\t-----------------------------"<cout<<"\t\t\t1.增加职工信息\n";
cout<<"\t\t\t2.显示完整信息\n";
cout<<"\t\t\t3.显示信息简表\n";
cout<<"\t\t\t4.结束程序运行\n";
cout<<"\t\t\t-----------------------------"<cout<<"\t\t\t-----------------------------"<cout<<"\n选择1-4:
";
cin>>cn;
}
while(cn<1||cn>4);
returncn;
}
//////////////显示职工信息的完整记录///////////////
voidlist:
:
display()
{
cout<<"编号:
"<cout<<"姓名:
"<cout<<"性别:
"<cout<<"年龄:
"<}
//////////////显示信息简表////////////////
voidsimplelist:
:
display()
{
cout<<"姓名:
"<cout<<"年龄:
"<}
///////////////1.增加职工信息//////////////
voidadd(lista[],int&n)
{
cout<<"您选择的是:
1.增加职工记录\n"<cout<<"注意:
当编号为0时,返回主菜单:
\n"<for(n=0;n{
cout<<"输入编号:
";
cin>>a[n].num;
if(a[n].num=="0")
break;//结束输入
for(intk=0;k{
if(a[n].num==a[k].num)
cout<<"输入编号重复!
"<}
cout<<"输入姓名:
";
cin>>a[n].name;
for(k=0;k{
if(a[n].name==a[k].name)
cout<<"输入姓名重复!
"<}
cout<<"请输入性别(f为女,m为男):
";
cin>>a[n].sex;
if(a[n].sex!
='f'&&a[n].sex!
='m')
{
cout<<"性别输入错误";
cout<<"请输入性别(f为女,m为男):
";
cin>>a[n].sex;
}
cout<<"请输入年龄:
";
cin>>a[n].age;
}
}
/////////////////2.生成信息简表//////////////////
floatcreat(listy[],simplelistx[],int&n)
{
if(n{
for(inti=0;i<=n;i++)
{
x[i].name=y[i].name;
x[i].age=y[i].age;
}
return1;
}
else
return0;
}
////////////////3.信息输出函数//////////////////
floatprinter(worker*p,int&n)
{
for(inti=0;i{
cout<<"********************"<(p+i)->display();
}
cout<<"********************"<return0;
}
四、测试用例及测试结果
1.增加职工信息
2.显示完整信息:
3.显示信息简表:
4.结束程序运行:
五、程序不足及升级方向
虽然这个程序的运行结果比较理想,但不是很美观,故有待完善。
六、参考文献
[1]姚全珠.C++面向对象程序设计[M].北京:
电子工业出版社,2010.
[2]郑莉.C++语言程序设计[M].北京:
清华大学出版社,2007.
一、实习题目:
有理数的四则运算
二、设计思想:
本程序中主要用到了一下这几个函数:
1、构造函数:
Rational(intx1=0,inty1=1){x=x1;y=y1;}
2、重载”+”、”-”、”*”、”/”四个运算符:
Rationaloperator+(Rationalr);//重载加法运算符
Rationaloperator-(Rationalr);//重载减法运算符
Rationaloperator*(Rationalr);//重载乘法运算符
Rationaloperator/(Rationalr);//重载除法运算符
3、重载流运算符:
friendistream&operator>>(istream&in,Rational&r);
friendostream&operator<<(ostream&out,Rational&r);
输入输出就是按格式构造输出,输入流需要保证正确的格式,要保证分母不等于零。
三、程序代码:
#include
usingnamespacestd;
classRational//有理数类
{
public:
intx;
inty;
Rational(intx1=0,inty1=1){x=x1;y=y1;}
Rationaloperator+(Rationalr);//重载加法运算符
Rationaloperator-(Rationalr);//重载减法运算符
Rationaloperator*(Rationalr);//重载乘法运算符
Rationaloperator/(Rationalr);//重载除法运算符
friendistream&operator>>(istream&in,Rational&r);//重载输入运算符
friendostream&operator<<(ostream&out,Rational&r);//重载输出运算符
};
///////////主函数的执行/////////////
intmain()
{
charch;
RationalA,B,C;
A:
cout<<"请输入A的值"<cin>>A;
cout<<"请输入B的值"<cin>>B;
cout<cout<<"--------------------\n"<C=A+B;
cout<<"两数之和为A+B="<C=A-B;
cout<<"两数之差为A-B="<C=A*B;
cout<<"两数之积为A*B="<C=A/B;
cout<<"两数之商为A/B="<cout<<"--------------------"<B:
cout<<"您是否要继续(Y/N)?
"<cin>>ch;
cout<if(ch=='y'||ch=='Y')
gotoA;
elseif(ch=='n'||ch=='N')
gotoC;
else
gotoB;
C:
system("pause");
return0;
}
//////////////////////////////////////////////
istream&operator>>(istream&in,Rational&r)
{
in>>r.x>>r.y;
if(r.y==0)
{
cout<<"分母不能为0\n";
}
returnin;
}
ostream&operator<<(ostream&out,Rational&r)
{
inti;
floatm,n;
if(r.x{
for(i=r.x;i>1;i--)
{
if(r.x%i==0&&r.y%i==0)
{
m=r.x/i;
n=r.y/i;
r.x=m;
r.y=n;
}
}
}
else//当x>=y,且x,y有公约数时,进行约分
{
for(i=r.y;i>1;i--)
{
if(r.x%i==0&&r.y%i==0)
{
m=r.x/i;
n=r.y/i;
r.x=m;
r.y=n;
}
}
}
out<returnout;
}
RationalRational:
:
operator+(Rationalr)
{
returnRational(x*r.y+y*r.x,y*r.y);
}
RationalRational:
:
operator-(Rationalr)
{
returnRational(x*r.y-y*r.x,y*r.y);
}
RationalRational:
:
operator*(Rationalr)
{
returnRational(x*r.x,y*r.y);
}
RationalRational:
:
operator/(Rationalr)
{
returnRational(x*r.y,y*r.x);
}
四、测试用例及测试结果
五、程序不足及升级方向
本程序中还有一些不足的地方,比如,在分式与小数的转换方面,暂时还不能实现,所以,还需以后再加考虑,完善。
六、参考文献
[1]姚全珠.C++面向对象程序设计[M].北京:
电子工业出版社,2010.
[2]郑莉.C++语言程序设计[M].北京:
清华大学出版社,2007.