实验6-1 近似求PI (15分)
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
2
π
=1+
3
1!
+
3×5
2!
+
3×5×7
3!
+⋯+
3×5×⋯×(2×i+1)
i!
+⋯
输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
输入样例:
1E-5
输出样例:
PI = 3.14158
#include
int fac(int n){
int temp=1;
for(int i=1;i<=n;i++){
temp=temp*i;
}
return temp;
}
int pl(int n){
int temp=1;
for(int i=1;i<=n;i++){
temp=temp*(2*i+1);
}
return temp;
}
int main(){
double t,eps;
double sum=1.0;
int i=1;
scanf("%lf",&eps);
t=1.0*fac(i)/pl(i);
while(t>eps){
i++;
t=1.0*fac(i)/pl(i);
sum=sum+t;
}
double x=sum*2;
printf("pi=%.6lf\n",x);
return 0;
}
实验6-8 简单计算器 (20分)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
#include
int main(){
int a,b;
char c;
scanf("%d",&a);
while(scanf("%c",&c)){
switch(c){
case'+':{scanf("%d",&b);a+=b;break;}
case'-':{scanf("%d",&b);a-=b;break;}
case'*':{scanf("%d",&b);a*=b;break;}
case'/':{
scanf("%d",&b);
if(b==0){
printf("error");
}else
a/=b;
break;
}case'=':{printf("%d",a);return 0;};
default:{printf("error");return 0;};
}
}
return 0;
}
实验6-9 统计一行文本的单词个数 (15分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let’s go to room 209.
输出样例:
5
gets()函数的用法
头文件:#include
gets()函数用于从缓冲区中读取字符串,其原型如下:
char *gets(char *string);
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
【返回值】若成功则返回string的指针,否则返回NULL。
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。
【实例】请看下面一个简单的例子。
#include
int main(void)
{
char str[10];
printf("Input a string.\n");
gets(str);
printf("The string you input is: %s",str); //输出所有的值,注意a
}
如果输入123456(长度小于10),则输出结果为:
Input a string.
123456↙
The string you input is:123456
如果输入12345678901234567890(长度大于10),则输出结果为:
Input a string.
12345678901234567890↙
The string you input is:12345678901234567890
同时看到系统提示程序已经崩溃。
如果不能正确使用gets()函数,带来的危害是很大的,就如上面我们看到的,输入字符串的长度大于缓冲区长度时,并没有截断,原样输出了读入的字符串,造成程序崩溃。
考虑到程序安全性和健壮性,建议用fgets()来代替gets()。
#include
int main(){
char a;
int cnt=0;
int cntword=0;
while(1){
scanf("%c",&a); //判断每个读入进来的char
if(a=='\n') { //如果是换行符的话,要跳出循环;
break;
}else if(a!=' '){ //如果不是空格,那如果是字母或者数字的话,统计数要分别上加;
if((a>='a'&&a<='z')||(a>='A'&&a<='Z')||(a>='0'&&a<='9')){
cntword++; //统计开头是字母或者数字的个数。
cnt++; //统计一个单词字母的个数;
printf("1)cnt=%d,cntword=%d,a=%c\n",cnt,cntword,a);
}
while(1){
scanf("%c",&a);
if(a==' '||a=='\n'){
break;
}
//因为跳出循环是在cnt之前,所以不是空格或者换行符的时候,这个才会被统计cnt的数量;
cnt++;
printf("2)cnt=%d,a=%c\n",cnt,a);
}
printf("3)%c",a); //读入以后就能跳出了,这里下一个读入的a是空格;
//if(cnt>1){ //循环结束以后,如果cnt数量大于1,
//if(a>='a'&&a<='z'||a>='A'&&a<='Z'||a>='0'&&a<='9'){
// cntword++;
// printf("4)cntword=%d",cntword);
// }
// }
if(a=='\n'){ //这行必须写,应该到最后读入了一个换位行,说明应该跳出程序;没有写的话,程序将进入无停止。
break;
}
}
}
printf("%d",cntword);
return 0;
}
程序分析的过程:
the summer holiday
1)cnt=1,cntword=1,a=t
2)cnt=2,a=h
2)cnt=3,a=e
3) 1)cnt=4,cntword=2,a=s
2)cnt=5,a=u
2)cnt=6,a=m
2)cnt=7,a=m
2)cnt=8,a=e
2)cnt=9,a=r
3) 1)cnt=10,cntword=3,a=h
2)cnt=11,a=o
2)cnt=12,a=l
2)cnt=13,a=i
2)cnt=14,a=d
2)cnt=15,a=a
2)cnt=16,a=y
3)
3Program ended with exit code: 0