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

C程序设计实验报告

姓名:黄静微  实验地点:家  实验时间:2020.03.25

实验项目

if语句的应用
switch···case语句的应用
switch···case语句嵌套if语句的应用
switch···case结构嵌套的应用
分析程序
简易计算器

一、实验目的与要求

if语句的应用

  • 正确使用C语言逻辑运算和关系运算
  • if···else语句的使用方法

switch···case语句的应用

  • 正确使用算术运算符和运算规则
  • switch···case语句的使用方法

switch···case语句嵌套if语句的应用

  • switch语句中break语句的用法
  • 正确使用switch中的表达式

switch···case结构嵌套的应用

  • 巩固对switch分支编程概念的理解
  • 熟悉switch语句中break语句的用法

分析程序

  • 分析输出结果
  • 逻辑运算符的运用

二、实验内容

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

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

问题分析: 这个实验中没出现什么问题,但是要注意的就是优先级,“等于”的优先级高于“与”,所以不需要括号。
2、实验练习:4.3.2
问题的简单描述: 编写程序实现如下功能:商店有打印纸(18元/本)、墨盒(132元/个)、光盘(4.5元/片)出售,商店进行优惠酬宾活动。具体规则如下:顾客购买商品的总额超过100元,优惠5%;超过200元,优惠6%;超过300元,优惠7%;超过400元,优惠8%;超过500元,优惠10%。根据不同的购买量,计算应付货款。
实验代码:

#include <stdio.h>
main()
{
	int dyz,mh,gp,a;
	float yfk,sum;
	printf("请输入打印纸、墨盒、光盘的数量:\n");
	scanf("%d,%d,%d",&dyz,&mh,&gp);
	sum=(dyz*18+mh*132+gp*4.5);
	a=sum/100;
	switch(a)
	{
	        case 0:
		        yfk=sum;
		        printf("应付款=%f",yfk);
		        break;
		case 1:
			yfk=sum*0.95;
			printf("应付款=%f",yfk);
			break;
		case 2:
		        yfk=sum*0.94;
			printf("应付款=%f",yfk);
			break;
		case 3:
		        yfk=sum*0.93;
			printf("应付款=%f",yfk);
			break;
		case 4:
			yfk=sum*0.92;
			printf("应付款=%f",yfk);
			break;
		default:
			yfk=sum*0.90;
			printf("应付款=%f",yfk);
			break;
	}
 } 

问题分析: 在输入这个程序的时候会忘记break后面的分号,default打成了defeult,编译不会错误,但是结果会出错,大于500的金额不能正常输出。
3、实验练习:4.3.3
问题的简单描述: 输入某一年、月的数值,输出该月的天数。
实验代码:

#include<stdio.h>
 int main()
 {
    int year, month,days;
    printf("Please enter year and month:\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:days=31;
       case 3:days=31;
       case 5:days=31;
       case 7:days=31;
       case 8:days=31;
       case 10:days=31;
       case 12:days=31;
       case 4:days=30;
       case 6:days=30;
       case 9:days=30;
       case 11:days=30;break;                        
   }
   printf("%d年%d月有%d天",year,month,days);
}

问题分析: 输入代码的时候没有问题,编译没有出错,但是在运行的时候输入的是中文下的数字,导致输出的是某年0月有0天。检查代码,运行代码使用英文输入法下的数字,就可以得到正确得结果。
4、实验练习:4.3.4
问题的简单描述: 编写一个自动售货机的程序。该程序具有如下功能:有两级菜单,一级菜单是商品类型的选择;二级菜单是具体的商品的选择(商品价格和品种可以自拟)。顾客先选择商品的类型,然后选择具体商品,输入购买数量。自动售货机根据选择的商品和输入的数量,计算并显示所选商品的总金额。
实验代码:

#include <stdio.h>
int 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.0*n;break;
	       case 4:sum=8.6*n;break;
	       } 
	       break;
         case 2:printf("请选择:1、笔(3元/支)  2、笔记本(1.2元/个)\n");
    	        printf("        3、文件夹(22元/个)     4、文具盒(8.6元/个)\n");
		scanf("%d",&y);
		printf("数量?");
		scanf("%d",&n);
		switch(y)
		{
		case 1:sum=3.0*n;break;
		case 2:sum=1.2*n;break;
		case 3:sum=22*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元/包)");
		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 元\n",sum);
}

问题分析: 这个实验有较多中文输入,在输入代码得时候,会忘记切换输入法,导致编译的时候第六行的printf那一句编译错误。将那句的分号改成英文输入法下的分号即可正常运行。
5、实验练习:4.3.5
问题描述:

  • 运行程序,分析输出结果。
  • 运行程序,分析错误的原因并修改程序,输出正确的结果
    实验代码1:
#include<stdio.h>
 main()
 {
    double x=1000/3.0;
    double y=x-333.0;
    double z=3*y-1.0;
    printf("x=%lf\n",x);
    printf("y=%lf\n",y);
    printf("z=%lf\n",z);
    if(z==0) printf("z==0.\n");
	else printf("z不等于0.\n");
}

运行结果如下:

问题分析1: 这个代码的结果中z不等于0是因为z按双精度浮点数输出,z小于0并向0无限趋近,所以z的输出为-0.000000,则不等于0.
实验代码2:

#include <stdio.h>
int 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);
}

问题分析2: 在表示某个数满足某个范围的时候,不能直接用数学上的关系式表达,需要用“&&”这个逻辑运算符。

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

设计思路: 用switch结构实现不同情况下的运算,通过do-while结构实现循环计算
流程图:

设计过程中遇到的问题: 数据和符号不能分开输入,输入非法符号会出现死循环

改进的方法: 用多个语句提示用户分别输入字符和数字,
未改进代码:

#include <stdio.h>
main()
{
	float a,b,c,d;
	char e;
	do{
		printf("Please input number\n");
		scanf("%f%c%f",&a,&e,&b);
		switch(e)
		{
			case'+':{c=a+b;printf("Result is:%f\n",c); 
				break;
			}
			case'-':{c=a-b;printf("Result is:%f\n",c);
				break;
			}
			case'*':{c=a*b;printf("Result is:%f\n",c);
				break;
			}
			case'/':{c=a/b;
			if(b=0)
			printf("Result is erro\n");
			else
			printf("Result is:%f\n",c);
			        break;
			}
		}
		printf("继续计算请输入1\n结束计算请输入2\n");
		scanf("%f",&d);
	}
	while(d<2);
	printf("Thank you!\n");
 } 

未改进代码运行结果:

改进代码1:

#include <stdio.h>
void menu()
{
	printf("--------------------\n");
	printf("请输入对应的运算符数字\n");
	printf("         1.+        \n"); 
	printf("         2.-        \n"); 
	printf("         3.*        \n"); 
	printf("         4./        \n"); 
	printf("--------------------\n");
}
main()
{
	int select=0;
	float a,b,c;
	do{
		menu();
		scanf("%d",&select);
		printf("Please input number\n");
		scanf("%f%f",&a,&b);
		switch(select)
		{
			case 1:{c=a+b;printf("Result is:%f\n",c); 
				break;
			}
			case 2:{c=a-b;printf("Result is:%f\n",c);
				break;
			}
			case 3:{c=a*b;printf("Result is:%f\n",c);
				break;
			}
			case 4:{c=a/b;
			if(b==0)
			printf("Result is erro\n");
			else
			printf("Result is:%f\n",c);
				break;
			}
		}
	}
	while(select);
	printf("Thank you!\n");
 } 

改进代码1问题分析:这个代码对数据的输入和运算类型的选择进行了改进,增加了一个菜单,但是还是没有解决非法输入后进入死循环的问题,所以结合同学的意见和指导,得出下面的改进代码2。
改进代码2:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define s select
void menu()
{
	printf("--------------------\n");
	printf("请输入对应的运算符数字\n");
	printf("         1.+        \n"); 
	printf("         2.-        \n"); 
	printf("         3.*        \n"); 
	printf("         4./        \n");
	printf("--------------------\n");
	system("color f4");
}
main()
{
	int s=0;
	float a,b,c;
	do{
		menu();
		scanf("%d",&s);
		//while((s=getchar())!='\n'&&s!=EOF);

		//while(s!='1'||s!='2'||s!='3'||s!='4')
		//{
			//printf("输入错误,请重新输入!");
			//scanf("%d",&s);
		//}
		printf("Please input number\n");
		scanf("%f%f",&a,&b);
		switch(s)
		{
			case 1:{c=a+b;printf("Result is:%f\n",c); 
				break;
			}
			case 2:{c=a-b;printf("Result is:%f\n",c);
				break;
			}
			case 3:{c=a*b;printf("Result is:%f\n",c);
				break;
			}
			case 4:{c=a/b;
			if(b==0)
			printf("Result is erro\n");
			else
			printf("Result is:%f\n",c);
			break;}
			default:{exit(EXIT_SUCCESS);}
					fflush(stdin);
		}while((s=getchar())!='\n'&&s!=EOF);
	}
	while(s);
	printf("Thank you!\n");
 } 

四、实验小结

  本次实验的操作使我对switch结构有好的认识,对运用switch结构情形也更了解了,并通过编写一个计算器代码对switch结构进行运算。在编写代码的过程中还是会出现将字符输入错误的问题, 在编写简易计算器的过程中,计算器出现非法输入死循环的情况,在解决这个问题的过程中,通过查找资料和同学的建议将代码进行了相应的改进,增加了菜单功能。此外,这次实验也让我认识到代码需要不断测验,从错误中不断学习。

posted @ 2020-03-26 20:53  JSZ-Angel  阅读(715)  评论(0编辑  收藏  举报