使用C编写学生管理系统心得

背景:使用c语言实现,进行从.txt文件来进行增删改查排序读取存储的功能。
1.当使用scanf读取字符时回车也是字符串,会被scanf读取
2.定义整型变量之后,使用scanf为这个变量赋值的时候,不能使用键盘输入字符,如果字符的话,相当于没有接收到任何数据
3.C语言中对文件的读写都是用库函数来实现的。对二进制文件和文本文件都采用缓冲文件系统。----如果没有缓冲的,其实效率非常低。
4.文件的打开与关闭 头文件:stdio.h
fopen函数
用 法:FILE *fopen(char *filename,char *type);
fclose函数
用 法:int fclose(FILE *stream); 返回值:成功返回0,不成功返回EOF(-1)
5.文件的读写
fscanf函数1.fscanf():从文件指针fp指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中;
原型: fscanf(FILE *fp, const char *format, agars)
fprintf函数 2.fprintf():将agars(参数表)内各项的值,按format(格式控制字符串)所表示的格式,将数据格式为字符串的形式写入到文件指针fp指向的文件中。
注:使用标准化输入/出 时 ,一定要格式匹配
6.一个汉字占两个字节
7.标准的C和C++都不支持正则表达式,但有正则表达式的函数库提供这功能.
8.C语言中并没有bool类型变量。这是C++中新增的系统类型,要在C语言中使用bool类型,可以使用自定义的方式。
1 使用整型做bool类型。typedef int bool;
2 使用枚举类型做bool类型。typedef enum{ false, true}bool;
9.格式化代码快捷键:ctrl+K+F

10.排序简单的使用冒泡排序法,其实对学号对姓名排序都是一样的
11.整个界面的循环使用do while(1),有符合条件的输入使用break跳出;相比switch case,其实if语句更方便
12.对文本的修改删除相对比较麻烦,比如说删除的方法就是:将文件写入到另一个文件中,当遇到不需要的内容时不写入,然后最后 再重新覆盖掉原文件。
13.一些报错的点
error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
其实是因为纯c环境下,局部变量必须在函数的头部进行声明和定义,而不能是函数体中,而c++中就不会如此限制了。一般c文件的后缀是.c,而c++文件的后缀是.c++
link error 就是连接错误,一般都是因为还有项目在跑着

14.一些相对比较关键的代码点

  int counts = 0;//学生数量的统计
    //1:初始化菜单  就是将各个功能函数模块化
    void initMenu();
    //2:查询显示学生信息界面
    void selectMenu();
    //3:初始化学生信息---从文件中读取学生信息并初始化
    void initData();
    //4:显示学生信息
    void display();


//3.初始化学生信息
void initData()
{

FILE *fp;
fp = fopen("E://student.txt", "r");
if (fp == NULL){
	printf("文件打开错误\n");
	exit(0);
}
else{//读取文件中的信息到学生数组中

	while (!feof(fp) && fscanf(fp, "%s %s %s %d %d %s", stu[counts].id,stu[counts].name, stu[counts].sex, &stu[counts].age,&stu[counts].grade, stu[counts].major) != -1){			
			counts++;
		}//while
		//printf("%d", counts);
    	}//else
    	fclose(fp);
    }
int i;//判断值的使用
		printf("\n请输入要插入的学生信息的学号(4位):");
		scanf("%s", stu[counts].id);
		len = strlen(stu[counts].id);
		if (len == 4){
			for (i = 0; i < counts; i++){
				if (strcmp(stu[counts].id, stu[i].id) == 0){
					printf("该学生已存在!请重新输入\n");
					break;
				}
				else continue;
			}
			if (i == counts)break;//说明没有匹配项,则可以进行添加  另一种可行的方法是按序排放,那么只需要和前一个人的学号比较即可

//13.按照性别将学生信息进行存储
void save()
{
	FILE *fpf,*fpm;
	fpf = fopen("E://female.txt", "w");
	fpm = fopen("E://male.txt", "w");
	if (fpf == NULL&&fpm==NULL){
		printf("创建文件失败\n");
		exit(0);
	}
	for (int i = 0; i < counts; i++){
		if (strcmp(stu[i].sex, "男") == 0){//将该数组存储到对应的文件中
			fprintf(fpm, "%s\t\t%s\t%s\t%d\t%d\t%s\n", stu[i].id, stu[i].name, stu[i].sex, &stu[i].age, &stu[i].grade, stu[i].major);
		}
		else{
			fprintf(fpf, "%s\t\t%s\t%s\t%d\t%d\t%s\n", stu[i].id, stu[i].name, stu[i].sex, &stu[i].age, &stu[i].grade, stu[i].major);
		}
	
	}
	fclose(fpf);
	fclose(fpm);
	printf("存储成功!");
}

猜你喜欢

转载自blog.csdn.net/qq_35297774/article/details/85627006