通讯录管理系统C语言课程设计

一、实验目的
1.巩固和加深学生对C语言课程的基本知识的理解和掌握
2.掌握C语言编程和程序调试的基本技能
3.利用C语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C语言解决实际问题的能力
二.程序要求
学生信息包括:学号,姓名,班级,地址,电话,E-mail等。设计一个学生通讯录管理系统,应具有以下功能:
1、学生通讯信息录入(存储在文件中);
2、学生通讯信息浏览;
3、查询功能:包括按学号查询、按姓名查询、按班级查询;
4、学生通讯信息删除;
5、学生通讯信息修改;
三、算法及分析
1、系统功能模块图
系统功能模块图
添加:可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱
后,会提示是否继续添加。
显示:可以以表格形式输出所有通讯录里的记录。
删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容。 查询:可以选择用姓名、电话、地址三种方式查询。
修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、
电子邮箱即可完成修改。
保存:输入文件名(带后缀名)后,即可将通讯录信息保存到文件。

*模块一:头文件,变量定义,函数的声明
对系统所使用的变量进行定义,对函数进行声明。
模块二:录入学生信息
声明函数void readfile(),说明一个文件指针FILE fp打开文件"student.txt"。
模块三:学生信息的查找
声明void seek()为查找函数,通过switch(item)设定用学号查找,用姓名查找两个分支。
模块四:学生信息的修改
声明void mod ify()为学生信息修改函数,通过switch(item)设定所要修改的项目。模块五:刷新学生信息
声明void sort()将录入学生系按升序排列,用的是“冒泡排序法”实现排序。
模块六:增加学生信息
声明void insert()插入学生信息,先通过判断学生是否存在,若
否则继续输入,若是则跳出,重新循环。
模块七:删除学生信息
声明void del()实现学生信息删除,通过学号对比确定要删除的信息,然后用后一个替换掉。
模块八:显示学生信息
通过disp lay()函数输出学生信息模块九:保存信息
通过fp=fopen(“student.txt”,“w”);写入信息。
模块十:汇总学生数目
通过number()函数将已有男女生及总学生数目汇总出来。
模块十一:系统帮助
通过help()函数帮助操作。
模块十二:界面菜单
通过switch(num)调用以上各函数,实现功能。

1、程序采用模块化设计,各模块独立,可分块调试,个模块由主函数控制调用。
2、其中主要模块(readfile()、seek()、mod ify())都是利用数组,指针来实现数据结构设计。
3、数据库设计的任务是确定系统所需要的数据库。数据库是表的集合,通常一个系统只需一个数据库。设计人是根据需求分析,确定数据库所包含的表及字段、表间的关系,然后具体确定表的结构,包括字段名、字段类型及宽度,需要的索引等。根据对需求得到的数据结构进行分析,按数据输入输出的要求,确定表和表间的关系,进行验证、调整、修改、完善,使其能够实现用户对数据和功能的要求。通讯信息表包括以下字段:学号,姓名,年龄,性别,出生年月,地址,电话, E-mail。学号为主索引。
2、主要函数
int Menu_select() 系统用户登录后的菜单
int Input(Student stu[]) 添加记录函数
int sum(Student stu[]) 统计记录函数(男 女 总 人数)
void Display(Student stu[]) 显示记录函数
int Delete(Student stu[]) 删除记录函数
void Chick(Student stu[]) 查找记录函数
void Change(Student stu[]) 修改记录函数
void WritetoText(Student stu[]) 写入文件函数
void Read(Student stu[]) 读取文件函数
void Menu() 对应int Menu_select()函数的子菜单 他调用除主函数意外的所有函数
void encfile(char *in_filename,char *pwd,char *out_file) 文件加密函数
void unencfile(char *in_filename,char *pwd,char *out_file) 文件解密函数
int unpasswd() 解密函数
int passwd() 调用文件加密的函数
int main() 主函数设置密码功能 调用 Menu 函数
流程图
源代码

#include"stdio.h"
#include<stdlib.h>
#include<conio.h>
#include<string.h> 
static int n=0; 
void encfile(char *in_filename,char *pwd,char *out_file) ; 
int passwd();                                             
int  unpasswd();                                          
void shut();                                              
typedef struct
	{
		long  score;               /*学号*/
		char name[10];             /*姓名*/
		char sex[8];			   /*性别*/
		char adds[20];			   /*工作单位*/
		char num[15];              /*电话号码*/
		char email[20];			   /*邮箱*/
	}Student;
Student T[100];

int Menu_Select()
	{
		char c;
		do{
		system("cls");    
		system("date /T");
		system("time /T");
		system("color 0a");
		printf("\t\t\t***学生通讯录***** \n");
		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("\t\t\t* 6. 保存记录  *\n");
		printf("\t\t\t* 7. 读取记录  *\n");
		printf("\t\t\t* 8. 统计记录  *\n");
		printf("\t\t\t* 9. 文件解密  *\n");
		printf("\t\t\t* *. 其他功能  *\n");
		printf("\t\t\t* 0. 退出程序  *\n");
		printf("\t\t\t*****************\n");
		printf("\t\t\t请您选择(0-9)选择 其他功能 请输入':':" );
		c=getchar();
		}while(c<'0'||c>'10');
		return(c-'0');
	}
 

int Input(Student stu[])
{
    int i=0;
    char sign;
	while(sign!='n'&&sign!='N')
	{
		printf("\t学号:");
		scanf("\t%d",&stu[n+i].score);
		printf("\t姓名:");
		scanf("\t%s",stu[n+i].name);
		printf("\t性别:");
		scanf("\t%s",stu[n+i].sex);
		printf("\t电话号码:");
		scanf("\t%s",stu[n+i].num);
		printf("\t工作地址:");
		scanf("\t%s",stu[n+i].adds);
		printf("\t电子邮箱:");
		scanf("\t%s",stu[n+i].email);
		printf("\n\t是否继续添加?(Y/N)");
		scanf("\t%c",&sign);
		i++;
	}
	return(n+i);
}

int sum(Student stu[])
{
	int a=0,b=0,i;
	for(i=0;i<n;i++)
	{
		if(strcmp(stu[i].sex,"男")==0) //比较函数
		a++;
	}
	b=i-a;
	printf("\t\t通讯录总人数为%d个,\n\t\t    其中男孩有%d个。\n",i,a);
	printf("\t\t    其中女孩有%d个。\n",b);
		return(n);
		system("pause");
}

void Display(Student stu[])
{
	int i;
	printf("------------------------------------------------------------------------------\n");  //显示的格式
	printf("学号           姓名   性别  电话号码     工作单位        电子邮箱\n");
	printf("------------------------------------------------------------------------------\n");
	for(i=1;i<n+1;i++)
		printf("%-14d%-8s%-6s%-13s%-15s%-15s\n",stu[i-1].score,stu[i-1].name,stu[i-1].sex,stu[i-1].num,stu[i-1].adds,stu[i-1].email);
	           //-14d%  -表示左对齐 14 表示十四个字节的位置 不足用空格补齐
    printf("----------------------------------------------------------------------\n");
	system("pause"); //系统函数停止。
}
 
int Delete(Student stu[])
{
	int i=0,j;
	long m;
	printf("\t请输入想删除记录中的学号:");
	scanf("%d",&m);
	while(stu[i].score!=m&&i<n)i++;
	if(i==n)
	{
		printf("\t通讯录中没有此人!\n");
 
	}
	else
	{
	for(j=i;j<n-1;j++)//后一条记录覆盖前一条记录
	{
		strcpy(stu[j].num,stu[j+1].num);
		strcpy(stu[j].name,stu[j+1].name);
		strcpy(stu[j].sex,stu[j+1].sex);
		strcpy(stu[j].adds,stu[j+1].adds);
		strcpy(stu[j].email,stu[j+1].email);
		stu[j].score=stu[j+1].score;
	}
	printf("\t\t\t已经成功删除!\n");
	n=n-1;
	}
	return (n); }
  void Chick(Student stu[])
 {
    
    int m;
    printf("\t\n请选择查询方式:\n");        //printf输出查询格式
    printf("\t**************************************\n");//格式:
    printf("\t**1---姓名查询(不建议用这种方式查询)**\n");
    printf("\t**2--电话查询(建议使用)             **\n");
    printf("\t**3--地址查询                       **\n");
    printf("\t**************************************\n");
    printf("请选择:");
    scanf("%d",&m);
    while(m!=1&&m!=2&&m!=3)
    {
		printf("输入错误,请重新选择:");
		scanf("%d",&m);
	}
 
	if(m==1)                                 
	{
		char s[20];
		int i=0;
		printf("\t请输入想查询的姓名:");
		scanf("\t%s",s);
   
   loop:while(strcmp(stu[i].name,s)!=0&&i<n )
		{	                                  
	    	i++;
		}
	   	if(i==n)
		{
			printf("\t通讯录中没有此人!\n");
			return;
		}
		else
		{
			printf("\t学生学号: %d\n",stu[i].score);
			printf("\t学生性别: %s\n",stu[i].sex);
			printf("\t电话号码: %s\n",stu[i].num);
			printf("\t工作地址: %s\n",stu[i].adds);
			printf("\t电子邮箱: %s\n",stu[i].email);
		}
			if(i<n-1)                              
			{
				i++;
				goto loop;
			}
	} ;
	
     if(m==2)
	 {
		char s[20];
		int i=0;
        printf("\t请输入想查询的电话:");
		scanf("\t%s",s);
        while(strcmp(stu[i].num,s)!=0&&i<n) i++;
        if(i==n)
		{
			printf("\t通讯录中没有此人!\n");
			return;
 
		}
		printf("\t学生学号: %d\n",stu[i].score);
		printf("\t学生姓名: %s\n",stu[i].name);
		printf("\t学生性别: %s\n",stu[i].sex);
		printf("\t工作地址: %s\n",stu[i].adds);
		printf("\t电子邮箱: %s\n",stu[i].email);
	 } ;
 
	if(m==3)
	{
		char s[20];
		int i=0;
		printf("\t请输入想查询的地址:");
		scanf("\t%s",s);
		while(strcmp(stu[i].adds,s)!=0&&i<n) i++;
		if(i==n)
		{
			printf("\t通讯录中没有此人!\n");
			return;
		}
		printf("\t学生学号: %d\n",stu[i].score);
		printf("\t学生姓名: %s\n",stu[i].name);
		printf("\t学生性别: %s\n",stu[i].sex);
		printf("\t电话号码: %s\n",stu[i].num);
		printf("\t电子邮箱: %s\n",stu[i].email);
	} ;
}
void Change(Student stu[])
{
	int i=0;
	long m;
	printf("\t请输入想修改的记录中人的学号:");
	scanf("%d",&m);
    while(stu[i].score!=m&&i<n)
	i++;
	if(i==n)
	{
		printf("\t通讯录中没有此人!\n");
		return;
	}
		printf("\t学号:");
		scanf("\t%d",&stu[i].score);
		printf("\t姓名:");
		scanf("\t%s",stu[i].name);
		printf("\t性别:");
		scanf("\t%s",stu[i].sex);
		printf("\t电话号码:");
		scanf("\t%s",stu[i].num);
		printf("\t工作地址:");
		scanf("\t%s",stu[i].adds);
		printf("\t电子邮箱:");
		scanf("\t%s",stu[i].email);
		printf("\t修改成功!");
}

void WritetoText(Student stu[])
{
	int i=0;
	FILE *fp;                                           
	char filename[20];                                  
	printf("\t保存到文件\n");                           
	printf("\t请输入所保存的文件名:");
	scanf("\t%s",filename);
	if((fp=fopen(filename,"w"))==NULL)
	{
		printf("\t无法打开文件\n");
		system("pause");
		return;
	}
	while(i<n)
	{
		fprintf(fp,"%-13d%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",stu[i].score,stu[i].name,stu[i].sex,stu[i].num,stu[i].adds,stu[i].email);
		i++;
	}
	fclose(fp);                                        
	printf("保存成功!\n");
}

void Read(Student stu[])
{
  FILE *fp;
  int i;
  char filename[20];
  printf("输入要读入的文件名:");
  scanf("\t%s",filename);
  if((fp=fopen(filename,"r"))==NULL)
    {
       printf("找不到%s文件!\n",filename);
       system("pause");
       exit(0);
    }
   n=0;
 // fseek(fp,0L,SEEK_SET);     
   for(i=0;i<100&&!feof(fp);i++)
    {
       fscanf(fp,"%d %s %s %s %s %s\n",&stu[i].score,stu[i].name,stu[i].sex,stu[i].num,stu[i].adds,stu[i].email);
       n++;
    }
 fclose(fp);
 printf("读取成功,文件%s中的所有信息已经读入!\n",filename);
}
 
void Menu()
{
		for(;; )
	{
		switch(Menu_Select())
		{
		
		case 1:
		printf("\n\t添加记录到通讯录\n");                    
		n=Input(T);
		break;
		
		case 2:
		printf("\n\t\t\t    通讯录记录表\n");                   
		Display(T);
		break;
 
		case 3:
		printf("\n\t从通讯录中删除记录\n");
		n=Delete(T);								              
		printf("\t");
		system("pause");							         
		break;
 
		case 4:
     	printf("\n\t在通讯录中查找记录\n");
		Chick(T);									             
		printf("\t");
		system("pause");
		break;
 
		case 5:
		printf("\n\t修改通讯录中的记录\n");
		Change(T);										       
		printf("\t");
		system("pause");
		break;
 
		case 6:
		printf("\n\t保存功能\n");
		WritetoText(T);	                                         
	    passwd();
		printf("\t");
		system("pause");
		break;
 
		case 7:
		printf("\n\t读取功能\n");
		Read(T);									                          
		printf("\t");
		system("pause");
		break;
 
		case 8:
		printf("\n\t****学生通讯录统计人数****\n\n");                         
		sum(T);
		system("pause");
		break;
 
		case 9:
		printf("\n\t****对学生文件进行解密处理****\n\n");                     
		unpasswd();
		system("pause");
		break;
 
		case 10:  //用C语言实现对计算机的开机 关机 重启  定时关机              
		shut();
		system("pause");
		break;

		case 0:
		printf("\n\t\t\t欢迎您再次使用本程序!\n");                            
		printf("\n\t\t本程序只适合个人娱乐沟通使用,谢绝商业用途。\n");
		printf("\n\t\t\n");
		system("pause");
		exit(0);
		}
	}
}
 
 

void encfile(char *in_filename,char *pwd,char *out_filename)           
{
	FILE *fp1,*fp2;
    char ch;
	int j=0;
	int j0=0;
	fp1=fopen(in_filename,"rb");
	if(fp1==NULL)
	{
		printf("cannot open in-file.\n");
		exit(1);                                                              
	}
	fp2=fopen(out_filename,"wb");
	if(fp2==NULL)
	{
		printf("cannot open or create out-file.\n");
		exit(1);                                                               
	}
	while(pwd[++j0]);                                     
	ch=fgetc(fp1);                                      
	/*加密算法开始*/
	while(!feof(fp1))
	{
		fputc(ch^pwd[j>=j0?j=0:j++],fp2);              
		ch=fgetc(fp1);                                   
	}
	printf("恭喜文件加密成功!\n");
	printf("请牢记您的密码!\n");
	fclose(fp1);/*关闭源文件*/
	fclose(fp2);/*关闭目标文件*/
}

int  passwd()//加密调用函数
{
	char in_filename[30];  /*用户输入的要加密的文件名*/
	char out_filename[30]; /*用户输入加密后保存的文件名*/
	char pwd[8];           /*用来保存密码*/
/*	printf("\t为了安全起见,这里要对文件做加密处理:\n");    //反复调试还是没有通过。。。。。
	printf("\t请输入要加密文件的名字:");
	scanf("\t s%",in_filename);
	fflush(stdin);
	printf("\t请输入加密后的文件名:");
	scanf("\t s%",out_filename);
	fflush(stdin);
	printf("\t 请输入密码(不超过8位):");
	scanf("\t s%",pwd);
	fflush(stdin);
*/
   printf("\t为了安全起见,这里要对文件做加密处理:\n");
   printf("\t\n请输入需要加密文件的名字:\n");
   fflush(stdin);             
   gets(in_filename);      
   printf("\t\n请输入加密的密码:\n");
   gets(pwd);                
   printf("\t\n请输入加密后文件的名字\n");
   gets(out_filename);       
   encfile(in_filename,pwd,out_filename);
   return 0;
}
 
void unencfile(char *in_filename,char *pwd,char *out_filename) 
{
	FILE *fp1,*fp2;
    char ch;
	int j=0;
	int j0=0;
	fp1=fopen(in_filename,"rb");
	if(fp1==NULL)
	{
		printf("cannot open in-file.\n");
		exit(1);      
	}
	fp2=fopen(out_filename,"wb");
	if(fp2==NULL)
	{
		printf("cannot open or create out-file.\n");
		exit(1);      
	}
	while(pwd[++j0]); 
	ch=fgetc(fp1);   
	while(!feof(fp1))
	{
		fputc(ch^pwd[j>=j0?j=0:j++],fp2);      
		ch=fgetc(fp1);                         
	}
	printf("恭喜文件解密成功!\n");
	printf("现在你可以对文件进行修改了!\n");
	fclose(fp1);
	fclose(fp2);
}
 
int  unpasswd()
{
	char in_filename[30];  
	char out_filename[30]; 
	char pwd[8];           
/*	printf("\t为了安全起见,这里要对文件做解密处理:\n");
	printf("\t请输入要解密文件的名字:");
	scanf("\t s%",in_filename);
	fflush(stdin);
	printf("\t请输入解密后的文件名:");
	scanf("\t s%",out_filename);
	fflush(stdin);
	printf("\t 请输入密码:");
	scanf("\t s%",pwd);
	fflush(stdin);
*/
   printf("\t\n请输入需要解密文件的名字:\n");
   fflush(stdin);
   gets(in_filename);         
   printf("\t\n请输入密码:\n");
   gets(pwd);                 
   printf("\t\n请输入解密后文件的名字\n");
   gets(out_filename);         
   unencfile(in_filename,pwd,out_filename);
   return 0;
}
/*
  C语言的关机程序,主要调用windows DOS 系统下的system 函数
 */
int print()
{
    printf(" ╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n");
    printf("╔═══╧╧C语言关机程序 ╧╧═══╗\n");
    printf("║*************\n");
    printf("║**********计算机学院***********\n");
    printf("║*******************************\n");
    printf("║※1.实现10分钟内的定时关闭计算机║\n");
    printf("║※2.立即关闭计算机              ║\n");
    printf("║※3.注销计算机                 ║\n");
    printf("║※4.重启计算机                 ║\n");
    printf("║※0.退出系统                   ║\n");
    printf("╚════════════════╝\n");
    return 0;
}
void shut()
{
	char cmd[20]="shutdown -s -t ";
	int c;
    char t[5]="0";
    system("title C语言关机程序        作者:FantasticTony");
    system("mode con cols=45 lines=25");
    system("color 0B");
    system("date /T");
    system("TIME /T");
    print();
    scanf("%d",&c);
    getchar();
    switch(c)
   {
    case 1:printf("您想在多少秒后自动关闭计算机?(0~600)\n");scanf("%s",t);system(strcat(cmd,t));break;
    case 2:system("shutdown -p");break;
    case 3:system("shutdown -l");break;
    case 4:system("shutdown -r");break;
    case 0:break;
    default:printf("Error!\n");
   }
    system("pause");
    exit(0);
}

int main()
{
	int flag1;
    char name[20]="lhy";
    char person[20];
	char ch[7];
	int i,n;
	system("title   通讯录管理系统   作者:FantasticTony");
	system("date /T");   
	system("time /T");	
	system("color 0b");
	
    printf ("\t\t **********通讯录管理系统!**********\n\n");
	printf ("\t\t\t\t用 户 登 录 \n\n");
    printf("\t\t\t\t username:");
    gets(person);
    flag1=strcmp(person,name);
    printf("\t\t\t\t password:");
    
	for(i=0;i<3;i++)
	{
		for(n=0;n<6;n++)
		{
			ch[n] = getch();
			printf("*");
		}
		printf("\n");
		ch[n] = '\0';
		if(0 == strcmp(ch,"201314"))
		{
			printf("\t\t\t\t管理员你好,欢迎你进入本系统!\n");
			getch();
			Menu();
			break;
		}
        else
        {
            printf("密码错误,请重新输入\n");
        }
	}
	if(i==3)
    {
        printf("你输入的错误的密码次数达到上限,系统自动退出!请联系管理员!");
        exit(1);
    } /*     gets(password1);
        flag2=strcmp(password,password1);
        if(flag1==0 && flag2==0)            
		{
            printf("\t\t\t\t Welcome !\n\t\t\t\t Press any key to enter the menu!\n");
			getch();
            Menu();
            break;
		}
        else
		{
            printf ("\t\t\t      Your username or password is wrong!\n\t\t\t\t Please input again!\n");
			printf ("\t\t\t      pay attention you will hava %d  chance!         \n\n",4-h);
            h++;
		}
	}
   	if (h=5)                              
	    printf ("对不起,您输入的用户名或密码有误,已被强制退出。\n");
	    */
	return 0;}

运行截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

快速构建 Web 应用程序

更多推荐