实验内容:
2-28:实现一个简单的菜单程序,运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit),Selete one:”提示用户输入。A表示增加,D表示删除,
S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加、删除、排序。”,输入Q时程序结束。
(1)要求使用if...else语句进行判断,用break,continue控制程序流程。
(2)要求使用switch语句。
下面是第一小问的解答:
#include <iostream>
#include <string.h>
using namespace std;
int main ()
{
char a;
while()
{ cout<<"Menu: A(dd) D(elete) S(ort) Q(uit),Select one:";
cin>>a;
if(a=='A')
{
cout<<"data has been added"<<endl;
continue;
}
else if(a=='D')
{
cout<<"data has been deleted"<<endl;
continue;
}
else if(a=='S')
{
cout<<"data has been sorted"<<endl;
continue;
}
else if(a=='Q')
{ break;
}
else
{
cout<<"no such choice concluded"<<endl;
continue;
}
}
return ;
}
说一句题外话,原来在C语言中实现循环输入用的是while(scanf("%d",&n)!=EOF)或者scanf("%d",&n);while(n--),但是在C++里没有scanf()函数的用法,所以用while(1)来控制循环输入。
下面是第二个小问的解答:
#include <iostream>
using namespace std;
int main ()
{
char a;
while()
{
cout<<"Menu: A(dd) D(elete) S(ort) Q(uit),Select one:";
cin>>a;
switch(a)
{
case 'A':
{
cout<<"data has been added"<<endl;
continue;
}
case 'D':
{
cout<<"data has been deleted"<<endl;
continue;
}
case 'S':
{
cout<<"data has been sorted"<<endl;
continue;
}
case 'Q':
{
break;
}
default:
{
cout<<"no such choice concluded"<<endl;
continue;
}
}
if(a=='Q')break;
}
return ;
}
2-29:用穷举法找出1~100间的质数并显示出来。分别使用while,do...while,for循环语句实现。
下面是第一个小问的解答:
#include <iostream>
#include <math.h>
#include<iomanip>
using namespace std;
int main ()
{
int i=,j,n=;
while(i<=)
{
for(j=;j<=sqrt(i);j++)
{
if(i%j==)break;
}
if(j>sqrt(i)&&i>)
{
n++;
if(n%==)
cout<<setw()<<i<<endl;
else
cout<<setw()<<i;
}
i++;
}
return ; }
个人认为二三两小问于第一问的区别不大,只是把while()改成do...while()或者for()即可。
我在这里使用了math.h的头文件来使用求根sqrt()函数来提高效率,并用setw()来实现右对齐美化。
2-32:在程序中定义一个整型变量,赋以1~100的值,要求用户猜这个数,比较两个数的大小,把结果提示给用户,直到猜对为止。
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
int thenumber;
int seed;
int guess;
cout<<"please enter an unsigned number:";
cin>>seed;
srand(seed);
thenumber=rand()%+;
while()
{ cout<<"please guess the number:";
cin>>guess;
if(guess>thenumber)
{
cout<<"the answer is smaller than the number you have just given"<<endl;
continue;
}
if(guess<thenumber)
{
cout<<"the answer is bigger than the number you have just given"<<endl;
continue;
}
if(guess==thenumber)
{
cout<<"the answer is just been guessed"<<endl;
break;
}
}
return ;
}
原本我是自己设置的一个要猜的数,但是不能重复利用,所以用随机数和种子函数,先自己输入一个无符号整数作为种子,这样就能每次都生成不同的随机数。
值得注意的是系统生成的随机数是任意大小的但是题目只要求1-100的数,所以需要把它%100+1。do...while类似,把while改成do...while即可。
2-34:口袋中有红黄蓝白黑5种颜色的球若干个。没词葱口袋中取出3个颜色不同的球,问有多少种取法。
#include <iostream> using namespace std;
int main ()
{
int a=,b=,i,n,m,s;
n=a,m=b,s=b;
for(i=;i<s;i++)
{
n--;
a=a*n;
}
//cout<<a;
for(i=;i<s;i++)
{
m--;
b=b*m;
// cout<<m;
}
// cout<<b;
a=a/b;
cout<<a<<endl;
return ;
}
这个只是求出不考虑顺序的取法总数,而且没有显示是哪几种取法。所以升级求考虑顺序且能显示是哪几种顺序的程序。
#include <iostream>
#include <iomanip>
using namespace std;
void swamp(int & ,int&);
void sperm(int color[],int,int );
int sum;
int main ()
{
int i,color[],k,m;
for(i=;i<=;i++)
color[i]=i+;
k=;
m=;
sperm(color,k,m);
cout<<endl;
cout<<sum<<endl; return ;
}
void swamp(int &a,int &b)
{
int t;
t=a;
a=b;
b=t;
}
void sperm (int color[],int k,int m)
{
int i;
if(k==)
{
sum++;
for (i=;i<=;i++)
{
cout<<color[i];
}
if(sum%==)cout<<endl;
else cout<<' ';
}
else
{
for(i=k;i<m;i++)
{
swamp(color[k],color[i]);
sperm(color,k+,m);
swamp(color[k],color[i]);
}
}
}
这原本是个全排列算法,我是通过学习他人的程序得到的,但是这里不是全排列而是只要把5个中的3个进行排列,所以做了略微的调整,还有我用了数字1-5来代替颜色,进行优化可以用二维字符数组。
实验反思:
1.顺序,循环,条件语句的熟练掌握是学好编程的关键,刚开始不会可以通过模仿,之后自己总结开发出自己的程序设计。
2.swrt(),setw(),srand(),rand()等函数的掌握能让程序设计变得事半功倍,同时有美化作用。
3.对于枚举类型和字符数组的掌握还是不够,要多加练习。
我评论的博客地址:
https://www.cnblogs.com/yidaoyigexiaopenyou/
https://www.cnblogs.com/shy0825/
https://www.cnblogs.com/Kun-520