每次改动代码的时候我们改之前要了解我们改动为什么要改动,怎么改动,改动导致结果。在思考完后保存已经完善的代码后再进行改动,同时改动结束后也要保存。以免出现错误后不能有历史上正确的代码或者无法再现错误。
题目
先输入人数,在输入名,学号,三课成绩,最后输出按成绩排名。
错误代码
#include<stdio.h>
struct Student{
char name[25];
char number[15];
int chi;
int math;
int eng;
};
int main()
{
int n;
scanf("%d",&n);
struct Student stu[25],t;//n+1会如何?
int sum[25]={0};
for(int i=0;i<n;i++){
getchar();
scanf("%s %s %d %d %d",&stu[i].name,&stu[i].number,&stu[i].chi,&stu[i].math,&stu[i].eng);
sum[i]=stu[i].chi+stu[i].math+stu[i].eng;
}
for (int k=0;k<n;k++){
for (int j=0;j<n-k-1;j++){
if(sum[j]<sum[j+1]){ //《==错误
t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
}
}
}
for (int m=0;m<n;m++){
printf("%s %s %d %d %d\n",stu[m].name,stu[m].number,stu[m].chi,stu[m].math,stu[m].eng);
}
}
直接看的话,很久都难以找到错误的地方,因为这个是由对到错的一个为了优化而改动的代码。
那么错在哪里了?本题原本在Student中已经写了sum用来计算总成绩,但是因为在本体的输出中并没有,所以作者在Student类型中删去了这一部分,用一个int型数组来代替。
问题就出在这里,原本sum和成绩,人名,学号等在一个类型中,移动了sum所在的类型就是移动了所有的资料,现在我们移动的仅仅是Student类型,而没有带上sum,sum留在了原地。这样就导致我们的冒泡排序的错误。
改动后代码
#include<stdio.h>
#include<stdlib.h>
#define chengji int
struct Student{
char name[25];
char number[15];
chengji chi;
chengji math;
chengji eng;
};
int main()
{
int n,SUMa;
scanf("%d",&n);
struct Student stu[25],t;//n+1会如何?
chengji sum[25]={-888888};
for(int i=0;i<n;i++){
getchar();
scanf("%s %s %d %d %d",&stu[i].name,&stu[i].number,&stu[i].chi,&stu[i].math,&stu[i].eng);
sum[i]=stu[i].chi+stu[i].math+stu[i].eng;
}
for (int k=0;k<n;k++){
for (int j=0;j<n-k;j++){
if(sum[j]<sum[j+1]){
t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
SUMa=sum[j];
sum[j]=sum[j+1];
sum[j+1]=SUMa;
}
}
}
for (int m=0;m<n;m++){
printf("%s %s %d %d %d\n",stu[m].name,stu[m].number,stu[m].chi,stu[m].math,stu[m].eng);
}
system("pause");
return 0;
}
这样就对了,在冒泡中吧stu数组和sum一起变动,用一个不是那么优雅的方法打好了“补丁”。作业也就交上去了。
相关故事
同时讲讲故事吧,有个大佬曾经说过,人脑更喜欢故事,才能更好的记住知识。
在做作业的时候,因为懒得自己做,参考(CC+CV)了一份已有代码。
错误了。(不然这篇文章干嘛的)
因为各种原因之前用熟悉的vs不用了,新用了不是那么笨重的vscode(这个真的好用诶,鬼一样。),图快问了原作者。。于是我找到了代码的原作者,问了之后,发现原作者也不记得了,原作者在询问老师后某一次作对后就忘了这段代码了。。。。
说实话,一个不过半百行的代码,短时间内非常难以看出错误,如果这是很长的代码,那可就有的烦了,毕竟断点调试也是得一个一个问题找,不过这个只有 两个会出问题的地方,打开电脑后用断点很快就找到问题地方了。想想这是一个庞大的代码的话,修改一个地方出了错误,结果没有备份,痛苦降临在身上是必然的的,逐步调试浪费宝贵生命。
谨记谨记。。。