007年《C语言程序设计》实验报告题目

已知N个学生的学号、姓名和4门功课的成绩,计算:

(1) 每个学生的总分、平均分。

(2) 按总分从大到小排序,同时调整学号、姓名、4门功课成绩和平均分;输出经排序后全部学生的成绩单。

(3) 任意输入一个学生的学号,输出该学生的成绩单。

注:每一小题用一个函数完成。

详细程序代码如下:(有详细注解)
用VC6.0编译,保存代码时,以.C为后缀名.(TC2.0也可,但不能显示汉字)
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<process.h>
#define NAME_LENGTH 20/*名字长度*/
#define NUMBER_LENGTH 10/*学号长度*/
#define MAX_STUDENT_NUMBER 50/*最大的学生数,你可以改大的*/
/*定义一个保存学生信息的结构体*/
struct student
{
unsigned char name[NAME_LENGTH];/*学生名字*/
unsigned char number[NUMBER_LENGTH];/*学号*/
float mark1;/*学习成绩1*/
float mark2;/*学习成绩2*/
float mark3;/*学习成绩3*/
float mark4;/*学习成绩4*/
float avg;/*平均成绩*/
};
struct student studentData[MAX_STUDENT_NUMBER];/*定义一个数组来保存学生信息*/
int studentNumber=0;/*用来保存学生人数*/

/*函数声明*/
void GetOneStudentInfomation(struct student *stu);
void OutputAllStudentInformation(void);
void OutputOneStudentInfo(struct student out);
void SearchStudentByNumber(void);
void CompositorByAvg(void);
void Menu(void);
/*主函数*/
void main()
{
Menu();
getch();
}
/***************************************
函数功能:显示菜单,根据用户选择完成相应功能
****************************************/
void Menu(void)
{
int choose;
printf("1-->输入新学生信息\n");
printf("2-->按总分从大到小排序并显示所有学生的成绩\n");
printf("3-->按学生的学号显示学生成绩\n");
printf("4-->退出系统\n");
scanf("%d",&choose);
switch(choose) /*根据用户选择进行不同的操作*/
{
case 1:
GetOneStudentInfomation(&(studentData[studentNumber]));
break;
case 2:
OutputAllStudentInformation();
break;
case 3:
SearchStudentByNumber();
break;
case 4:
exit(0);
default:
break;
}
Menu();
}

/***************************************
函数功能:获取1个学生的数据信息,将数据保存到
stu指向的变量中
****************************************/
void GetOneStudentInfomation(struct student *stu)
{
printf("请输入学生姓名:\n");
scanf("%s",stu->name);
printf("请输入学生学号:\n");
scanf("%s",stu->number);
printf("请输入学生第1门成绩:\n");
scanf("%f",&(stu->mark1));
printf("请输入学生第2门成绩:\n");
scanf("%f",&(stu->mark2));
printf("请输入学生第3门成绩:\n");
scanf("%f",&(stu->mark3));
printf("请输入学生第4门成绩:\n");
scanf("%f",&(stu->mark4));
stu->avg=(stu->mark1+stu->mark2+stu->mark3+stu->mark4)/4;/*得到平均成绩*/
studentNumber++;/*得到一个学生信息后,学生人数增1*/
}
void OutputAllStudentInformation(void)
{
int i;
if(studentNumber==0)/*如果还没有学生信息,就提示用户*/
{
printf("还没有学生信息,请先输入学生信息\n");
return;
}
CompositorByAvg();/*先排序再输出*/
printf("名字\t学号\t第1门\t第2门\t第3门\t第4门\t平均成绩\n");
for(i=0;i<studentNumber;i++)
{
OutputOneStudentInfo(studentData[i]);
}
}
void SearchStudentByNumber(void)
{
unsigned char number[NUMBER_LENGTH];
int i;
int flag=0;
if(studentNumber==0)/*如果还没有学生信息,就提示用户*/
{
printf("还没有学生信息,请先输入学生信息\n");
return;
}
printf("请输入要查找的学生的学号:\n");
scanf("%s",number);
for(i=0;i<studentNumber;i++)
{
if(strcmp(number,studentData[i].number)==0)
{
printf("查到该学生\n");
printf("名字\t学号\t第1门\t第2门\t第3门\t第4门\t平均成绩\n");
OutputOneStudentInfo(studentData[i]);
flag=1;
break;
}
}
if(!flag)
printf("不存在学号为%s的学生\n",number);
}
/***************************************
函数功能:显示一个学生的信息
****************************************/
void OutputOneStudentInfo(struct student out)
{
printf("%s\t",out.name);
printf("%s\t",out.number);
printf("%.2f\t",out.mark1);
printf("%.2f\t",out.mark2);
printf("%.2f\t",out.mark3);
printf("%.2f\t",out.mark4);
printf("%.2f\t\n",out.avg);
}
/***************************************
函数功能:按总分高到低排序
****************************************/
void CompositorByAvg(void)
{
int i;
int j;
struct student temp;
if(studentNumber!=0)/*有学生信息时帮排序*/
for(i=0;i<studentNumber;i++)
{
for(j=i+1;j<studentNumber;j++)
{
if((studentData[j].mark1+studentData[j].mark2
+studentData[j].mark3+studentData[j].mark4)>
(studentData[i].mark1+studentData[i].mark2+studentData[i].mark3+studentData[i].mark4))/*后面的总成绩大时,就放到前面*/
{
temp.avg=studentData[i].avg;
temp.mark1=studentData[i].mark1;
temp.mark2=studentData[i].mark2;
temp.mark3=studentData[i].mark3;
temp.mark4=studentData[i].mark4;
strcpy(temp.name,studentData[i].name);
strcpy(temp.number,studentData[i].number);

studentData[i].avg=studentData[j].avg;
studentData[i].mark1=studentData[j].mark1;
studentData[i].mark2=studentData[j].mark2;
studentData[i].mark3=studentData[j].mark3;
studentData[i].mark4=studentData[j].mark4;
strcpy(studentData[i].name,studentData[j].name);
strcpy(studentData[i].number,studentData[j].number);

studentData[j].avg=temp.avg;
studentData[j].mark1=temp.mark1;
studentData[j].mark2=temp.mark2;
studentData[j].mark3=temp.mark3;
studentData[j].mark4=temp.mark4;
strcpy(studentData[j].name,temp.name);
strcpy(studentData[j].number,temp.number);
}
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-05-21
#include <stdio.h>
#include <string.h>

#define N 3//学生数目

typedef struct /*定义结构体数组*/
{
char num[20]; /*学号*/
char name[20]; /*姓名*/
float score[4]; /*成绩*/
float total;//总分
float average;//平均分
} Student;

Student stu[N];

//输入学生信息
void input()
{
int i,j;

printf("请输入%d个学生的信息:\n",N);
for(i=0;i<N;i++)
{
printf("学号:");
scanf("%s",stu[i].num);
printf("姓名:");
scanf("%s",stu[i].name);
for(j=0;j<4;j++)
{
printf("科目%d的成绩:",j+1);
scanf("%f",&stu[i].score[j]);
}
}
}

//输出学生信息
void output(int i)
{
int j;

printf("学生的信息如下:\n");
printf("学号:%s\n",stu[i].num);
printf("姓名:%s\n",stu[i].name);
for(j=0;j<4;j++)
{
printf("科目%d的成绩:%f\n",j+1,stu[i].score[j]);
}
printf("总分:%f\n",stu[i].total);
printf("平均分:%f\n",stu[i].average);
}

//计算总分和平均分
void process()
{
int i,j;

for(i=0;i<N;i++)
{
stu[i].total=0;
for(j=0;j<4;j++)
{
stu[i].total+=stu[i].score[j];
}
stu[i].average=stu[i].total/4;
}
}

//排序并输出
void sort()
{
Student tStu;
int i,j;

for(i=0;i<N;i++)
{
for(j=N-1;j>i;j--)
{
if(stu[j].total>stu[j-1].total)
{
tStu=stu[j];
stu[j]=stu[i];
stu[i]=tStu;
}
}
}
for(i=0;i<N;i++)
{
output(i);
}
}

//根据学号查找
void find(char *no)
{
int i;

for(i=0;i<N;i++)
{
if(strcmp(stu[i].num,no)==0)
{
output(i);
return;
}
}
printf("没有找到!\n");
}

void main()
{
input();
process();
sort();
find("1");
}本回答被提问者采纳
第2个回答  2008-05-21
好利害啊!!!
相似回答