admin 管理员组

文章数量: 1086019


2024年4月25日发(作者:德州html5培训)

课程设计说明

课程设计目的:

通过此课程,更系统和全面地掌握程序设计的相关知识,巩固和加深《C程序设

计》理论知识,把理论与实践相结合,掌握基本编程技巧,学习调试程序,锻炼

独立思考能力,培养创新思维,提高编程能力。

本程序运用了数组、指针、结构体、函数、循环语句、文件保存和读取等知识,

由于上学期时间紧张,部分知识并没有学透彻。通过这次机会,可以获得更深的

理解和应用,为以后学习打下坚实的基础。

软件的总体结构图以及主要功能模块

学生信息管理系统

一、 输入和添加信息模块

使用此模块时,系统会提示你想要输入的学生数目,然后通过for的循环语句实

现逐个输入学生学号、姓名、年龄、成绩等,并进行总分计算和排名。如果想再

输入新信息,系统会开辟新空间,并提示你是否覆盖以前信息,从而实现新信息

1

退出系统

的输入。

未进行此操作前,先进行其它操作,系统都会提示你现在没有信息。

二、 查找信息模块

输入信息后进行此操作,系统会提示你是按学号查找,还是按姓名查找,然后通

过字符串的比较查找信息,并在屏幕显示是否找到信息。若没找到,系统会提示

没有要找的信息;若找到信息,就会在屏幕上把信息内容显示出来。

三、 修改信息

进行此操作时,系统会提示你是按学号还是按姓名查找,然后把要修改人的信息

全部显示出来,再次确认是否真的要修改。若要修改,就输入新信息,把要修改

的信息覆盖,并重新排名,把修改后的信息全部显示出来。

四、 成绩排序

此模块包括四个被调函数,应用了字符串和指针知识。同样,系统会提示你是按

学号还是按姓名(abc)排序,选择后,系统会提示是按升序还是降序排列,最

终把排序后的信息全部显示出来。

五、 文件处理

文件处理包含文件的打开和文件的保存。应用文件打开和关闭函数,以读写方式

将文件保存到一个二进制文件中。若未保存前,先打开文件,如果无信息,系统

会提示没有文件;如果有信息,系统会提示你先保存文件。打开文件后,可以在

屏幕上显示全部信息。

六、 浏览信息

随时浏览最新信息。学生学号、姓名、各科成绩、总成绩、排名等一目了然。

源程序:

#include "stdio.h"

#include "string.h"

#include "malloc.h"

#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/

#define course 3 /*学科数目*/

typedef struct message_student /*结构体定义*/

{

char number[6];

char name[20];

int age;

float subject[course];

float score;

int index;

}student;

extern int numstus; /*学生数目*/

extern student *pointer; /*指向结构体数组*/

extern int lens;

2

int openfile(student stu[]);

int findrecord(student stud[]);

int writetotext(student stud[]);

void welcome();

void display1();

void showtable();

void sort(student stu[]);

void addrecord(student stud[]);

void display(student stud[],int n1,int n2);

void amendrecord(student stud[]);

void count(student stud[]);

void sortnum(student stud[]);

void sortnum2(student stud[]);

void sortname(student stud[]);

void sortname2(student stud[]);

void display(student stud[],int n1,int n2) /*浏览信息*/

{

int i;

showtable(); /*显示表头*/

for(i=n1;i<=n2;i++)

printf("t%st%st%dt%.2ft%.2ft%.2ft%.2ft%dtn",stud[i].number,stud[i].name,st

ud[i].age,stud[i].subject[0],stud[i].subject[1],stud[i].subject[2],stud[i].score,stud[i].ind

ex);

/*通过循环输出数据*/

}

int findrecord(student stud[]) /*查找信息*/

{

char str[2];

char i;

if(numstus==0)

{

printf("No records to searchn");

}

else

{

printf("search by?");

scanf("%s",str);

3

if(str[0]=='1') /*按学号查找*/

{

printf("Enter num:");

scanf("%s",&str);

for(i=0;i

if(strcmp(str,stud[i].number)==0)

{

display(stud,i,i);

break;

}

else continue;

}

else if(str[0]=='2') /*按姓名查找*/

{

printf("Enter name:");

scanf("%s",str);

for(i=0;i

if(strcmp(str,stud[i].name)==0)

{

display(stud,i,i);

break;

}

else continue;

}

if(i>numstus)

{

printf("No records to searchn");

return -1;

}

return i;

}

}

int openfile(student *stu) /*打开文件*/

{

int i=0;

student *p;

FILE *fp;

p=stu;

char filename[20],str[2];

if(numstus!=0)

{

4

printf("Record existed,save?(y/n)");

scanf("%s",str);

if(str[0]=='y'||str[0]=='Y')

writetotext(stu);

}

printf("Enter file name:");

scanf("%s",&filename);

numstus=0;

free(p);

if((fp=fopen(filename,"rb"))==NULL)

{

printf("Cannot open filen");

return(-1);

}

for(i=0;i

{

if(fread(&stu[i],sizeof(student),1,fp)!=1)

i++;

numstus++;

{if(!feof(fp)) return(-1);

printf("file read errorn");

}

}

fclose(fp);

printf("Read sucessfullyn");

printf("Reveal record?(y/n)");

scanf("%s",&str);

if(str[0]=='y'||str[0]=='Y')

display(stu,0,numstus-1);

return(0);

}

void sort(student stud[]) /*排序*/

{

int j=0;

int k;

char str;

student *p;

p=stud;

if(numstus==0)

{

printf("No records to search!");

}

while(1)

5

{

aa: printf(" numbern");

printf(" namen");

scanf("%d",&k);

if(k==1)

{

printf("Order by:n");

bb: printf("1.按升序t");

printf("2.按降序n");

scanf("%d",&k);

if(k==1)

sortnum2(p);

else if(k==2)

sortnum(p);

else

goto bb;

display(stud,0,numstus-1);

}

else if(k==2)

{

printf("Order by:n");

cc: printf("1.按升序t");

printf("2.按降序n");

scanf("%d",&k);

if(k==1)

sortname2(p);

else if(k==2)

sortname(p);

else

goto cc;

display(stud,0,numstus-1);

}

else goto aa;

printf("Exit order?(y/n)");

scanf("%s",&str);

if(str=='n'||str=='N') goto aa;

else return;

}

}

void sortnum(student stud[])

{

int i,j;

student temp;

student *p;

6

p=stud;

for(i=0;i

for(j=0;j

{

if(strcmp(stud[j+1].number,stud[j].number)>0)

{

temp=*(p+j);

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

*(p+j+1)=temp;

}

}

}

void sortnum2(student stud[])

{

int i,j;

student temp;

student *p;

p=stud;

for(i=0;i

for(j=0;j

{

if(strcmp(stud[j].number,stud[j+1].number)>0)

{

temp=*(p+j);

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

*(p+j+1)=temp;

}

}

}

void sortname(student stud[])

{

int i,j;

student temp;

student *p;

p=stud;

for(i=0;i

for(j=0;j

{

if(strcmp(stud[j+1].name,stud[j].name)>0)

{

temp=*(p+j);

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

*(p+j+1)=temp;

}

7

}

}

void sortname2(student stud[])

{

int i,j;

student temp;

student *p;

p=stud;

for(i=0;i

for(j=0;j

{

if(strcmp(stud[j].name,stud[j+1].name)>0)

{

temp=*(p+j);

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

*(p+j+1)=temp;

}

}

}

int writetotext(student stud[]) /*将所有记录写入文件*/

{

int i=0;

student *p;

FILE *fp;

char filename[20];

printf("Enter file name:");

scanf("%s",&filename);

fp=fopen(filename,"wb");

while(i

{

p=&stud[i];

if(fwrite(p,sizeof(student),1,fp)==1)

i++;

}

fclose(fp);

printf("Save successfully!n");

display(stud,0,numstus-1);

numstus=0;

return 0;

}

void welcome()

{

8

printf("t*************************************************************

n");

printf("tt ☆★☆★欢迎使用学生成绩管理系统★☆★☆nttttn");

printf("t*************************************************************

n");

}

void showtable()

{

printf("------------------------------------------------------------------------------n");

printf("t学号t姓名t年龄t计算机t英语t数学t总分t名次n");

printf("------------------------------------------------------------------------------n");

}

void amendrecord(student stud[]) /*修改信息*/

{

char str[5];

int j,i=-1;

if(numstus==0) /*没有记录返回*/

printf("No records to modify!");

while(i<0)

{

i=findrecord(stud);

if(i>=0)

{

printf("Modify the record or no?(y/n)");

scanf("%s",&str);

if(str[0]=='y'||str[0]=='Y')

{

printf("Renew recordn");

printf("Enter number:");

scanf("%s",stud[i].number);

printf("Enter name:");

scanf("%s",stud[i].name);

printf("Enter age:");

scanf("%d",&stud[i].age);

stud[i].score=0;

printf("Enter scores by order(用空格隔开):");

for(j=0;j

{

9

scanf("%f",&stud[i].subject[j]);

stud[i].score+=stud[i].subject[j];

}

}

count(stud);

}

display(stud,0,numstus-1);

}

}

void count(student stud[]) /*排名*/

{

int i,j;

for(i=0;i

{

stud[i].index=1;

for(j=0;j

if(stud[j].score>stud[i].score)

stud[i].index++;

}

}

void addrecord(student stud[]) /*输入和添加信息*/

{

int i=0,j,num;

char str[5];

if(numstus!=0)

{

printf("Cover the existed record or no?(y/n)n");

scanf("%s",str);

if(str[0]=='Y'||str[0]=='y')

i=0;

else i=numstus;

}

printf("How many students to insert:");

scanf("%d",&num);

if(i==0)

numstus=num;

else numstus+=num;

if(numstus>lens)

{

lens+=50;

10

pointer=(student *)realloc(pointer,lens*LEN);

}

for(;i

{

getchar();

printf("Enter number:");

gets(pointer[i].number);

printf("Enter name:");

gets(pointer[i].name);

printf("Enter age:");

scanf("%d",&pointer[i].age);

printf("Enter 3 scores(用空格隔开):");

stud[i].score=0;

for(j=0;j

{

scanf("%f",&stud[i].subject[j]); /*计算总分*/

stud[i].score+=stud[i].subject[j];

}

}

count(stud); /*附名次*/

display(stud,0,numstus-1);

getchar();

}

int numstus;

int lens;

student *pointer;

void main()

{

int i=1;

lens=100;

pointer=(student *)malloc(lens*LEN); /*分配内存*/

numstus=0;

welcome(); /*欢迎界面*/

printf("nn");

abc:

printf(" t◇**** 1. 输入和添加记录

printf(" t◆**** 3. 修改记录

printf(" t◇**** 5. 打开文件

printf(" t◆**** 7. 浏览记录

printf("nn");

printf("请选择功能编号(0-7):");

scanf("%d",&i);

switch(i)

11

2. 查找记录 ****◇n");

4. 成绩排序 ****◆n");

6. 保存文件 ****◇n");

0. 退出系统 ****◆n");

{

case 1:addrecord(pointer);break; /*增加学生信息*/

case 2:findrecord(pointer);break; /*查询学生信息*/

case 3:amendrecord(pointer);break; /*修改学生信息*/

case 4:sort(pointer);break; /*学生信息排序*/

case 5:openfile(pointer);break; /*打开文件*/

case 6:writetotext(pointer);break; /*保存文件*/

case 7:display(pointer,0,numstus-1);break; /*显示记录*/

case 0: {printf("nntt★☆谢谢您的使用!☆★nn");goto end;} /*退出系统*/

default:printf("Enter number 0~7:n"); /*输入错误*/

}

goto abc;

end:

;

getchar();

getchar();

}

运行结果:

12

13

14

总结:

本程序主要功能是查询学生信息,包括计算总分和排名次等。在运行各功能模块

时,都会有相关信息提示,以防出错,并综合应用了指针、结构体、数组、字符

串、循环语句、文件等方面的知识。

15

其中排序功能模块最为严密,运用了字符串和指针的相关知识,还运用了goto

语句,防止因输错而无法进行此项操作。部分代码如下:

printf("Order by:n");

bb: printf("1.按升序t");

printf("2.按降序n");

scanf("%d",&k);

if(k==1)

sortnum2(p);

else if(k==2)

sortnum(p);

else

goto bb;

如果输入的不是1或2,则重新选择,然后显示结果。如果你进行了按学号降序

排列,还想尝试一下其它排列,比如,按姓名,或者按升序,则以下部分代码可

以实现你的愿望,而不必再返回主菜单进行选择。

printf("Exit order?(y/n)");

scanf("%s",&str);

if(str=='n'||str=='N') goto aa;

else return;

因时间紧迫,此程序还有很多不足之处,否则可以更严密,功能也可更加完善,

比如,可以再添加一个求平均分的模块,还可以为程序加一个密码。

通过此课程,我学到了很多。我不仅系统的学到了编程的很多知识,更领悟了生

活态度。

通过自学,我学会了使用typedef,并在此程序中成功运用。我还学会了调试程序

的新方法,利用特殊键定位调试。

因为心急,我当时在文件相关的程序还没有调试出来的情况下就答辩了,结果当

然不理想。于是答辩后,我自己又来到图书馆查找资料,最终将程序调试正确,

并成功运行。这时,我心里有说不出的喜悦。我深深地体会到学习要有耐心,更

要细心,只要坚持,就一定会成功!学习中是这样,生活中更是这样,我坚信“坚

持就是胜利” !

16


本文标签: 信息 文件 系统 学生 提示