C语言 用指针编程,输入N个学生的成绩,对成绩进行排序,并统计及格和不及格率

如题所述

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define N 10

struct Student
{
float score;
struct Student *next;
};

//创建单向键表,返回链表表头head
struct Student *CreatLink(struct Student *head ,int n)
{
int i;
struct Student *p1,*p2;
head=p1=(struct Student *)malloc(sizeof(struct Student));
if(p1 == NULL)
{
printf("Not enough memory to allocate buffer\n");
system("PAUSE");
exit(1); /* terminate program if out of memory */
}
scanf("%f",&(p1->score));
p1->next=NULL;
for(i=2;i<=n;i++)
{
p2=p1;
p1=(struct Student *)malloc(sizeof(struct Student));
if(p1 == NULL)
{
printf("Not enough memory to allocate buffer\n");
system("PAUSE");
exit(1); /* terminate program if out of memory */
}
scanf("%f",&(p1->score));
p1->next=NULL;//最近产生的节点下一节点指向空
p2->next=p1;
}
return head;
}

//显示循环链表的成员
void DisplayLink(struct Student *head)
{
struct Student *p;
p=head;
do
{
printf("%.1f ", p->score);
p=p->next;
}while(p!=NULL); //p再次与head相等时,即所有成员都遍历完成
printf("\n\n");
}

//选择排序法排序链表
struct Student *SortLink(struct Student *head)
{
struct Student *head2=NULL,*p1,*p2,*p1lst,*p2lst,*q;
float MaxScore;

while(head!=NULL)
{
p2=p1=head;
MaxScore=head->score;
while(p1!=NULL)
{
if(p1->score > MaxScore)
{
MaxScore=p1->score;
p2lst=p1lst;
p2=p1;
}
p1lst=p1;
p1=p1->next;
}
if(p2==head)
{
head=head->next;
}
else
{
p2lst->next=p2->next;
}
if(head2==NULL)
{
head2=q=p2;
}
else
{
q->next=p2;
q=q->next;
}
}
q->next=NULL;
return head2;
}

//计算通过比率
float CalculatePassRatio(struct Student *head)
{
int i=0;
struct Student *p;
p=head;
while(p!=NULL)
{
if(p->score > 60) i++;
p=p->next;
}
return((float)i/N);
}

int main(int argc, char *argv[])
{
int n;
struct Student *head;
printf("Please input %d sorces:\n",N);
head=CreatLink(head,N);
printf("The sorces you input:\n");
DisplayLink(head);
head=SortLink(head);
printf("After Sort The sorces are follows:\n");
DisplayLink(head);
printf("The pass ratio is %.2f\%%\n\n",CalculatePassRatio(head)*100);
free(head);
system("PAUSE");
return 0;
}
虽然看起来长了点,但是你可以学习用链表是怎么做。我自己编的,也不是什么标准答案。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-13
用链表吧,排序涉及链表中节点位置的变化与更改,这个c的书上一般有。统计的话是对链表的遍历、和条件筛选,这个书上也有吧。编程还是自己多看看书什么的自己动手编的。
第2个回答  2012-12-13
这个 好像不难吧!是要源代码吗??追问

急求!!

追答

你去找个 类似的吧,然后我再帮你改改,因为我这 也没有类似的代码,从头开始写 又得写好久了!

追问

int a[M][N],i,j,max,maxi;
double sum,avg;
for(i=0;imax)
{
max=a[i][j]; maxi=i;
}
}
avg=sum/N;
printf("第%d门课的平均成绩为%.2lf,最高成绩的同学的序号为:%d\n",j+1,avg,maxi+1);

追答

改为:
int a[M][N],i,j,max,maxi; int *p=(int*)a;
double sum,avg;
for(i=0;imax)
{
max=*(p + i *j + N); maxi=i;
}
}
avg=sum/N;
printf("第%d门课的平均成绩为%.2lf,最高成绩的同学的序号为:%d\n",j+1,avg,maxi+1);

第3个回答  2012-12-13
您是知道思路不懂c啊?还是懂c不知道思路啊?追问

指针的不懂,

追答

那您先不用这个写一个范本,别人也好改

追问

int a[M][N],i,j,max,maxi;
double sum,avg;
for(i=0;imax)
{
max=a[i][j]; maxi=i;
}
}
avg=sum/N;
printf("第%d门课的平均成绩为%.2lf,最高成绩的同学的序号为:%d\n",j+1,avg,maxi+1);

相似回答