实验报告(二)

c程序设计实验报告

姓名:许欣明  实验时间:2021.4.15  实验地点:一教522

一、实验目的与要求:

(1)掌握结构化程序的算法描述方法。

(2)了解C语言的基本语法要素,能熟练地将算法描述转化为C语言程序。

(3)熟练掌握C语言运算符的优先级、结合性、运算规则、运算对象类型等。

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

(5)学会正确的使用逻辑表达式和关系表达式。

(6)掌握各种形式的if语句语法和使用方法。注意if语句中if和else的匹配关系,以及if语句的嵌套。

(7)掌握switch语句的语法和使用方法。注意在switch语句中break语句的语法及switch语句的嵌套。

(8)能独立编写分支结构程序并测试通过。

(9)用if语句、switch语句解决简单的应用问题并上机实现。

二、实验内容

(一)实验练习:3.3.1

1.问题描述:使用算法流程图表示某函数的算法。

2.实验代码:

#include <stdio.h>

int main()
{
    float x,y;
    printf("请输入x的值:\n");
    scanf("%f",&x);
    if(x<1)
    {
        y=x;
        printf("y的值为:%.1f\n",y);
    }

    else if(x<10)
    {
        y=2*x-1;
        printf("y的值为:%.1f\n",y);
    }
    else
    {
        y=3*x-1;
        printf("y的值为:%.1f\n",y);
    }
    
    return 0;
}

3.问题分析:if和else后面使用复合语句时忘记加大括号,导致程序运行结果出错;

程序需要接收一个浮点数,因此用float来表示。

 

(二)实验练习:3.3.2

1.问题描述:用算法流程图描述求解鸡兔同笼问题的算法。

2.实验代码:

#include <stdio.h>

int main()
{
    int h,f,x,y;
    printf("鸡兔总数,鸡兔总脚数:\n");
    scanf("%d,%d",&h,&f);
    if(h>0 && f>0)
    {
        x=(4*h-f)/2;
        y=(f-2*h)/2;
        printf("鸡有%d,兔有%d",x,y);
    }
    else
    printf("输入错误"); 
    
    return 0;
}

3.问题分析:输入与输出函数中的“鸡的总数,兔的总数”没有统一,使最后的结果反了。

 

(三)实验练习3.3.3

1.问题描述:根据平面坐标,输出塔的高度。

2.实验代码:

#include <stdio.h>
#include <math.h>

int main()
{
    int h = 10;
    float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;
    printf("请输入一个点(x,y):\n");
    scanf("%f%f",&x,&y);
    d1=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
    d2=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
    d3=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3));
    d4=sqrt((x-x4)*(x-x4)+(y-y4)*(y-y4));
    if(d1>1&&d2>1&&d3>1&&d4>1)
    h=0;
    printf("该塔的高度为%d",h);
    
    
    return 0;
}

3.问题分析:使用sqrt函数时忘记引用头文件math.h导致程序无法运行;

 

(四)实验练习4.3.1

1.问题描述:读入三个表示箱子长宽高的整数值,判断并输出该箱子是正方形还是长方形。

2.实验代码:

#include <stdio.h> 

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

3.问题分析:每条语句写完之后记得加上分号;

在判断三个数值相等时,不能简单的l==w==h这样连等在电脑中是无法识别的,应该改成l==w&&w==h。

 

(五)实验练习4.3.2

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

2.实验代码:

#include <stdio.h>

int main ()
{
    int z,w; 
    float d,m,g;
    printf("请输入打印纸,墨盒,光盘的数量:\n");
    scanf("%f%f%f",&d,&m,&g);
    z=d*18+m*132+g*4.5;
    switch(z%100)
    {
        case 0:break;
        case 1:w=0.05*z;
        break;
        case 2:w=0.06*z;
        break;
        case 3:w=0.07*z;
        break;
        case 4:w=0.08*z;
        break;
        case 5:w=0.1*z;
        break;
        default:w=0.1*z;
        break;
    }
    z=z-w;
    printf("应付款数%d",z);
    return 0;
}

3.问题分析:最后的输出总数z开始是定义的float型,在switch后面的表达式中float数值是不能取模的,更改成整型数之后程序可以完美运行;

不要忘了switch中运算的是优惠的金额,所以要记得最后用“z=z-w”来表示应付金额。

 

(六)实验练习4.3.3

1.问题描述:输入某一年、月的数值,输出该月的天数。

2.实验代码:

#include <stdio.h>

int main()
{
    int year,month,days;
    printf("请输入年和月:\n");
    scanf("%d%d",&year,&month);
    switch(month)
    {
        case 2:if((year%4)&&(year%100))
        days=28;
        else
        days=29;
        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天\n",year,month,days);
    return 0;
 } 

3.问题分析:判断是否为闰年的条件思考了太久,调试了太久,开始并没有想到用上取模;

case 2 的判断是否为闰年后都语句后面应该加上break,否则输入二月份不管哪一年它都会输出的是31天。

 

三、实验小结:

if else语句中的注意事项:


   1.复合语句要加大括号。

   2.else总是与离它最近的上一个if配对。

switch语句中的注意事项:

  1. case后面只能是常量不能是变量,而且多个case后面的不能相同。
  2. switch语句遇到break结束整个switch语句,如果没有break就执行到语句结束。
  3. default可以加也可以不加。

if语句与switch语句的使用选择:

   if语句使用场景:
  
1.针对一个范围的判断
   2.针对几个常量值的判断
   switch语句使用场景:
   1.针对几个常量值的判断

对同伴的额建议:在一些重要的方面可以用别的颜色的字体标出,使得更容易注意到,思维导图太过简单,还可以分支出来更多的内容。

 

四、思维导图:

 

 

posted @ 2021-04-18 15:27  __xu  阅读(111)  评论(0编辑  收藏  举报