C语言 各位大佬帮帮忙
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 各位大佬帮帮忙相关的知识,希望对你有一定的参考价值。
7-6 成绩排序 (30 分)
某班有n个学生,输入该班这n个学生的姓名、某三门课的成绩,计算各自的平均成绩,存放到一个结构数组中,将平均成绩作为关键字,然后把该这些学生的名字和平均成绩按从大到小的顺序排列输出.如果有相同分数则名字字典序小的在前。
输入格式:
第一行为人数n,n为正整数.接下来的n行,每行为每个学生的名字和他的3门课程的成绩(小数点后最多有2位小数), 中间用单个空格隔开.名字只包含字母且长度不超过20.即:学生的姓名 分数 分数 分数.
输出格式:
把成绩单按平均分数从高到低的顺序进行排序并输出,每行包含名字和分数,两项之间有一个空格.如果有相同分数则名字字典序小的在前.平均分输出小数点后2位. 4舍5入.
输入样例:
在这里给出一组输入。例如:
8
Kitty 66.66 66.66 66.67
Hanmeimei 66.66 66.66 66.66
Joey 92 58 96
Tim 28 68 32
Test 56 98 78
Sdt 78 65 90
Red 45 56 89
Wed 56 89 74
输出样例:
在这里给出相应的输出。排序输出结果按照四舍五入之后的值进行排序.例如:
Joey 82.00
Sdt 77.67
Test 77.33
Wed 73.00
Hanmeimei 66.66
Kitty 66.66
Red 63.33
Tim 42.67
我调用的是algorithm库里面的sort函数对成绩排序,如果你要用别的排序方法,可以自行修改排序部分,使用快速排序即可。
#include<stdio.h>#include<string.h>
#include<math.h>
#include<algorithm>
struct Student
char name[20];
double score1;
double score2;
double score3;
double avg;
;
bool cmp(Student &s1,Student &s2)
if(fabs(s1.avg-s2.avg)>0.01) return s1.avg>s2.avg;
else return strcmp(s1.name,s2.name)<0;
int main()
int n,i;
scanf("%d",&n);
Student s[n];
for(i=0;i<n;i++)
scanf("%s%lf%lf%lf",s[i].name,&s[i].score1,&s[i].score2,&s[i].score3);
s[i].avg=(s[i].score1+s[i].score2+s[i].score3)/3;
std::sort(s,s+n,cmp);//自行修改排序部分
for(i=0;i<n;i++)
printf("%s %.2lf\\n",s[i].name,s[i].avg);
参考技术A 私---------信-----------我------------写-------------给-------------你 参考技术B 需要C语言入门视频教程发电子邮件至wj2017wj@126.com 参考技术C 这个我可以做
c语言链表插入问题,pta提交有个段错误,请各位大佬帮忙找找茬,感激!
#include <stdio.h>#include <stdlib.h>struct date int num; struct date *next;;int main() int i=0,n,m,cnt=0,num; struct date *head,*p,*q,*k,*x,*g; scanf("%d",&n); scanf("%d",&num); while(cnt<n) p=(struct date *)malloc(sizeof(struct date)); p->num=num; cnt++; if(cnt==1) head=p; q=p; else q->next=p; q=p; if(cnt<n) scanf("%d",&num); p->next=NULL; scanf("%d",&m); x=(struct date *)malloc(sizeof(struct date)); x->num=m; k=head; while(k->next!=NULL&&k->next->num<m) k=k->next; if(k->next!=NULL&&head->num>m) x->next=head; for(g=x;g!=NULL;g=g->next) printf(" %d",g->num); else if(k->next!=NULL&&head->num<=m) x->next=k->next; k->next=x; for(g=head;g!=NULL;g=g->next) printf(" %d",g->num); else k->next=x; x->next=NULL; for(g=head;g!=NULL;g=g->next) printf(" %d",g->num); return 0;
看到你这问题,你时间快到了吧。
你变量命名很随意,没有备注,逻辑读起来很费时间,另外i变量没使用,所有指针变量都没有初值,建议都给初值NULL否则会有野指针。
直接模仿你的结构写一个吧。
#include <stdio.h>#include <stdlib.h>
struct date
int num;
struct date *next;
;
int main()
int n,m,num;
struct date *head=NULL,*hSave=NULL,*tail=NULL,*newDate=NULL;
scanf("%d",&n);//第一行有序输入
while(n--)//根据第二行输入生成链表
scanf("%d",&m);
newDate=(struct date *)malloc(sizeof(struct date));
newDate->num=m;
newDate->next=NULL;
if(!newDate)
return 1;
if(head==NULL)
head=(struct date *)malloc(sizeof(struct date));
if(!head)
return 1;
head->next=newDate;
else
tail->next=newDate;
tail=newDate;
scanf("%d",&num);//第三行输入 插入
newDate=(struct date *)malloc(sizeof(struct date));
newDate->num=num;
newDate->next=NULL;
hSave=head;
while(hSave->next)//遍历链表
if(hSave->next->num<=num && (hSave->next->next==NULL || hSave->next->next->num>=num))//当前节点数值小于等于输入并且(下一节点为空或下一个节点数值大于等于输入)
newDate->next=hSave->next->next;
hSave->next->next=newDate;
break;
hSave=hSave->next;
while(head->next)//最终输出打印
printf("%d ",head->next->num);
head=head->next;
return 0;
参考技术A 你变量命名很随意,没有备注,逻辑读起来很费时间,另外i变量没使用,所有指针变量都没有初值,建议都给初值NULL否则会有野指针。
以上是关于C语言 各位大佬帮帮忙的主要内容,如果未能解决你的问题,请参考以下文章