#include<stdio.h>
#include<string.h>
struct Stu
{
	char Name[12];
	int ID;
	int Math;
	int Chinese;
	int English;
};
struct Stu Student[100];
void Menu()
{
	puts("1.Browse");
	puts("2.Add");
	puts("3.Delete");
	puts("4.Modify");
	puts("5.Find");
	puts("0.Exit");
}
void Save()
{
	FILE* pfw = fopen("data1.txt", "w");
	if (pfw == NULL)
	{
		printf("Save failed!");
		return;
	}
	int i = 0;
	while (Student[i].ID != 0)
	{
		if (Student[i].ID != -1)
		{
			fwrite(&Student[i], 1, sizeof(struct Stu), pfw);
		}
		i++;
	}
	fclose(pfw);
}
void Load()
{
	FILE* pfr = fopen("data1.txt", "r");
	if (pfr == NULL)
	{
		printf("Load failed!");
		return;
	}
	int i = 0;
	int flag = 0;
	do
	{
		flag=fread(&Student[i], 1, sizeof(struct Stu),pfr);
		i++;
	} while (flag== sizeof(struct Stu));
	fclose(pfr);
}
int Judge(int nIndex,int i,int nMaxindex)
{
	if (nIndex == 0) return Student[i].ID > Student[nMaxindex].ID;
	if (nIndex == 1) return Student[i].Math < Student[nMaxindex].Math;
	if (nIndex == 2) return strcmp(Student[i].Name, Student[nMaxindex].Name)>0;
}
void Sort(int nIndex)
{
	int n = 0, nMaxindex = 0;
	struct Stu Tmp;
	while (Student[n].ID != 0)
		n++;
	for (int j = n-1;j>0 ; j--)
	{
		nMaxindex = 0;
		for (int i = 1; i <= j; i++)
		{
			if (Judge(nIndex,i, nMaxindex))
			{
				nMaxindex = i;
			}
		}
		if (nMaxindex != j)
		{
			Tmp = Student[j];
			Student[j] = Student[nMaxindex];
			Student[nMaxindex] = Tmp;
		}
	}
}
void Print()
{
	int i = 0;
	puts("Name\tIDnumber\tMath\tChinese\tEnglish\n");
	while (Student[i].ID != 0)
	{
		if (Student[i].ID != -1)
		{
			printf("%s\t%-8d\t%d\t%d\t%d\n", Student[i].Name, Student[i].ID, Student[i].Math, Student[i].Chinese, Student[i].English);
		}
		i++;
	}
}
int Browse()
{
	puts("1.Sort by ID");
	puts("2.Sort by Name");
	puts("3.Sort by Math");
	puts("4.Return");
	char s = getchar();
	while (getchar()!= '\n')continue;
	switch (s)
	{
	case '1':Sort(0); Print(); break;
	case '2':Sort(2); Print(); break;
	case '3':Sort(1); Print(); break;
	case '4': break;
	default:puts("please obey!"); return 1;
	}
	return 0;
}
int Add()
{
	int i = 0;
	puts("Put ID");
	int ID;
	scanf("%d", &ID);
	while (getchar() != '\n')continue;
	while (Student[i].ID != 0 && Student[i].ID != -1)
	{
		if (Student[i].ID == ID)
		{
			return 1;
		}
		i++;
	}
	Student[i].ID = ID;
	puts("Name");
	scanf("%s", &Student[i].Name);
	while (getchar() != '\n')continue;
	puts("Math,Chinese,English");
	scanf("%d,%d,%d", &Student[i].Math, &Student[i].Chinese, &Student[i].English);
	while (getchar() != '\n')continue;
	Save();
	return 0;
}
int Delete()
{
	int i = 0;
	puts("Put ID");
	int ID;
	scanf("%d", &ID);
	while (getchar() != '\n')continue;
	while (Student[i].ID != 0)
	{
		if (Student[i].ID == ID)
		{
			Student[i].ID = -1;
			break;
		}
		i++;
	}
	if (Student[i].ID == 0)
		return 1;
	Save();
	return 0;
}
int Modify()
{
	int i = 0;
	puts("Put ID");
	int ID;
	scanf("%d", &ID);
	while (getchar() != '\n')continue;
	while (Student[i].ID != 0)
	{
		if (Student[i].ID == ID)
		{
			break;
		}
		i++;
	}
	if (Student[i].ID == 0)
		return 1;
	puts("Math,Chinese,English");
	scanf("%d,%d,%d", &Student[i].Math, &Student[i].Chinese, &Student[i].English);
	while (getchar() != '\n')continue;
	Save();
	return 0;
}
int Find()
{
	int i = 0;
	puts("Put ID");
	int ID;
	scanf("%d", &ID);
	while (getchar() != '\n')continue;
	while (Student[i].ID != 0)
	{
		if (Student[i].ID == ID)
		{
			printf("%s,%d,%d,%d\n", Student[i].Name, Student[i].Math, Student[i].Chinese, Student[i].English);
			break;
		}
		i++;
	}
	if (Student[i].ID == 0)
		return 1;
	return 0;
}
int main(void)
{
	Load();
	while (1)
	{
		Menu();
		char s = getchar();
		while (getchar() != '\n')continue;
		switch (s)
		{
		case '1': {while(Browse()==1); break; }
		case '2': {if (Add() == 1)puts("ID is duplicated"); else puts("Add success!");  break; }
		case '3': {if (Delete() == 1)puts("ID doesn't exist"); else puts("Delete success!");  break; }
		case '4': {if (Modify() == 1)puts("ID doesn't exist"); else puts("Modify success!"); break; }
		case '5': {if (Find() == 1)puts("ID doesn't exist"); else puts("Find success!");  break; }
		case '0': {return 0; }
		default: {puts("Please obey!"); break; }
		}
	}
	return 0;
}
简介:100个表示学生的结构体,有添加,浏览所有学生,根据学号查找、修改、删除的功能。添加时具有自动学号查重的功能。浏览时有多种排序功能
写这段代码收获;
1.if配合break跳循环很好用.
2.scanf里面要是用输入%s格式,如
scanf("%s", &Student[i].Name);
就不要用scanf接受多个格式的变量了,这个scanf就专门用来接%s,因为如果不这样做,输入的时候后面你想要输入的不属于%s格式的内容无法与前面你想输入进去属于%s的内容分开,造成你不想要的结果.
3.\t用于对齐时,如果一列上的数据,有的大于等于8位,有的小于8位就会造成对不齐的效果,这个时候机智的将小于8位的数利用类似-%8d这种格式强制将其转化成8位的就可以了.
4.getchar()和scanf命令之后可以跟
while (getchar() != '\n')continue;
来清空缓存区,还可以把上面的代码当暂停用
5.c语言文件操作在实际使用中,最好写一个Save()函数用来保存,每次修改和添加都调用一次Save()函数,再写一个Load()函数,这个函数只在main函数开头调用一次就可以,用来把文件里的数据导出到程序中进行处理或显示.
6.多个函数的代码只有局部不相同,此时设置一个判断函数来分别选择这个局部代码,可以使代码更简洁。
如这里面的Judge函数
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号