实验6-1 近似求PI (15分)--实验6-8 简单计算器 (20分)(switch-case用法)--实验6-9 统计一行文本的单词个数

实验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<stdio.h>
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<stdio.h>
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 <stdio.h>

gets()函数用于从缓冲区中读取字符串,其原型如下:
char *gets(char *string);

gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。

【返回值】若成功则返回string的指针,否则返回NULL。

注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。

【实例】请看下面一个简单的例子。

#include <stdio.h>
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<stdio.h>
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

发布了54 篇原创文章 · 获赞 0 · 访问量 1003

猜你喜欢

转载自blog.csdn.net/hellobettershero/article/details/103919058