一、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作业中熟悉函数的用法
③对伪代码的用法及流程图还不熟悉

posted on 2017-11-11 21:27  呜啦  阅读(701)  评论(5编辑  收藏  举报