邓吃鱼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第二次作业(2)

7-1 计算职工工资

1.设计思路

(1)题目算法

第一步:输入员工数N,定义结构体数组
第二步:对结构体进行初始化,输入值
第三步:用for循环算出每组结构体实发工资tsalary
第四步:进行调试,针对个别细节问题进行修改

(2)流程图

2.实验代码

#include<stdio.h>
int main()
{
	int N,i;
	scanf("%d",&N);
	struct staff{
		char name[10];
		float bsalary;
		float fsalary;
		float expend;
	}staff[N];
	for(i=0;i<N;i++){
		scanf("%s %f %f %f",&staff[i].name,&staff[i].bsalary,&staff[i].fsalary,&staff[i].expend);
	}
	float tsalary[N];		
	for(i=0;i<N;i++){
    tsalary[i]=staff[i].bsalary+staff[i].fsalary-staff[i].expend;
		printf("%s %.2f\n",staff[i].name,tsalary[i]);
	}
	return 0;
 } 	

3.调试问题及解决方法


7-2 计算平均成绩

1.设计思路

(1)题目算法

第一步:输入学生数N,定义学生结构数组
第二步:用for循环依次输入每组学生结构变量的值
第三步:求出所有学生的总成绩sum,再求出并输出平均成绩average,保留两位小数
第四步:将每位学生的成绩student[i].grade与平均成绩average进行比较,将低于平均成绩的学生的name num输出
第五步:调试,针对细节性错误进行修改

(2)流程图

2.实验代码

#include<stdio.h>
int main()
{
	int N,i;
	float sum=0,average;
	scanf("%d",&N);
	struct student{
		int num;
		char name[10];
		float grade;
	}student[N];
	for(i=0;i<N;i++){
		scanf("%d %s %f",&student[i].num,&student[i].name,&student[i].grade);
		sum=sum+student[i].grade;
	}
	average=sum/N*1.0;
	printf("%.2f\n",average);
	for(i=0;i<N;i++){
		if(student[i].grade<average){
			printf("%s %05d\n",student[i].name,student[i].num);
		}
	}
	return 0;
 } 

3.调试问题及解决方法

错误信息:
错误原因:%d输出时,默认前面的0不输出
改正方法:%05d 需要固定输出几位数,就在d前加上数字几


第二次作业(3)

6-1 按等级统计学生成绩

1.设计思路

(1)题目算法

第一步:找到需要调用的函数,及明确函数目的
第二步:用if将grade进行分类
第三步:当等级为D时,将不及格人数+1,以此类推
第四步:返回不及格人数
第五步:进行调试,对个别问题再进行修改

(2)流程图

2.实验代码

int set_grade( struct student *p, int n )
{
	int i,count=0;
	for(i=0;i<n;i++){
		if((p+i)->score>=85&&(p+i)->score<=100){
			(p+i)->grade='A';
		}
		if((p+i)->score>=70&&(p+i)->score<=84){
			(p+i)->grade='B';
		}
		if((p+i)->score>=60&&(p+i)->score<=69){
			(p+i)->grade='C';
		}
		if((p+i)->score>=0&&(p+i)->score<=59){
			(p+i)->grade='D';
		}
		if((p+i)->grade=='D'){
			count ++;
		}
	}
	return count;
}

3.调试问题及解决方法

错误信息:The count for failed (<60): 为乱序数字
错误原因:没有给count定义初始值
改正方法:在count++前,定义count的值为0


6-2 结构体数组按总分排序

1.设计思路

(1)题目算法

第一步:找到需要调用的两个函数,明确calc函数是用来统计结构变量中sum的值,sort函数主要是解决排序及交换问题
第二步:用循环算出sum的值,大致完成calc函数
第三步:用冒泡排序法根据sum的大小进行排序,注意替换过程中是每一位学生的所有相关数据都会随着sum的排序而发生改变
第四步:进行调试,解决相应的细节问题

(2)流程图

2.实验代码

void calc(struct student *p,int n)
{
	int i,j;

	for(i=0;i<n;i++){
		(p+i)->sum=0;
		for(j=0;j<3;j++){
		
			(p+i)->sum=(p+i)->sum+(p+i)->score[j];
		}
	
    }

}
void sort(struct student *p,int n)
{
	int i,j;
	struct student t;
	for(i=0;i<n-1;i++){
		for(j=0;j<(n-1-i);j++){
			if(p[j].sum<p[j+1].sum){
				t=p[j];
				p[j]=p[j+1];
				p[j+1]=t;
			}
		}
	}
}

3.调试问题及解决方法

错误信息1:编译错误
错误原因:对t的定义错误,将t单纯地视为一个浮点数sum的过程替换值
改正方法:t也应该视为与sum类型相同的结构变量,将float t改为struct student t

错误信息2:输出结果只是对sum进行了重新排序,而其它信息没有发生变化
错误原因:在sort函数中,交换的时候只是对p[j].sum进行交换没有将整个p[j]结构体直接进行整体交换
改正方法:将p[j].sum后的.sum去掉,使之整体交换

错误信息3:calc函数存在问题,sum的求值出现错误
错误原因:将(p+i)->sum=0的初始赋值放在for循环外,但实际上,每次i的for循环代表算完一位同学的总成绩sum,因此每次i的for循环后都要使sum的值再次清零
改正方法:将(p+i)->sum=0放在第一次的循环后面,使每次i++后,(p+i)->sum的最初值也能重新归零

在修改过程中,学习到同学@马钰娟调用calc函数的方法:

运用一个for循环,思路简洁,让代码也更加简洁

1.学习总结和进度

(1)学习了字符串和结构体,及运用指针来表示字符串和结构体
(2)掌握如何定义一个字符串,字符串的初始化,字符串的引用,字符串的应用
(3)掌握如何定义一个结构体,结构体的初始化,结构体的引用,结构体的应用
(4)对博客园这项作业不能老是抱以消极的态度,尽量别拖欠。比如说今晚,虽然是踩着点只完成近期的几道题目,但是在这种归纳总结的过程中,状态会情不自禁地投入,回忆自己在调试过程时,是如何一步一步地进行修正,逐步靠近最终需要输出的结果。在独自完成每一题的小结后,不是累而是感受到自己在提出问题分析问题解决问题后的满足感。在以后的博客作业中,我想我会以更加积极的态度面对,每完成一次PTA作业,趁着记忆犹新将自己的思路及解题过程记录下来,高效率地完成好作业,而不是像现在这样踩点补作业。

2.git地址 the secend homework

3.评论

马钰娟
李伍壹
焦瑞君

posted on 2018-04-08 21:21  邓吃鱼  阅读(228)  评论(5编辑  收藏  举报