标签:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#define MAX 100
typedef int elemType;
typedef int elemInfo;
typedef struct
{
elemType num; //学号
elemType cls; //班级
char* name; //名字
elemType score[10]; //分数
}stuInfo;
typedef struct{
stuInfo stu[MAX];
elemType length; // 存储的个数
}stuType;
void DisplayMenu(){ //选择菜单
printf("MENU\n");
printf("---------*******************************************************---------\n");
printf("---------*1. 批量输入学生信息 *---------\n");
printf("---------*2. 通过键盘输入某位学生某次的分数 *---------\n");
printf("---------*3. 输出所有学生信息 *---------\n");
printf("---------*4. 初始化学生信息 *---------\n");
printf("---------*5. 给定学号,显示某位学生作业完成情况 *---------\n");
printf("---------*6. 给定某位学生的学号,修改该学生的信息 *---------\n"); //修改
printf("---------*7. 删除学生信息 *---------\n");
printf("---------*8. 给定某个班级的班号,显示该班所有学生的作业完成情况*---------\n");
printf("---------*9. 输出某个班级某次作业学生的排名 *---------\n");
printf("---------*10.输出全部学生某次作业的排名 *---------\n");
printf("---------*******************************************************---------\n");
}
int choiceItem(){ //选择菜单
int choice ;
do{
DisplayMenu();
printf("请选择一个你要执行的功能序号:");
scanf("%d",&choice);
}while(choice<0 || choice >10);
return choice;
}
void Init (stuType *s){
s->length=0;
}
void inputAInfo(stuInfo* as,stuType* s){ //通过键盘输入某位学生某次的分数
printf("输入学号:\n");
int j,num;
scanf("%d",&num);
for(j=0;j<s->length;j++){
if(s->stu[j].num==num){
printf("学号已存在,请重新输入学号:");
scanf("%d",&num),j=0;
}
}
as->num=num;
printf("输入班级:\n");
scanf("%d",&as->cls);
as->name=(char*)malloc(30);
printf("输入姓名:");
scanf("%s",as->name);
int i;
for (i = 0; i < 10; ++i)
{
printf("输入该学生第 %d 次的成绩:\n",i+1);
scanf("%d",&as->score[i]);
}
}
int printAEqu(stuType s,int index){ // 输出一个学生的信息inidex 学生的平均分
int i,sum=0;
for (i = 0; i < 10; ++i)
{
sum+=s.stu[index].score[i];
}
return (sum/10);
}
void printAInfo(stuType s,int index){ // 输出一个学生的信息
if(index!=-1)
{
int i,sum=0;
printf("%-11d%-6s%-6d",s.stu[index].num,s.stu[index].name,s.stu[index].cls);
for (i = 0; i < 10; ++i)
{
printf("%-5d",s.stu[index].score[i]);
sum+=s.stu[index].score[i];
}
printf("%4d\n",sum/10);
}
else
printf("没有这个学生!");
}
void inputAllInfo(stuType *s ,int length){ //输入全部学生的信息
printf("您正在加入 %d 个学生信息 \n",length);
int i;
for (i = 0; i < length; ++i)
{
if(s->length==MAX){
printf("超出限制!\n");
break;
}
inputAInfo(&s->stu[s->length],s);
s->length++;
}
}
void printAllInfo(stuType s){ // 输出全部学生信息
if(s.length==0){
printf("没有学生信息,请录入!\n");
return ;
}
printf(" 学号 姓名 ");
printf("班级 ");
int j;
for(j=0;j<10;j++)
{
printf("%dth ",j+1);
}
printf("平均分");printf("\n");
int i;
for ( i = 0; i < s.length; ++i)
{
printAInfo(s,i);
}
}
int search(stuType s){
int num;
printf("输入学号:\n");
scanf("%d",&num);
int i;
for (i = 0; i < s.length; ++i)
{
if(s.stu[i].num==num)
return i;
}
return -1;
}
void modify(stuType*s ,stuType stu){ //修改学生信息
int num,scoreIndex,FuckYou=0;
if(s->length==0)
printf("没有学生信息!\n");
else
{
printf("输入学号:");
scanf("%d",&num);
int i,j;
for ( i = 0; i <= s->length; ++i)
{
if (stu.stu[i].num==num)
{
printf("输入你要修改的是第几次成绩:");
scanf("%d",&scoreIndex);
printf("新修改的成绩为:");
scanf("%d",&s->stu[i].score[scoreIndex-1]);
FuckYou=1;
}
}
if(!FuckYou)
printf("没有这个学生\n");
}
}
void del(stuType* s,int index){ //删除学生信息
if(s->length==0) //判断存储学生的 stuType stu数组的长度
printf("没有这个学生 !\n");
else{
if(index!=-1) // 在调用 search()函数的时候输入学号 后返回index index为 该学生的小标 该学生表示为 s->stu[index]
{
for(;index < s->length;index++) // 资料 《数据结构教程》 P34 删除数据元素思想 。到从下标 index开始,后一个替代前一个元素。
s->stu[index]=s->stu[index+1];
s->length--; // 一直向前移动.到 整个数组长度减一 依次实现删除数据。
}
}
}
void searchCls(stuType* s){ // 按班级搜索
int cls,i;
printf("输入班级:\n");
scanf("%d",&cls);
if (!cls)
printf("没有这个班级\n");
else
for (i = 0; i < s->length; ++i)
{
if(s->stu[i].cls==cls)
printAInfo(*s,i);
}
}
{ // 班级内部分数排序
int cls,i,k,scoreIndex,passnum=0;
int a[20];
printf("输入班级:\n");
stuInfo ohshit;
scanf("%d",&cls);
if (!cls) //
printf("没有这个班级\n");
else
{
printf("需要哪次作业成绩排名或者输入111输出平均分排名:");
scanf("%d",&scoreIndex);
printf(" 名字 学号 ");
scoreIndex==111?printf("平均分\n"):printf("第%d次\n",scoreIndex);
int j=0;
for (i = 0; i < s->length; ++i) // 对整个存储学生的 stu 进行遍历
{
if(s->stu[i].cls==cls) //判断 学生的 班级cls 是否是要查询的班级
{
a[j]=i; //如果该学生是这个班级的学生 记录下这个学生的下标保存到数组 a[]
j++;
}
}
j--; // 遍历以后 数组 a[j] 里面存储的都是 所查询班级的学生的 s->stu[] 下标
for(i=0;i<j;i++) // 资料 《数据结构教程》P293 冒泡排序 . 开始
{
for(k=j;k>i;k--)
{
if((scoreIndex==111)?printAEqu(*s,a[k])> printAEqu(*s,a[k-1]):s->stu[a[k]].score[scoreIndex-1] > s->stu[a[k-1]].score[scoreIndex-1])
{
ohshit=s->stu[a[k]];
s->stu[a[k]]=s->stu[a[k-1]];
s->stu[a[k-1]]=ohshit;
}
}
}
// 冒泡排序结束
for(i=0;i<=j;i++){
if(s->stu[i].score[scoreIndex-1]>=60 || printAEqu(*s,a[i])>=60)
passnum++;
printf("%-10s",s->stu[a[i]].name);
printf("%-14d ",s->stu[a[i]].num);
printf("%-5d\n",(scoreIndex==111)?printAEqu(*s,a[i]):s->stu[a[i]].score[scoreIndex-1]);
}
printf("及格人数为 %d,总人数为 %d\n",passnum,j+1);
}
}
void allInSort(stuType *s)
{
int i,j,scoreIndex,passnum=0;
printf("需要哪次作业成绩排名或者输入111输出平均分排名:");
scanf("%d",&scoreIndex);
printf(" 名字 学号 ");
scoreIndex==111?printf("平均分\n"):printf("第%d次\n",scoreIndex);
stuInfo tmp;
for(i=0;i<s->length-1;i++) // 资料 《数据结构教程》P293 冒泡排序 . 开始
{
for(j=s->length-1;j>i;j--)
{
if((scoreIndex==111)?printAEqu(*s,j)> printAEqu(*s,j-1):s->stu[j].score[scoreIndex-1] > s->stu[j-1].score[scoreIndex-1])
{
tmp=s->stu[j];
s->stu[j]=s->stu[j-1];
s->stu[j-1]=tmp;
}
} // 冒泡排序结束
}
for(i=0;i<s->length;i++){
if(s->stu[i].score[scoreIndex-1]>=60 || printAEqu(*s,i)>=60)
passnum++;
printf("%-10s",s->stu[i].name);
printf("%-14d ",s->stu[i].num);
printf("%-5d\n",(scoreIndex==111)?printAEqu(*s,i):s->stu[i].score[scoreIndex-1]);
}
printf("及格人数为:%d,总人数为:%d\n",passnum,s->length);
}
int main(){ //主函数
stuType student;
student.length=0;
int choice,index;
Init(&student);
int ch;
do{
choice=choiceItem();
switch(choice){
case 1: printf("输入你要输入学生信息的个数:");
scanf("%d",&index);
inputAllInfo(&student,index);break;
case 2: inputAllInfo(&student,1);break;
case 3: printAllInfo(student);break;
case 4: Init(&student);break;
case 5: printAInfo(student,search(student));break;
case 6: modify(&student, student);break;
case 7: del(&student,search(student));break;
case 8: searchCls(&student);break;
case 9: clsInSort(&student);break;
case 10:allInSort(&student);break;
}
system("pause"); //按任意键继续运行
}
while(choice);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/webers/p/4168427.html