=+(-:)? C语言达人请进!$$$$$

[复制链接]
查看11 | 回复4 | 2008-5-22 21:37:59 | 显示全部楼层 |阅读模式
gun
回复

使用道具 举报

千问 | 2008-5-22 21:37:59 | 显示全部楼层
这已经可以归入软件工程范畴了。。。
回复

使用道具 举报

千问 | 2008-5-22 21:37:59 | 显示全部楼层
详细程序代码如下:保存代码时,以.C为后缀名.用VC6.0编译.保存学生信息时,我是以student.txt为文件名的.运行程序时,应该在VC6.0生成的Debug文件夹下再运行本程序.(可以先建立student.txt文件,不先建也不要紧)保存数据的格式为:1000aaa 410 88 99 661001bbb 420 66 77 87即学号,姓名,班级,成绩1,成绩2,成绩3(你可以在原来基础上多加几门成绩,在这里由于篇幅,我就给了3门)#include#include#include#include#includetypedef struct STUDENT{ char studentNumber[10];/*学生学号*/ char studentName[20];/*学生姓名*/ char className[20];/*班级名称*/ float mark1;/*第1门成绩*/ float mark2;/*第2门成绩*/ float mark3;/*第3门成绩*/ struct STUDENT *next;}STUDENT;STUDENT *headLink;/*链表表头指针*//*以下是函数声明*/void ReadInfoFormFile(void);void DesplayMenu(void);void CreateHeadLink(void);STUDENT *MallocNode(void);void GetInformation(STUDENT *t);void OutputInformation(void);void DesplayInfoBystudentName(void);void DesplayInfoBystudentNumber(void);void DesplayOneNode(STUDENT *t);void InsertOneNode(STUDENT *t);void DeleteNodeBystudentNumber(void);void ChangeMarkByName(void);void ChangeMarkByNumber(void);void SaveLinkToFile(void);void DesplayMarkSegment(void);void CompositorByTotalMark(void);int choose;/*用于接受用户的选择*//*主函数*/void main(){ CreateHeadLink(); ReadInfoFormFile(); DesplayMenu();}/************************************函数功能:从文件中读学生信息到链表中************************************/void ReadInfoFormFile(void){ FILE *fp; STUDENT *p; fp=fopen("student.txt","r"); if(!fp) {printf("文件不存在\n");return; } p=MallocNode(); while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0) {InsertOneNode(p);p=MallocNode(); } fclose(fp);}/************************************函数功能:显示菜单,根据用户的输入完成相应的功能************************************/void DesplayMenu(void){ STUDENT *p; printf("-------请选择相应功能------------\n\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("|11退出
|\n\n"); scanf("%d",&choose);/*取得用户的选择*/ switch(choose) { case 1:OutputInformation();/*显示所有学生的信息*/break; case 2:DesplayInfoBystudentName();break; case 3:DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/break; case 4:p=MallocNode();/*先申请一个新结点*/GetInformation(p);/*要求用户输入信息到新结点中*/InsertOneNode(p);/*将新结点加到链表中*/break; case 5:DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/break; case 6:ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/break; case 7:ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/break; case 8:SaveLinkToFile();/*保存数据*/break; case 9:DesplayMarkSegment();/*显示各分数段的学生成绩*/break; case 10:CompositorByTotalMark();break; case 11:SaveLinkToFile();/*保存数据后再退出*/free(headLink);exit(1);break; default:break; } DesplayMenu();/*递归调用*/}/************************************函数功能:建立链表表头************************************/void CreateHeadLink(void){ STUDENT *p; p=(STUDENT*)malloc(sizeof(STUDENT)); headLink=p; p->next=NULL;}/************************************函数功能:申请一个新结点,并将其初始化************************************/STUDENT *MallocNode(void){ STUDENT *p; int i; p=(STUDENT*)malloc(sizeof(STUDENT)); if(p==NULL)return NULL; for(i=0;istudentNumber='\0'; for(i=0;istudentName='\0'; for(i=0;iclassName='\0';p->mark1=0.0;p->mark2=0.0;p->mark3=0.0;p->next=NULL; return p;}/************************************函数功能:取得用户输入的学生信息************************************/void GetInformation(STUDENT *t){ printf("请输入学生学号:\n"); scanf("%s",t->studentNumber); printf("请输入学生姓名:\n"); scanf("%s",t->studentName); printf("请输入该生所在班级:\n"); scanf("%s",t->className); printf("请输入第1门成绩:\n"); scanf("%f",&(t->mark1)); printf("请输入第2门成绩:\n"); scanf("%f",&(t->mark2)); printf("请输入第3门成绩:\n"); scanf("%f",&(t->mark3));}/************************************函数功能:在链表的结尾处增加一个结点************************************/void InsertOneNode(STUDENT *t){ STUDENT *p; p=headLink; while(p->next) {p=p->next; } p->next=t;}/************************************函数功能:根据用户输入的学生姓名显示该学生的信息************************************/void DesplayInfoBystudentName(void){ STUDENT *p; char studentName[20]; char flag=0; p=headLink->next; printf("请输入学生姓名:\n"); scanf("%s",studentName); while(p) {if(strcmp(p->studentName,studentName)==0){ printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); DesplayOneNode(p); flag=1; break;}p=p->next; } if(!flag)printf("对不起,不存在姓名为 %s 的学生\n",studentName);}/************************************函数功能:根据用户输入的学号显示该学生的信息************************************/void DesplayInfoBystudentNumber(void){ STUDENT *p; char studentNumber[10]; char flag=0; p=headLink->next; printf("请输入学生学号:\n"); scanf("%s",studentNumber); while(p) {if(strcmp(p->studentNumber,studentNumber)==0){ printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); DesplayOneNode(p); flag=1; break;}p=p->next; } if(!flag)printf("对不起,不存在学号为 %s 的学生\n",studentNumber);}/************************************函数功能:输出一个结点的信息************************************/void DesplayOneNode(STUDENT *t){ printf("%s\t",t->studentNumber); printf("%s\t",t->studentName); printf("%s\t",t->className); printf("%.2f\t",t->mark1); printf("%.2f\t",t->mark2); printf("%.2f\t",t->mark3); printf("%.2f\t",t->mark1+t->mark2+t->mark3); printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3);}/************************************函数功能:根据用户输入的学号删除该学生************************************/void DeleteNodeBystudentNumber(void){ char studentNumber[10]; STUDENT *p,*q; char flag=0; printf("请输入要删除的学生学号:"); scanf("%s",studentNumber); p=headLink; q=headLink->next; while(q) {if(strcmp(q->studentNumber,studentNumber)==0){ p->next=q->next; free(q); flag=1; break;}p=p->next;q=q->next; } if(!flag) {printf("不存在该学号的学生\n");return; } printf("成功删除\n");}/************************************函数功能:显示所有学生的信息************************************/void OutputInformation(void){ STUDENT *p; p=headLink->next; if(p==NULL) {printf("现在没有学生信息,请先输入学生信息\n\n");return; } printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) {DesplayOneNode(p);p=p->next; }}/************************************函数功能:根据输入的姓名修改成绩************************************/void ChangeMarkByName(void){ STUDENT *p; char studentName[20]; char flag=0; float mark1,mark2,mark3; p=headLink->next; printf("请输入学生姓名:\n"); scanf("%s",studentName); while(p) {if(strcmp(p->studentName,studentName)==0){ printf("请输入新的第1门成绩:\n"); scanf("%f",&mark1); printf("请输入新的第2门成绩:\n"); scanf("%f",&mark2); printf("请输入新的第3门成绩:\n"); scanf("%f",&mark3); p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; printf("修改成功\n"); break;}p=p->next; } if(!flag)printf("对不起,不存在姓名为 %s 的学生\n",studentName);}/************************************函数功能:根据输入的学号修改成绩************************************/void ChangeMarkByNumber(void){ STUDENT *p; char studentNumber[20]; char flag=0; float mark1,mark2,mark3; p=headLink->next; printf("请输入学生学号:\n"); scanf("%s",studentNumber); while(p) {if(strcmp(p->studentNumber,studentNumber)==0){ printf("请输入新的第1门成绩:\n"); scanf("%f",&mark1); printf("请输入新的第2门成绩:\n"); scanf("%f",&mark2); printf("请输入新的第3门成绩:\n"); scanf("%f",&mark3); p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; printf("修改成功\n"); break;}p=p->next; } if(!flag)printf("对不起,不存在学号为 %s 的学生\n",studentNumber);}/************************************函数功能:保存链表数据到文件中************************************/void SaveLinkToFile(void){ STUDENT *p; FILE *fp; p=headLink->next; if(p==NULL) {printf("现在没有学生信息,请先输入学生信息\n\n");return; } fp=fopen("student.txt","w+"); if(!fp) {printf("文件不存在\n");return; } while(p) {fprintf(fp,"%s%s%s%f%f%f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);p=p->next; } fclose(fp);}/************************************函数功能:显示优秀和不及格学生成绩************************************/void DesplayMarkSegment(void){ STUDENT *p; int count=0; p=headLink->next; printf("60分以下(不及格)的学生成绩如下:\n"); printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) {if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/{ count++; DesplayOneNode(p);}p=p->next; } printf("不及格的学生一共有%d人\n",count); p=headLink->next; printf("成绩优秀的学生成绩如下:\n"); printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); count=0; while(p) {if((8mark1/10)))&&(8mark2/10)))&&(8mark3/10)))){ count++; DesplayOneNode(p);}p=p->next; } printf("成绩优秀的学生一共有%d人\n",count);}/************************************函数功能:按总成绩排序************************************/void CompositorByTotalMark(void){ STUDENT exchange,*r,*p,*q; r=headLink->next; if(r==NULL) {printf("现在还没学生信息,请先输入学生信息\n");return; } while(r)/*两层while循环实现排序*/ {p=r;q=r->next;while(q){ if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3)) {
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.className,q->className);
exchange.mark1=q->mark1;
exchange.mark2=q->mark2;
exchange.mark3=q->mark3;
strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
strcpy(q->studentName,p->studentName);
strcpy(q->className,p->className);
q->mark1=p->mark1;
q->mark2=p->mark3;
q->mark3=p->mark3;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
strcpy(p->studentName,exchange.studentName);
strcpy(p->className,exchange.className);
p->mark1=exchange.mark1;
p->mark2=exchange.mark2;
p->mark3=exchange.mark3; } q=q->next;}r=r->next; } OutputInformation();}
回复

使用道具 举报

千问 | 2008-5-22 21:37:59 | 显示全部楼层
C语言课程设计报告-------学生成绩简单管理程序 一、系统菜单的主要功能 (1)输入若干条记录 (2)显示所有记录 (3)按学号排序 (4)插入一条记录 (5)按姓名查找,删除一条记录 (6)查找并显示一条记录 (7)输出统计信息 (新增) (8)从正文中添加数据到结构体数组中 (9)将所有数据写入文件中 (0)退出程序 二、题目分析 该题主要考察学生对结构体,指针,文件的操作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。 菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明: 功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。 功能2是显示所有的记录,通过循环输出,格式也比较重要。 功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函数。 功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。 功能6的算法在5中就已经体现了,输入姓名,一一比较。 功能7为新增的功能,因为考虑到原来给出的函数中竟然没有对学生成绩的统计功能,因此新增此功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。 功能8和9是对文件的操作,提前准备好数据。 三、程序正文部分 #include /*引用库函数*/ #include #include #include typedef struct /*定义结构体数组*/ { char num[10]; /*学号*/ char name[20]; /*姓名*/ int score; /*成绩*/ }Student; Student stu[80]; /*结构体数组变量*/ int menu_select() /*菜单函数*/ { char c; do{ system("cls"); /*运行前清屏*/ printf("\t\t****Students' Grade Management System****\n"); /*菜单选择*/ printf("\t\t | 1. Input Records |\n"); printf("\t\t | 2. Display All Records |\n"); printf("\t\t | 3. Sort |\n"); printf("\t\t | 4. Insert a Record |\n"); printf("\t\t | 5. Delete a Record |\n"); printf("\t\t | 6. Query |\n"); printf("\t\t | 7. Statistic |\n"); printf("\t\t | 8. Add Records from a Text File|\n"); printf("\t\t | 9. Write to a Text file |\n"); printf("\t\t | 0. Quit |\n"); printf("\t\t*****************************************\n"); printf("\t\t\tGive your Choice(0-9):"); c=getchar(); /*读入选择*/ }while(c'9'); return(c-'0'); /*返回选择*/ } int Input(Student stud[],int n) /*输入若干条记录*/ {int i=0; char sign,x[10]; /*x[10]为清除多余的数据所用*/ while(sign!='n'&&sign!='N') /*判断*/ { printf("\t\t\tstudent's num:"); /*交互输入*/ scanf("\t\t\t%s",stud[n+i].num); printf("\t\t\tstudent's name:"); scanf("\t\t\t%s",stud[n+i].name); printf("\t\t\tstudent's score:"); scanf("\t\t\t%d",&stud[n+i].score); gets(x); /*清除多余的输入*/ printf("\t\t\tany more records?(Y/N)"); scanf("\t\t\t%c",&sign); /*输入判断*/ i++; } return(n+i); } void Display(Student stud[],int n) /*显示所有记录*/ { int i; printf("\t\t\t-----------------------------------\n"); /*格式头*/ printf("\t\t\tnumber name score\n"); printf("\t\t\t-----------------------------------\n"); for(i=1;i1&&i%10==0) /*每十个暂停*/ {printf("\t\t\t-----------------------------------\n"); /*格式*/ printf("\t\t\t"); system("pause"); printf("\t\t\t-----------------------------------\n"); } } printf("\t\t\t"); system("pause"); } void Sort_by_num(Student stud[],int n) /*按学号排序*/ { int i,j,*p,*q,s; char t[10]; for(i=0;i0) {strcpy(t,stud[j+1].num); strcpy(stud[j+1].num,stud[j].num); strcpy(stud[j].num,t); strcpy(t,stud[j+1].name); strcpy(stud[j+1].name,stud[j].name); strcpy(stud[j].name,t); p=&stud[j+1].score; q=&stud[j].score; s=*p; *p=*q; *q=s; } } int Insert_a_record(Student stud[],int n) /*插入一条记录*/ {char x[10]; /*清除多余输入所用*/ printf("\t\t\tstudent's num:"); /*交互式输入*/ scanf("\t\t\t%s",stud[n].num); printf("\t\t\tstudent's name:"); scanf("\t\t\t%s",stud[n].name); printf("\t\t\tstudent's score:"); scanf("\t\t\t%d",&stud[n].score); gets(x); n++; Sort_by_num(stud,n); /*调用排序函数*/ printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/ return(n); } int Delete_a_record(Student stud[],int n) /*按姓名查找,删除一条记录*/ { char s[20]; int i=0,j; printf("\t\t\ttell me his(her) name:"); /*交互式问寻*/ scanf("%s",s); while(strcmp(stud.name,s)!=0&&istud.score) j=i; if(stud[k].score<stud.score) k=i; } aver=1.0*sum/n; printf("\t\t\tthere are %d records.\n",n); /*总共记录数*/ printf("\t\t\tthe hignest score:\n"); /*最高分*/ printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score); printf("\t\t\tthe lowest score:\n"); /*最低分*/ printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score); printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/ } int AddfromText(Student stud[],int n) /*从文件中读入数据*/ { int i=0,num; FILE *fp; /*定义文件指针*/ char filename[20]; /*定义文件名*/ printf("\t\t\tInput the filename:"); scanf("\t\t\t%s",filename); /*输入文件名*/ if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/ { printf("\t\t\tcann't open the file\n"); /*打开失败信息*/ printf("\t\t\t"); system("pause"); return(n); } fscanf(fp,"%d",&num); /*读入总记录量*/ while(i<num) /*循环读入数据*/ { fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score); i++; } n+=num; fclose(fp); /*关闭文件*/ printf("\t\t\tSuccessed!\n"); printf("\t\t\t"); system("pause"); return(n); } void WritetoText(Student stud[],int n) /*将所有记录写入文件*/ { int i=0; FILE *fp; /*定义文件指针*/ char filename[20]; /*定义文件名*/ printf("\t\t\tWrite Records to a Text File\n"); /*输入文件名*/ printf("\t\t\tInput the filename:"); scanf("\t\t\t%s",filename); if((fp=fopen(filename,"w"))==NULL) /*打开文件*/ { printf("\t\t\tcann't open the file\n"); system("pause"); return; } fprintf(fp,"%d\n",n); /*循环写入数据*/ while(i<n) { fprintf(fp,"%-16s%-15s%d\n",stud.num,stud.name,stud.score); i++; } fclose(fp); /*关闭文件*/ printf("Successed!\n"); /*返回成功信息*/ } void main() /*主函数*/ { int n=0; for(;;) { switch(menu_select()) /*选择判断*/ { case 1: printf("\t\t\tInput Records\n"); /*输入若干条记录*/ n=Input(stu,n); break; case 2: printf("\t\t\tDisplay All Records\n"); /*显示所有记录*/ Display(stu,n); break; case 3: printf("\t\t\tSort\n"); Sort_by_num(stu,n); /*按学号排序*/ printf("\t\t\tSort Suceessed!\n"); printf("\t\t\t"); system("pause"); break; case 4: printf("\t\t\tInsert a Record\n"); n=Insert_a_record(stu,n); /*插入一条记录*/ printf("\t\t\t"); system("pause"); break; case 5: printf("\t\t\tDelete a Record\n"); n=Delete_a_record(stu,n); /*按姓名查找,删除一条记录*/ printf("\t\t\t"); system("pause"); break; case 6: printf("\t\t\tQuery\n"); Query_a_record(stu,n); /*查找并显示一个记录*/ printf("\t\t\t"); system("pause"); break; case 7: printf("\t\t\tStatistic\n"); Statistic(stu,n); /*新增功能,输出统计信息*/ printf("\t\t\t"); system("pause"); break; case 8: printf("\t\t\tAdd Records from a Text File\n"); n=AddfromText(stu,n); /*新增功能,输出统计信息*/ break; case 9: printf("\t\t\tWrite to a Text file\n"); WritetoText(stu,n); /*循环写入数据*/ printf("\t\t\t"); system("pause"); break; case 0: printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*结束程序*/ printf("\t\t\t"); system("pause"); exit(0); } } } 四、函数调用关系图 注:“→”代表调用 Input函数 打印链表记录 Display函数 输入若干条记录 menu_select()函数 选择菜单 Sort_by_num函数 显示所有记录 Delete_a_record函数 按姓名查找,删除一条记录 Query_a_record查找并显示一条记录 Statistic函数 输出统计信息 (新增) AddfromText函数 从正文中添加数据到结构体数组中 Main函数 Insert_a_record插入一条记录 WritetoText函数 将所有数据写入文件中 退出程序 Reverse(head)函数 按学号排序 五、设计测试流程 1、进入界面 2、输入选项1,回车; 按提示输入数据: 3、回到主菜单; 输入选项7,回车; 输入文件名:data.txt,回车; 出现成功提示,则读入文件操作成功。 4、回到主菜单,输入2,回车 每10个暂停显示数据 5、回到主菜单,输入3,回车 出现排序成功信息。 6、回到主菜单,输入4,回车 按提示插入一组数据 7、回到主菜单,输入5,回车 按提示输入姓名,删除数据 出现删除成功的信息 8、回到主菜单,输入6,回车 输入姓名进行查询 9、回到主菜单,输入7,回车 出现统计信息 10、回到主菜单,输入9,回车 输入result.txt,回车 出现成功写入文件的信息 11、回到主菜单,输入0,回车退出系统zhe 貌是有点难度!嘿嘿,我才学了一期哦!
回复

使用道具 举报

千问 | 2008-5-22 21:37:59 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行