求一道C语言作业题。
题目为:使用模块化(函数)设计学生成绩的处理程序n个学生的成绩,学生成绩表含学号、姓名、语文、数学、总分、名次等栏目。请定义结构数组方式存储。程序要有录入、计算总分,排名...
题目为:使用模块化(函数)设计学生成绩的处理程序n个学生的成绩,学生成绩表含学号、姓名、语文、数学、总分、名次等栏目。请定义结构数组方式存储。程序要有录入、计算总分,排名,输出等功能。每个功能用一个函数。
求大神看看,我哪里有问题?我能运行,但是出的答案就太离谱了。。。我不想说了,我是用C++运行的。
我的答案
#include<stdio.h>
#include<conio.h>
#define n 5
struct stu
{int num;
char name[20];
int chi;
int math;
int sum;
int rank;
};
void input(struct stu *a);
void count(struct stu *b);
void rank(struct stu *c);
void output(struct stu *d);
main()
{int i;
struct stu a[n];
for(i=0;i<n;i++)
input(&(a[i]));
for(i=0;i<n;i++)
count(&(a[i]));
rank(a);
output(a);
getch();
}
void input(struct stu *p)
{scanf("%d,%s,%d,%d\n",&(p->num),&(p->name),&(p->chi),&(p->math));}
void count(struct stu *b)
{(b->sum)=(b->chi)+(b->math);}
void rank(struct stu *c)
{char *p,*q,a[20];
int i,j,t;
for(i=0;i<n;i++)
{ for(j=1;j<(n-i);j++)
if((c->sum)<((c+j)->sum))
{t=(c->sum);
(c->sum)=((c+j)->sum);
((c+j)->sum)=t;
t=(c->num);
(c->num)=((c+j)->num);
((c+j)->num)=t;
t=(c->chi);
(c->chi)=((c+j)->chi);
((c+j)->chi)=t;
t=(c->math);
(c->math)=((c+j)->math);
((c+j)->math)=t;
p=(c->name);
q=((c+j)->name);
for(i=0;i<20;i++)
{a[i]=*(p+i);
*(p+i)=*(q+i);
*(q+i)=a[i];}
}
(c->rank)=i+1;
c++;
}
}
void output(struct stu *d)
{int i;
for(i=0;i<n;i++)
printf("学号%d,姓名:%s,语文%d,数学%d,总分%d,名次%d\n",d->num,d->name,d->chi,d->math,d->sum,d->rank);
d++;
} 展开
求大神看看,我哪里有问题?我能运行,但是出的答案就太离谱了。。。我不想说了,我是用C++运行的。
我的答案
#include<stdio.h>
#include<conio.h>
#define n 5
struct stu
{int num;
char name[20];
int chi;
int math;
int sum;
int rank;
};
void input(struct stu *a);
void count(struct stu *b);
void rank(struct stu *c);
void output(struct stu *d);
main()
{int i;
struct stu a[n];
for(i=0;i<n;i++)
input(&(a[i]));
for(i=0;i<n;i++)
count(&(a[i]));
rank(a);
output(a);
getch();
}
void input(struct stu *p)
{scanf("%d,%s,%d,%d\n",&(p->num),&(p->name),&(p->chi),&(p->math));}
void count(struct stu *b)
{(b->sum)=(b->chi)+(b->math);}
void rank(struct stu *c)
{char *p,*q,a[20];
int i,j,t;
for(i=0;i<n;i++)
{ for(j=1;j<(n-i);j++)
if((c->sum)<((c+j)->sum))
{t=(c->sum);
(c->sum)=((c+j)->sum);
((c+j)->sum)=t;
t=(c->num);
(c->num)=((c+j)->num);
((c+j)->num)=t;
t=(c->chi);
(c->chi)=((c+j)->chi);
((c+j)->chi)=t;
t=(c->math);
(c->math)=((c+j)->math);
((c+j)->math)=t;
p=(c->name);
q=((c+j)->name);
for(i=0;i<20;i++)
{a[i]=*(p+i);
*(p+i)=*(q+i);
*(q+i)=a[i];}
}
(c->rank)=i+1;
c++;
}
}
void output(struct stu *d)
{int i;
for(i=0;i<n;i++)
printf("学号%d,姓名:%s,语文%d,数学%d,总分%d,名次%d\n",d->num,d->name,d->chi,d->math,d->sum,d->rank);
d++;
} 展开
1个回答
展开全部
rank函数里面,你用的冒泡排序不对,c的地址一直没有变, c应该改成c+j-1
不知道你想用什么排序算法?
还有最后output中for语句应该改为:(d++无作用的)
for(i=0;i<n;i++){
printf("学号%d,姓名:%s,语文%d,数学%d,总分%d,名次%d\n",d->num,d->name,d->chi,d->math,d->sum,d->rank);
d++;}
PS:初学者首先应该学会调试
不知道你想用什么排序算法?
还有最后output中for语句应该改为:(d++无作用的)
for(i=0;i<n;i++){
printf("学号%d,姓名:%s,语文%d,数学%d,总分%d,名次%d\n",d->num,d->name,d->chi,d->math,d->sum,d->rank);
d++;}
PS:初学者首先应该学会调试
更多追问追答
追问
rank 里面有个c 啊,然后为什么要c j-1?最后那我懂了,是我大意了,谢谢,那个排序不是冒泡,我用的是,只要后面比它小的,就跟它换位置,这种排序方法
追答
“只要后面比它小的,就跟它换位置,这种排序方法”这不就是冒泡排序吗?
还有你中间复制名字的时候又用到 i 了,i的值不就会变了吗?不对了吧。
如果你想用查找排序的话,算法应该是:
从第一个开始查找,找到最大的放到第一个位置;再从第二个开始查找,找到最大的放到第二个位置;以此类推。
哦,你后面有一个c++没有看到,你在程序里用的都是地址传递,这样的话基址信息都被改了。不好,我觉得应该这么做:
void rank(struct stu *c) {
char *p,*q,a[20];
int i,j,t,i_temp;
for(i=0;i<n;i++) {
for(j=i;j<n;j++){
if((c[i].sum)<((c[j]).sum)){
t=(c[i].sum);
(c[i].sum)=((c[j]).sum);
((c[j]).sum)=t;
t=(c[i].num);
(c[i].num)=((c[j]).num);
((c[j]).num)=t;
t=(c[i].chi);
(c[i].chi)=((c[j]).chi);
((c[j]).chi)=t;
t=(c[i].math);
(c[i].math)=((c[j]).math);
((c[j]).math)=t;
p=(c[i].name);
q=((c[j]).name);
for(i_temp=0;i_temp<20;i_temp++) {
a[i_temp]=*(p+i_temp);
*(p+i_temp)=*(q+i_temp);
*(q+i_temp)=a[i_temp];
}
}
}
(c[i].rank)=i+1;
}
}
我测试过了,没有问题。
吐槽一下,这么小的程序你的bug也太多了吧。有一些函数用上的话比如说字符串复制strcpy函数,程序会清楚很多。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询