zoukankan      html  css  js  c++  java
  • C语言第四次博客作业嵌套循环

    一、PTA实验作业

    题目1. 查询水果价格

    1. 本题PTA提交列表(要提交列表,不是结果)

    2. 设计思路(此处用流程图最好)

    • (1)定义变量choice存放编号,price存放单价,i为循环变量
    • (2)定义变量i,用来记录编号数目
    • (3)输出菜单:
      [1] apple
      [2] pear
      [3] orange
      [4] grape
      [0] exit
    • (4)赋值i=1
    • (5)输入数据choice
    • (6)如果choice为0,退出循环
    • (7)如果choice为1,price=3.00;
    • (8)如果choice为2,price=2.50;
    • (9)如果choice为3,price=4.10;
    • (10)如果choice为4,price=10.20;
    • (11)否则,price=0.00;
    • (12)i=i+1
    • (13)重复步骤5~12,直到不满足i<=5,结束循环
    • (14)输出price = 价格,并保留两位小数

    3.本题调试过程碰到问题及解决办法

    • (1)问题:
      ①在读入0时,输出时多了一组水果菜单,多了一次循环
      ②多次尝试还是错误,在同学提醒下知道菜单不应该进行循环,只输出一次就可以了
    • (2)解决办法:
      ①把choice==0的情况放到菜单前面,在读入0时直接退出循环,解决了菜单多了一次循环的问题
      ②得知菜单不用参加循环后把菜单移除循环外,结果正确



    题目2. 换硬币

    1. 本题PTA提交列表(要提交列表,不是结果)

    2. 设计思路(此处用流程图最好)

    • ①定义整型变量fen5,fen2,fen1分别存放5分,2分,1分硬币数量,count存放换法个数;total存放硬币总数;money存放待换零钱数额
    • ②输入数据money
    • ③赋初值count为0,赋初值total为0
    • ④定义fen5=19(5分硬币最多19个),fen5--
    • ⑤定义fen2=47(2分硬币最多47个),fen2--
    • ⑥定义fen1=93(1分硬币最多93个),fen1--
    • ⑦重复步骤④⑤⑥,直到不满足fen5<=19&&fen5>=1,fen2<=47&&fen2>=1,fen1<=93&&fen1>=1
    • ⑧如果5fen5+2fen2+fen1==money,输出“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”
    • ⑨count++
    • ⑩输出count = 换法个数

    3.本题调试过程碰到问题及解决办法

    • (1)问题:
      ①输出未换行
      ②没有设定每种硬币个数至少为1,导致出现硬币个数为负的情况,出现死循环
      ③输入数据为13时答案正确,但换一个数据total大小顺序就错乱了
    • (2)解决办法:
      尝试着换用循环递减的方法实现硬币数量从大到小,把嵌套循环条件改为fen5<=19&&fen5>=1;fen2<=47&&fen2>=1;fen1<=93&&fen1>=1




    题目3.歌唱比赛评分系统

    1. 本题PTA提交列表(要提交列表,不是结果)

    2. 设计思路(此处用流程图最好)

    • (1)定义整型变量grade存放成绩,sum存放成绩总和,min存放最低分,max存放最高分,n存放评委人数,repeat为循环次数,i,j为循环变量,定义浮点型变量score存放最终得分
    • (2)输入数据repeat,
    • (3)赋值i=1,输入数据n,,赋值sum=0,min=100,max=0,j=1,输入数据grade
    • (4)sum=sum+grade
    • (5)如果grade<min(输入成绩小于最小值),赋值min=grade
    • (6)如果grade>max(输入成绩大于最大值),赋值max=grade
    • (7)j=j+1
    • (8)重复步骤3~6,直到不满足j<=n
    • (9)score=(sum-min-max)*1.0/(n-2)
    • (10)输出平均分score,并保留两位小数
    • (11)i=i+1
    • (12)重复步骤3~11,直到不满足i<=repeat

    3.本题调试过程碰到问题及解决办法

    • (1)问题:
      ①思考不到位,把赋初值时min=0
      ②不理解题目意思,不知道repeat控制的循环是哪些部分,把平均数计算和输出放在循环外,虽然repeat=1时输出结果与题目要求一致,但在PTA中测评显示错误。
    • 解决办法:
      ①调试发现不管输入的grade值为多少,最小值min一直为0,于是想到把赋值min=100时才能让最小值赋值给min
      ②输入repeat=2时,发现第一次循环没有进入平均值计算和输出部分,直接跳到第二次循环部分,因此第一次循环没有输出平均值,尝试把平均值计算和输出部分移到循环里面,这样第一次循环时就可以进入这两条语句中,改动后发现结果正确。


    二、同学代码结对互评

    1.互评同学名称

    黄毓颖

    2.我的代码、互评同学代码截图

    我的代码

    #include<stdio.h>
    int main()
    {
    	int repeat,n,grade,sum,min,max,i,j;//grade存放成绩,sum存放成绩总和,min存放最低分,max存放最高分
    	float score;//score存放最终得分
    	scanf("%d",&repeat);
    	for(i=1;i<=repeat;i++){
    	  scanf("%d",&n);
    	  sum=0;//赋值sum为0
    	  min=100;//赋初值min为100
    	  max=0;//赋初值max为0
    		for(j=1;j<=n;j++){
    		scanf("%d",&grade);
    		sum=sum+grade;//累加成绩
    		if(grade<min)//如果输入成绩小于最小值
    		min=grade;//将此成绩赋给min
    		if(grade>max)//如果输入成绩大于最大值
    		max=grade;//将此成绩赋给max
    		}
    		score=(sum-min-max)*1.0/(n-2);//计算平均值
    		printf("score:%.2f\n",score);
    	}
    	return 0;
     } 
    

    黄毓颖同学的代码

    {
        int i,j,n,repeat,mark,sum=0,max,min;
        double score;  //定义score存放平均分//
        (n>=3&&n<=10);
        (repeat>0&&repeat<10);
        scanf("%d%d",&repeat,&n);//输入运算次数和评委人数//
        scanf("%d",&mark);//输入成绩//  
        sum=sum+mark; 
        max=mark;
        min=mark;
        for(i=1;i<=repeat;i++){
            if(i!=1){
            scanf("%d%d",&n,&mark);
            max=mark;
            min=mark;
            sum=mark;}
          for(j=1;j<=(n-1);j++){ 
          scanf("%d",&mark);
          if(mark>max){
            max=mark;
          }
          if(mark<min){
            min=mark;//判断出最大值和最小值//
          }sum=sum+mark;}
          sum=sum-max-min;//减去最大值和最小值//
        score=sum*1.0/(n-2);//算出减去最大值和最小值后的平均成绩//
        
        printf("score:%.2lf\n",score);
        }  
     }
    

    3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

    不同:我的代码中直接赋值min=100,max=0,与输入的成绩grade作比较,找出最小值和最大值,而黄毓颖同学的则使用了课本中的找最大值的方法,先输入一个成绩把它赋值给最大值和最小值,再与剩下的几个成绩对比找出最大值和最小值。
    各自优势:我的代码看起来比较简单,但可能会在为什么要赋值min=100处不容易理解。黄毓颖同学的代码程序比较多看起来有点复杂,但是细读起来发现是课本上相似的方法,容易读懂。相比之下我会比较喜欢看起来简单明了一点的代码
    另:黄毓颖同学的代码中,注释用的符号只需要一个//即可,不需要两个

    三、截图本周题目集的PTA最后排名

    PTA排名

    四、本周学习总结

    1.你学会了什么?

    • 函数的定义:
      库函数:scanf(),printf()等
      自定义函数:用户自己定义的函数
    • 函数定义的一般形式:
    函数类型 函数名 (形式参数表)     /*函数首部*/
    {
      函数实现过程                             /*函数体*/
    }
    

    其中:
    函数首部后面不能加分号,它和函数体一起构成完整的函数定义
    函数类型指函数结果返回的类型,一般与return语句中表达的类型一致。
    形式参数表格式:类型1 形参1,类型2 形参2,…,类型n 形参n(每个形参前的类型必须分别写明)
    注:形式参数可以必须时变量

    • 函数体:
      函数体用return语句返回运算结果
    • 函数调用:
      ①函数调用的一般形式:函数名(实际参数表)
      注:实际参数可以是常量,变量和表达式
      ②参数:
      形参:函数定义时,位于其首部的参数
      实参:主调函数的参数
      注:形参和实参必须一一对应,两者数量形同,类型尽量一致
      ③函数结果的返回:格式:return 表达式
      return语句的作用:1.结束函数的运行;2.带着运算结果(表达式的值)返回主调函数
      注:return语句只能返回一个值
      ④函数声明:格式:函数类型 函数名(形参表);
      注:函数声明是一条C语句,后面要加分号,而函数定义时的函数首部不是语句
    • 不返回结果的函数:
      不返回结果的函数定义:
    {
      函数实现过程                             /*函数体*/
    }
    

    注:在不返回结果的函数定义中,void不能省略,否则,函数类型被默认定义为int

    • 局部变量和全局变量
      局部变量:定义在函数内部的变量,例:形参;有效作用范围局限于所在的函数内部
      全局变量:定义在函数外而不属于任何函数的变量;有效作用范围时从定义开始到程序所在文件的结束
      注:允许全局变量和局部变量同名,同名是局部变量有效
    • 变量生存周期和静态局部变量
      自定义变量形式:auto 类型名 变量表
      静态变量定义格式:static 类型名 变量表
      注:1.自动变量没有赋初值→随机值;静态变量没有赋初值→自动赋0; 2.静态变量赋初值只在函数第一次调用时起作用,以后调用都按前一次调用保留的值使用。

    2.本周的内容,你还不会什么?

    ①嵌套循环的PTA作业中,“编程打印空心字符菱形”一题还是不能自主完成,本次PTA中的此题是在老师讲解后,又通过其他人的协助指导才勉强完成,但如果再做一次,我想还是没法自己完成。
    ②对于函数这一章节的认识还处在课本的理论知识,对于自己打代码还有一段距离,希望能在接下来函数的PTA作业中熟悉函数的用法
    ③对伪代码的用法及流程图还不熟悉

  • 相关阅读:
    CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)
    hdu 4607 树形dp 树的直径
    poj 2955 区间dp入门题
    poj 2139 flord水题
    poj 2377 最大生成树
    lightoj 1422 区间dp
    模拟类似括号匹配
    nyoj 33 蛇形填数
    nyoj 2 括号配对问题水
    Hackonacci Matrix Rotations 观察题 ,更新了我的模板
  • 原文地址:https://www.cnblogs.com/smtwula/p/7813989.html
Copyright © 2011-2022 走看看