图书信息管理系统

1.程序组成:

源文件:test.cpp,源.cpp

头文件:test.h

2.功能实现:

  • 系统以菜单方式工作,
  • 图书信息录入功能,
  • 图书信息浏览功能,
  • 查询功能
  • 删除功能
  • 价格排序
  • 修改图书信息
  • 程序加密

(备注:图书信息包括登录号,书名,作者名,分类号,出版单位,出版时间,价格。)

3.写作思路:   

  • 先将大致结构勾勒出来:

第二,先写出主函数:

第三,显示功能菜单,通过分支结构实现输入选择功能:

第四,创建一个结构体数组以便将多个图书信息储存:

第五,使用fget函数对输入内容进行读取,并初始化一个整型数字i,用来保存图书的个数以便后面的使用:

第六,实现浏览功能,需要对所有的图书信息进行打印,这一步只需要写一个循环即可:

第七,写出实现浏览功能的函数,这需要将输入的字符数组与book[i].name通过strcmp(需引string.h)函数进行对比,历遍过程中二者相等时将其信息打印出来:

第八,写出实现删除指定图书的信息,与上一步相似,也是通过历遍找到该图书并将其删除,与此同时将后面的各项都向前移一位:

第九,写出实现依据价格对图书信息进行排序的函数,我是使用的冒泡排序,也可以使用其他算法,排序完之后直接调用func2将结果打印出来:

第十,写出实现修改的函数,历遍找出与输入相等的字符数组并将其修改:

第十一,对代码进行细节上的修改,比如在每个功能函数中都加一段实现是否继续的代码,这样可以大大提高代码的实用性:

第十二,为了增加程序对信息的保护,我们还可以设计一段代码来实现密码登录的功能,这只需要再创建一个字符数组即可:

4.代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void memu();//功能选择
void func1();//录入
void func2();//浏览
void func3();//查询
void func4();//删除
void func5();//价格排序
void func6();//修改
void lm();//是否继续程序

//创建结构体:
extern struct Book {
	char num1[20];
	char name1[20];
	char name2[20];
	char num2[20];
	char dw[20];
	char time[20];
	double price;
}book[100],kk[100];

#define _CRT_SECURE_NO_WARNINGS 1

#include"test.h"
void memu();


int main()
{
	printf("请设置密码:");
	char mima[20];
	fgets(mima, sizeof(mima), stdin);
	system("cls");
	while (1)
	{
	    //打印菜单:
	    printf("************************************\n");
	    printf("*************是否进入程序***********\n");
	    printf("*************按1进入****************\n");
	    printf("*************按0退出****************\n");
	    printf("************************************\n");
	    printf("请输入:");
	    //判断进入退出:
		int a = 0;
		scanf("%d", &a);
		getchar();
		if (a == 1)
		{
			system("cls");
			printf("请输入密码:");
			int k = 0;
		MMM:
			char input[20];
			fgets(input, sizeof(input), stdin);
			int ll = strcmp(input, mima);
			if(ll == 0)
			memu();//进入程序
			else if (ll != 0 && k < 5)
			{
				k++;
				printf("密码错误,请重新输入:");
				goto MMM;
			}
			else if (k == 5)
			{
				printf("电脑在五秒后关机!");
				system("shutdown /s /t 5");
				break;
			}
		}
		else if (!a)
		{
			break;
		}
		else
		{
			printf("选择无效,请重新选择:\n");
		}
	}
	return 0;
}

//功能选择:
void memu()
{
jk:
	printf("1.录入\n\n");
	printf("2.浏览\n\n");
	printf("3.查询\n\n");
	printf("4.删除\n\n");
	printf("5.价格排序\n\n");
	printf("6.修改\n\n");
	printf("请选择功能:\n");
	char a = 0;
	scanf("%c", &a);
	switch (a)
	{
	case '1':
		func1();
		break;
	case '2':
		func2();
		break;
	case '3':
		func3();
		break;
	case '4':
		func4();
		break;
	case '5':
		func5();
		break;
	case '6':
		func6();
		break;
	default:
		printf("选择无效,请重新选择:\n");
		goto jk;
	}
}
#define _CRT_SECURE_NO_WARNINGS 1

#include"test.h"

int i = 0;
struct Book book[100];

//录入
void func1()
{
	while (1)
	{
		getchar();
		printf("登录号:");
		fgets(book[i].num1, sizeof(book[i].num1), stdin);
		printf("书名:");
		fgets(book[i].name1, sizeof(book[i].name1), stdin);
		printf("作者名:");
		fgets(book[i].name2, sizeof(book[i].name2), stdin);
		printf("分类号:");
		fgets(book[i].num2, sizeof(book[i].num2), stdin);
		printf("出版单位:");
		fgets(book[i].dw, sizeof(book[i].dw), stdin);
		printf("出版时间:");
		fgets(book[i].time, sizeof(book[i].time), stdin);
		printf("价格:");
		scanf("%lf", &book[i].price);
		getchar();
		++i;
		printf("是否继续录入(Y/N):");
	NEXT:
		char ch;
		scanf("%c", &ch);
		if (ch == 'Y')
		{
			;
		}
		else if (ch == 'N')
		{
			break;
		}
		else
		{
			printf("选择无效,请重新选择:");
			getchar();
			goto NEXT;
		}
	}
	lm();
}

//浏览:
void func2()
{
	printf("————————————————————————————————————————————————————————————————————————————————————————————————————————————\n");
	for (int j = 0; j < i; j++)
	{
		printf("登录号:%s   书名:%s   作者名:%s   分类号:%s   出版单位:%s   出版时间:%s   价格:%lf\n", book[j].num1, book[j].name1, book[j].name2, book[j].num2, book[j].dw, book[j].time, book[j].price);
	}
	printf("————————————————————————————————————————————————————————————————————————————————————————————————————————————\n");
	lm();
}

//查询:
void func3()
{
	while (1)
	{
		getchar();
		printf("请输入你要查询的书名:");
		int count = 0;
		char a[100];
		fgets(a, sizeof(a), stdin);
		//getchar();
		for (int j = 0; j < i; j++)
		{
			int b = strcmp(a, book[j].name1);
			if (!b)
			{
				count = 1;
				printf("登录号:%s   书名:%s   作者名:%s   分类号:%s   出版单位:%s   出版时间:%s   价格:%lf\n", book[j].num1, book[j].name1, book[j].name2, book[j].num2, book[j].dw, book[j].time, book[j].price);
			}
		}
		if (!count)
		{
			printf("查无此书。\n");
		}
		printf("是否继续查询(Y/N):");
		int pp = 0;
		NE:
		char ch;
		if (pp)
		{
			getchar();
		}
		scanf("%c", &ch);
		//getchar();
		if (ch == 'Y')
		{
			;
		}
		else if (ch == 'N')
		{
			break;
		}
		else
		{
			pp = 1;
			printf("选择无效,请重新选择:");
			goto NE;
		}
	}
	lm();
}

//删除:
void func4()
{
	while (1)
	{
		getchar();
		printf("请输入你要删除的书名:");
	cnm:
		char a[100];
		fgets(a, sizeof(a), stdin);
		int count = 0;
		for (int j = 0; j < i; j++)
		{
			int b = strcmp(a, book[j].name1);
			if (!b)
			{
				count = 1;
				for (int k = j; k < i; k++)
				{
					book[k] = book[k + 1];
				}
				--i;
			}
		}
		if (!count)
		{
			printf("没有找到你要删除的书,请重新输入:");
			goto cnm;
		}
		printf("是否继续删除(Y/N):");
	ok:
		char ch;
		scanf("%c", &ch);
		//getchar();
		if (ch == 'Y')
		{
			;
		}
		else if (ch == 'N')
		{
			break;
		}
		else
		{
			printf("选择无效,请重新选择:");
			goto ok;
		}
	}
	lm();
}

//价格排序:
void func5()
{
	printf("1.升序\n");
	printf("2.降序\n");
	printf("请选择升序还是降序:");
	int a = 0;
	scanf("%d", &a);
	if (a == 1)
	{
		for (int j = 0; j < i - 1; j++)
		{
			for (int k = 0; k < i - 1 - j; k++)
			{
				if (book[k].price > book[k + 1].price)
				{
					Book temp = book[k];
					book[k] = book[k + 1];
					book[k + 1] = temp;
				}
			}
		}
	}
	else if (a == 2)
	{
		for (int j = 0; j < i - 1; j++)
		{
			for (int k = 0; k < i - 1 - j; k++)
			{
				if (book[k].price < book[k + 1].price)
				{
					Book temp = book[k];
					book[k] = book[k + 1];
					book[k + 1] = temp;
				}
			}
		}
	}
	func2();
	lm();
}

//修改:
void func6()
{
	while (1)
	{
		getchar();
		printf("请输入你要修改的书名:");
		char ch[100];
		fgets(ch, sizeof(ch), stdin);
		int count = 0;
		//getchar();
		for (int j = 0; j < i; j++)
		{
			int b = strcmp(ch, book[j].name1);
			if (!b)
			{
				count = 1;
				printf("已找到该书,请修改:\n");
				printf("登录号:");
				fgets(book[j].num1, sizeof(book[j].num1), stdin);
				printf("书名:");
				fgets(book[j].name1, sizeof(book[j].name1), stdin);
				printf("作者名:");
				fgets(book[j].name2, sizeof(book[j].name2), stdin);
				printf("分类号:");
				fgets(book[j].num2, sizeof(book[j].num2), stdin);
				printf("出版单位:");
				fgets(book[j].dw, sizeof(book[j].dw), stdin);
				printf("出版时间:");
				fgets(book[j].time, sizeof(book[j].time), stdin);
				printf("价格:");
				scanf("%lf", &book[j].price);
				getchar();
			}
		}
		if (!count)
		{
			printf("找不到该书。\n");
		}
		printf("是否继续修改(Y/N):");
		//getchar();
		char nm;
	so:
		scanf("%c", &nm);
		//getchar();
		if (nm == 'Y')
		{
			;
		}
		else if (nm == 'N')
		{
			break;
		}
		else
		{
			printf("选择无效,请重新选择:");
			//getchar();
			goto so;
		}
	}
	lm();
}

//是否选择继续程序
void lm()
{
	int kkt = 0;
	printf("是否继续使用程序(Y/N):");
o:
	char nn;
	if (!kkt)
	{
		getchar();
	}
	scanf("%c", &nn);
	getchar();
	if (nn == 'Y')
	{
		memu();
	}
	else if (nn == 'N')
	{
		;
	}
	else
	{
		kkt = 1;
		printf("选择错误,请重新选择:");
		goto o;
	}
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手机更换社保证照片教程来啦,速速查收!

&#x1f4cc;线上直接搞定很简单&#xff01; 没有申领社保卡的姐妹们可以自己申领&#xff01; 已有社保卡的姐妹可以先挂失然后再申领&#xff01; &#x1f64c;教程 线上更换社保证&#xff1a; 1️⃣打开「掌上12333」&#xff0c;找到电子社保卡 2️⃣点击社保卡申领&am…

关于影视字幕翻译哪个公司比较专业?

现如今&#xff0c;影视剧作为跨文化交流的重要桥梁&#xff0c;正日益受到中国观众的热爱。因此也催生了影视字幕翻译的需求。那么&#xff0c;如何做好影视作品字幕翻译&#xff0c;哪个公司在影视字幕英译中更为专业&#xff1f; 我们知道&#xff0c;字幕翻译是涉外影视作品…

接口测试用例设计 - 实战篇

一&#xff0e;接口测试流程 1&#xff0e;需求讨论 2&#xff0e;需求评审 3&#xff0e;场景设计 4&#xff0e;数据准备 5&#xff0e;执行 二&#xff0e;分析接口文档中哪些元素 1&#xff0e;接口名称 2&#xff0e;接口地址 3&#xff0e;支持格式 4&#xff0…

Spring IOC 源码分析

​ 什么是 IoC IoC &#xff08;Inversion of control &#xff09;控制反转。它是一种思想不是一个技术实现。描述的是&#xff1a;Java开发领域对象的创建以及管理的问题。 例如&#xff1a;现有类A依赖于类B。传统的开发方式 &#xff1a;往往是在类A中手动通过new关键字…

C++设计模式

目录 一.概念 1.设计模式概念 2.底层思维与抽象思维 &#xff08;1&#xff09;底层思维 &#xff08;2&#xff09;抽象思维 3.面向对象 4.软件设计复杂性 &#xff08;1&#xff09;软件设计复杂的根本原因 &#xff08;2&#xff09;解决复杂性的方法 ① 分解 ②…

C++ Webserver从零开始:基础知识(四)——I/O复用

目录 前言 select系统调用 poll系统调用 epoll系统调用 epoll_create epoll_ctl epoll_wait LT和ET模式 EPOLLONESHOT事件 epoll和select/poll的区别 事件集处理方式 实现原理和效率 其他区别 前言 在第三章中我们大概地讲解了什么是I/O复用&#xff0c;即&#xf…

低聚糖市场分析:预计2029年将达到26亿美元

低聚糖又名寡糖( oligosaccharide)或少糖类&#xff0c;是一种新型功能性糖源&#xff0c;低聚糖集营养、保健、食疗于一体&#xff0c;广泛应用于食品、保健品、饮料、医药、饲料添加剂等领域。 在我国由于低聚糖行业的技术飞速进步&#xff0c;收率和质量明显提高&#xff0…

React关于类组件ts使用

类组件中定义了两个接口的类型&#xff0c; 分别约束自身数据state对象 与父组件通过props传递进来的数据。 在父组件使用子组件 并传递参数&#xff1b;

guns项目 Failed to register @ServerEndpoint class 问题

问题发生所在 socket-business-websocket-7.2.4.jar tomcat发布测试的时候报Failed to register ServerEndpoint class &#xff0c;查询jar报主要是WebSocketServer 类加载有问题&#xff0c;把jar报中该类注掉&#xff0c;重新实现这个类&#xff0c;删除Component注解问题&…

uibot-native-message-plug5.1.2_0.zip

网上下载的5.1.1 不好用&#xff0c;于是自己找了一个测试没有问题&#xff0c;支持360和chrome 该扩展安装后&#xff0c;使用uibot creator 很容易&#xff0c;不需要敲击代码做爬虫类自动化程序。

当心!recover成为”恶魔“--Go中的容错处理进阶

前言&#xff1a; Go语言本身没有try/catch异常机制&#xff0c;因为Go的三位创始人在设计Go语言之出觉得这样写会变得很繁琐。 但因为&#xff1a;Go本身支持函数多返回值&#xff0c;因此在写函数的时候&#xff0c;可以优先考虑容错处理。 接下来&#xff0c;我们来看看在G…

不小心删了u盘里的word文档怎么恢复(含三种恢复方法)

在日常生活和工作中&#xff0c;U盘因其便携性而成为存储和传输数据的重要工具。然而&#xff0c;有时会发生误删重要文件的情况&#xff0c;如不小心删了U盘里的Word文档。面对这种情况&#xff0c;许多用户感到束手无策。本文将为您介绍如何恢复不小心删除的U盘Word文档&…

Docker从入门到精通

系列文章目录 docker常见用法之镜像构建1 docker 系列文章目录一、镜像的分层结构二、容器的用法三、镜像的构建3.1docker commit 构建新镜像三部曲3.1.1运行容器并且修改容器3.1.2提交容器3.1.2删除docker镜像 3.2Dockerfile构建镜像 系列文章目录一、 Dockerfile写法详解1.1…

基于Mcrosemi M2S090T FPGA 的 imx991 SWIR的SLVS解码(一)

目录 一、平台介绍 二、器件的简介 1、imx991 SWIR Image Sensor 2、M2S090T 三、工程 1、imx991寄存器配置 一、平台介绍 工程开发平台&#xff1a;Libero Version:20231.0.6 Release:v2023.1 文本编辑器&#xff1a;Sublime text3 二、器件的简介 1、imx991 SWIR I…

我自己总结记忆的23种设计模式

1&#xff0c; 对23种设计模式&#xff0c;大家的第一个印象就是抽象繁琐&#xff0c;记不住&#xff01;&#xff01;不常用&#xff1f;&#xff1f; 其实设计模式是非常有用的&#xff0c;大家只要理解设计模式了&#xff0c;思想上就能有质的飞跃&#xff01; 但是&#…

RFID服装物流零售管理系统设计解决方案

一、方案概述 本方案是广东航连科技根据服装企业客户的需求量身定制的解决方案&#xff0c;该方案综合了RFID技术、网络技术、计算机技术、数据库技术和无线通信技术&#xff0c;结合服装企业的实际需求以及航连科技的丰富经验和独特技术&#xff0c;提出了以下基于RFID的物流…

高级 Python 面试问题与解答

文章目录 专栏导读1.什么是PIP&#xff1f;2.什么是 zip 函数&#xff1f;3.Python 中的 __init __ () 是什么&#xff1f;4.Python 中的访问说明符是什么&#xff1f;5.Python 中的单元测试是什么&#xff1f;6.Python全局解释器锁&#xff08;GIL&#xff09;&#xff1f;7.P…

nginx代理七牛云http资源,节省https费用(亲测有效)

七牛云https费用太高了&#xff0c;通过配置服务器https代理到http访问&#xff01; location ~ /qiniu/(.*) { proxy_pass http://qiniu.myweb.cn/$1; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarde…

Vue3+ElementPlus实例_select选择器(不连续搜索)

1.开发需求 在各大UI框架的select选择器中&#xff0c;在搜索时都是输入连续的搜索内容&#xff0c;比如“app-store”选项&#xff0c;你要输入“app-xxx”&#xff0c;才能匹配这个选择&#xff0c;要是想输入“a-s”这种不连续的匹配方式&#xff0c;就实现不了&#xff0c…

安科瑞应急疏散照明系统在歌舞娱乐等场所的应用

首先必须明确疏散照明并不包含疏散指示标志&#xff0c;疏散照明是为了提供人员疏散时的必要照明&#xff0c;必须达到规定照度&#xff0c;以便逃生时看清逃生的路径&#xff0c;避免出现恐慌及踩踏事故&#xff0c;而疏散指示标志则是提供疏散路径方向引导的&#xff0c;所以…