目录
头文件
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++再见!