结构体类型 求助
设计一个程序,统计一个班(最多有35人)的学生成绩,要求能实现如下四个功能:
(1)由键盘输入每个学生的学号和四门课程的成绩
(2)计算每个学生的平均成绩和总成绩
(3)按总成绩从高到低排名,并按名次输出每个学生的情况,包括:学号,各科成绩,平均成绩,总成绩,排名
(4)根据要求输出某门课程(由键盘输入课程号)成绩在90分(含90分)以上且总分在前5名的学生情况
问题点数:50、回复次数:10Top
1 楼liubucheng(xiapliubuchneg)回复于 2006-03-13 18:12:26 得分 0
你可以用结构类型
typedf struct student{
int num;
char name[20];
float fs[]; }studs;
Top
2 楼hyz0906(超超)回复于 2006-03-13 18:14:32 得分 0
这是我的程序,请帮忙改一下:
#define str struct student
#define sc score
str
{
long num;
double sc[4],sum,ave;
};
static void px(p,k,i,l)
int i,l,k;
str *p[];
{
int m,n;
double t;
str *w;
t=(*p[i+k]).sc;w=p[i+k];n=2*(i+1)-1;m=i;
while(n<=l-1)
{
if((n<l-1)&&((*p[n+k]).sc<(*p[n+k+1].sc)))
n=n+1;
if(t<(*p[n+k]).sc)
{p[m+k]=p[n+k];
m=n;n=2*(m+1)-1;
}
else n=1;
}
p[m+k]=w;
return;
};
void rkey(p,n,k,m)
int n,k,m;
str *p[];
{
int i,l;
str *w;
void px();
if(k<0) k=0;
if(m>n-1) m=n-1;
l=m-k+1;
for(i=l-1;i>=0;i--)
px(p,k,i,l);
for(i=l-1;i>=1;i--)
{
w=p[k];p[k]=p[i+k];p[i+k]=w;
px(p,k,0,i);
};
return;
};
int search(p,k,m,a,l)
str p[];
double a;
int k,m;
{
int i;
i=k;
while((i<=m)&&((p[i].sc[l]>=a)))i=i+1;
if(i>m)return(-1);
return(i);
};
float sum(a,b,c,d)
{
float a,b,c,d,s;
s=a+b+c+d;
return(s);
};
float ave()
{
float av;
av=sum()/4;
return(av);
};
#include <stdio.h>
main()
{
int i,j,q,n,m,h;
double a=90.0;
str stu[35];
printf("1.input everyone's num and score;\n2.count average score and whole score;\n3.line the conditions of everyone;\n4.output the one whose one score is more than 90 and the mark is one of the frist 5th.\nPlease input the amount of the students
and the operation number:");
scanf("%d %d",&m,&n);
if(m>35)
printf("error!the biggest amount is 35.");
if(m<=35)
switch(n)
case 1:
printf("please input the information of the students.\n");
for(i=0;i<=m-1;i++)
scanf("%l %f %f %f %f",&stu[i].num,&stu[i].sc[0],&stu[i].sc[1],&stu[i].sc[2],&stu[i].sc[3]);
printf("\n");
printf("No. score 1 score 2 score 3 score 4\n");
for(i=0;i<=m;i++)
printf("%-8d%-5.2f%-5.2f%-5.2f%-5.2f\n",stu[i].num,stu[i].sc[0],stu[i].sc[1],stu[i].sc[2],stu[i].sc[3]");
case 2:
for(i=0;i<=m-1;i++)
sum(stu[i].sc[0],stu[i].sc[1],stu[i].sc[2],stu[i].sc[3]);
ave();
case 3:
str *p[m];
for(i=0;i<=m-1;i++)
p[i]=&stu[i];
printf("\n");
px(p,m,1,m-2)
printf("No. score 1 score 2 score 3 score 4 mark average\n");
for(i=0;i<=m-1;i++)
printf("%-8d%-5.2f%-5.2f%-5.2f%-5.2f%-5.2f%-5.2f\n",stu[i].num,stu[i].sc[0],stu[i].sc[1],stu[i].sc[2],stu[i].sc[3],stu[i].sum,stu[i].ave");
printf("\n");
case 4:
printf("please input the num of the score:");
scanf("%d",&h);
do
{
q=search(stu,i,m,a,h);
for(i=1;i<=5;i++)
if(q!=-1)
printf("%-8d%-5.2f%-5.2f%-5.2f%-5.2f%-5.2f%-5.2f\n",stu[i].num,stu[i].sc[0],stu[i].sc[1],stu[i].sc[2],stu[i].sc[3],stu[i].sum,stu[i].ave");
i=q+1;
};
while(q=-1)
printf("\n");
}Top
3 楼luo_luo(骆骆)回复于 2006-03-13 18:15:31 得分 0
不要用i j k这样的变量Top
4 楼du51(郁郁思扬)回复于 2006-03-13 19:39:23 得分 50
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 35
typedef struct tagSTU
{
char id[28];
float scores[4];
float avg;
float tot;
}STU;
STU* createSTU()
{
STU *stu=(STU*)malloc(sizeof(STU));
printf("请输入ID及成绩(以空格分开)\n");
scanf("%s%f%f%f%f",stu->id,&stu->scores[0],&stu->scores[1],\
&stu->scores[2],&stu->scores[3]);
stu->tot=stu->scores[0]+stu->scores[1]+stu->scores[2]+stu->scores[3];
stu->avg=stu->tot/4;
return stu;
}
void Equal(STU *a,STU *b)
{
a->scores[0]=b->scores[0];
a->scores[1]=b->scores[1];
a->scores[2]=b->scores[2];
a->scores[3]=b->scores[3];
strcpy(a->id,b->id);
a->avg=b->avg;
a->tot=b->tot;
}
void Sort(STU *addr,int num)
{
int i,j;
STU temp;
for(i=num-1;i>0;i--)
{
for(j=0;j<i;j++)
{
if(addr[j].tot<addr[j+1].tot)
{
Equal(&temp,&addr[j]);
Equal(&addr[j],&addr[j+1]);
Equal(&addr[j+1],&temp);
}
}
}
}
void Show(STU *addr,int num)
{
int i=0;
while(i<num)
{
printf("id:%s\n%.2f %.2f %.2f %.2f %.2f %.2f\n",addr[i].id,addr[i].scores[0],\
addr[i].scores[1],addr[i].scores[2],addr[i].scores[3],addr[i].avg,addr[i].tot);
i++;
}
}
void Showsub(STU *addr,int num,int s)
{
int i=0;
while(i<num&&i<5)
{
if(addr[i].scores[s]>89)
printf("id:%s\n%.2f %.2f %.2f %.2f %.2f %.2f\n",addr[i].id,addr[i].scores[0],\
addr[i].scores[1],addr[i].scores[2],addr[i].scores[3],addr[i].avg,addr[i].tot);
i++;
}
}
int main()
{
int num,i=0,s=0;
STU stu[MAX];
printf("请输入人数(<35)\n");
scanf("%d",&num);
if(num<1||num>MAX)return -1;
while(i<num)
{
stu[i]=*createSTU();
i++;
}
Sort(stu,num);
Show(stu,num);
printf("输入课号(0-3)\n");
scanf("%d",&s);
if(s<0||s>3)return -1;
Showsub(stu,num,s);
system("PAUSE");
return 0;
}
Top
5 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-13 21:05:06 得分 0
楼主直接参考 du51(郁郁思扬) 的程序吧 ~
看出来 这个老兄特意为你写了程序
不要辜负了人家的一片心意哈 ~
我看楼主你就以身相许好了 ^_^
----------------
楼主需要多看看基础啊 ~
函数的格式居然还是 那么古老的格式 ...
void rkey(p,n,k,m)
int n,k,m;
str *p[];
==》
void rkey(str p, int n, int k, int m)Top
6 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-13 21:08:13 得分 0
#define str struct student
#define sc score
str
{
long num;
double sc[4],sum,ave;
};
楼主啊,你的 define 看起来真是 ...
一般操作方式:
typedef struct student
{
long num;
double sc[4],sum,ave;
}str;Top
7 楼hyz0906(超超)回复于 2006-03-14 08:59:54 得分 0
大哥,您的程序我看不太懂.我是一名计算机系的大一学生,刚接触c语言半年,上个学期刚开始还可以,这个学期开始编写一些比较复杂的程序,觉得有点困难,请指教!Top
8 楼jinjiajie(leorio)回复于 2006-03-14 09:12:11 得分 0
....大一就有这实力,不错不错Top
9 楼hyz0906(超超)回复于 2006-03-14 09:26:00 得分 0
上面这个程序运行输入数据后为何会有这样的错误提示:
scanf:floating point formats not linked
Abnormal program termination
Top
10 楼hyz0906(超超)回复于 2006-03-15 12:29:12 得分 0
有人能指点一下吗?Top




