小程序:学生信息管理系统--C语言版本

程序写的很烂,但希望对你有用!!!

做了点小修改(添加学生先校验是否已存在,另外实现了学生信息修改及删除功能),链接点这里http://blog.csdn.net/linan_nwu/article/details/7883882


/*
**学生成绩管理系统
**俺就是俗人一个,不过看到在博客中贴上我敲的这些小程序,访问人数有增加哦^-^,我挺开心的。
**当然也是本着这个“小程序”的初衷,常见的,经典的,所以,“学生成绩管理系统”光荣入选了。
**另外我的code越敲越有feel了,加油!!!我相信敲完1000行代码,10000行代码后或多或少都会有收获。
**预告一下,接下来会推出链表,指针系列,会整理专门的文章,主要是敲程序(号码簿管理,停车库等,都很耳熟吧,嘻嘻^-^)。
**当然这些知识点现在的代码中就要用到,但知识就是要使用才能掌握,用完后再回过头看看理论,才可以巩固,正是应了老古人的“熟能生巧”。
*/

/*程序功能说明:
**1.学生信息的添加,删除;
**==>删除的功能没有实现,因为这个程序是把信息保存在文件中的,对文件的操作我还不熟,怎么从文件中删除信息呢?
**==>为了保证这个程序是在一天内完成的,今天就先到这里吧,过几天回头再改
**2.学生成绩的统计(总成绩,平均分);
**3.信息的查询(按学号,姓名,成绩范围)==>按'成绩范围'查询和按'学号','姓名'方法差不多,所以这里就不写了;
*/

#include"StuManageSys.h"

//用"a+"权限来打开“学生信息”记录表
//这里我这么写是为了以“追加”的方式(即不覆盖之前的数据信息),把用户添加的学生添加到“学生信息”记录表中
void aOpenFile()
{
	fp=fopen(fileName,"a+");//fileName定义为全局变量,在整个程序运行过程中,保存着上次用户创建或正确打开文件的名称
        if(NULL==fp)
	{
		printf("\n文件以'a+'模式打开失败\n");
	}
}

//用"r"权限来打开“学生信息”记录表
void rOpenFile()
{
	fp=fopen(fileName,"r");
        if(NULL==fp)
	{
		printf("\n文件以'r'模式打开失败\n");
	}
}

//系统初始化
void initSys()
{
    bool flag = true;

    printf("请输入学生信息记录表的名称(filename.txt):");
    scanf("%s",fileName);
    //printf("用户输入的信息记录表名称是:%s",fileName);

	//fopen 函数定义: FILE *fopen( const char *fname, const char *mode );
    /*功能说明: fopen()函数打开由fname(文件名)指定的文件, 并返回一个关联该文件的流.
	**如果发生错误, fopen()返回NULL. mode(方式)是用于决定文件的用途(例如 用于输入,输出,等等) 
	**Point 1:是"r",不是'',我一开始在这里犯错啦~~
	**Point 2:和fclose配合使用哈^^
	*/
	fp=fopen(fileName,"r");

	if(NULL==fp){
		printf("\n文件打开失败\n");
		printf("1.文件名输入有误,重新输入;\n");
		printf("2.以该文件名创建新文件;\n");

		while(flag)
		{
			int choose = 0;
			choose = getchar();
			//printf("choose = %d",choose);
			switch(choose)
			{
			case 10:
				break;
			case 49:
			    printf("请输入学生信息记录表的名称(filename.txt):");
	                    scanf("%s",fileName);
			    fp = fopen(fileName,"r");
			        if(NULL!=fp) 
				flag = false;
				else
				{
					printf("\n文件打开失败\n");
					printf("1.文件名输入有误,重新输入;\n");
					printf("2.以该文件名创建新文件;\n");
				}
				break;
			case 50:
			    fp = fopen(fileName,"a+");
			    flag = false;
			    break;
			default:
			    printf("输入有误,请键入1或2重新选择\n");
			    break;
			}//end of switch
		}//end of while
	}
	else
	{
		printf("文件打开成功!\n");
	}
	
}

//将学生信息写入文件
void saveStu(stu *stu)
{
	fprintf(fp,"%s\n",stu->stuName);
	fprintf(fp,"%d\n",stu->stuID);
	
	for(int i=0;istuScore[i]);

        fprintf(fp,"%d\n",stu->totalScore);
	fprintf(fp,"%d\n",stu->aveScore);     
}

int addStu()
{
	int num = 0;
	bool flag = true;

	while(flag)
	{
		printf("\n请输入要添加的学生人数:\n");
		scanf("%d",&num);
		
		if(num <= 0)
			printf("输入人数<0,无效,请重新输入\n");
		else if(num > 50)
			printf("输入人数>50,为保证有效,建议分批次录入学生信息\n");
		else
			flag = false;
	}

	printf("用户想要添加%d个学生",num);
	stu *p = (stu *)malloc(sizeof(stu));
        aOpenFile();
	for(int i=0;istuName);
                printf("\n学号:");
		scanf("%d",&(p->stuID));
	    
		p->totalScore = 0;//help to init it;
		for(int j=0;jstuScore[j]));
			p->totalScore += p->stuScore[j];
		}

		p->aveScore = p->totalScore/STU_SCORE_NUM;

		saveStu(p);
	}
	
        fclose(fp);
	return 0;
}

void printStuInfo(stu *stu)
{
	printf("\n姓名:%s",stu->stuName);
        printf("\n学号:%d",stu->stuID);

	for(int i=0;istuScore[i]);
	}

	printf("\n总分数是%d",stu->totalScore);
	printf("\n平均分是%d\n",stu->aveScore);
}

int getStuInfo(stu *p)
{
	char buf[STU_SIZE_BUFF];

	if(fscanf(fp,"%s",buf)!=1)
		return 0;
	
	strncpy(p->stuName,buf,STU_NAME_LEN);

        fscanf(fp,"%d",&(p->stuID));

	p->totalScore = 0;//Help to init it;
	for(int i=0;istuScore[i]));
	}

	fscanf(fp,"%d",&(p->totalScore));
        fscanf(fp,"%d",&(p->aveScore));
	
	return 1;
}

void printAllStuInfo(stu *p)
{
	rOpenFile();

	printf("\n系统中所有学生信息如下:");
	while(getStuInfo(p)!=0)
	{
		printStuInfo(p);
	}

	fclose(fp);

}

int getAllStuNum(stu *p)
{
	int num =0;

	while(getStuInfo(p)!=0)
	{
		num++;
	}

	return num;
}

int deleteStu()
{
	return 0;
}

bool getStuByName(stu *p,char *name)
{
	bool flag = false;

	rOpenFile();

	while(getStuInfo(p)!=0)
	{
		//printf("\nCheck Loop times,p->stuName=%s,name=%s",p->stuName,name);
		if(!strcmp(p->stuName,name))
		{
			//printf("\np->stuName=%s,name=%s",p->stuName,name);
			printf("\n查询到学生信息如下:");
			printStuInfo(p);
			flag = true;
		}
	}

    fclose(fp);
	return flag;
}

bool getStuByID(stu *p,int id)
{
	bool flag = false;

	rOpenFile();

	while(getStuInfo(p)!=0)
	{
		//printf("\nCheck Loop times,p->stuID=%d, id=%d",p->stuID,id);
		if(p->stuID==id)
		{
			//printf("\np->stuID=%d,id=%d",p->stuID,id);
			printf("\n查询到学生信息如下:");
			printStuInfo(p);
			flag = true;
		}
	}
	
    fclose(fp);
	return flag;
}

void mainMenu()
{
	stu p;
	int choose;
	bool flag = true,result=false;

	while(flag)
	{
	    printf("\n\t\t****************************\n");
	    printf("\t\t“学生成绩管理系统”功能列表:\n");
            printf("\t\t1.添加学生;\n");
	    printf("\t\t2.按学生姓名查找;\n");
	    printf("\t\t3.按学号查询;\n");
	    printf("\t\t4.打印所有学生成绩信息;\n");
            printf("\t\t5.退出;\n");
		printf("\t\t****************************\n");
		printf("\t\t请键入功能编号:\n");

		scanf("%d",&choose);
	
		switch(choose)
		{
		case 1:
			addStu();
			break;
		case 2:
			char name[STU_NAME_LEN];

            printf("\n请输入学生姓名:\n");
		    scanf("%s",name);
            result = getStuByName(&p,name);

			if(!result)
				printf("\n未查询到该学生信息\n");

			break;
        case 3:
			int id;

                    printf("\n请输入学生学号:\n");
		    scanf("%d",&id);
                    result = getStuByID(&p,id);

			if(!result)
				printf("\n未查询到该学生信息\n");
			break;
		case 4:

			printAllStuInfo(&p);
			break;
		case 5:
			exit(0);
                        flag = false;
			break;
		default:
                        printf("\n您的输入有误,请重新输入\n");
                        break;
		}

	}

}

int main(void)
{
	initSys();
    
	mainMenu();

	if(NULL==fp)
		fclose(fp);

	return 0;
}


以下是头文件StuManageSys.h
#include
#include
#include

#define STU_NAME_LEN 20
#define STU_SCORE_NUM 3
#define STU_INT_LEN 4
#define STU_SIZE_BUFF 44  //这个Buffer的大小需要和sizeof(stu)相同,用来从文件中读取学生信息,这里我处理的不好,有better method 吗?

//用结构体定义学生信息(姓名,学号,各门学科的成绩)
typedef struct student{
	char stuName[STU_NAME_LEN];
	int  stuID;
	int  stuScore[STU_SCORE_NUM];
    int  totalScore;
	int  aveScore;
}stu;

//FILE *stufilept;
FILE *fp;
char fileName[20];


void aOpenFile();//用"a+"权限来打开“学生信息”记录表
void rOpenFile();//用"r"权限来打开“学生信息”记录表
void initSys();//系统初始化
void saveStu(stu *stu);//将学生信息写入文件

void printStuInfo(stu *stu);
void printAllStuInfo(stu *p);

int getStuInfo(stu *p);
int getAllStuNum(stu *p);
int addStu();
int deleteStu();

bool getStuByName(stu *p,char *name);
bool getStuByID(stu *p,int id);


你可能感兴趣的:(C基础)