C语言--图书管理项目

news2024/11/20 7:26:30

C语言图书管理系统项目

第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
第十二节 链表
第十三节 共用体union,枚举enum,宏定义#define,条件编译,const与指针
C语言–图书管理项目


文章目录

  • C语言图书管理系统项目
  • 前言
  • 一、登录功能
  • 二、主要功能
  • 总结


前言

图书馆项目主要运用到了链表,以及文件操作。


一、登录功能

账号是admin。
默认密码是123456
在这里插入图片描述

二、主要功能

在这里插入图片描述

搜索功能展示如下:
在这里插入图片描述

整体代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char pwd[10]="123456";	//系统密码 
char password[10];	//密码全局变量
char username[10];	
//判断输入的用户名和密码是否正确,正确返回1,否则返回0;
int login(char* username,char* password){
	char u[] = "admin";
	int i = strlen(username);
	if(i< 3 || i> 5){
		return -1;
	}   //对比字符串
	if(strcmp(u,username)==0 && strcmp(pwd,password)==0){
		return 1;
	} 
	return 0;
}

void getPwd(){		//输入密码 
	int i = 0;
	char ch;
	while(1)
	{
		ch = getch();	//暗文 
		if(ch == '\b')//  \b 回退键 	
		{
			// 删除i-1位上的字符 ,如果i == 0,什么都不做
			// 如果i不等于0,先清除password[i-1]里面的数据 '\0';  i = i - 1;  
			if(i != 0)
			{
				password[i-1] = '\0';
				printf("\b");	//回退 
				printf(" ");	//把位置上的改为空格 
				printf("\b");	//回退 
				i--;				
			}			
		}else if(ch == '\r'){		// 字符串的结束符号\0
			password[i] = '\0';
			break;		 // 结束循环
		}else{
			password[i] = ch;
			printf("*");
			i++;
		}	
	}
}
int update(){
	printf("请输入你的原密码:");
	char temp[20];
	scanf("%s",temp);
	int f = strcmp(temp,pwd);
	if(f!=0){
		printf("输入的密码错误,请重新重来\n");
		return 0; 
	}
	printf("请输入你的新密码:");
	scanf("%s",&temp);
	printf("再确认你的新密码:");
	char temp2[20];
	scanf("%s",&temp2);
	f = strcmp(temp,temp2);
	if(f!=0){
		printf("两次输入的密码不一致,请重新重来\n");
		return 0; 
	}
	strcpy(pwd,temp); 
}
void logon(){
	printf("===========欢迎进入图书管理系统===========\n");
	printf("==========================================\n");
	while(1){
		printf("请登录账号密码。\n");
		printf("账号:");
		scanf("%s",username);
		printf("密码:");
		getPwd();	//获取密码 
		int res = login(username,password);
		if(res == 1){
			printf("\n登陆成功\n");
			break;;
		}else if(res == -1){
			printf("\n请输入3~5位数账号\n"); 
		}else{
			printf("\n账号密码错误\n"); 
		}
	}
}
	
typedef struct book{
	char name[41];
	char author[21];
	int num;
	float price;
	float hot;
	struct book *next;
}book;
int hotRank(book* *h){
	book *head = *h;
	book *pre,*p,*q;
	book *tail = NULL;
	book *touZhiZhen = (book* )malloc(sizeof(book));
	touZhiZhen->next = *h;	//让头节点为空,方便排序后找到头节点 
	if(head == NULL) return 0;
	while(touZhiZhen->next != tail)
	{									
		pre = touZhiZhen;  		//指向头节点 
		p = touZhiZhen->next;	//头节点
		q = p->next;		//next 
		while (p->next != tail)
		{	
			if (p->hot < q->hot)//升序排列
			{	//交换节点
				pre->next = q;
				p->next = q->next;
				q->next = p;
			}else{
				p = p->next;
			}
			q = p->next;
			pre = pre->next;
		}
		tail = p;//一次循环后,最后一个数已最大,tail前移
	}
	*h = touZhiZhen->next;
	p = *h;	//从新指向头节点
	printf("书名\t作者\t库存\t价格\t热度\n");
	while(p!=NULL){
		int l = strlen(p->name);
		if(l < 10){
			printf("%s\t%s\t%d\t%.2f\t%.2f\n",p->name,p->author,p->num,p->price,p->hot);
		}else{
			printf("%s  %s  %d\t%.2f\t%.2f\n",p->name,p->author,p->num,p->price,p->hot);
		}
		p = p->next;
	}
	return 1;
}

int borrowBook(book* *h){
	printf("请输入要借阅书名:");
	char str[35];
	scanf("%s",str);
	
	book *p = *h;
	while(p != NULL){
		if(strcmp(str,p->name) == 0){
			p->num = p->num-1;
			printf("借阅成功\n\n"); 
			return 1; 
		}
		p = p->next;
	}
	printf("查找不到该书籍\n\n"); 
	return 0;
}
int returnBook(book* *h){
	printf("请输入要归还书名:");
	char str[35];
	scanf("%s",str);
	
	book *p = *h;
	while(p != NULL){
		if(strcmp(str,p->name) == 0){
			p->num = p->num+1;
			printf("归还成功\n\n"); 
			return 1; 
		}
		p = p->next;
	}
	printf("没有该书籍,归还失败\n\n"); 
	return 0;
}
int initLink(book* *h){
	//以读的方式打开文件
	FILE *fp = fopen("./book.txt","r"); 
	if(fp == NULL) 
	{ 	
	    printf("打开文件失败"); 
	    return 0; 
	} 
	int count = 0;
	char ch;
	while((ch = fgetc(fp)) != EOF){
		if(ch == '\n'){
			count++;
		}//判断有多少个行(即多少个结构体)
	}
	rewind(fp);	//将文件指针指向文件头
	book *p = *h;
	int i;
	for(i=0; i<count; i++){
		book *node = (book *)malloc(sizeof(book));
		fscanf(fp,"%s %s %d %f %f\n",node->name,node->author,&node->num,&node->price,&node->hot);
	    node->next = NULL;
		//把创面新建的节点加入链表
		if(p == NULL){
			p=node;
			*h = node;
			continue;
		}
		p->next = node;		
		p = node;		
	}
	fscanf(fp,"%s",pwd);
	// 关闭 
	fclose(fp);
}
int save(book* *h){
	book *p = *h;
	//以写的方式打开文件
	FILE *fp = fopen("./book.txt","w"); 
	if(fp == NULL) 
	{ 	
	    printf("打开文件失败"); 
	    return 0; 
	} 
	while(p != NULL){
		fprintf(fp,"%s %s %d %.2f %.2f\n",p->name,p->author,p->num,p->price,p->hot);
	    p = p->next;
	}	
	fprintf(fp,"%s",pwd);
	// 关闭 
	fclose(fp);
}
int searchAll(book* *h){
	book* p = *h;
	printf("书名\t作者\t库存\t价格\t热度\n");
	while(p != NULL){
		int l = strlen(p->name);
		if(l < 8){
			printf("%s\t%s\t%d\t%.2f\t%.2f\n",p->name,p->author,p->num,p->price,p->hot);
		}else{
			printf("%s  %s  %d\t%.2f\t%.2f\n",p->name,p->author,p->num,p->price,p->hot);
		}
		p = p->next;
	}
	printf("搜索完成\n\n");  
	return 0;
}
int searchName(book* *h){
	printf("请输入要搜索书名:");
	char str[35];
	scanf("%s",str);
	printf("书名\t作者\t库存\t价格\t热度\n");
	
	book* p = *h;
	while(p != NULL){
		if(strcmp(str,p->name) ==0){
			printf("%s\t%s\t%d\t%.2f\t%.2f\n",(p)->name,(p)->author,(p)->num,(p)->price,(p)->hot);
		}	
		(p) = (p)->next;
	}
	printf("搜索完成\n\n"); 
	return 0;
}
int searchAuthor(book* *h){
	printf("请输入要搜索作者:");
	char str[35];
	scanf("%s",str);
	printf("书名\t作者\t库存\t价格\t热度\n");
	
	book* p = *h;
	while(p != NULL){
		if(strcmp(str,p->author) ==0){
			printf("%s\t%s\t%d\t%.2f\t%.2f\n",(p)->name,(p)->author,(p)->num,(p)->price,(p)->hot);
		}	
		(p) = (p)->next;
	}
	printf("搜索完成\n\n"); 
	return 0;
}
void serch(book* *h){
	AA:printf("[1]全部查询   [2]按书名查找   [3]按作者查找 其余数字退出\n");
	printf("请输入你的选择:");
	short temp;
	scanf(" %hd",&temp);
	switch(temp){
		case 1: searchAll(h); goto AA;
		case 2: searchName(h);goto AA;
		case 3:	searchAuthor(h);goto AA;
		default: 	printf("退出搜索界面\n\n"); break;
	}
}
int addbook(book* *h){
	book *node = (book *)malloc(sizeof(book));
	printf("请输入书名:");
	scanf("%s",node->name); 
	printf("请输入书的作者:");
	scanf("%s",node->author); 
	printf("请输入库存数量:");
	scanf("%d",&node->num); 
	printf("请输入书的价格:");
	scanf("%f",&node->price);
	printf("请输入书的热度:");
	scanf("%f",&node->hot);
	node->next = NULL;
	book* p = *h;	
	if(p == NULL){
		*h = node;
		printf("添加完成\n\n"); 	
		return 1;
	}
	while(p->next != NULL){	//找到链表上最后一个节点 
		p = p->next;
	}
	p->next = node;		//添加节点
	printf("添加完成\n\n"); 
	return 1;
}
void UI(){
	printf("===========欢迎进入图书管理系统===========\n");
	printf("==========================================\n");
	printf("=======[1]检索\t\t[2]借书 还书======\n");
	printf("=======[3]热度排行\t[4]添加新书=======\n");
	printf("=======[5]修改密码\t[6]保存数据=======\n");
	printf("=======[0]退出程序\n");
	printf("==========================================\n");
	printf("请输入相应的数字选择:");
}

int main()
{	
	book *h=NULL;
	initLink(&h);
	logon();
	while(1){		
		UI();
		int num; 
		scanf("%d",&num); 
		switch(num){
			case 1:serch(&h);break; 
			case 2:{
					printf("[1]借阅 [2]归还  其余退出\n");
					short temp;
					scanf("%hd",&temp);
					if(temp == 1){
						borrowBook(&h); 
					}else if(temp == 2){
						returnBook(&h); 
					}
					break;
			}
			case 3:hotRank(&h);break; 
			case 4:addbook(&h); break; 
			case 5:update();;break;
			case 6:save(&h);break;
			case 0:	return 0;
			default: printf("请输入功能对应的数字1~6/n");break;
		}
	}
	return 0;
}



总结

主要运用到了链表的增删改查,文件的保存以及初始化操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux多线程编程】1. 多线程与单线程

什么是单线程 在描述什么是多线程之前&#xff0c;先讲讲什么是单线程。 int var 100; // 全局变量 var&#xff0c;初始值为 100 void func(){var 100;std::cout << "now var is: " << var << std::endl; // c 语法&#xff0c;意思为输出 va…

【强训】day02

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、 编程1. 排序子序列2. 倒置字符串答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 阅读如下代码。 请问&#xff0c;对语句行 test.hello(). 描述正确的有&#xff08;&#xff09; pa…

网站备案信息查询,网站备案号在哪里查询

网站备案号一般是在工信部官方查询&#xff0c;也可以使用第三方工具查询。 1、使用工信部域名信息备案管理系统网站查询 打开工信部的域名信息备案管理系统网站https://beian.miit.gov.cn/&#xff0c;点击ICP备案信息查询&#xff0c;添加需要查询的域名&#xff08;网站网址…

Drools基础与实现(操作实例)

简介&#xff1a; Drools 是用 Java 语言编写的开放源码规则引擎&#xff0c;使用 Rete 算法对所编写的规则求值。Drools 允许使用声明方式表达业务逻辑。可以使用非 XML 的本地语言编写规则&#xff0c;从而便于学习和理解。并且&#xff0c;还可以将 Java 代码直接嵌入到规则…

逻辑漏洞渗透与攻防(一)之身份验证漏洞

目录 逻辑漏洞概要 漏洞的根因&#xff1a; 逻辑漏洞的分类&#xff1a; 身份验证漏洞 暴力破解漏洞 1.1 未限制爆破 1.2 爆破-验证码爆破 1.3 暴力破解漏洞-限制IP爆破 1.4 暴力破解漏洞-限制密码错误次数来爆破 1.5 暴力破解漏洞-多字段爆破 1.6 限制登录频率爆破 …

(小程序)会议OA项目-其它页面

目录 一、tabs组件及会议管理布局 1.自定义tabs组件 2.会议管理 二、投票管理参考图 三、个人中心布局 一、tabs组件及会议管理布局 1.自定义tabs组件 文档参考:自定义组件 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framewo…

植物大战僵尸:实现自动收集阳光

植物大战僵尸这款游戏可以说是很多90后的回忆了&#xff0c;基本上只要是90后或多或少的都接触过&#xff0c;而玩游戏与制作辅助是两个概念&#xff0c;今天我将给大家分享一些游戏辅助方面的制作技巧&#xff0c;之所以使用植物大战僵尸这款游戏是因为游戏简单容易分析&#…

Apache Kafka Spring 集成

Apache Kafka Spring 集成 今天来学习Spring如何集成 Apache kafka&#xff0c;在Spring Boot中如何集成kafka客户端 生产、消费消息。首先介绍下各个组件的版本信息&#xff1a; Apache Kafka_2.13-3.3.1Spring Boot 3.0.0Apache-Maven-3.6.0JDK-17.0.5 启动Kafka # 进入k…

ArcGIS基础实验操作100例--实验38删除冗余节点

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验38 删除冗余节点 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

免费分享在线设计工具,比ps还方便的贺卡设计工具!

元旦贺卡在线制作工具&#xff0c;不用自己设计&#xff0c;只需借助在线工具平台的模板就能轻松搞定的贺卡设计方法&#xff01;跟着小编下面的设计步骤&#xff0c;使用在线工具乔拓云轻松设计活动贺卡&#xff0c;设计过程简单且一键生成分享链接&#xff0c;不用自己设计工…

推荐四款常见的电子教室软件,大家觉得哪款好用

现在越来越多的教学教室都在使用多媒体教学软件&#xff0c;不仅包括学校&#xff0c;还有一些培训机构和教堂。 那么&#xff0c;多媒体教学软件有哪些&#xff1f; 哪款多媒体教学软件好用&#xff1f; 在今天的文章中&#xff0c;小编挑选了4款流行的多媒体教学软件推荐给大…

【全网最细PAT题解】【PAT乙】1009 说反话(cin、getline、cin.getline三种输入格式)

题目链接 1009 说反话 题目描述 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词…

【Spring 入门教程2】

&#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.2 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ Spring_day02 S…

C++ - opencv应用实例之矩形框检测

C++ - opencv应用实例之矩形框检测 现阶段下,目标检测在实际应用场景中的表现颇为重要,工业质检、移动机器人视觉伺服、作业、交通监控、安防领域等均需要通过目标检测来实现对目标的定位、测量或者统计、辅助控制等目前目标检测主要分为两个方向的发展,其一是基于传统图像处…

let、const、var关键字

1、let ES6中新增的用于声明变量的关键字。 &#xff08;1&#xff09;let声明的变量只在所处于的块级有效 if (true) { let a 10;} console.log(a) // a is not defined 注意&#xff1a;使用let关键字声明的变量才具有块级作用域&#xff0c;使用var声明的变量不具备块级…

计算机网络(二)Linux网络编程

layout: post title: 计算机网络&#xff08;二&#xff09;Linux网络编程 description: 计算机网络&#xff08;二&#xff09;Linux网络编程 tag: 计算机网络 文章目录POSIX概念POSIX网络相关APIsocket()bind()网络字节序与主机字节序&#xff08;大小端设备&#xff09;list…

TensorFlow之过拟合与欠拟合-2

1 基本概念 过度拟合&#xff08;overfit&#xff09; 正则化&#xff08;regularization&#xff09; L1正则化&#xff08;L1 regularization&#xff09; L2正则化&#xff08;L2 regularization&#xff09; 删除正则化&#xff08;dropout regularization&#xff09…

植物大战僵尸:实现灵魂收割者

植物大战僵尸这款游戏可以说是很多90后的回忆了&#xff0c;基本上只要是90后或多或少的都接触过&#xff0c;而玩游戏与制作辅助是两个概念&#xff0c;今天我将给大家分享一些游戏辅助方面的制作技巧&#xff0c;之所以使用植物大战僵尸这款游戏是因为游戏简单容易分析&#…

【JavaSE成神之路】聊聊封装这件事

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java的封装。 1. 什么是封装 Java的封装是指&#xff0c;在一个类中把一些重要的信息隐藏起来&#xff0c;使得外部不能直接访问。 Java的封…

Java --- JUC之volatile

目录 一、volatile两大特点 二、volatile的内存语义 三、volatile内存屏障 四、volatile四大屏障 五、volatile的特性 六、volatile使用场景 一、volatile两大特点 1、可见性 2、有序性 二、volatile的内存语义 1、当写一个volatile变量时&#xff0c;JMM会把该线程对…