设计菜单选择程序(1). 实习题目菜单是应用程序的界面,通过控制语句改变程序执行的顺序,设计菜单是程序设计的基础。
本设计分两步:第一步:设计一个菜单程序。
1.菜单内容:程序运行后,给出3个菜单项的内容和输入提示,如下:1)利用克莱姆法则求解线性方程组2)统计一篇英文文章的单词数3)退出程序第二步:为上述菜单项配上相应的功能。
(2). 设计思想菜单是该程序的整体框架,主要通过使用控制语句用来改变程序执行的顺序,即根据用户选择的不同功能来调用不同的实现函数。
如果输入1,进行克莱姆法则求解线性方程组。
输入2,统计一篇英文文章的单词数。
输入3,退出整个程序。
在cpp文件所在的文件夹内建立一个名为1.txt的文本文档,把要统计的单词个数的文章放入其中。
(3). 程序代码#include<iostream>#include <string>#include<cstdlib>#include<fstream>#define N 500#define ERROR cout<<"您输入的指令错误,请重新输入!"<<endl//声明全局变量#include<cstdlib>#include<stdio.h>using namespace std;void nemu(); //菜单选择函数void gramer();void show_text() ;int main(){int a,t=1;while(t){nemu();cout<<"选择1-3:";cin>>a;switch(a){case 1:cout<<"1.利用克莱姆法则求解线性方程组"<<endl;gramer ();break;case 2:cout<<"2.统计一篇英文文章的单词数"<<endl;show_text() ;break;case 3:cout<<"\t欢迎下次继续使用,再见!\n";t=0;break;}}return 0;}void nemu() //菜单选择函数{cout<<"\t\t\t***************************** \n";cout<<"\t\t\t1利用克莱姆法则求解线性方程组\n";cout<<"\t\t\t \n";cout<<"\t\t\t2 统计一篇英文文章的单词数\n";cout<<"\t\t\t \n";cout<<"\t\t\t3 结束程序运行\n";cout<<"\t\t\t \n";cout<<"\t\t\t***************************** \n"; }//利用克莱姆法则求解线性方程组double a[N][N];//声明系数矩阵double c[N][N];//声明临时系数矩阵double K[N];//声明行列式判别式分子double b[N];//声明常数列向量double x[N];//声明线性方程组的解void gramer(){int i,p,n,j,w;char ch;double D;//系数矩阵判别式//判断是否为齐次线性方程A:cout<<"该方程是否为齐次线性方程(Y/N)?";cin>>ch;if ((ch!='y')&&(ch!='Y')&&(ch!='n')&&(ch!='N')){ERROR;goto A;}//取系数矩阵并计算cout<<"注明:该线性方程组的未知数个数与方程组数相同,即系数矩阵为m*m,增广矩阵为m*n其中(n=m+1)"<<endl;cout<<"请输入系数矩阵的阶数:"<<endl;cin>>n;cout<<"请按顺序输入每一行!"<<endl;//对系数矩阵取值for (i=0;i<n;i++){cout<<"第"<<i+1<<"行"<<endl;for (j=0;j<n;j++){cout<<" 第"<<j+1<<"列";cin>>a[i][j];//按(行)顺序输入系数矩阵的元素}}//对临时系数矩阵赋值for (i=0;i<n;i++)for (j=0;j<n;j++)c[i][j]=a[i][j];//计算判别式的值for (i=1;i<n;i++){for (w=i;w<n;w++){D=c[w][i-1]/c[i-1][i-1];for (j=0;j<n;j++)c[w][j]-=D*c[i-1][j];}}D=1;for (i=0;i<n;i++)D*=c[i][i];//根据系数行列式执行if (ch=='y'||ch=='Y')//该方程组为齐次线性方程组{if (D==0)cout<<"该线性方程组有零解"<<endl;elsecout<<"该线性方程组无解或有无数组解"<<endl;}else if (ch=='n'||ch=='N')//该方程组为非齐次线性方程组{if (D==0)//判别式为0,该线性方程组无解或有无数组解cout<<"该线性方程组无解或有无数组解"<<endl; else//判别式不为零,该方程有唯一解{cout<<"该方程有唯一解!"<<endl;cout<<"请输入常数列向量:"<<endl;//输入常数列向量for (i=0;i<n;i++){cout<<"第"<<i+1<<"行";cin>>b[i];}//对Kn进行赋值for (p=0;p<n;p++){//对临时系数矩阵赋值for (i=0;i<n;i++)for (j=0;j<n;j++)c[i][j]=a[i][j];//将常数列向量代入for (i=0;i<n;i++)c[i][p]=b[i];//计算的值Knfor (i=1;i<n;i++){for (w=i;w<n;w++){K[p]=c[w][i-1]/c[i-1][i-1];for (j=0;j<n;j++)c[w][j]-=K[p]*c[i-1][j];}}K[p]=1;for (i=0;i<n;i++)K[p]*=c[i][i];}//计算线性方程组的解并输出cout<<"该线性方程组的解为:"<<endl;for (i=0;i<n;i++){x[i]=K[i]/D;cout<<"x"<<i+1<<"="<<x[i]<<endl;}}}B:cout<<"您是否要继续(Y/N)?"<<endl;cin>>ch;if (ch=='y'||ch=='Y')goto A;else if (ch=='n'||ch=='N')goto C;elsegoto B;C:system("pause");}//统计一篇英文文章的单词数void show_text(){int i=0;char szFile[2000];ifstream fin;fin.open("1.txt");if (fin.fail()){cout<<"Input file opening failed.\n";exit(1);}char next;int x=0,yy=0;fin.get(next);while (! fin.eof()){if(!(next>=65&&next<=90||next<=122&&next>=97)) yy=yy+1;else yy=0;if(yy==1)++x;szFile[i] = next;++ i;fin.get(next);}szFile[i]='\0';for( int k=0;k<i;++k)cout << szFile[k];cout <<"\n\n单词总数为:"<<x<<endl;}(4). 测试用例及测试结果(5). 程序不足及升级方向程序比较繁琐,有待简化。
如:在系数矩阵的输入时需要一个元素一个元素挨个的输入。
可以增加一别的矩阵运算功能,可以在添加查找单词和统计某一单词出现的次数功能。
(6). 参考文献[1]姚全珠.C++面向对象程序设计[M]。
北京:电子工业出版社。
2010。