程序设计大作业-通讯录系统

废话不多说,看效果图和代码。

大概分为,密码界面和功能界面;

一共有新建,删除,修改,查询,显示所有记录,按学号排序这些功能,

并且结束程序时会保存记录到电脑文件中,下次打开时读取文件信息,实现新建信息不遗失的效果。

废话不多说,直接上代码,不懂的私信留言都可。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
FILE *fp;
int len = 0; 
void pause(){
	int i;
	printf("\n\n按任意键加回车返回主菜单!");
    scanf("%d",&i);
    getchar();
}
 
struct stu 
{
	char name[100];//姓名为字符串型
    int xh;//学号为整形
	int grade;//班级
	char tel[50];//电话
	char add[100];//地址为字符串型
	struct stu *next;//用指针处理链表,next是指针变量,指向结构体变量
};
struct stu *charu(struct stu *head,struct stu *q)
{	
	struct stu *p;
	for(p=head;p->next!=NULL;p=p->next);//for(使p也指向head;当p为空文件时 ;p指向下一个结点)
	p->next=q;
	q->next=NULL;
	return head;
}
void search(struct stu *head) 
{	
	
	struct stu *p;
	int s=0;
	int a;//要查找学生的学号
	if(head->next==NULL)//头文件为空时打印出的结果为"通讯录为空"
	{printf("**********************************通讯录为空!!!*********************************\n\n\n");
	printf("------------------------------请新建联系人后尝试!!!-----------------------------\n\n");
	}
	else//头文件不为空时,开始查询学生的信息
	{
		printf("\t输入要查询学生学号:");
		scanf("%d",&a);
		for(p=head->next;p->next!=NULL;p=p->next)//for(使p也指向head;当p为空文件时 ;p指向下一个结点)
		{
			if(p->xh==a) //如果输入的学号和某个相同,输出以下的东西。
			{
				printf("        要查找的学生信息为:\n");
				printf("       ★姓名:");puts(p->name);
				printf("\t\t学号: ");printf("%d\n",p->xh);
				printf("\t\t班级:");printf("%d\n",p->grade);
				printf("\t\t电话:");puts(p->tel);
				printf("\t\t地址:");puts(p->add);
				printf("\t\t查找成功!!!");
				printf("\n\n\n");
				s+=1;
				break;
			}
		}
	if(p->xh==a&&s==0)
		{
			printf("   要查找的学生信息为:\n");
			printf("       ★姓名:");puts(p->name);
			printf("\t班级:");printf("%d\n",p->grade);
			printf("\t电话:");puts(p->tel);
			printf("\t地址:");puts(p->add);
			printf("\t查找成功!!!");
			printf("\n\n");
		}
	else if(s==0){
		printf("no people have found!!!\n");//如果不符合,就输出没有找到
	}
	
	}
}

struct stu *change(struct stu *head)  
{
		int b,a,c;
		int x=0;
	struct stu *p;
	if(head->next==NULL)// 头文件为空时,输出通讯录为空
	{
		printf("**********************************通讯录为空!!!*********************************\n\n");
	printf("------------------------------请新建联系人后尝试!!!-----------------------------\n\n");
	}
	else
	{
		printf("\t\t\t输入要修改学生学号:");
		scanf("%d",&a);
		for(p=head->next;p->next!=NULL;p=p->next)
		{	if(p->xh==a){
			x++;
			start:printf("\t\t\t输入想要修改什么?\n");
			printf("\t\t\t	1:修改姓名\n");
				printf("\t\t\t	2:修改学号\n");
				printf("\t\t\t	3:修改班级\n");
				printf("\t\t\t	4:电话\n");
				printf("\t\t\t	5:地址\n");
				printf("          请输入你的选择:");
				le:scanf("%d",&b);
				switch(b)//先通过学号找到该学生,然后用switch语句选择修改项,再用switch和goto语句实现是否循环
				{
					case 1:
						printf("\t\t\t输入新姓名:");
						scanf("%s",p->name);break;
					case 2:printf("\t\t\t输入新学号:");
						scanf("%d",&p->xh);break;
					case 3:
						printf("\t\t\t输入新的年级:");
						scanf("%d",&p->grade);break;
					case 4:
						printf("\t\t\t输入新的电话号:");
						scanf("%s",p->tel);break;
					case 5:
						printf("\t\t\t输入新的地址:");
						scanf("%s",p->add);break;
					default: printf("\t\t输入操作错误,请重新输入:");goto le;  
				}
				printf("\t\t\t修改成功!!!\n");
				printf("    是否要修改其他项? 1:是  2:否\n");
				printf("          请输入你的选择:");
					scanf("%d",&c);
				if(c==1){
					goto start;
				} 
				else{
					break;
				}
		}
			
		}
		 if(p->xh==a&&x==0)
		{start1:printf("\t\t\t输入想要修改什么?\n");
			printf("\t\t\t	1:修改姓名\n");
				printf("\t\t\t	2:修改学号\n");
				printf("\t\t\t	3:修改班级\n");
				printf("\t\t\t	4:电话\n");
				printf("\t\t\t	5:地址\n");
				printf("          请输入你的选择:");
				le1:scanf("%d",&b);
				switch(b)//先通过学号找到该学生,然后用switch语句选择修改项,再用switch和goto语句实现是否循环
				{
					case 1:
						printf("\t输入新姓名:");
						scanf("%s",p->name);break;
					case 2:printf("\t输入新学号:");
						scanf("%d",&p->xh);break;
					case 3:
						printf("\t输入新的年级:");
						scanf("%d",&p->grade);break;
					case 4:
						printf("\t输入新的电话号:");
						scanf("%s",p->tel);break;
					case 5:
						printf("\t输入新的地址:");
						scanf("%s",p->add);break;
					default: printf("输入操作错误,请重新输入:");goto le1;  
				}
				printf("\t\t\t修改成功!!!\n");
				printf("    是否要修改其他项? 1:是  2:否\n");
				printf("       请输入你的选择:");
					scanf("%d",&c); 
				}
				else if(c==1){
					goto start1;
				} 
				else if(c==2){	;}
				else{
					printf("\t\t抱歉,未查询到此学号!");
				}
	}
	return head;   
}
void printall(struct stu *head) 
{
	struct stu *p=head->next;
	while(1)
	{		
		if(p==NULL)  
		{
			printf("**********************************通讯录为空!!!*********************************\n\n\n");
		printf("------------------------------请新建联系人后尝试!!!-----------------------------\n\n");
			break;
		}
		else if(p->next==NULL)
		{
			printf("        ★姓名:");puts(p->name);
			printf("\t学号:");printf("%d\n",p->xh);
			printf("\t班级:");printf("%d\n",p->grade);
			printf("\t电话:");puts(p->tel);
			printf("\t地址:");puts(p->add);
			printf("\n\n");
			printf("\t\t\t输出成功!!!\n\n");
			break;
		}
		else 
		{
				printf("        ★姓名:");puts(p->name);
			printf("\t学号:");printf("%d\n",p->xh);
			printf("\t班级:");printf("%d\n",p->grade);
			printf("\t电话:");puts(p->tel);
			printf("\t地址:");puts(p->add);
				printf("\n");
				p=p->next;
				continue;
		}
			printf("\n\n");
			printf("\t\t\t输出成功!!!\n\n");
		}
}
void sf(struct stu *head)
{
		struct stu *p=head ;
		printf("正在释放链表····\n");
		while(p!=NULL)
		{
			head=head->next;
			free(p);
			p=head;
		}
		printf("释放链表成功!!!!\n");
		printf("欢迎下次使用!!!"); 
}
void jiemian(){
	printf("\t\t班级:2014       第六小组      设计课题:学生通讯录管理系统\n");
	printf("\n********************************C语言课程设计***********************************\n");
	printf("	*******************★学生通讯录管理系统★*****************\n\n\n");
}
void menu(){
	printf("\t\t班级:2014       第六小组     设计课题:学生通讯录管理系统\n");                  
	printf("\n---------------------------------C语言课程设计-----------------------------------\n");
	printf("	---------------------★学生通讯录管理系统★--------------\n");
	printf("	▎			            			▎\n");
	printf("	▎			            			▎\n");
	printf("	▎			1:新建通讯录			▎\n");
	printf("	▎			2:删除通讯录			▎\n");
	printf("	▎			3:修改通讯录			▎\n");
	printf("	▎			4:查询通讯录			▎\n");
	printf("	▎			5:显示全部记录			▎\n");
	printf("	▎			6:排序通讯录	                ▎\n");
	printf("	▎			7:结束程序			▎\n");
	printf("	▇▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▇\n");
	printf("输入操作符1-6:");
}
void paixu(struct stu *head){
	struct stu *L=head;
	struct stu *LL=head->next;
	if(LL==NULL){
		printf("**********************************通讯录为空!!!*********************************\n\n\n");
		printf("------------------------------请新建联系人后尝试!!!-----------------------------\n\n");
		
	}
	else{
		int i,count = 0,num;//count记录链表结点的个数,num进行内层循环,
	struct stu *p,*q,*tail;
	p = L;
	while(p->next != NULL)//计算出结点的个数
	{
		count++;
		p = p->next;
	}
	for(i=0;i < count - 1;i++)//外层循环,跟数组冒泡排序一样
	{
		num = count - i - 1;//记录内层循环需要的次数,跟数组冒泡排序一样,
		q=L->next;//令q指向第一个结点
		p=q->next;//令p指向后一个结点
		tail=L;//让tail始终指向q前一个结点,方便交换,也方便与进行下一步操作
		while(num--)//内层循环 次数跟数组冒泡排序一样
		{
			if(q->xh > p->xh)//如果该结点的值大于后一个结点,则交换
			{
				q->next=p->next;
				p->next=q;
				tail->next=p;
			}
				tail = tail->next;//注释②
				q=tail->next;//注释②
				p=q->next;//注释②
		 } 
	} 
	printf("\t\t\t已将通讯录按学号排序完成!!\n\n");
	}

}
void check()
{	
   char userName[5];/*用户名*/
   char userPWD[5];/*密码*/
   int i;
   system("color 4F");
   for(i = 1; i < 4; i++)
   {
        printf("\n                                          请输入您的用户名 :");
        gets(userName);
        printf("\n                                          请输入您的密码 :");
         gets(userPWD);

        if ((strcmp(userName,"1")==0) && (strcmp(userPWD,"1")==0))
        {
            
            system("cls");
            
            return;
        }
        else
        {
            if (i < 3)
                printf("用户名或密码错误,请重新输入!");
            else
            {
                printf("您已连续3次将用户名或密码输错,系统将退出!");
                exit(1); 
            }
        }
   }

}
void mimajiemian()
{	 
   printf(" \n\n\n                                          **********************************\n");
   printf("                                          *                                *\n");
   printf("                                          *                                *\n");
   printf("                                          *                                *\n");
   printf("                                          *  欢迎进入学生通讯录信息系统    *\n");
   printf("                                          *                                *\n");
   printf("                                          *                                *\n");
   printf("                                          *                                *\n");
   printf("                                          **********************************\n");
}
void writedata(stu *head)
{
    FILE *fp = fopen("Ss.txt", "w+");
    if (fp == NULL)
    {
        perror
		 ("fopen");
        return;
    }
 
    fwrite(&len, sizeof(int), 1, fp);// 要写入个数
    stu *p = head;
    while(p->next != NULL)
    {
        p = p->next;
        int length = sizeof(stu);//写入数据的长度
        fwrite(&length, sizeof(int), 1, fp);
        fwrite(p, length, 1, fp);//写入数据
    }
 
    fclose(fp);
}
void readdata(stu *head)
{
    FILE *fp = fopen("Ss.txt", "ab+");
 
    if (fp == NULL)
    {
        perror ("fopen");
        return;
    }
 
    stu *temp = head;
 
    fread (&len, sizeof(int), 1, fp);   // 读记录的个数
    int i;
    for (i = 0; i < len; i++)
    {
        int length;
        fread (&length, sizeof(int), 1, fp);
 
        stu *p = (stu *)malloc(sizeof(stu));
        if( p == NULL )
        {
            printf("malloc error!\n");
            return ;
        }
 
        int ret = fread (p, length, 1, fp);        // 读取数据
        printf("%d\n",ret);
        while( temp->next != NULL )
        {
            temp = temp->next;
            
        }
        temp->next = p;    //找到最后一个结点,将结点p尾插进链表
        p->next = NULL;
    }
 
    fclose(fp);
 
}
struct stu *del(struct stu *head) 
{
	struct stu *p,*q;
	int a;//要删除学生的学号
	if(head->next==NULL)// 头文件为空时,输出通讯录为空
		{printf("**********************************通讯录为空!!!*********************************\n\n\n");
		printf("------------------------------请新建联系人后尝试!!!-----------------------------\n\n");
		}
	else
	{	
		one:printf("\t输入要删除学生学号:");
		scanf("%d",&a);
		for(p=head,q=p->next;q->xh!=a&&q->next!=NULL;)
		{
		p=p->next;
		q=p->next;
		}
		if(q->xh==a)
		{	
			p->next=q->next;
			free(q);
			len--;
			writedata(head);
			//释放q,也就是删除q,在这里就是删除q(学号为a)
			printf("\n\t删除成功!!!\n");
		}
		else printf("\n\tNo people have found!!!\n");//如果不符合,就输出没有找到
	}
	return head;//返回头文件
}

int main()
{
	int wl;
	struct stu *head,*q;
	head=(struct stu*)malloc(sizeof(struct stu));
	head->next=NULL;
	int i=1;
	readdata(head);
	system("cls");
	mimajiemian(); 
	check();
	start:system("color 1e");
	menu();
	scanf("%d",&wl);
	switch(wl)
	{
		case 1:system("cls");
				jiemian();
				system("color 01");
				one:printf("\t选择成功!!\n\n"); 
				len++;
				q=(struct stu *)malloc(sizeof(struct stu));
				printf("\t请输入新建人姓名:");scanf("%s",q->name);
				printf("\t输入学号:");scanf("%d",&q->xh);
				printf("\t输入班级:");scanf("%d",&q->grade);
				printf("\t手机号:");scanf("%s",q->tel);
				printf("\t家庭地址:");scanf("%s",&q->add);
				charu(head,q);
				printf("\t新建成功!!!\n");
				printf("\t请选择是否继续新建:\n\t1:继续新建\n\t2:返回主菜单\n\t\t");
				two:int a;
				scanf("%d",&a);
				if(a==1){
					goto one;
				}
				else if(a==2){
				writedata(head);
				system("cls");
				goto start;
				break;
				}
				else{
					system("color 4"); 
					printf("请输入正确的指令:");
					goto two;
				}
				
		case 2:
			system("cls");
			jiemian();
			printf("\t选择成功!!\n\n"); 
			system("color A5");
			head=del(head);
			pause();system("cls");goto start;break;
		case 3:
			system("cls");
			system("color 60");
			jiemian();
			printf("\t选择成功!!\n\n"); 
			change(head);pause();system("cls");goto start;break;
	    case 4:
	    	system("cls");
	    	jiemian();
	    	system("color 5a");
			printf("\t选择成功!!\n\n"); 
			search(head);pause();system("cls");goto start;break;
		case 5:
			system("cls");
			jiemian();
			system("color 6f");
			printf("\t选择成功!!\n\n"); 
			printall(head);pause();system("cls");goto start;break;
		case 6:system("cls");
			jiemian();
			system("color 04");
			printf("\t选择成功!!\n\n"); 
			paixu(head);
			pause();system("cls");goto start;break; 
		case 7: 
			system("cls");
			jiemian();
			printf("\t选择成功!!\n\n");  
			writedata(head);
			sf(head);
			exit (0);
		default: pause();system("cls");printf("输入操作错误,重新"); goto start; }
	return 0;
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值