• 直接上代码不解释

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define AVAILABLE 0
#define UNAVAILABLE 1
#define MAXNAME 30
#define CLEAR "cls" typedef struct book{
char *name;
int id;
int count;
int status;
struct book *next;
}Book; void welcome();
void error(char *); // [异常提醒]
char land(); // [主页面项目]
int usrstudent(); // [学生入口]返回 0表示返回主页 1表示继续执行本函数
int usrmanager(); // [管理员入口]返回 0表示返回主页 1表示继续执行本函数
int viewbook(); // [查看图书]返回打印的图书个数 失败返回-1
int addbook(); // [注册图书]添加图书成功 返回图书id 失败返回-1
int modbook(); // [修改图书]修改图书信息 成功后返回id 失败 -1
int delbook(); // [注销图书]删除成功 返回被删除图书的id 失败返回-1
void printbook(Book *); // [打印图书]
Book *lookup(char *, int); // [搜索图书]
int borrowbook(); // [借阅图书]
int returnbook(); // [归还图书] Book *head = NULL;
int nbook = ;
int main(){ welcome();
return ;
}
void welcome(){
printf("*************************欢迎使用图书管理系统*************************\n");
while(){
printf("-------------------------------------\n");
printf("请输入项目前编号执行相关操作:\n");
printf("\n[1] 管理员入口\n\n[2] 学生入口\n\n[0] 退出\n\n");
switch(land()){
case '':
while(){
if(usrmanager()){
continue;
}else{
break;
}
}
break;
case '':
while(){
if(usrstudent()){
continue;
}else{
break;
}
}
break;
case '':
exit();
default:
error("采集项目参数失败");
}
}
}
char land(){
char c, flag;
int i;
while(){
for(i = ; (c = getchar()) != '\n'; flag = c, ++i)
;
if(i == ){
if(flag == '' || flag == '' || flag == ''){
return flag;
}
}else if(i == ){
continue;
}
error("[请输入命令: 1 / 2 / 0 选择项目]");
}
return '\0';
}
void error(char *s){
fprintf(stderr, "%s\n", s);
}
char dostudent(){
char c, flag;
int i;
while(){
for(i = ; (c = getchar()) != '\n'; flag = c, ++i )
;
if(i == ){
if(flag == '' || flag == '' || flag == '' || flag == ''){
return flag;
}
}else if(i == ){
continue;
}
error("[请输入命令: 1 / 2 / 3/ 0 选择项目]");
}
}
int usrstudent(){
printf("-------------------------------------\n");
printf("请输入项目前编号执行相关操作:\n\n");
printf("[1] 借阅图书\n[2] 归还图书\n[3] 查看馆存图书\n");
printf("[0] 返回主页\n");
switch(dostudent()){
case '':
borrowbook();
break;
case '':
returnbook();
break;
case '':
viewbook();
break;
case '':
return ;
default:
error("采集项目参数失败");
break;
}
return ;
}
int borrowbook(){
system(CLEAR);
char sname[MAXNAME];
printf("搜索图书:\n");
scanf("%s", sname);
getchar();
Book *bp;
char *namep = NULL;
if((bp = lookup(namep = strdup(sname), )) == NULL){
printf("图书 %s 不存在\n", namep);
fflush(stdin);
return -;
}else{
printbook(bp);
if(! bp->status){
printf("借阅图书: Y N\n");
}else{
printf("图书外借中\n");
return ;
}
while(){
char c = '\0';
scanf("%c", &c);
getchar();
if(!(c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
fflush(stdin);
error("指令无效");
continue;
}
if(c == 'Y' || c == 'y'){
--bp->count > - ? printf("成功\n") : printf("失败\n");
if(! bp->count){
bp->status = UNAVAILABLE;
}
return bp->id;
}else{
return ;
}
}
}
return -;
}
int returnbook(){
system(CLEAR);
char sname[MAXNAME];
printf("归还图书:\n");
scanf("%s", sname);
getchar();
Book *bp;
char *namep;
if((bp = lookup(namep = strdup(sname), )) == NULL){
fflush(stdin);
printf("此图书并不是馆内图书\n");
return -;
}else{
printbook(bp);
printf("归还图书: Y N\n");
while(){
char c = '\0';
scanf("%c", &c);
getchar();
if(!(c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
fflush(stdin);
error("指令无效");
}else if(c == 'Y' || c == 'y'){
bp->count++ ? : (bp->status = AVAILABLE);
printf("成功\n");
return bp->id;
}else{
return ;
}
}
} return -;
}
char domanager(){ char c, flag;
int i; while(){
for(i = ; (c = getchar()) != '\n'; flag = c, ++i)
;
if(i == ){
if(flag == '' || flag == '' || flag == '' || flag == '' || flag == ''){
return flag;
}
}else if(i == ){
continue;
}
error("[请输入命令: 1 / 2 / 3/ 4 / 0 选择项目]"); } return '\0';
}
int usrmanager(){
printf("-------------------------------------\n");
printf("请输入项目前编号执行相关操作:\n\n");
printf("[1] 查看已存图书\n[2] 注册新图书\n[3] 修改已有图书信息\n[4] 注销现存图书\n");
printf("[0] 返回主页\n");
switch(domanager()){
case '':
viewbook();
break;
case '':
addbook();
break;
case '':
modbook();
break;
case '':
delbook();
break;
case '':
return ;
default:
error("采集项目参数失败");
break;
}
return ; }
int viewbook(){
system(CLEAR); ///////////////////////////////////////////
Book *bp;
for(bp =head; bp != NULL; bp = bp->next){
printbook(bp);
}
if(nbook){
return nbook;
}else{
printf("图书馆还没有图书哦\n");
return ;
}
return -;
}
void printbook(Book *bp){
printf("图书编号:%d\n", bp->id);
printf("图书名:%s\n", bp->name);
printf("图书存数:%d\n", bp->count);
printf("图书状态:%s\n", bp->status ? "不可借" : "可借");
}
int addbook(){
system(CLEAR); ///////////////////////////////////////////
char sname[MAXNAME];
int id, count;
char *namep; while(){
id = ;
count = ;
namep = NULL;
printf("请输入图书名:\n");
scanf("%s", sname);
getchar();
printf("请输入小于1000的图书编号:\n");
scanf("%d", &id);
getchar();
if(!(id > && id < )){
error("输入编号不符合要求");
fflush(stdin);
continue;
}
printf("请输入小于50的图书数量:\n");
scanf("%d", &count);
getchar();
if(!(count > && count < )){
error("输入数目不符合要求");
fflush(stdin);
continue;
}
Book *bp;
if((bp = lookup(namep = strdup(sname), id)) == NULL){
bp = (Book *)malloc(sizeof (Book));
if(bp == NULL || (bp->name = namep) == NULL){
error("注册图书失败");
fflush(stdin);
continue;
}
bp->id = id;
bp->count = count;
bp->status = AVAILABLE;
++nbook; bp->next = head;
head = bp;
printf("图书 %s 注册成功\n", sname);
return id;
}else{
fflush(stdin);
error("图书名或编号已经被占用");
}
} return -;
}
Book *lookup(char *s, int id){
Book *bp;
for(bp = head; bp != NULL; bp = bp->next){
if(id == bp->id || strcmp(s, bp->name) == ){
return bp;
}
}
return NULL;
}
int modbook(){ // 修改除id之外的信息 因为要修改id 直接删掉后重新添加会更好
system(CLEAR); ///////////////////////////////////////////
Book *bp = NULL;
while(){
int id = ;
printf("请输入要修改信息的图书编号:\n");
scanf("%d", &id);
getchar();
if(!(id > && id < )){
fflush(stdin);
error("图书编号不符合要求");
continue;
}
if((bp = lookup("", id)) != NULL){
printf("以下为要修改的图书的现有信息:\n");
printbook(bp);
printf("[1] 修改图书名\n[2] 修改图书数量\n[3] 修改图书状态\n[0] 放弃修改\n");
while(){
int i;
scanf("%d", &i);
getchar();
if(!(i == || i == || i == || i == )){
fflush(stdin);
error("输入项目前编号选择相关项目");
continue;
}
switch(i){
case :
while(){
char newname[MAXNAME], *namep;
printf("图书名:\n");
scanf("%s", newname);
getchar();
if((lookup(namep = strdup(newname), )) != NULL){
fflush(stdin);
error("图书名已存在");
continue;
}
if((bp->name = namep) != NULL){
printf("修改成功\n");
return id;
}
}
break;
case :
while(){
int bnum;
printf("输入图书数量:\n");
scanf("%d", &bnum);
getchar();
if(!(bnum > || bnum < )){
fflush(stdin);
error("数目不符合要求");
continue;
}
bp->count = bnum;
printf("修改成功\n");
return id;
}
break;
case :
while(){
char c;
int status;
status = bp->status;
status == AVAILABLE ? printf("修改状态为[不可借]: Y N\n") : printf("修改状态为[可借]: Y N\n");
scanf("%c", &c);
getchar();
if(!( c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
fflush(stdin);
error("指令无效");
continue;
}
if(c == 'Y' || c == 'y'){
status == AVAILABLE ? bp->status = UNAVAILABLE : (bp->status = AVAILABLE);
printf("修改成功\n");
return id;
}else{
printf("放弃修改\n");
return ;
}
}
break;
case :
return ;
default:
error("获取参数失败");
break;
}
}
}else{
printf("没有此图书\n");
return ;
}
}
return -;
}
int delbook(){
system(CLEAR); ///////////////////////////////////////////
Book *bp, *fbp; int id = ;
printf("请输入要注销的图书编号:\n");
scanf("%d", &id);
getchar();
if(!(id > && id < )){
fflush(stdin);
error("图书编号不符合要求");
return -;
}
for(fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next){
if(bp->id == id){
printbook(bp);
break;
}
}
if(bp != NULL){
while(){
printf("确定要注销此图书:Y N\n");
char YN;
scanf("%c", &YN);
getchar();
if(!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))){
fflush(stdin);
error("指令无效\n");
continue;
}
if(YN == 'Y' || YN == 'y'){
bp == head ? head = bp->next : (fbp->next = bp->next);
free(bp->name); //2018-05-26修改:添加释放name这块内存//bp内存的只是指向name的指针
free(bp);
bp = NULL;
printf("图书注销成功\n");
break;
}else{
printf("放弃注销\n");
return ;
}
}
return id;
}else{
printf("要注销的图书编号不存在\n");
return -;
}
return -;
}

  • 效果展示

图书管理系统 (c语言实现) (全部代码)的更多相关文章

  1. C语言课程设计—图书管理系统

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<std ...

  2. C语言: 简易图书管理系统

    这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西. 在Linux系统下,用Vim编写,如要在Windows上运行则需要一些改动,主要是一些调用系统函数的改动.如Window ...

  3. [C基础修炼] [C课程设计]C语言课程设计之图书管理系统

    #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *fp;//定义文件指针fp,指向文 ...

  4. c语言小项目-使用mysql数据库的图书管理系统

    VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装 ...

  5. 放出一批jsp图书管理系统图书借阅系统源码代码运行

    基于jsp+mysql的JSP图书销售管理系统 https://www.icodedock.com/article/105.html基于jsp+Spring+Spring MVC的Spring图书借阅 ...

  6. [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

    [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website develop ...

  7. 在Django中使用ORM创建图书管理系统

    一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...

  8. Django——图书管理系统

    基于Django的图书管理系统 1.主体功能 1.列出图书列表.出版社列表.作者列表 2.点击作者,会列出其出版的图书列表 3.点击出版社,会列出旗下图书列表 4.可以创建.修改.删除 图书.作者.出 ...

  9. Node操作MongoDB并与express结合实现图书管理系统

    Node操作MongoDB数据库 原文链接:http://www.xingxin.me/ Web应用离不开数据库的操作,我们将陆续了解Node操作MongoDB与MySQL这是两个具有代表性的数据库, ...

随机推荐

  1. [LOJ10121] 与众不同

    题目类型:\(DP\)+\(RMQ\) 传送门:>Here< 题意:给定一个长度为\(N\)的序列,并给出\(M\)次询问.询问区间\([L,R]\)内的最长完美序列.所谓完美序列就是指连 ...

  2. poj 3764 The xor-longest Path (01 Trie)

    链接:http://poj.org/problem?id=3764 题面: The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K ...

  3. BZOJ 4030: [HEOI2015]小L的白日梦

    4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 172  Solved: 39[Submit][Statu ...

  4. <Android基础>(四) Fragment Part 1

    Fragment 1)Fragment的简单用法 2)动态添加Fragment 3)在Fragment中模拟返回栈 4)Fragment和活动之间通信 第四章 Fragment Fragment是一种 ...

  5. react事件处理函数中绑定this的bind()函数

    问题引入 import React, { Component } from 'react'; import { Text, View } from 'react-native'; export def ...

  6. x86汇编语言实践(1)

    0 写在前面 为了更深入的了解程序的实现原理,近期我学习了IBM-PC相关原理,并手工编写了一些x86汇编程序. 在2017年的计算机组成原理中,曾对MIPS体系结构及其汇编语言有过一定的了解,考虑到 ...

  7. SQL学习指南第二篇

    使用集合 union操作符(组合查询) 多数 SQL 查询只包含从一个或多个表中返回数据的单条 SELECT 语句.但是,SQL 也允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结 ...

  8. GWAS群体分层 (Population stratification):利用plink对基因型进行PCA

    一.为什么要做祖先成分的PCA? GWAS研究时经常碰到群体分层的现象,即该群体的祖先来源多样性,我们知道的,不同群体SNP频率不一样,导致后面做关联分析的时候可能出现假阳性位点(不一定是显著信号位点 ...

  9. Django admin修改密码

    django的admin用户被我多动症一样的测试,给密码弄丢了,需要重置. 从数据库重置的可能性为0,因为django对于密码有保护策略.考虑从运行程序的地方进行重置: 1.在程序的文件夹下,执行这样 ...

  10. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...