第二次作业(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作业,趁着记忆犹新将自己的思路及解题过程记录下来,高效率地完成好作业,而不是像现在这样踩点补作业。