包含函数模块化求素数,代码使用率更高
使用do…while做人机交互遇到的麻烦
新手日记1:使用do…while循环制作人机交互(输入y再次执行程序,输入n结束并退出)
遇到的麻烦:在输入y字符后,do…while循环不进行循环,直接退出
/*
2019年11月30日23:02:35
使用函数模块化将判断素数的指令分开进行自定义函数
使函数更加高效使用;
Mading in JiuFen;
*/
#include<stdio.h>
#include<stdbool.h>
bool Isprime(int val); //求该数字是不是一个素数
int Traverseval(int val1); //求2到该区间有多少个素数,并且统计个数并且输出全部素数
int main()
{
int ival;
int rc;
char pd;
do
{
printf("进入程序,该程序有两个功能\n");
printf("输入1选择功能一:输入一个数字,系统对其进行素数判定\n");
printf("输入1选择功能一:输入一个数字,系统对扫描从2到该数字内有多少个素数,并对其统计个数输出\n");
scanf("%d",&rc);
switch(rc)
{
case 1:
printf("请输入一个数字:系统对其进行素数判定\n");
scanf("%d",&ival);
if(Isprime(ival))
printf("Yes!\n");
else
printf("NO!\n");
break;
case 2:
printf("请输入一个数字:系统对扫描从2到该数字内有多少个素数,并对其统计个数输出\n");
scanf("%d",&ival);
Traverseval(ival);
break;
default:
printf("WARNING : 你输入错误,系统停止,请按照说明从新输出!!!!\n");
}
printf("使用继续使用,如果使用,输入Y/y,退出N\n");
//或使用scanf("%c",&pd);
pd = getchar();
}while(pd == 'Y' || pd == 'y');
return 0;
}
bool Isprime(int val)
{
int i;
for(i = 2;i<val;i++)
{
if(val % i == 0)
break;
}
if(val == i)
return true;
else
return false;
}
int Traverseval(int n)
{
int i;
int count = 0;
for(i = 2;i<= n;i++)
{
if(Isprime(i))
{
printf("%d\n",i);
count++;
}
}
printf("该区间内总计素数个数为%d\n",count);
}
使用上述代码do…while 都无法进行正常循环
发现,输入的scanf在接收键盘时,需要在scanf(" %c",&pd)中的%c前边加上一个空格,此时代码即可正常运行,do…while生效
或者采用
getchar();
pd = getchar();
此时代码即也可正常运行,do…while生效
对其猜测,可能在输入前需要接受一个回车,才可以正常输入y或者n,否则,scanf会接收一个回车输入,导致程序判定失败,无法正常循环。
下列附上正确代码
/*
2019年11月30日23:02:35
使用函数模块化将判断素数的指令分开进行自定义函数
使函数更加高效使用;
Mading in Mr.JiuFen;
*/
#include<stdio.h>
#include<stdbool.h>
bool Isprime(int val); //求该数字是不是一个素数
int Traverseval(int val1); //求2到该区间有多少个素数,并且统计个数并且输出全部素数
int main()
{
int ival;
int rc;
char pd;
do
{
printf("进入程序,该程序有两个功能\n");
printf("输入1选择功能一:输入一个数字,系统对其进行素数判定\n");
printf("输入1选择功能一:输入一个数字,系统对扫描从2到该数字内有多少个素数,并对其统计个数输出\n");
scanf("%d",&rc);
switch(rc)
{
case 1:
printf("请输入一个数字:系统对其进行素数判定\n");
scanf("%d",&ival);
if(Isprime(ival))
printf("Yes!\n");
else
printf("NO!\n");
break;
case 2:
printf("请输入一个数字:系统对扫描从2到该数字内有多少个素数,并对其统计个数输出\n");
scanf("%d",&ival);
Traverseval(ival);
break;
default:
printf("WARNING : 你输入错误,系统停止,请按照说明从新输出!!!!\n");
}
printf("使用继续使用,如果使用,输入Y/y,退出N\n");
scanf(" %c",&pd); //注意%c前有一个空格
//getchar();
//pd = getchar();
}while(pd == 'Y' || pd == 'y');
return 0;
}
bool Isprime(int val)
{
int i;
for(i = 2;i<val;i++)
{
if(val % i == 0)
break;
}
if(val == i)
return true;
else
return false;
}
int Traverseval(int n)
{
int i;
int count = 0;
for(i = 2;i<= n;i++)
{
if(Isprime(i))
{
printf("%d\n",i);
count++;
}
}
printf("该区间内总计素数个数为%d\n",count);
}
谢谢大家!!!