C语言——管理系统

1 整体代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>



enum Operator { Quit, Insert, Show, Search, Modify, Delete, Sort };

//1 创建系统
typedef struct MM {
	char name[20];
	int age;
	int num;
	char addr[20];
}MM;
typedef struct SystemInfo {
	MM* arr;
	int curSize;
	int maxSize;
}SystemInfo;
SystemInfo* create_system(int maxSize) {
	SystemInfo* s = (SystemInfo*)malloc(sizeof(SystemInfo));
	assert(s);
	s->curSize = 0;
	s->maxSize = maxSize;
	s->arr = (MM*)malloc(sizeof(MM) * maxSize);
	return s;
}


//2 打印菜单和系统
void print_system(SystemInfo* s) {
	printf("姓名\t年龄\t编号\t住址\n");
	for (int i = 0; i < s->curSize; i++) {
		printf("%s\t%d\t%d\t%s\n", s->arr[i].name, s->arr[i].age, s->arr[i].num, s->arr[i].addr);
	}
}
void print_menu()
{
	printf("----------------------------\n");
	printf("\t0.退出系统\n");
	printf("\t1.录入系统\n");
	printf("\t2.显示信息\n");
	printf("\t3.查找信息\n");
	printf("\t4.修改信息\n");
	printf("\t5.删除信息\n");
	printf("\t6.排序信息\n");
	printf("----------------------------\n");
}


//3 插入
void insert_system(SystemInfo* s, MM data) {
	//自动增长
	if (s->curSize == s->maxSize) {
		s->maxSize *= 2;
		MM* temp = realloc(s->arr, sizeof(MM) * s->maxSize);
		s->arr = temp;
	}
	s->arr[s->curSize++] = data;
}
void insert_data(SystemInfo* s) {
	while (true) {
		MM temp;
		printf("请输入MM信息,(用空格隔开)返回请按T\n(name,age,num,addr):");
		while (getchar() != '\n');
		int key1 = getchar();
		if (key1 == 'T' || key1 == 't') {
			break;
		}
		scanf_s("%s%d%d%s", temp.name, 20, &temp.age, &temp.num, temp.addr, 20);
		insert_system(s, temp);
		printf("是否继续输入(按Y继续/按N返回)");
		while (getchar() != '\n');
		int key = getchar();
		if (key == 'N' || key == 'n') {
			break;
		}
	}
}

//4 查找
//按3种方式查找
void search_by_name(SystemInfo* s) {
	MM temp;
	printf("请输入查找姓名:");
	while (getchar() != '\n');
	scanf_s("%s", temp.name, 20);
	printf("姓名\t年龄\t编号\t住址\n");
	for (int i = 0; i < s->curSize; i++) {
		if (strcmp(s->arr[i].name, temp.name) == 0) {
			printf("%s\t%d\t%d\t%s\n", s->arr[i].name, s->arr[i].age, s->arr[i].num, s->arr[i].addr);
			break;
		}
	}
}
void search_by_age(SystemInfo* s) {
	//MM temp;没用哈哈哈
	int begin = 0;
	int end = 0;
	printf("请输入查找年龄的范围:(两个数中间用空格隔开)");
	while (getchar() != '\n');
	scanf_s("%d%d", &begin, &end);
	printf("姓名\t年龄\t编号\t住址\n");
	for (int i = 0; i < s->curSize; i++) {
		if (s->arr[i].age >= begin && s->arr[i].age <= end) {
			printf("%s\t%d\t%d\t%s\n", s->arr[i].name, s->arr[i].age, s->arr[i].num, s->arr[i].addr);
		}
	}
}
void search_by_address(SystemInfo* s) {
	MM temp;
	printf("请输入要查找的地址:");
	while (getchar() != '\n');
	scanf_s("%s", temp.addr, 20);
	printf("姓名\t年龄\t编号\t住址\n");
	for (int i = 0; i < s->curSize; i++) {
		if (strcmp(s->arr[i].addr, temp.addr) == 0) {
			printf("%s\t%d\t%d\t%s\n", s->arr[i].name, s->arr[i].age, s->arr[i].num, s->arr[i].addr);
		}
	}
}

void search_system(SystemInfo* s) {

	while (true) {
		printf("---------------\n");
		printf("0.退出查找\n");
		printf("1.按姓名查\n");
		printf("2.按年龄区间\n");
		printf("3.按住址查找\n");
		printf("---------------\n");

		int key = 0;
		scanf_s("%d", &key);
		switch (key) {
		case 0:
			printf("退出成功!");
			break;
		case 1:
			search_by_name(s);
			break;
		case 2:
			search_by_age(s);
			break;
		case 3:
			search_by_address(s);
			break;
		default:
			printf("无效选项,请重新选择。\n");
			break;
		}
		if (key == 0)
			break;
	}
}


//5 修改
//一般做修改和删除类操作,通常是用唯一属性来作为参照
//姓名会重复,但编号不会
void modify_system(SystemInfo* s) {	
	int num = 0;
	printf("请输入要修改的编号");
	scanf_s("%d", &num);
	//找位置
	int pos = -1;
	for (int i = 0; i < s->curSize; i++) {
		if (num == s->arr[i].num) {
			pos = i;
			break;
		}
	}
	if (pos == -1) {
		printf("没有找到,无法修改!");
	}
	else {
		printf("请输入新的信息:name,age,num,addr");
		scanf_s("%s%d%d%s", s->arr[pos].name, 20, &s->arr[pos].age, &s->arr[pos].num, s->arr[pos].addr, 20);
		printf("修改成功");
	}


}

//6 删除
void delete_system(SystemInfo* s)
{
	int num;
	printf("输入删除mm的编号:");
	scanf_s("%d", &num);
	//找位置
	int pos = -1;
	for (int i = 0; i < s->curSize; i++)
	{
		if (s->arr[i].num == num)
		{
			pos = i;
			break;
		}
	}
	if (pos == -1)
	{
		printf("没有找到,无法删除!\n");
	}
	else
	{
		for (int i = pos; i < s->curSize - 1; i++)
		{
			s->arr[i] = s->arr[i + 1];
		}
		s->curSize--;
		printf("删除成功!\n");
	}
}

//7 排序
bool compare_age(MM one, MM two)
{
	return one.age > two.age;
}
bool compare_name(MM one, MM two)
{
	return strcmp(one.name, two.name) > 0;
}
void sort_system(SystemInfo* s, bool(*compare)(MM one, MM two))
{
	for (int i = 0; i < s->curSize; i++)
	{
		for (int j = 0; j < s->curSize - i - 1; j++)
		{
			if (compare(s->arr[j], s->arr[j + 1]))
			{
				MM temp = s->arr[j];
				s->arr[j] = s->arr[j + 1];
				s->arr[j + 1] = temp;
			}
		}
	}
}


//8 文件操作
void save_file(SystemInfo* s, const char* filename) {
	FILE* fp = fopen(filename, "w");
	for (int i = 0; i < s->curSize; i++)
	{
		fprintf(fp, "%s\t%d\t%d\t%s\n", s->arr[i].name, s->arr[i].age, s->arr[i].num, s->arr[i].addr);
	}
	fclose(fp);
}
void load_file(SystemInfo* s, const char* filename)
{
	FILE* fp = fopen(filename, "r");
	if (fp == NULL) //第一次打开文件会没有,加个判定
	{
		fp = fopen(filename, "w+");
		fclose(fp);
	}
	else
	{
		MM temp;
		while (fscanf(fp, "%s\t%d\t%d\t%s\n", temp.name, &temp.age, &temp.num, temp.addr) != EOF)
		{
			insert_system(s, temp);
		}
		fclose(fp);
	}
}

// 按键交互
//enum Operator { Quit, Insert, Show, Search, Modify, Delete, Sort };
void keydown_system(SystemInfo* s) {
	int key = 0;
	scanf_s("%d", &key);
	switch (key) {
	case Quit:
		printf("退出成功!!!");
		save_file(s, "mm.txt");
		exit(0);
		break;
	case Insert:
		insert_data(s);
		save_file(s, "mm.txt");
		print_system(s);
		break;
	case Show:
		print_system(s);
		break;
	case Search:
		search_system(s);
		break;
	case Modify:
		modify_system(s);
		save_file(s, "mm.txt");
		print_system(s);
		break;
	case Delete:
		delete_system(s);
		save_file(s, "mm.txt");
		print_system(s);
		break;
	case Sort:
		sort_system(s, compare_age);
		print_system(s);
		break;
	default:
		printf("无效选项,请重新选择。\n");
		break;
	}
}




int main() {

	SystemInfo* s = create_system(10);
	load_file(s, "mm.txt");
	while (true) {
		print_menu();
		keydown_system(s);
		system("pause");
		system("cls");
	}
	return 0;
}

2 while (getchar() != ‘\n’);到底为什么这样用

在 C 语言中,while (getchar() != '\n'); 这行代码确实常用于清除输入缓冲区中的换行符。这种用法通常出现在读取了一行文本之后,目的是清空缓冲区中剩余的换行符,以防止它影响后续的输入读取。

详细解释

当你使用 scanffgets 或其他输入函数读取用户输入时,输入的数据(包括按下的回车键产生的换行符 '\n')都会被存储在输入缓冲区中。换行符标记了输入的结束,但通常会保留在缓冲区中。

例如,如果你使用 scanf("%s", string); 读取一个字符串,scanf 会读取连续的字符直到遇到空白字符(如空格、制表符或换行符),然后停止读取。这时,换行符仍然留在输入缓冲区中。

作用

while (getchar() != '\n'); 这段代码的作用是:

  1. 读取字符getchar() 函数从输入缓冲区中读取下一个字符。
  2. 检查换行符:循环继续执行,直到 getchar() 读取到换行符 '\n'
  3. 清空缓冲区:循环读取并丢弃缓冲区中的所有字符,直到换行符,有效地清空了缓冲区。

考虑以下情况:

  1. 用户输入了多个换行符,例如按了几次回车键。
  2. 输入缓冲区中可能包含两个或更多的换行符,如 \n\n\n

对于代码:

while (getchar() != '\n');
  • 第一次循环getchar() 读取第一个换行符并丢弃它。
  • 第二次循环:再次调用 getchar() 读取下一个换行符,继续丢弃,直到没有更多的换行符。

最终,当 getchar() 尝试读取下一个非换行符的字符时,循环结束。

通常使用 while (getchar() != '\n'); 来清空输入缓冲区中的多余字符,是为了准备使用 getchar() 或类似的函数读取下一个用户输入的字符或字符串。

如果之后要输入的是整数,通常不需要清空缓冲区中的换行符

因为换行符对于整数输入没有影响。scanf函数在读取整数时会忽略空白字符,包括空格、制表符和换行符。

3 格式化写文件的好处

格式化写文件的特点

  1. 可读性:格式化写入的文件更容易被人阅读和理解,因为它们包含描述性的文本和结构化的布局。
  2. 结构化:数据按照一定的格式排列,如使用制表符(\t)或逗号分隔,这有助于区分不同字段。
  3. 一致性:格式化写入有助于保持数据的一致性,因为每个记录都遵循相同的布局模式。

与其它写文件方法的区别

  1. 单个字符写入:使用 fputc 函数可以一次写入一个字符,这种方法不如 fprintf 灵活,因为需要手动构造每一行的格式。
  2. 字符串写入:使用 fputs 函数可以一次写入一个字符串,这比 fputc 更高效,但仍然需要手动管理数据的格式化。
  3. 二进制写入:使用 fwrite 函数可以高效地写入二进制数据,这种方法不关心数据的可读性,只关心数据的快速存储和恢复。
  4. 块写入:使用 fwrite 也可以将数据结构作为一个块写入,这种方法适用于需要高效读写大量数据的情况,但生成的文件不适合直接阅读。

4 形参 SystemInfo* s 这样写的原因:

  • 指针传递:函数接受一个指向 SystemInfo 结构体的指针,而不是直接传递整个结构体。这样做的好处是减少了内存的复制,因为结构体可能很大,通过指针传递可以避免复制整个结构体,从而提高效率。
  • 直接操作:通过指针,函数可以直接访问和操作原始数据结构,而不需要在函数内部创建数据的副本。
  • 灵活性:指针传递提供了更多的灵活性,因为你可以传递任何 SystemInfo 类型的实例的地址,包括动态分配的内存地址。
  • 一致性:在 C 语言中,通常使用指针来传递复杂的数据结构,这样可以保持代码的一致性和风格。
  • 修改原数据:如果函数需要修改原始数据结构的内容,使用指针是必要的,因为这样可以直接修改原始数据,而不是修改副本。

5 文件存储操作

//文件存储操作
void save_file(SystemInfo* s,const char* filename) 
{
	FILE* fp = fopen(filename, "w");//清空方式,不然数据会重复增加
	for (int i = 0; i < s->curSize; i++) 
	{
		fprintf(fp, "%s\t%d\t%d\t%s\n", s->arr[i].name, s->arr[i].age, s->arr[i].num, s->arr[i].addr);
	}
	fclose(fp);
}
void load_file(SystemInfo* s, const char* filename) 
{
	FILE* fp = fopen(filename, "r");
	if (fp == NULL) //第一次打开文件会没有,加个判定
	{
		fp = fopen(filename, "w+");
		fclose(fp);
	}
	else 
	{
		MM temp;
		while (fscanf(fp, "%s\t%d\t%d\t%s\n", temp.name, &temp.age, &temp.num, temp.addr) != EOF) 
		{
			insert_system(s, temp);
		}
		fclose(fp);
	}
}

6 strcmp函数

int strcmp(const char *str1, const char *str2);
  • str1str2 是指向要比较的以 null 结尾的字符串的指针。

返回值

  • 负数:如果 str1 小于 str2(即 str1 排在 str2 前面)。
  • 正数:如果 str1 大于 str2(即 str1 排在 str2 后面)。
  • 0:如果两个字符串相等。

在 C 语言中,比较两个字符串是否相等时,不能使用 == 操作符,因为 == 用于比较指针是否相等,而不是它们指向的字符串内容。要比较两个字符串的内容,应该使用 strcmp 函数。

对于你提到的两个条件:

  1. if (strcmp(s->arr[i].addr, temp.addr) == 0)
  2. if (s->arr[i].addr == temp.addr)

第一个条件是正确的用法。strcmp 函数比较两个字符串,如果返回值是 0,则表示两个字符串相等。

第二个条件是不正确的,因为 s->arr[i].addrtemp.addr 都是指向字符串的指针,if 语句实际上比较的是指针的值是否相等,而不是它们指向的字符串内容是否相等。

7 gets和puts

gets 函数曾经是一个在 C 语言中用来从标准输入读取字符串的函数,定义在 <string.h> 头文件中。它的使用非常简单,只需要提供一个字符数组作为参数。但是,gets 函数在读取输入时不会检查目标缓冲区的大小,这使得它极易造成缓冲区溢出,是一个非常不安全的函数。因此,gets 函数已经在 C11 标准中被彻底移除。

还是用scanf_s (%s)好

但输出可以用puts

puts 函数是 C 语言标准库中的一个函数,用于将字符串输出到标准输出(通常是屏幕),并在输出后添加一个换行符。puts 是安全的,因为它不会导致缓冲区溢出,但它要求你保证输入的字符串本身是以空字符('\0')结尾的。

#include #include #include #include #define ID struct id struct id { char name[20]; // xing ming int num; // xue hao int age; // nian ling char sex[2]; // xing bie char xi[20]; // xi bie char zhuan[20]; // zhuan ye char add[20]; // di zhi ID *next; // }; // FILE *fp; // ID *head; int sum_age=0,max_age=0,min_age=100,pc=0; float ave_age=0; ID *creat() { ID *p1,*p2,*head; int pd; p1=p2=head=NULL; printf("\t\t\t 开始输入记录!!!\n"); printf("please input pd:\n"); scanf("%d",&pd); while(pd!=0) { p1=(ID*)malloc(sizeof(ID)); printf("请输入学生的学号:\n");scanf("%d",&p1->num); printf("请输入学生的姓名:\n");scanf("%s",p1->name); printf("请输入学生的年龄:\n");scanf("%d",&p1->age); sum_age+=p1->age; if(max_ageage) max_age=p1->age; if(min_age>p1->age) min_age=p1->age; printf("请输入学生的性别:\n");scanf("%s",p1->sex); printf("请输入学生的系别:\n");scanf("%s",p1->xi); printf("请输入学生的专业:\n");scanf("%s",p1->zhuan); printf("请输入学生的地址:\n");scanf("%s",&p1->add); if(head==NULL) { head=p1; p2=p1; } else { p2->next=p1; p2=p1; } printf("please input pd:\n"); scanf("%d",&pd); pc++; } p2->next=NULL; return(head); } /*输入/添加记录*/ ID *insert(ID *head) { ID *temp,*p1,*p2; int pd; start: p1=head; printf("插入操作开始!!!\n"); temp=(ID *)malloc(sizeof(ID)); printf("请输入学生的学号:\n");scanf("%d",&temp->num); printf("请输入学生的姓名:\n");scanf("%s",temp->name); printf("请输入学生的年龄:\n");scanf("%d",&temp->age); printf("请输入学生的性别:\n");scanf("%s",temp->sex); printf("请输入学生的系别:\n");scanf("%s",temp->xi); printf("请输入学生的专业:\n");scanf("%s",temp->zhuan); printf("请输入学生的地址:\n");scanf("%s",temp->add); if (head==NULL) { head=temp; temp->next=NULL; } else { while(p1!=NULL) { p2=p1; p1=p1->next; } p2->next=temp; temp->next=NULL; } printf("插入末尾成功"); pc++; printf("是否继续插入 1.Yes 2.No;\n"); scanf("%d",&pd); if(pd==1) goto start; return (head); } /*删除学生记录*/ ID *delet(ID *head) { ID *p1,*p2; int num; printf("请输入要删除的学生的学号:");scanf("%d",&num); p1=head; if (head==NULL) { printf("没有记录\n"); goto end; } while(num!=p1->num && p1!=NULL) { p2=p1;p1=p1->next; } if(num==p1->num) { if (p1==head) head=p1->next; else p2->next=p1->next; printf("删除成功!!!\n"); pc--; //free(p1); //free(p2); } end:return head; } /*查找学生记录*/ ID *search(ID *head) { ID *p1,*p2; int num; printf("请输入要查找的学生的学号:");scanf("%d",&num); p1=head; while(num!=p1->num && p1!=NULL) { p2=p1;p1=p1->next; } if(num==p1->num) { printf("学生的学号:%d\n",p1->num); printf("学生的姓名:%s\n",p1->name); printf("学生的年龄:%d\n",p1->age); printf("学生的性别:%s\n",p1->sex); printf("学生的系别:%s\n",p1->xi); printf("学生的专业:%s\n",p1->zhuan); printf("学生的地址:%s\n",&p1->add); //free(p1); //free(p2); } return head; } /*按学号查询学生记录进行修改*/ ID *modify_num(ID *head) { ID *p; int i,m,n,num; start: printf("请输入要修改的学生的学号:"); scanf("%d",&num); p=head; while(p!=NULL ) { if(num==p->num) { m=1; while(m==1) { m=0; printf("\t\t 1.修改学生的学号\n"); printf("\t\t 2.修改学生的姓名\n"); printf("\t\t 3.修改学生的年龄\n"); printf("\t\t 4.修改学生的性别\n"); printf("\t\t 5.修改学生的系别\n"); printf("\t\t 6.修改学生的专业\n"); printf("\t\t 7.修改学生的地址\n"); printf("请选择(1--7):"); scanf("%d",&i); switch( i ) { case 1 : printf("请输入修改后的学号:"); scanf("%d",&p->num); break; case 2: printf("请输入修改后的姓名:"); scanf("%s",p->name); break; case 3: printf("请输入修改后的年龄:"); scanf("%d",&p->age); break; case 4: printf("请输入修改后的性别:"); scanf("%s",&p->sex); break; case 5: printf("请输入修改后的系别:"); scanf("%s",p->xi); break; case 6: printf("请输入修改后的专业:"); scanf("%s",p->zhuan); break; case 7: printf("请输入修改后的地址:"); scanf("%s",p->add); break; default: printf("输入错误,请重新输入"); } } break; } p=p->next; } printf("是否继续修改其他学生情况(1改 2不改):"); scanf("%d",&n); if(n==1)goto start; else return head; } /*退出程序*/ void ask_age() { if(pc==0) { printf("没有记录\n"); return ; } ave_age=float(sum_age*1.0/pc); printf("%f\n",ave_age); printf("%d\n",max_age); printf("%d\n",min_age); } /*显示结果函数*/ void print(ID *head) { ID *p; p=head; printf("\t\t\t*****************\n"); printf("显示结果是:\n"); if(head!=NULL) do { printf("%10d%10s%10d%10s%10s%10s%10s\n",p->num,p->name,p->age,p->sex,p->xi,p->zhuan,p->add); p=p->next; } while(p!=NULL); } void main() { ID *head; int choise; printf("\t\t\t* * * * 李林C语言课设* * * *\n"); while(1) { printf("\t\t 学生信息管理系统\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("\t\t 1.建立文件\n"); printf("\t\t 2.插入数据\n"); printf("\t\t 3.删除数据\n"); printf("\t\t 4.修改记录\n"); printf("\t\t 5.搜索记录\n"); printf("\t\t 6.求年龄\n"); printf("\t\t 0.退出\n"); printf("\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("请选择(0-6):"); scanf("%d",&choise); switch(choise) { case 1: head=creat(); print(head); break; case 2: head=insert(head); print(head); break; case 3: head=delet(head); print(head); break; case 4: head=modify_num(head); print(head); break; case 5:search(head); print(head); break; case 6:ask_age(); break; case 0: exit(0); break; default :printf("输入错误,请重新输入!\n"); } } } ★★★★★★★★★★★★★★★★★★★★★★★★★★★ #include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h" #include "stdlib.h" #define null 0 struct record { char name[20]; char phone[20]; char adress[40]; char postcode[10]; char e_mail[30]; }student[500]; struct LinkList { struct record US; struct LinkList *next; }a; struct LinkList *head=null; int num=0; FILE *fp; int menu_select(); int adduser(); int list(); int search(); int display(); int add(); int listbyname(); int dele(); int save(); int exit(); void main() { system("cls"); for(;;) { switch(menu_select()) { case 0:adduser();break; case 1:list();break; case 2:search();break; case 3:display();break; case 4:add();break; case 5:listbyname();break; case 6:dele();break; case 7:save();break; case 8:exit(0); } } } menu_select() { char s[80]; int a; printf("*_* press any key enter menu! *_* \n"); getch(); system("cls"); printf("\t\t********************MENU*********************\n\n"); printf("\t\t 0. 输入记录\n"); printf("\t\t 1. 显示记录 \n"); printf("\t\t 2. 按姓名查找\n"); printf("\t\t 3. 按电话号码查找\n"); printf("\t\t 4. 插入记录 \n"); printf("\t\t 5. 按姓名排序\n"); printf("\t\t 6. 删除记录\n"); printf("\t\t 7. 记录保存文件\n"); printf("\t\t 8. Quit\n"); printf("\t\t***********************************************\n"); do{ printf("\n Enter you choice(0~11):"); scanf("%s",s); a=atoi(s); } while (a11); return a; } adduser() { printf("\n\t\t**************** 请输入用户信息 ****************\n"); printf("\n\t\t输入姓名:"); scanf("%s",&student[num].name); printf("\n\t\t输入电话号码:"); scanf("%s",&student[num].phone); printf("\n\t\t输入地址:"); scanf("%s",&student[num].adress); printf("\n\t\t输入邮编:"); scanf("%s",&student[num].postcode); printf("\n\t\t输入e-mail:"); scanf("%s",&student[num].e_mail); num++; printf("\n\t\t是否继续添加?(Y/N):"); if (getch()=='y') adduser(); return(0); } list() { int i; system("cls"); if(num!=0) { printf("\n\t\t*************** 以下为通讯录所有信息************"); for (i=0;i<num;i++) { printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t电话: %s",student[i].phone); printf("\n\t\t地址: %s",student[i].adress); printf("\n\t\t邮编: %s",student[i].postcode); printf("\n\t\te-mail:%s",student[i].e_mail); printf("\t\t"); if (i+1<num) { printf("\n\t\t__________________________"); system("pause"); } } printf("\n\t\t************************************************"); } else printf("\n\t\t通讯录中无任何纪录"); printf("\n\t\t按任意键返回主菜单:"); getch(); return(0); } search() { int mark=0; int i; int a=0; printf("\n\t\t***************** 按姓名查找 *******************"); char name[20]; printf("\n\t\t请输入姓名:"); scanf("%s",name); for(i=a;i<num;i++) { if (strcmp(student[i].name,name)==0) { printf("\n\t\t************* 以下是您查找的用户信息 ***********"); printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t电话: %s",student[i].phone); printf("\n\t\t地址: %s",student[i].adress); printf("\n\t\te-mail:%s",student[i].e_mail); printf("\n\t\t************************************************"); mark++; if ((i+1)<num) { printf("\n\t\t是否继续查找相同名字的用户信息:(y/n)"); if (getch()=='y') { a=i; continue; } else return(0); } else { printf("\n\t\t按任意键返回主菜单"); getch(); return(0); } } } if(mark!=0) { printf("\n\t\t没有相同姓名的用户纪录"); printf("\n\t\t按任意键返回主菜单"); getch(); return(0); } else { printf("\n\t\t没有相同姓名的用户纪录"); printf("\n\t\t按任意键返回主菜单"); getch(); return(0); } } display() { int mark=0; int i; int a=0; printf("\n\t\t****************** 按电话查找 ******************"); char phone[10]; printf("\n\t\t请输入电话号码:"); scanf("%s",phone); for(i=0;i<num;i++) { if (strcmp(student[i].phone,phone)==0) { printf("\n\t\t************** 以下是您查找的用户信息 **********"); printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t电话: %s",student[i].phone); printf("\n\t\t地址: %s",student[i].adress); printf("\n\t\te-mail:%s",student[i].e_mail); printf("\n\t\t************************************************"); printf("\n\t\t按任意键返回主菜单:"); mark++; getch(); return(0); } } if (mark==0) { printf("\n\t\t没有改用户的信息"); printf("\n\t\t按任意键返回主菜单"); getch(); return(0); } return(0); } add() { int i; if ((fp=fopen("student.bin","wb"))==NULL) { printf("\n\t\t文件打开失败"); } for (i=0;i<num;i++) { if (fwrite(&student[i],sizeof(struct record),1,fp)!=1) { printf("\n\t\t写入文件错误!\n"); } printf("\n\t\t**************** 请输入用户信息 ****************\n"); printf("\n\t\t输入姓名:"); scanf("%s",&student[num].name); printf("\n\t\t输入电话号码:"); scanf("%s",&student[num].phone); printf("\n\t\t输入地址:"); scanf("%s",&student[num].adress); printf("\n\t\t输入邮编:"); scanf("%s",&student[num].postcode); printf("\n\t\t输入e-mail:"); scanf("%s",&student[num].e_mail); num++; printf("\n\t\t是否继续添加?(Y/N):"); if (getch()=='y') adduser(); return(0); } fclose(fp); printf("\n\t\t通讯录文件已保存"); printf("\n\t\t按任意键退出程序\n\t\t"); exit(0); return(0); } void deletebyphone() { int i,j; int deletemark=0; char phone[20]; printf("\n\t\t请输入要删除用户电话号码:"); scanf("%s",phone); if(num==0) { printf("\n\t\t对不起,文件中无任何纪录"); printf("\n\t\t按任意键返回主菜单"); getch(); return; } for (i=0;i<num;i++) { if (strcmp(student[i].phone,phone)==NULL) { printf("\n\t\t以下是您要删除的用户纪录:"); printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t电话: %s",student[i].phone); printf("\n\t\t地址: %s",student[i].adress); printf("\n\t\te-mail:%s",student[i].e_mail); printf("\n\t\t是否删除?(y/n)"); if (getch()=='y') { for (j=i;j<num-1;j++) student[j]=student[j+1]; num--; deletemark++; printf("\n\t\t删除成功"); printf("\n\t\t是否继续删除?(y/n)"); if (getch()=='y') deletebyphone(); return; } else return; } continue; } if (deletemark==0) { printf("\n\t\t没有该用户的纪录"); printf("\n\t\t是否继续删除?(y/n)"); if (getch()=='y') deletebyphone(); return; } } void deletebyname() { int a=0; int findmark=0; int j; int deletemark=0; int i; char name[20]; printf("\n\t\t请输入要删除用户姓名:"); scanf("%s",name); for (i=a;i<num;i++) { if (strcmp(student[i].name,name)==NULL) { printf("\n\t\t以下是您要删除的用户纪录:"); findmark++; printf("\n\t\t________________________________"); printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t电话: %s",student[i].phone); printf("\n\t\t地址: %s",student[i].adress); printf("\n\t\te-mail:%s",student[i].e_mail); printf("\n\t\t________________________________"); printf("\n\t\t是否删除?(y/n)"); if (getch()=='y') { for (j=i;j<num-1;j++) student[j]=student[j+1]; num--; deletemark++; printf("\n\t\t删除成功"); if((i+1)<num) { printf("\n\t\t是否继续删除相同姓名的用户信息?(y/n)"); if (getch()=='y') { a=i; continue; } } printf("\n\t\t是否继续删除?(y/n)"); if (getch()=='y') deletebyname(); return; } if((i+1)<num) { printf("\n\t\t是否继续删除相同姓名的用户信息?(y/n)"); if (getch()=='y') { a=i; continue; } } } else continue; } if ((deletemark==0)&&(findmark==0)) { printf("\n\t\t没有该用户的纪录"); printf("\n\t\t是否继续删除?(y/n)"); if (getch()=='y') deletebyphone(); return; return; } else if (findmark!=0) { printf("\n\t\t没有重名信息"); printf("\n\t\t没有该用户的纪录"); printf("\n\t\t是否继续删除?(y/n)"); if (getch()=='y') deletebyphone(); return; return; } } dele() { char choic; printf("\n\t\t1-按电话号码删除 2-按姓名删除"); printf("\n\t\t请选择:"); choic=getch(); switch (choic) { case '1':deletebyphone();break; case '2':deletebyname();break; } return(0); } listbyname() { int i,j; struct record tmp; for (i=1;i<num;i++) { if(strcmp(student[i].name,student[i-1].name)<0) { tmp=student[i]; j=i-1; do { student[j+1]=student[j]; j--; }while ((strcmp(tmp.name,student[j].name)=0)); student[j+1]=tmp; } } printf("\n\t\t排序成功,是否显示?(y/n)"); if (getch()=='y') list(); return(0); } save() { int j; FILE*fp; fp=fopen("student.txt","w"); if (fp==NULL) printf("can't open the file."); if(num!=0) { for(j=0;j<num;j++) { fwrite(student,sizeof(student),1,fp); } } printf("保存成功!"); fclose(fp); return(0); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值