C语言大作业,C语言高手们救下小弟啊```

Python015

C语言大作业,C语言高手们救下小弟啊```,第1张

这是我在大学做过的课程设计,你看看:

/*

程序功能:

能完成每位学生的某门课程的平时成绩和期末考试成绩的录入,

完成每位学生的总评成绩计算(平时成绩*30%+期末考试成绩*70%)并生成数据文件,

生成分数段统计文件(不及格人数,60-69数,70-79人数,80-89人数,90-100人数,及格率),

通过学生成绩的数据文件查询学生成绩(查询条件自定)。

通过学生成绩的分段统计文件输出学生成绩分段情况和及格率。

程序要求:

(1)能够完成300人以内任何人数的成绩处理。

(2)程序要有主控菜单

*/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct stud

{

long num

char name[20]

double score

}

typedef struct stucode

{

struct stud student

struct stucode *next

}L

void menu()

void createlist(struct stucode **r)

void out(struct stucode *r)

void search1(struct stucode *r)

void search2(struct stucode *r)

void del(struct stucode **r)

void insert(struct stucode **r)

void sort(struct stucode **r)

void main()

{

char choose

int flag=1

struct stucode *r=NULL

while(flag)

{

system("cls")

menu()

choose=getchar()

switch(choose)

{

case '1':

createlist(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '2':

search1(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '3':

search2(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '4':

del(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '5':

insert(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '6':

sort(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '7':

out(r)

printf("Testing function 7\nPress any key to continue\n")

getchar()

getchar()

break

case '0':

flag=0

printf("The end.\n")

break

default: printf("\nWrong Selection!(选择错误,请重选!)\n")getchar()getchar()

}

}

}

void createlist(struct stucode **r)

{

struct stucode *p,*t

long n

char a[20]

double s

if(*r) *r=NULL

printf(" \n请输入:\n 学号(请按学号升序排列) 姓名 分数 (若要结束请输入三个为零)\n")

scanf("%ld%s%lf",&n,a,&s)

if(n==0) return

p=(L *)malloc(sizeof(L))

p->student.num=n

strcpy(p->student.name,a)

p->student.score=s

p->next=NULL

*r=p

scanf("%ld%s%lf",&n,a,&s)

while(n)

{

t=p

p=(L *)malloc(sizeof(L))

p->student.num=n

strcpy(p->student.name,a)

p->student.score=s

p->next=NULL

t->next=p

scanf("%ld%s%lf",&n,a,&s)

}

}

void search1(struct stucode *r)

{

long x

if(!r)

{

printf("没有学生信息可查询!\n")

return

}

printf(" 请输入要查询的学生信息的学生学号:\n")

scanf("%ld",&x)

while(r&&r->student.num!=x)

r=r->next

if(r==NULL)

printf("Error! No such student !\n")

else

printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)

}

void search2(struct stucode *r)

{

char m[20]

if(!r)

{

printf("没有学生信息可查询!\n")

return

}

printf(" 请输入要查询的学生信息的学生姓名:\n")

scanf("%s",m)

while(r&&strcmp(r->student.name,m))

r=r->next

if(r==NULL)

printf("Error! No such student !\n")

else

printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)

}

void del(struct stucode **r)

{

long k

struct stucode *p=*r,*t

if(!(*r))

{

printf("没有学生信息可删除 !\n")

return

}

printf(" 请输入要删除的学生信息的学生学号:\n")

scanf("%ld",&k)

if(p->student.num==k)

*r=(*r)->next,free(p)

else

{

while(p->next&&p->next->student.num!=k)

p=p->next

if(p->next==NULL)

printf("Error! No such student !\n")

else

{

t=p->next

p->next=p->next->next

free(t)

}

}

}

void insert(struct stucode **r)

{

long n

char a[20]

double s

L *p,*t,*k

printf(" 请输入要插入的学生信息的学生学号 姓名 分数:\n")

scanf("%ld%s%lf",&n,a,&s)

p=(L *)malloc(sizeof(L))

p->student.num=n

p->student.score=s

strcpy(p->student.name,a)

if(!(*r))

{

*r=p

(*r)->next=NULL

return

}

if(p->student.num<(*r)->student.num)

p->next=(*r),(*r)=p

else

{

t=*r

k=t

while(t->next&&t->next->student.num<=p->student.num)

t=t->next

p->next=t->next

t->next=p

*r=k

}

}

void sort(struct stucode **r)

{

struct stucode *t,*p,*q,*z

if(!r)

{

printf("没有学生信息可排序!\n")

return

}

if(!(*r)||!(*r)->next)

return

t=*r

p=t->next

t->next=NULL

while(p)

{

q=p->next

if(p->student.score>t->student.score)

{

p->next=t

t=p

}

else

{

z=t

while(z->next&&z->next->student.score>=p->student.score)

z=z->next

p->next=z->next

z->next=p

}

p=q

}

*r=t

}

void out(struct stucode *r)

{

printf("\n\n")

if(!r)

{

printf("没有学生信息可输出!\n")

return

}

while(r)

{

printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)

r=r->next

}

printf("\n\n")

}

void menu()

{

printf("\n 学生信息管理系统\n")

printf("\n 菜单\n\n")

printf("\n 1建立链表并显示\n")

printf("\n 2查找某学号的学生信息\n")

printf("\n 3查找某姓名的学生信息\n")

printf("\n 4删除某学号的学生信息\n")

printf("\n 5插入新的学生信息\n")

printf("\n 6按分数降序排列输出\n")

printf("\n 7输出\n")

printf("\n 0退出\n")

printf("\n 请选择您要执行的选项:\n")

}

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<conio.h>

#define max 20

typedef struct student//学生

{

char sno[max]// 学号

char sname[max] //姓名

char sex[max] //性别

char age[max] //年龄

char depart[max] //系

char classs[max] //班

char grade[max]//年级

struct student* next

} student

student* head

int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输

{

char username[max],password[max]

printf("\n请输入用户名:")

scanf("%s",username)

printf("\n请输入密码(最多15位):")

//开始以不回显且支持退格方式获取输入密码

int i=0

while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围

{

if(password[i-1]=='\b')//对退格键的处理

{

printf("%c%c%c",'\b','\0','\b')

i=i-2

}

else

printf("*")

}

password[--i]='\0'

//已获取密码。验证用户身份

if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))

{

printf("\n登录成功!")

return 1

}

else

return 0

}

void regist()

{

char ch

student *s,*ptr //s用来建新结点,ptr用来暂存头结点

do

{

s=(student*)malloc(sizeof(student))// 新建一个学生结点

printf("\n开始注册...") //开始注册

printf("\n请输入该学生的学号:")

scanf("%s",s->sno)

printf("\n请输入该学生的姓名:")

scanf("%s",s->sname)

printf("\n请输入该学生的性别:")

scanf("%s",s->sex)

printf("\n请输入该学生的年龄:")

scanf("%s",s->age)

printf("\n请输入该学生的系:")

scanf("%s",s->depart)

printf("\n请输入该学生所在的班:")

scanf("%s",s->classs)

printf("\n请输入该学生所在的年级")

scanf("%s",s->grade)

ptr=head

head=s//将新结点插入队头

s->next=ptr

fflush(stdin)

printf("\n请问是否继续注册?(Y/N)")

scanf("%c",&ch)

}while(ch=='Y'||ch=='y')

return

}

void ElePrint(char str[]) //输出单个元素

{

if(str==NULL) exit(0)

printf("%s",str)

for(unsigned int i=0i<12-strlen(str)i++) printf(" ")//为了对齐输出,需插入一些空格

return

}

int LinePrint(student *ptr) //输出一行

{

if(ptr==NULL) //检查传进来的指针

return 0

printf("\n")

ElePrint(ptr->sno)

ElePrint(ptr->sname)

ElePrint(ptr->age)

ElePrint(ptr->sex)

ElePrint(ptr->depart)

ElePrint(ptr->classs)

ElePrint(ptr->grade)

return 1

}

void print() //输出全部学生信息

{

student *ptr=head

printf("\n学号姓名年龄性别系 班 年级")

while(ptr)

{

LinePrint(ptr)

ptr=ptr->next

}

printf("\n")

return

}

void search()//查询模块

{

int method//查询方式

char no[max],name[max],departm[max],clss[max],grades[max]//用来接收查询关键字

while(1)

{

printf("\n请选择查询方式")

printf("\n1.按学号查询")

printf("\n2.按姓名查询")

printf("\n3.按所在系查询")

printf("\n4.按所在班级查询")

printf("\n5.按所在年级查询")

printf("\n6.打印全部学生信息")

printf("\n7.返回主菜单\n")

scanf("%d",&method)

student *p=head,*temp

switch(method)

{

case 1:

printf("\n请输入要查询的学号:")

scanf("%s",no)

while(p)

{

if(!strcmp(p->sno,no))

break

else

{

temp=p

p=p->next

}

}

printf("\n学号姓名年龄性别系 班 年级")

LinePrint(p)

break

case 2:

printf("\n请输入要查询的姓名:")

scanf("%s",name)

printf("\n学号姓名年龄性别系 班 年级")

while(p)

{

if(!strcmp(p->sname,name))

LinePrint(p)

p=p->next

}

break

case 3:

printf("\n请输入学生所在的系:")

scanf("%s",departm)

printf("\n学号姓名年龄性别系 班 年级")

while(p)

{

if(!strcmp(p->depart,departm))

LinePrint(p)

p=p->next

}

break

case 4:

printf("\n请输入学生所在的班:")

scanf("%s",clss)

printf("\n请输入学生所在的年级:")

scanf("%s",grades)

printf("\n学号姓名年龄性别系 班 年级")

while(p)

{

if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))

LinePrint(p)

p=p->next

}

break

case 5:

printf("\n请输入学生所在的年级:")

scanf("%s",grades)

printf("\n学号姓名年龄性别系 班 年级")

while(p)

{

if(!strcmp(p->grade,grades))

LinePrint(p)

p=p->next

}

break

case 6:

print()

break

case 7:

return

default:

printf("很抱歉,暂无此查询方式!")

break

}

}

}

void modify()//修改学生信息

{

char num[max]

student *p=head

printf("\n请输入要修改的学生的学号:")

scanf("%s",num)

while(p)

{

if(!strcmp(p->sno,num))

break

else

p=p->next

}

if(p==NULL)

{

printf("\n错误:没有此学生的信息!\n")

return

}

LinePrint(p)

printf("\n请输入要修改的该学生的信息:")

printf("\n1.姓名")

printf("\n2.性别")

printf("\n3.年龄")

printf("\n4.所在的系")

printf("\n5.所在的班")

printf("\n6.所在的年级")

char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max]

int select

fflush(stdin)

scanf("%d",&select)

printf("\n请输入新的信息:")

switch(select)

{

case 1:

scanf("%s",name1)

strcpy(p->sname,name1)

break

case 2:

scanf("%s",sex1)

strcpy(p->sex,sex1)

break

case 3:

scanf("%s",age1)

strcpy(p->age,age1)

break

case 4:

scanf("%s",depart1)

strcpy(p->depart,depart1)

break

case 5:

scanf("%s",class1)

strcpy(p->classs,class1)

break

case 6:

scanf("%s",grade1)

strcpy(p->grade,grade1)

break

default:

printf("\nError!")

break

}

LinePrint(p)

return

}

void del()// 删除某学生的信息

{

student *p=head,*temp=head,*s

char num1[max]

printf("\n请输入要删除的学生的学号:")

scanf("%s",num1)

while(p)//查找该学生所在的结点

{

if(!strcmp(p->sno,num1))

break

else

{

temp=p

p=p->next

}

}//while

if(!p)

{

printf("\n不存在此学生的信息.")

return

}

LinePrint(p)//输出该学生的信息

printf("\n请问真的要删除该学生的信息吗?(Y/N)")

char ch

fflush(stdin)

scanf("%c",&ch)

if(ch=='Y'||ch=='y')

{

s=p->next

temp->next=s

free(p)

printf("\n已经删除该学生的信息.")

}

return

}

void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现

{

student *ptr,*s=head,*p

int count=0,count1

while(s)//统计链表结点个数

{

count++

s=s->next

}

for(int i=1i<counti++)

{

ptr=head

p=NULL

count1=count-i//用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点

while(ptr&&ptr->next&&(count1--))

{

if(strcmp(ptr->sno,ptr->next->sno)>0)

{

s=ptr->next

ptr->next=s->next

if(p==NULL) //ptr处于队头时

head=s

else

p->next=s

s->next=ptr

p=s

}

else

{

ptr=ptr->next

if(p==NULL) //ptr处于队头时

p=head

else

p=p->next

}

}

}

return

}

void quit()

{

char ch

printf("\n真的要退出?(Y/N)")

fflush(stdin)

scanf("%c",&ch)

if(ch=='Y'||ch=='y')

exit(0)

return

}

int main()

{

int option

printf("\nCopyright@2005 KongXinCai All rights reserved.")

printf("\n欢迎使用学生信息管理系统!\n")

//登录模块

int icheck=0

while(icheck<3)

{

if(LogOn()==0)

icheck++

else

break

}

if(icheck==3)

{

printf("\n连续登录三次不成功,退出!")

exit(0)

}

//系统界面

while(1)

{

printf("\n\n请选择需要的服务:")

printf("\n1.注册")

printf("\n2.查询")

printf("\n3.修改")

printf("\n4.删除")

printf("\n5.排序")

printf("\n7.求平均")

printf("\n6.退出\n")

scanf("%d",&option)

switch(option)

{

case 1:

regist()

break

case 2:

search()

break

case 3:

modify()

break

case 4:

del()

break

case 5:

sort()

break

case 6:

quit()

break

}

}

return 0

}

#include "stdio.h"

/*定义学生结构体*/

struct Student

{

     char ID[20]

     char Name[20]

     float Mark1

     float Mark2

     float Mark3

     float Average

}

/*声明学生数组及学生数量*/

struct Student students[1000]

int num=0

/*求平均值*/

float Avg(struct Student stu)

{

     return (stu.Mark1+stu.Mark2+stu.Mark3)/3

}

/*通过学号返回数组下标*/

int Student_SearchByIndex(char id[])

{

     int i

     for (i=0i<numi++)

     {

         if (strcmp(students[i].ID,id)==0)

         {

              return i

         }

     }

     return -1

}

/*通过姓名返回数组下标*/

int Student_SearchByName(char name[])

{

     int i

     for (i=0i<numi++)

     {

         if (strcmp(students[i].Name,name)==0)

         {

              return i

         }

     }

     return -1

}

/*显示单条学生记录*/

void Student_DisplaySingle(int index)

{

     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩")

     printf("-------------------------------------------------------------\n")

     printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,

              students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average)

}

/*插入学生信息*/

void Student_Insert()

{

     while(1)

     {

         printf("请输入学号:")

         scanf("%s",&students[num].ID)

         getchar()

printf("请输入姓名:")

         scanf("%s",&students[num].Name)

         getchar()

printf("请输入成绩:")

         scanf("%f",&students[num].Mark1)

         getchar()

printf("请输入成绩:")

         scanf("%f",&students[num].Mark2)

         getchar()

printf("请输入成绩:")

         scanf("%f",&students[num].Mark3)

         getchar()

students[num].Average=Avg(students[num])

         num++

printf("是否继续?(y/n)")

         if (getchar()=='n')

         {

              break

         }

     }

}

/*修改学生信息*/

void Student_Modify()

{

     float mark1,mark2,mark3

     while(1)

     {

         char id[20]

         int index

         printf("请输入要修改的学生的学号:")

         scanf("%s",&id)

         getchar()

         index=Student_SearchByIndex(id)

         if (index==-1)

         {

              printf("学生不存在!\n")

         }

         else

         {

              printf("你要修改的学生信息为:\n")

              Student_DisplaySingle(index)

              printf("-- 请输入新值--\n")

              printf("请输入学号:")

              scanf("%s",&students[index].ID)

              getchar()

              printf("请输入姓名:")

              scanf("%s",&students[index].Name)

              getchar()

              printf("请输入成绩:")

              scanf("%f",&students[index].Mark1)

              getchar()

              printf("请输入成绩:")

              scanf("%f",&students[index].Mark2)

              getchar()

              printf("请输入成绩:")

              scanf("%f",&students[index].Mark3)

              getchar()

              students[index].Average=Avg(students[index])

         }

         printf("是否继续?(y/n)")

         if (getchar()=='n')

         {

              break

         }

     }

}

/*删除学生信息*/

void Student_Delete()

{

     int i

     while(1)

     {

         char id[20]

         int index

         printf("请输入要删除的学生的学号:")

         scanf("%s",&id)

         getchar()

         index=Student_SearchByIndex(id)

         if (index==-1)

         {

              printf("学生不存在!\n")

         }

         else

         {

              printf("你要删除的学生信息为:\n")

              Student_DisplaySingle(index)

              printf("是否真的要删除?(y/n)")

              if (getchar()=='y')

              {

                   for (i=indexi<num-1i++)

                   {

                       students[i]=students[i+1]

                   }

                   num--

              }

              getchar()

         }

         printf("是否继续?(y/n)")

         if (getchar()=='n')

         {

              break

         }

     }

}

/*按姓名查询*/

void Student_Select()

{

     while(1)

     {

         char name[20]

         int index

         printf("请输入要查询的学生的姓名:")

         scanf("%s",&name)

         getchar()

         index=Student_SearchByName(name)

         if (index==-1)

         {

              printf("学生不存在!\n")

         }

         else

         {

              printf("你要查询的学生信息为:\n")

              Student_DisplaySingle(index)

         }

         printf("是否继续?(y/n)")

         if (getchar()=='n')

         {

              break

         }

     }

}

/*按平均值排序*/

void Student_SortByAverage()

{

     int i,j

     struct Student tmp

     for (i=0i<numi++)

     {

         for (j=1j<num-ij++)

         {

              if (students[j-1].Average<students[j].Average)

              {

                   tmp=students[j-1]

                   students[j-1]=students[j]

                   students[j]=tmp

              }

         }

     }

}

/*显示学生信息*/

void Student_Display()

{

     int i

     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩")

     printf("-------------------------------------------------------------\n")

     for (i=0i<numi++)

     {

         printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,

              students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average)

     }

}

/*将学生信息从文件读出*/

void IO_ReadInfo()

{

     FILE *fp

     int i

     if ((fp=fopen("Database.txt","rb"))==NULL)

     {

         printf("不能打开文件!\n")

         return

     }

     if (fread(&num,sizeof(int),1,fp)!=1)

     {

         num=-1

     }

     else

     {

         for(i=0i<numi++)

         {

              fread(&students[i],sizeof(struct Student),1,fp)

         }

     }

     fclose(fp)

}

/*将学生信息写入文件*/

void IO_WriteInfo()

{

     FILE *fp

     int i

     if ((fp=fopen("Database.txt","wb"))==NULL)

     {

         printf("不能打开文件!\n")

         return

     }

     if (fwrite(&num,sizeof(int),1,fp)!=1)

     {

         printf("写入文件错误!\n")

     }

     for (i=0i<numi++)

     {

         if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)

         {

              printf("写入文件错误!\n")

         }

     }    

     fclose(fp)

}

/*主程序*/

main()

{

     int choice

     IO_ReadInfo()

     while(1)

     {

         /*主菜单*/

         printf("\n------ 学生成绩管理系统------\n")

         printf("1. 增加学生记录\n")

         printf("2. 修改学生记录\n")

         printf("3. 删除学生记录\n")

         printf("4. 按姓名查询学生记录\n")

         printf("5. 按平均成绩排序\n")

         printf("6. 退出\n")

         printf("请选择(1-6):")

         scanf("%d",&choice)

         getchar()

         switch(choice)

         {

         case 1:

              Student_Insert()

              break

         case 2:

              Student_Modify()

              break

         case 3:

              Student_Delete()

              break

         case 4:

              Student_Select()

              break

         case 5:

              Student_SortByAverage()

              Student_Display()

              break

         case 6:

              exit()

              break

         }

         IO_WriteInfo()

     }

}