学生管理系统是初学者网络编程通常要遇到的问题,本人小菜鸟,一个月前做了这一类题,拿出来和初学者分享一下。。。说的不好,有错误欢迎指正( ^_^ )
先说C下(python下也有,见下一篇,两个并不起来,汗):
首先是界面的建立,这个不用说了吧,便于对这个系统进行管理;其次是从文件中读取信息,打开文件,定义指针读取即可;增、删、查找这些都比较简单,略过。重点讲一下如何统计各邮箱的使用人数:因为学生信息是事先知道的,所以只要把他们的各个邮箱种类存放到数据里面(比如char qq[10]="qq.com"),然后从文件中取出每个学生相应的邮箱信息和每个邮箱类的数组strcmp,如果比较结果为0,那么该类的邮箱使用人数就++,这样,最后只要输出就O了。关键性问题来了,如何找到文件中的对应学生的邮箱呢?我是这样想的:找到‘@’作为一个标志,读取它后面的字符,如果以‘.com’结尾就读到m为止,如果以‘.cn’或者其他的非主流邮箱,自己可以想办法找到标志性结尾,这里只提供一种思路,毕竟自己解决自己的问题是最快乐的,我就不夺人之乐了。
自己写的C程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define true 1
int Number;
struct student {
char name[20];
char id[10];
char sex[10];
char age[10];
char tel[12];
char mail[40];
};
int duqu(struct student st[]);//o
void xianshi(); //o
void add(); //o
void select(); //o
void chazhao(); //o
void del(); //o
void tongji();
void fh(); //o
struct student st[31];
struct student stu;
void main()
{
int choose=0;
FILE *fp=NULL;
char yesorno;
if((fp=fopen("student.txt","rb"))==NULL)
{
printf("\n=========>提示:文件不存在,是否要创建一个?(y/n)\n");
scanf("%c",&yesorno); if(yesorno=='y'||yesorno=='Y')
{
fp=fopen("D:\\student.txt","wb");
fclose(fp);
}
else
exit(0);
} else
{
Number=duqu(st);
}
system("cls"); //清屏
while(true)
{
xianshi();
printf("\t\t====>请选择:");
scanf("%d",&choose);
system("cls");
switch(choose)
{
case 0: exit(0);fh();break;
case 1: add();fh();break;
case 2: select();fh();break;
case 3: chazhao();fh();break;
case 4: del();fh();break;
case 5: tongji();fh();break;
default:break;
}
fflush(stdin); //清空输入缓冲区,一是scanf函数未能读取的回车键,此时也可以用getchar();二是输入与scanf函数不能匹配的格式。
getchar();
system("cls");
}
}
void fh()
{
printf("\t===>按Enter键返回主菜单\n");
}
void tongji()
{ int i;
char qq[10]="qq.com";
char sina[10]="sina.com";
char onetwosix[10]="126.com";
char onesixthree[10]="163.com";
char sohu[10]="sohu.com";
char bj[10];
int q=0,s=0,ots=0,ost=0,sh=0;
//.......................................
/*FILE *fp;
fp=fopen("D:\\mail.txt","w");
i=0;
while (i<Number)
{
fprintf(fp,"%s\n",st[i].mail);
i++;
}
fclose(fp);*/
//.........................................
FILE *fp2;
fp2=fopen("D:\\mail.txt","r");
char ch;
while (! feof(fp2))
{
memset(bj,0,sizeof(bj));
ch=fgetc(fp2);
if (ch=='@')
{
ch=fgetc(fp2);
bj[0]=ch;
ch=fgetc(fp2);
bj[1]=ch;
ch=fgetc(fp2);
bj[2]=ch;
ch=fgetc(fp2);
bj[3]=ch;
ch=fgetc(fp2);
bj[4]=ch;
ch=fgetc(fp2);
bj[5]=ch;
if (ch!='m')
{
ch=fgetc(fp2);
bj[6]=ch;
if (ch!='m')
{
ch=fgetc(fp2);
bj[7]=ch;
}
}
printf("%s\n",bj);
}
if (strcmp((char *)qq,(char *)bj)==0)//(char *)强制转换。。。。
{
q++;
}
if (strcmp((char *)sina,(char *)bj)==0)
{
s++;
}
if (strcmp((char *)onetwosix,(char *)bj)==0)
{
ots++;
}
if (strcmp((char *)onesixthree,(char *)bj)==0)
{
ost++;
}
if (strcmp((char *)sohu,(char *)bj)==0)
{
sh++;
}
}
printf("qq邮箱使用人数:%d\n",q);
printf("sina邮箱使用人数:%d\n",s);
printf("126邮箱使用人数:%d\n",ots);
printf("163邮箱使用人数:%d\n",ost);
printf("sohu邮箱使用人数:%d\n",sh);
//...................................待续
}
void del()
{
FILE *fp=NULL;
char id[10];
int i=0;
int j=0;
printf("请输入要删除的学生学号:");
scanf("%s",id);
for(i=0;i <Number;i++)
{
if (strcmp(id,st[i].id)==0)
{
for (j=i;j <Number-1;j++)
{
st[j]=st[j+1];
st[j+1]=st[30];//把另外一个都变为0。
}
Number--;
}
}
fp=fopen("D:\\student.txt","w");
for (i=0;i <Number;i++)
{
fwrite(&st[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("删除成功;\n");
}
void chazhao()
{
char id[10];
int i=0;
printf("请输入要查找学生的学号:");
scanf("%s",id);
system("cls");
printf("\t姓名\t学号\t性别\t年龄\t电话\t邮箱\n");
for(i=0;i<Number;i++)
{
if (strcmp(id,st[i].id)==0)
{
printf("\t%s\t%s\t%s\t%s\t%s\t%s\n",st[i].name,st[i].id,st[i].sex,st[i].age,st[i].tel,st[i].mail);
}
}
}
void select()
{
int i=0;
printf("以下是全部学生信息\n");
printf("\t姓名\t学号\t性别\t年龄\t电话 \t邮箱\n");
for(i=0;i < Number;i++)
{
printf("\t%s\t%s\t%s\t%s\t%s \t%s\n",st[i].name,st[i].id,st[i].sex,st[i].age,st[i].tel,st[i].mail);
}
}
void add()
{
printf("输入要添加的同学信息\n");
printf("姓名:");
scanf("%s",&stu.name);
printf("学号:");
scanf("%s",&stu.id);
printf("性别:");
scanf("%s",&stu.sex);
printf("年龄:");
scanf("%s",&stu.age);
printf("电话:");
scanf("%s",&stu.tel);
printf("邮箱:");
scanf("%s",&stu.mail);
FILE *fp;
fp=fopen("D:\\student.txt","a");
while(fp != NULL)
{
fprintf(fp,"\n%s\n%s\n%s\n%s\n%s\n%s",stu.name,stu.id,stu.sex,stu.age,stu.tel,stu.mail);
break;
}
printf("添加成功\n");
Number++;
fclose (fp);
}
int duqu(struct student st[])
{
FILE *fp;
int i=0;
fp=fopen("D:\\student.txt","r");
while(!feof(fp))
{
fscanf(fp,"%s\n",&st[i].name);
fscanf(fp,"%s\n",&st[i].id);
fscanf(fp,"%s\n",&st[i].sex);
fscanf(fp,"%s\n",&st[i].age);
fscanf(fp,"%s\n",&st[i].tel);
fscanf(fp,"%s\n",&st[i].mail);
i=i+1;
}
fclose(fp);
return i;
}
void xianshi()
{
printf("\t*****************************************************************\n");
printf("\t* *\n");
printf("\t* 学生成绩管理系统 *\n");
printf("\t* *\n");
printf("\t* [1] 增加学生信息 [2] 查看学生信息 *\n");
printf("\t* [3] 查找学生信息 [4] 删除学生信息 *\n");
printf("\t* [5] 统计(邮箱使用人数) [0] 退出系统 *\n");
printf("\t*****************************************************************\n");
}