C语言程序设计实验报告三

C程序设计实验报告

姓   名:赖瑾  
实验地点:家                      
实验时间:2020年3月25日                 
实验项目:4.3.1 If语句的应用
     4.3.2 switch-case的应用
     4.3.3 switch-case嵌套if语句的应用
     4.3.4 switch-case结构嵌套的应用
     4.3.5 分析程序
     计算器的实现 
  
       

一、实验目的与要求

1.掌握C语言逻辑值的表示方法(0代表"假”,1代表"真")。

2.学会正确地使用关系表达式和逻辑表达式。

3.掌握各种形式的if语句语法和使用方法,if语句中if和else的匹配关系,以及if语句的嵌套。

4.熟练掌握switch语句的语法和使用方法,注意在switch语句中break语句的用法及switch语句的嵌套。

                

二、实验内容

(1)4.3.1 If语句的应用

1、问题的简单描述:读入3个表示箱子长、宽、高的整数值,判断并输出该箱子是正方形还是长方形。
     
2、实验代码:

#include<stdio.h>
int main()
{
	int l,w,h;
	printf("请输入箱子的长、宽、高,中间用空格隔开:\n");
	scanf("%d%d%d",&l,&w,&h);
	if(l==w==h)
	    printf("该箱子是正方体。\n");
	else
	    printf("该箱子是长方体。\n");
 } 

3、问题:运行时输入格式错误
      
4、分析:在编写代码时记得把输入提示写详细,避免输入错误
         

(2)4.3.2 switch-case的应用

1、问题的简单描述:编写程序实现如下功能:商店有打印纸( 18元/本)、墨盒( 132元/个)、光盘(4.5元/片)出售,商店进行优惠酬宾活动。具体规则如下:顾客购买商品的总额超过100元,优惠5%;超过200元,优惠6%;超过300元,优惠7%;超过400元,优惠8%;超过500元,优惠10%。根据不同的购买量,计算应付货款。
      
2、实验代码:

#include<stdio.h>
main()
{
    float x,y,z,s;
    printf("请按顺序输入打印纸、墨盒、光盘的数量(之间用逗号间隔):\n");
    scanf("%f,%f,%f",&x,&y,&z);
    s=x*18+y*132+z*4.5;
	if(s<=100)
	    printf("应付款数=%.2f\n",s);
	else 
	     if(s<=200) 
            printf("应付款数=%.2f\n",s*0.95);
	     else 
		     if(s<=300) 
	            printf("应付款数=%.2f\n",s*0.94);
	         else 
			     if(s<=400) 
	                printf("应付款数=%.2f\n",s*0.93);
	             else 
				     if(s<=500) 
	                    printf("应付款数=%.2f\n",s*0.92);
	                 else
	                    printf("应付款数=%.2f\n",s*0.9);
	                    
	
 } 

     
3、问题:错误输入的结果分析

     
4、分析:因为输入是输入的是中文输入法的逗号包括了一个逗号和一个空格,这两个作为数值0被读入所以得到这个结果。
        

(3)4.3.3 switch-case嵌套if语句的应用

1、问题的简单描述:输人某一年、月的数值,输出该月的天数。
      
2、实验代码:

#include<stdio.h>
main()
{
    int year,month, days;
    printf ("请输入年份和月份(中间用逗号隔开):\n ") ;
    scanf ("%d,%d",&year, &month) ;
    switch (month)
   {
   case 2 : if(year/4==0&&year/100!=0)/*判断是否是闰年*/
                days=29;
             else
                 days=28;	
    break;
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:days=31;break;
    case 4:
    case 6:
    case 9:
    case 11: days=30; break;
    }
    printf("%d年%d月有%d天",year,month,days);
 } 

       
3、问题:格式不好看
        
4、分析:Shift+Ctrl+A可以优化格式。
         

(4)4.3.4 switch-case结构嵌套的应用

1、问题的简单描述:编写一个自动售货机的程序。该程序应具有如下功能:有两级菜单,一级菜单是商品类型的选择;二级菜单是具体商品的选择(商品价格和品种可以自拟)。顾客先选择商品类型,然后选择具体商品,输入购买数量。自动售货机根据选择的商品和输入的数量,计算并显示所选商品的总金额。
       
2、实验代码:

#include<stdio.h>
main()
{
	int x,n,y;
	float sum=0.0;
	printf ("请选择:1.日用品 2.文具 3.食品\n");
	scanf ("%d",&x);
	switch(x)
	{
	     case 1:printf("请选择:1.牙刷(3.5元/支) 2.牙膏(6.2 元/支)\n");
                    printf("       3.肥皂(2元/块)  4. 毛巾(8.6元/条)\n");
                    scanf ("%d",&y);
                    printf("数量? ");
	            scanf ("%d",&n);
	     switch(y)/*匹配顾客选择的具体商品*/
            {
             case 1:sum=3.5*n;break;
             case 2:sum=6.2*n;break;
             case 3:sum=2*n;break;
	     case 4:sum=8.6*n;break;
            }
         break;
         case 2: printf("请选择: 1.笔(3元/支)     2.笔记本(1.2元/个)\n");
                 printf("       3.文件夹(12元/个) 4.文具盒(8.6 元/个)\n");
                 scanf ("%d",&y);
                 printf ("数量?");
                 scanf ("%d",&n);
         switch(y)
            {
     	     case 1: sum=3*n; break;
    	     case 2: sum=1.2*n; break;
	     case 3: sum=12*n; break;
	     case 4: sum=8.6*n; break;
	    }
         break;
         case 3: printf("请选择: 1.白糖(3.6元/包) 2. 盐(1元/包) \n");
                 printf("       3.饼(2元/个)    4.方便面(3.6 元/条) \n");
                 scanf ("%d",&y);
                 printf ("数量?");
                 scanf ("%d",&n) ;
         switch (y)
            {
             case 1: sum=3.6*n; break;
             case 2: sum=1*n; break;
             case 3: sum=2*n; break;
	     case 4: sum=3.6*n; break;
	    }
		break;
     }
printf("总计:%.2f",sum);
}

3、问题:对switch-case结构嵌套不熟
        
4、分析:多应用
        

(5)4.3.5 分析程序

1、问题的简单描述:改正错误代码
          
2、原代码

#include<stdio.h>
main()
{
	int num=20;
	if(5<num<10)
	    printf("%d in range (5,10)!\n",num);
	else
	    printf("%d out of range (5,10)!\n",num);

3、改正后代码:

#include<stdio.h>
main()
{
	int num=20;
	if(5<num&&num<10)
	    printf("%d in range (5,10)!\n",num);
	else
	    printf("%d out of range (5,10)!\n",num);
}

        
4、问题分析:问题在于这里判断条件格式错误了,5<num<10,这里5<num进行了一次判断,结果为真或者假也就是0或者1,这里0或1都会小于10所以输出的一定会是in range (5,10)!。所以需要用逻辑运算符。
                                

三、项目实训:计算器的实现

1、设计思路

①先定义一个可以实现加、减、乘、除的计算函数
②用for循环结构实现多个数的连续计算
③再通过if语句结束循环
④定义的计算函数要能进行错误判断

2、流程图

3、设计过程中遇到的问题及改进的方法

①优先级问题
通过分开输入每次计算的数字解决
Before

After

②输入提示不清晰
不能只从知道代码内容的自己出发,运行代码的时候要想到多种输入情况。

③没有错误判断
没有基本的错误判断,就算除数是零程序也会运行,所以增加了以下部分用作错误判断

④对缓冲区概念不了解
输入的回车键也会被字符输入函数读取,使用getchar()函数读取一个回车键就可以解决这个问题。

4、代码

#include<stdio.h>
main()
{
	float js(float a,char fh,float b);
	float c,d;
	char f;
	int j;
	printf("请输入第一个数\n");
	scanf("%f",&c);
	for(j=2;;j++)
	{
		getchar(); 
		printf("请输入运算符号和第%d个数\n或输入=得出计算结果\n",j);
		scanf("%c",&f);
		if(f=='=')
		break;
		scanf("%f",&d);
		c=js(c,f,d);
	}
	printf("%f",c);
	
 } 
 
 float js(float a,char fh,float b)
 {
 	float x;
 	switch(fh)
 	{
 		case'+':x=a+b;break;
 		case'-':x=a-b;break;
 		case'*':x=a*b;break;
 		case'/':
 			if(b==0)
 			{
			printf("输入错误,除数不能为零!\n");
 			x=a;
 		        }
 			else
 			x=a/b;break;
 		default:printf("输入错误!\n");
	 }
	 return(x);
 }

     

四、实验小结

  首先是这次实验经常提到的判断条件问题,连续判断要用逻辑运算符。还有对switch-case嵌套结构不熟会打错。看一个问题要先了解他的目的,再将其分解成一个个步骤来达到目的。想不通时要懂得换一个角度思考,要重视基础,多看书,像这次编写计算器代码时不知道字符输入函数会读取回车键导致结果出现了问题也发现不了,还是参考了同学得代码才解决了这个问题,又倒回去看书发现书里其实有说到这个内容。还有就是老师提到的错误判断的问题,不能单纯的从已知代码的自己出发来检查运行代码,要考虑到错误输入的情况,并且作出提示尽量避免错误输入。
 
    回到顶部

posted @ 2020-03-25 22:13  赖瑾  阅读(745)  评论(0编辑  收藏  举报