C语言 通讯录系统

 

目录

头文件

all.h

crud.h

data_move.h

global.h

main.h

safe.h

源文件

crud.cpp

data_move.cpp

global.cpp

main.cpp

safe.cpp

测试

登录账号

 添加

 查询

修改 

结束


头文件

all.h

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>//控制台输入输出
#include <string.h>
#include "collections.h"
#include "string_pro.h"
#include "global.h"
#include "main.h"
#include "safe.h"
#include "crud.h"
#include "data_move.h"

#pragma comment(lib,".\\StaticLinkListLib.lib")
#pragma comment(lib,".\\StaticStringproLib.lib")

crud.h

#pragma once
#include "all.h"
/*数据维护*/
/*创建一条记录*/
Address_Book* createAddressBook(const char* name,
								const char* tel,
								const char* qq,
								const char* note);

/*增加新记录*/
void addNew();

/*输入一条 */
Address_Book* inputAddressBook();

/*追加到 文件 持节保存*/
int appendToFile(Address_Book* pbook);

/*查询*/
void query();

/*修改*/
void update();

/*更新到文件*/
int updateToFile(int index,Address_Book* pbook);

data_move.h

#pragma once
#include "all.h"
void importData();

global.h

#pragma once
#include "collections.h"
//数据类型
typedef struct address_book
{
	char name[20];//姓名
	char tel[20];//手机号
	char qq[20];//qq号
	char note[100];//备注
	int del;//1代表已被删除 !1没有删除
} Address_Book;
//数据结构
extern PLinkedList listAddressBook;

extern char userID[50];
extern char passWord[50];

main.h

#pragma once
/*项目初始化*/
void init();

/*展示菜单*/
void showMenu();

/*加载数据*/
void loadData();

safe.h

#pragma once
#include "global.h"
#include <stdio.h>
#include <string.h>
#include <conio.h>

/*登录*/
int login();

/*输入账号*/
void intputUserID();

/*输入密码*/
void intputPassword();

源文件

crud.cpp

#include "all.h"

Address_Book* createAddressBook(const char* name, const char* tel, const char* qq, const char* note)
{
	Address_Book* p = (Address_Book*)malloc(sizeof(Address_Book));
	if (p)
	{
		strcpy(p->name, name);
		strcpy(p->tel, tel);
		strcpy(p->qq, qq);
		strcpy(p->note, note);
	}
	return p;
}

void addNew()
{
	Address_Book* pab = inputAddressBook();
	getchar();//
	printf("是否保存请确认(Y/N)");
	char yes = getchar();
	if (yes == 'Y' || 'y')
	{
		add(listAddressBook, pab);
		if (appendToFile(pab))
		{
			printf("保存成功\n");
		}
		else
		{
			printf("保存失败,请联系管理员\n");
		}
	}
	else
	{
		free(pab);

	}

}

Address_Book* inputAddressBook()
{
	Address_Book book;
	printf("请输入姓名:");
	scanf_s("%s", book.name,20);
	printf("请输入手机:");
	scanf_s("%s", book.tel,20);
	printf("请输入QQ:");
	scanf("%s", book.qq);
	printf("请输入备注:");
	scanf("%s", book.note);
	
	return createAddressBook(book.name, book.tel, book.qq, book.note);
}

int appendToFile(Address_Book* pbook)
{
	FILE* pf = fopen("./addressbook.ab", "ab");
	if (pf)
	{
		fwrite(pbook, sizeof(Address_Book), 1, pf);
		fclose(pf);
		return 1;
	}
	return 0;
}

void query()
{
	printf("请输入查询关键字(ALL查询全部):");
	char keyword[50];
	scanf("%s", keyword);
	//链表的遍历
	iterator(listAddressBook);
	int i = 0;
	printf("%4s %-10s %s %s %s\n", "编号", "姓名", "手机", "QQ", "备注");

	while (hasNext(listAddressBook))
	{
		i++;
		address_book* pab = (address_book*)next(listAddressBook);
		if (pab->del!=1 && strcmpIgnorecase("all", keyword) == 0
			|| contains(pab->name, keyword)
			|| contains(pab->tel, keyword)
			|| contains(pab->qq, keyword)
			|| contains(pab->note, keyword)
			)
		{
			printf("%-4d %-10s %s %s %s\n", i, pab->name, pab->tel, pab->qq, pab->note);
		}
	}
}

void update()
{
	int id;
	printf("请输入被修改的数据编号:");
	scanf("%d", &id);
	id--;
	Address_Book* old = (Address_Book*)get(listAddressBook, id);
	if (old)
	{
		printf("原有数据:");
		printf("姓名:%s\n", old->name);
		printf("电话:%s\n", old->tel);
		printf("QQ:%s\n", old->qq);
		printf("备注:%s\n", old->note);
		printf("请输入新数据:");
		Address_Book* xin = inputAddressBook();
		//确认是否保存
		getchar();
		printf("是否更新?(Y/N)");
		char yes = getchar();
		if (yes == 'y' || yes == 'Y')
		{
			set(listAddressBook, id, xin);
			free(old);
			//保存到文件
			if (updateToFile(id, xin))
			{
				printf("更新成功\n");
			}
		}
		

	}
	else
	{
		printf("没有对应数据\n");
	}
}

int updateToFile(int index, Address_Book* pbook)
{
	FILE* pf = fopen("./addressbook.ab", "r+b");
	if (pf)
	{
		//文件定位
		fseek(pf, index * sizeof(Address_Book), SEEK_SET);
		fwrite(pbook, sizeof(Address_Book), 1, pf);
		fclose(pf);
		return 1;
	}
	return 0;
}

data_move.cpp

#include "data_move.h"

void importData()
{
	printf("数据导入来源:");
	char path[50];
	scanf("%s" , path);
	FILE* pf = fopen(path, "rt");
	if (pf)
	{
		Address_Book book;
		while (!feof(pf) && fscanf(pf, "%s%s%s%s",
			book.name, book.tel, book.qq, book.note) > 0)
		{
			Address_Book* pab = (Address_Book*)malloc(sizeof(Address_Book));
			memcpy(pab, &book, sizeof(Address_Book));
			add(listAddressBook, pab);
			appendToFile(pab);
		}

		fclose(pf);
		printf("导入成功\n");
	}
	else
	{
		printf("导入失败\n");
	}
}

global.cpp

#include "all.h"
/*全局变量*/

char userID[50];
char passWord[50];
PLinkedList listAddressBook = createLinkedList();

main.cpp


#include "all.h"

int main()
{
	loadData();

	init();
	char menuID;//
	do
	{
		printf("选择菜单项:/>");
		menuID = _getche();
		switch (menuID)
		{
		case 'a':
		case 'A':
			addNew();
			break;
		case 'u':
		case 'U':
			update();
			break;
		case 'd':
		case 'D':
			break;
		case 's':
		case 'S':
			query();
			break;
		case '1':
			break;
		case '2':
			break;
		case 'i':
		case 'I':
			break;
		case 'e':
		case 'E':
			break;
		case 'p':
		case 'P':
			break;
		case 'q':
		case 'Q':
			break;

		default:
			break;


		}


	} while (menuID != 'q');

	return 0;
}

void init()
{
	//登录
	int i = 3;
	for (; i >= 1; i--)
	{
		if (login())
		{
			break;
		}
		else
		{
			system("cls");
			printf("还有%d次机会\n", i - 1);
		}
	}
	if (i < 1)
	{
		printf("非法用户");
		exit(0);
		return ;
	}

	//数据加载
	system("cls");
	printf("欢迎您: %s\n", userID);
	showMenu();
}

void showMenu()
{
	printf("=====================欢迎使用Colin通讯录============================\n");

	printf("a.增加新记录\n");
	printf("u.修改新记录\n");
	printf("d.删除已有记录\n");
	printf("s.条件检索记录\n");
	printf("--------------------\n");
	printf("1.按姓名索引排序\n");
	printf("2.按手机归属地索引排序\n");
	printf("--------------------\n");
	printf("i.导入外部数据\n");
	printf("e.检索导出数据\n");
	printf("--------------------\n");
	printf("p.更新密码\n");
	printf("--------------------\n");
	printf("q.退出系统\n");

	printf("=================================================\n");

}

void loadData()
{
	/*add(listAddressBook, createAddressBook("zahngsan", "189", "999", "wu"));
	add(listAddressBook, createAddressBook("lisi", "189", "999", "wu"));
	add(listAddressBook, createAddressBook("wanglwu", "189", "999", "wu"));
	add(listAddressBook, createAddressBook("Jim", "189", "999", "wu"));*/
	FILE* pf = fopen("./addressbook.ab", "rb");
	if (pf != NULL)
	{
		Address_Book book;
		while (!feof(pf) && fread(&book, sizeof(Address_Book), 1, pf) > 0)
		{
			Address_Book* pab = (Address_Book*)malloc(sizeof(Address_Book));
			memcpy(pab, &book, sizeof(Address_Book));
			add(listAddressBook, pab);
		}


		fclose(pf);
	}


}

safe.cpp

#include "all.h"

int login()
{
	intputUserID();
	intputPassword();
	if (strcmp(userID, "wj")==0 
		&& strcmp(passWord, "123456")==0)//
	{

		return 1;
	}
	else
	{
		printf("账号密码有错误!!\n");
	}

	return 0;
}

void intputUserID()
{
	printf("输入账号:");
	scanf_s("%s", userID, 50);
}

void intputPassword()
{
	printf("输入密码:");
	//scanf_s("%s", passWord, 50);
	//getch() 输入 但不显示   putchar('*')
	char ch; 
//	'\r';//回车
//	'\n';//换行
	int i = 0;
	for (; ; i++)
	{
		ch = _getch();
		if (ch != '\r')
		{
			passWord[i] = ch;
			putchar('*');
		}
		else
			break;
	}
	passWord[i] = '\0';
}

测试

登录账号

 

 添加

 查询

 

修改 

 

 

结束

    至此,C语言的学习告一段落,以一个不完整的通讯录结束,但大体框架已经搭建,一些功能没有写,感兴趣的可以自行参透,​​​​​​​接下来我们会开始学习C++,我们C++再见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员懒羊羊

多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值