C 语言程序编程 求解答

假设有N个学生,每个学生有M门课程,编写程序实现数据输入/输出、计算平均成绩、排列等功能。
1、编写函数hello(),输出“成绩统计程序”字样以及程序员的班级、学号和姓名;(班级 :生物技术2班 学号:2011040171082 姓名:李鹏)
2、编写函数average(int[],int),使用数组参数传入M个整数,计算并返回这M个整数的平均值;
3、编写函数sort(float[],int),使用数组参数传入N个浮点数,将这N个浮点数按从大到小的顺序排列;
4、编写函数display(float[],int),顺序输出数组中的N个浮点数;
5、编写函数main(),实现:
(1)显示“成绩统计程序”字样及作者所在班级、学号、姓名等信息;
(2)输入学生数N和课程数M;
(3)输入N个学生的M门课的成绩,同时调用avgerage()函数计算每个学生的平均成绩;
(4)调用display()函数输出排序前的学生平均成绩表;
(5)调用sort()函数对学生平均成绩排序;
(6)调用display()函数输出排序后的学生平均成绩表;
(7)要求:相应步骤提示信息明确

下面是我自己编的,菜鸟水平O(∩_∩)O,不知道合不合要求。图片为运行结果

#include<stdio.h>

#define STUDENT 100     //假设最大学生数不超过100

#define CLASS 20     //最大课程数不超过20 

void hello()

{

printf("成绩统计程序\n");

printf("班级 :生物技术2班  学号:2011040171082  姓名:李鹏\n");

}

float average(int a[],int x)

{

int i;

float sum=0;

for(i=0;i<x;i++)

sum+=a[i];

return(sum/x);

}

void display(float f[],int n)

{

int i;

for(i=0;i<n;i++)

printf("%f ",f[i]);

printf("\n");

}

void sort(float *p,int n)/*这里用了指针,将原数组重新排序后放回了原数组,现实情况下就不能分辨每个成绩是谁的了*/

{

int i,j;

float t;

for(j=n-1;j>=0;j--)

for(i=0;i<j;i++)

if(*(p+i)<*(p+i+1))

{

t=*(p+i);

*(p+i)=*(p+i+1);

*(p+i+1)=t;

}

}

void main()

{

int n,m,i,j;

int a[STUDENT][CLASS];

float avg[STUDENT];

  hello();              //(1)显示“成绩统计程序”字样及作者所在班级、学号、姓名等信息;

printf("输入学生数N:");//(2)输入学生数N和课程数M;

scanf("%d",&n);

    printf("输入课程数M:");

scanf("%d",&m);

    

for(i=0;i<n;i++)       //(3)输入N个学生的M门课的成绩

{

printf("请输入第%d个学生的M门课的成绩:",i+1);

for(j=0;j<m;j++)

scanf("%d",&a[i][j]);

avg[i]=average(a[i],m); //,同时调用avgerage()函数计算每个学生的平均成绩;

//printf("第%d个学生的平均成绩为:%f\n",i+1,avg[i]);//use to test

}

printf("排序前的学生平均成绩:");

display(avg,n);//(4)调用display()函数输出排序前的学生平均成绩表;

sort(avg,n);//(5)调用sort()函数对学生平均成绩排序;

printf("排序后的学生平均成绩:");

display(avg,n);//(6)调用display()函数输出排序后的学生平均成绩表;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-03
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define bool int
#define true 1
#define false 0
#define LEN sizeof(struct System)
struct System /*存放学生信息*/
{
char name[20]; /*姓名*/
char num[10]; /*学号*/
char c[5]; /*c语言成绩*/
char match[5]; /*数学成绩*/
char english[5]; /*英语成绩*/
struct System *next; /*下个结点*/
};
typedef struct System sys;
sys *head = NULL;
void ShowMenu(); /*菜单*/
void Find(); /*输出单个信息*/
void Display(); /*输出全部信息*/
void Addition(); /*增加学生信息*/
void Modify(); /*修改学生信息*/
void Delete(); /*删除学生信息*/
void Aver();
void Save(); /*输出信息到文件*/
void Open(); /*文件信息输出到链0表*/
sys *FindMessage(); /*查找信息*/
int main()
{
char x;
bool quit = false; /*创建并设置退出循环的条件为假*/
Open();
while(!quit)
{
ShowMenu(); /*显示菜单*/
scanf("%s", &x);
switch(x)
{
case'0':
quit = true;
Save();
break;
case'1':
Addition();
break;
case'2':
Modify();
break;
case'3':
Delete();
break;
case'4':
Find();
break;
case'5':
Display();
break;
default:
break;
}
}
return 0;
}
/*菜单显示*/
void ShowMenu()
{
printf("\n********************************************* \n");
printf("1.增加学生 ");
printf("2.修改学生 ");
printf("3.删除学生 ");
printf("4.查找学生 ");
printf("5.显示全部学生 ");
printf("0.退出\n");
printf("********************************************* \n");
printf("请选择 ");
}

/*增加信息*/
void Addition()
{
sys *p1 = NULL, *p2 = NULL;
p1 = (sys * )malloc(sizeof(sys));
printf("输入姓名:");
scanf(" %s ",p1->name);
printf("输入学号:");
scanf(" %s ",p1->num);
printf("输入c语言成绩:");
scanf(" %s ",p1->c);
printf("输入数学成绩:");
scanf(" %s ",p1->match);
printf("输入英语成绩:");
scanf(" %s ",p1->english);
p1->next = NULL;
if(NULL == head)
{
head = (sys * )malloc(sizeof(sys));
head->next=p1;
}else
{
for(p2 = head;p2->next!=NULL;p2=p2->next);
p2->next=p1;
}
}
/*查找用户*/
void Find()
{
sys *p = FindMessage();
if(NULL==p)
printf("对不起,没有找到该学生!\n");
else
printf("找到该学生:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english);

}
/*查找用户函数*/
sys *FindMessage()
{
char name[20];
sys *p = NULL;
printf("请输入姓名!\n");
scanf(" %s ",name);
if(head == NULL)
{
printf("学生管理系统没有记录,请输入记录后,再使用功能!\n");
return NULL;
}
for(p = head; p->next!= NULL; p = p->next)
if(!strcmp(p->next->name,name))
return p;
return NULL;
}

/*显示所有信息*/
void Display()
{
sys * p = NULL;
if(head==NULL)
{
printf("学生管理系统没有记录,请输入记录后,再使用功能!\n");
return;
}
for(p = head->next;p!=NULL;p=p->next)
printf("姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->name, p->num, p->c, p->match, p->english);
}

/*修改信息*/
void Modify()
{
sys *p=FindMessage();
if(NULL==p)
printf("对不起,没有找到该学生!\n");
else
{
printf("要修改学生的信息:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english);
printf("请输入新的姓名:\n");
scanf("%s",p->next->name);
printf("请输入新的学号:\n");
scanf("%s",p->next->num);
printf("请输入新的c语言成绩:\n");
scanf("%s",p->next->c);
printf("请输入新的数学成绩:\n");
scanf("%s",p->next->match);
printf("请输入新的英语成绩:\n");
scanf("%s",p->next->english);
p->next->next=NULL;
}
}

/*删除信息*/
void Delete()
{
sys *temp = NULL;
sys *p=FindMessage();
if(NULL==p)
printf("对不起,没有找到该学生!\n");
else
{
printf("要删除学生的信息:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english);
temp=p->next;
p->next=p->next->next;
free(temp);
}
}

/*输出信息到文件,并释放链表空间*/
void Save()
{
sys *p=NULL;
FILE *fp;
char *filename="book.txt";
if(head==NULL)
{
printf("\n记录为空!\n");
return;
}
else
p=head->next;
if((fp=fopen(filename,"w"))==NULL) /*出错检测*/
{
printf("\n打不开文件!\n");
return;
}
while(p!=NULL)
{
fprintf(fp, "%s\t %s\t %s\t %s\t %s\t\n",p->name, p->num, p->c, p->match, p->english);
p=p->next;
}
printf("保存完毕!\n");
fclose(fp);
for(;head->next!=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}

/*读取文件信息输出到链表*/
void Open()
{
FILE *fp;
sys *p1=NULL, *p2=NULL, *temp=NULL;
if((fp=fopen("book.txt","r"))==NULL)
{
printf("\n**************这是一个新的学生管理系统***************");
return;
}
head=(sys *)malloc(sizeof(sys));
head->next=NULL;
temp=p2=head;
while(!feof(fp)) /*读取文件信息*/
{
p1=(sys *)malloc(LEN);
temp=p2;
p2->next=p1;
p2=p1;
fscanf(fp,"%s %s %s %s %s", p1->name, p1->num, p1->c, p1->match, p1->english);
}
temp->next=NULL;
fclose(fp);
}