概述
大一学了大半年的C语言,只学到指针,学得浅。总体下来,感觉自己只学会了hello world。没有实际的项目可以练手,网上的资料又残次不齐,代码没有一个能运行的。
我从0开始,一行一行的实现了图书管理系统,虽然功能简单,但也不少,增删改查,一个不落。
最主要的收货有3点
- 学会使用googletest单元测试框架,来测试我写的代码
- 学会了单链表
- 学会使用visual studio 2019调试代码
核心代码
1. 添加图书
void add_menu()
{
char name[MAX_LENGTH];
char author[MAX_LENGTH];
printf("添加图书n");
printf("请输入书名:n");
scanf_s("%s", name, (unsigned)_countof(name));
printf("请输入作者:n");
scanf_s("%s", author, (unsigned)_countof(author));
linklist_add(g_book, name, author);
database_write(g_book);
}
2. 删除图书
void del_menu()
{
while (TRUE)
{
// 清屏
system("cls");
printf("删除图书n");
list_menu(FALSE);
printf("请输入序号删除图书,按ESC返回上级菜单n");
int key = _getch();
// ESC返回
if (key == 27)
{
break;
}
// '0' 48
// '1' 49
key = key - '0';
// 数据合法
if (key > 0 && key < 10) // [1,9]
{
linklist_del(g_book, g_page[key].name, g_page[key].author);
}
}
}
3. 更新图书
void modify_menu()
{
printf("修改图书n");
// 列出所有图书
list_menu(FALSE);
// 让用户选择图书序号
printf("请输入序号修改图书,按ESC返回上级菜单n");
int key = _getch();
if (key == 27)
{
return;
}
key = key - '0';
// g_book删除旧的图书信息
if (key > 0 && key < 10)
{
linklist_del(g_book, g_page[key].name, g_page[key].author);
}
// 提示用户输入书名,作者
char name[MAX_LENGTH];
char author[MAX_LENGTH];
printf("请输入书名:n");
scanf_s("%s", name, (unsigned)_countof(name));
printf("请输入作者:n");
scanf_s("%s", author, (unsigned)_countof(author));
// g_book插入新的图书信息
linklist_add(g_book, name, author);
database_write(g_book);
}
4. 查询图书
void query_menu()
{
printf("查询图书n");
// 提示用户输入用户名author查询
char author[MAX_LENGTH];
printf("请输入作者查询n");
printf("作者:");
scanf_s("%s", author, (unsigned)_countof(author));
printf("------------查询结果----------n");
printf("序号tt书名tt作者n");
int index = 1;
// 遍历g_book链表
struct linklist_t* p = g_book;
while (p->next != NULL)
{
// 指向下一个节点
p = p->next;
// 如果author跟g_book的author一样,则显示出来
if (memcmp(p->author, author, strlen(p->author)) == 0)
{
printf("%dtt%stt%sn", index, p->name, p->author);
index++;
}
}
_getch();
}
5. 列出所有图书
void list_menu(int pause)
{
printf("列出所有图书n");
printf("序号tt书名tt作者n");
struct linklist_t* p = g_book;
memset(g_page, 0, sizeof(g_page));
int index = 1;
while (p->next != NULL)
{
p = p->next;
printf("%dtt%stt%sn", index, p->name, p->author);
memcpy(g_page[index].author, p->author, strlen(p->author) + 1);
memcpy(g_page[index].name, p->name, strlen(p->name) + 1);
index++;
}
if (pause)
{
_getch();
}
}
6. 主逻辑
// 主界面
void mainmenu()
{
printf("图书管理系统n");
printf("n");
printf("1. 添加图书n");
printf("2. 删除图书n");
printf("3. 修改图书n");
printf("4. 查询图书n");
printf("5. 列出所有图书n");
printf("n");
printf("请按数字,选择功能n");
}
void mainloop()
{
while (true) {
mainmenu();
// getchar需要按回车键
int key = _getch();
system("cls");
switch (key) {
case '1':
add_menu();
break;
case '2':
del_menu();
break;
case '3':
modify_menu();
break;
case '4':
query_menu();
break;
case '5':
list_menu(TRUE);
break;
default:
break;
}
system("cls");
}
}
int main()
{
g_book = linklist_init();
mainloop();
return 0;
}
7. 完整源码下载
源码
最后
以上就是高高大叔为你收集整理的C语言项目:使用gtest单元测试实现图书管理系统(附源码)的全部内容,希望文章能够帮你解决C语言项目:使用gtest单元测试实现图书管理系统(附源码)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复