图书信息管理系统

news2024/12/23 3:43:51

 

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 10000

typedef struct {
    char no[100];//图书ISBN
    char name[100];//图书名字
    double price;//图书价格
} Book;

typedef struct {
    Book data[MAXSIZE];
    int length;
} SqList,*PSqList;

PSqList PL;//创建一个顺序表,PL为一个指针变量

FILE* fp;
int cnt,st,op,i,j,k,flag,num,idx;
char name[100],no[100];
double price;
Book temp;

void menu();//菜单
void add();//图书插入
void delete1();//图书删除
void modify();//价格更新
void output();//图书浏览
void search();//图书查找
void price_sort();//价格排序
void reserse_save();//逆序存储
void bookstatistics();//图书统计
void read_in_information();//导入信息
void save_information1();//保存信息1(存储到book.txt中)
void save_information2();//保存信息2.1(正序存储到book-newsort.txt中)
void save_information3();//保存信息2.2(逆序存储到book-newsort.txt中)
int main() {
    read_in_information();//导入信息
    printf("图书信息如下:\n");
    output();//图书浏览
    menu();//菜单
    scanf("%d", &op);
    if (op >= 1 && op <= 8) {
        switch (op) {
            case 1:
                add();
                break;
            case 2:
                delete1();
                break;
            case 3:
                modify();
                break;
            case 4:
                price_sort();
                break;
            case 5:
                output();
                break;
            case 6:
                search();
                break;
            case 7:
                bookstatistics();
                break;
            case 8:
                reserse_save();
                break;
        }
    } else printf("输入无效\n");
    return 0;
}
//菜单
void menu() {
    printf("                                            图书信息管理系统\n");
    printf("***********************************************************************************************************************\n");
    printf("                                     1.图书插入\n");
    printf("                                     2.图书删除\n");
    printf("                                     3.价格更新\n");
    printf("                                    4.价格排序\n");
    printf("                                     5.图书浏览\n");
    printf("                                     6.图书查找\n");
    printf("                                     7.图书统计\n");
    printf("                                     8.逆序存储\n");
    printf("***********************************************************************************************************************\n");
    printf("请输入代码选择(1-8):\n");
}
//图书浏览
void output() {
    printf("北京林业大学图书馆计算机类图书采购列表\n");
    printf("ISBN         书名                    定价\n");
    for(i=1; i<=PL->length; i++) {
        printf("%-10s  %-20s    %-10.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
    }
    printf("\n");
}
//图书统计
void bookstatistics() {
    printf("图书总数为%d\n",PL->length);
    printf("\n");
}
//图书查找
void search() {
    flag = 1;
    while (1) {
        printf("请输入需要查找的图书位置或书名(如果有多本,则全部输出)\n按键1选择输入图书位置,按键2选择输入书名,按键0选择停止输入:");
        scanf("%d", &op);
        if (op == 1 || op == 2 || op == 0) {
            switch (op) {
                case 0:
                    flag = 0;
                    break;
                case 1: {
                    printf("请输入要查找的图书位置:");
                    scanf("%d", &num);
                    if(num<1||num>PL->length) printf("图书不存在,查找失败\n");
                    else {
                        printf("该图书信息如下:\n");
                        printf("ISBN       书名         定价\n");
                        printf("%-8s  %-8s    %-6.2f\n",PL->data[num].no,PL->data[num].name,PL->data[num].price);
                    }
                }
                break;
                case 2: {
                    printf("请输入要查找的书名:");
                    scanf("%s", name);
                    int cnt=0;
                    for(int i=1; i<=PL->length; i++) {
                        if(strcmp(PL->data[i].name,name)==0) cnt++;
                    }
                    if(cnt==0) printf("图书不存在,查找失败\n");
                    else {
                        printf("该图书信息如下:\n");
                        printf("ISBN       书名         定价\n");
                        for(int i=1; i<=PL->length; i++) {
                            if(strcmp(PL->data[i].name,name)==0) printf("%-8s  %-8s    %-6.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
                        }
                    }
                    break;
                }
            }
        } else {
            printf("输入无效,请重新输入!!!\n");
            continue;
        }
        if (flag == 0) break;
    }
    printf("\n");
}
//价格更新
void modify() {
    for(i=1; i<=PL->length; i++) {
        if(PL->data[i].price<45) PL->data[i].price*=1.2;
        else PL->data[i].price*=1.1;
    }
    save_information2();//正序存储到新文件book-newsort.txt中
    printf("更新成功!!!\n");
}
//图书插入
void add() {
    printf("请输入需要插入的图书信息(ISBN,书名,定价):\n");
    scanf("%s%s%lf", no, name, &price);
    printf("请输入需要插入的位置num:\n");
    scanf("%d",&num);
    if(num<1||num>PL->length) printf("指定位置非法!!!\n");
    else {
        for(i=PL->length; i>=num; i--) {
            strcpy(PL->data[i+1].no,PL->data[i].no),strcpy(PL->data[i+1].name,PL->data[i].name),PL->data[i+1].price=PL->data[i].price;
        }
        strcpy(PL->data[num].no,no),strcpy(PL->data[num].name,name),PL->data[num].price=price;
        PL->length++;
    }
    save_information1();//存储到book.txt中
}
//图书删除
void delete1() {
    printf("请输入需要删除的图书位置:\n");
    scanf("%d", &num);
    if(num<1||num>PL->length) printf("指定位置非法!!!\n");
    else {
        for(int i=num; i<PL->length; i++) {
            strcmp(PL->data[i].no,PL->data[i+1].no),strcmp(PL->data[i].name,PL->data[i+1].name),PL->data[i].price=PL->data[i+1].price;
        }
        PL->length--;
    }
    save_information1();//存储到book.txt中
}
//导入信息
void read_in_information() {
    if ((fp = fopen("D:\\book.txt", "r")) == NULL) {
        printf("file open error!\n");
        exit(0);
    }
    PL = (PSqList)malloc(sizeof(SqList)); // 分配内存
    if(PL)
        PL->length = 0;
    else {
        printf("内存分配失败!!!\n");
        exit(-1);
    }
    while (!feof(fp)) {
        ++cnt;
        fscanf(fp,"%s%s%lf",PL->data[cnt].no,PL->data[cnt].name,&PL->data[cnt].price);
        PL->length++;
    }
    if (fclose(fp)) {
        printf("can not close the file!\n");
        exit(0);
    }
}
//价格排序
void price_sort() {
    for(i=1; i<PL->length; i++) {
        k=i;
        for(j=i+1; j<=PL->length; j++) {
            if(PL->data[j].price<PL->data[k].price) k=j;
        }
        if(k!=i) {
            temp=PL->data[i];
            PL->data[i]=PL->data[k];
            PL->data[k]=temp;
        }
    }
    save_information2();//正序存储到新文件book-newsort.txt中
    printf("排序成功!!!\n");
}
//逆序存储
void reserse_save() {
    save_information3();//逆序存储到新文件book-newsort.txt中
    printf("操作成功!!!\n");
}
//保存信息1
void save_information1() {
    if ((fp = fopen("D:\\book.txt", "w")) == NULL) {
        printf("file open error!\n");
        exit(0);
    }
    for(int i=1; i<=PL->length; i++) {
        if(i<PL->length) fprintf(fp,"%s %s %.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
        else fprintf(fp,"%s %s %.2f",PL->data[i].no,PL->data[i].name,PL->data[i].price);
    }
    if (fclose(fp)) {
        printf("can not close the file!\n");
        exit(0);
    }
}
//保存信息2.1(正序存储到book-newsort.txt中)
void save_information2() {
    if ((fp = fopen("D:\\book-newsort.txt", "w")) == NULL) {
        printf("file open error!\n");
        exit(0);
    }
    for(int i=1; i<=PL->length; i++) {
        if(i<PL->length) fprintf(fp,"%s %s %.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
        else fprintf(fp,"%s %s %.2f",PL->data[i].no,PL->data[i].name,PL->data[i].price);
    }
    if (fclose(fp)) {
        printf("can not close the file!\n");
        exit(0);
    }
}
//保存信息2.2(逆序存储到book-newsort.txt中)
void save_information3() {
    if ((fp = fopen("D:\\book-newsort.txt", "w")) == NULL) {
        printf("file open error!\n");
        exit(0);
    }
    for(int i=PL->length; i>=1; i--) {
        if(i>1) fprintf(fp,"%s %s %.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
        else fprintf(fp,"%s %s %.2f",PL->data[i].no,PL->data[i].name,PL->data[i].price);
    }
    if (fclose(fp)) {
        printf("can not close the file!\n");
        exit(0);
    }
}

 

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

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

相关文章

算法基础:图

图论 图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形&#xff0c;这种图形通常用来描述某些事物之间的某种特定关系&#xff0c;用点代表事物&#xff0c;用连接两点的线表示相应两个事物间具有这种关系。 …

Java实现Ip地址获取

Java实现Ip地址获取 一、两种实现方式二、测试结果 一、两种实现方式 package com.lyp;import org.apache.commons.lang3.ObjectUtils;import java.net.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Optional;/***…

创建及编辑线要素

17. 创建及编辑线要素 17.1 功能讲解 所有QGIS按键&#xff0c;右下角带 * 的&#xff0c;都是新建的意思。下图中&#xff0c; File encoding尽量选择 System。可自定义字段&#xff0c;例如 ‘Btype’&#xff0c;可以用其以不同的标记区分省界和区界。 保存路径&#x…

「UG/NX」Block UI 指定矢量SpecifyVector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

ES6中WeakMap和WeakSet

这里重点说一下它们和对应的set、map的区别 WeakSet 不能遍历,没有forEach&#xff0c;没有size只能添加对象垃圾回收器完全不考虑WeakSet对该对象的引用。 WeakMap 键只能是对象它的键存储的地址不会影响垃圾回收。 let obj {name: Tom,age: 20}let map new WeakMap();…

Linux安装Mysql(详细)

安装Mysql数据库 参考阿里云命令安装Mysql smartservice.console.aliyun.com/service/ser… 安装MySQL 1.远程连接ECS实例。 具体操作&#xff0c;请参见使用VNC登录实例。 2.运行以下命令&#xff0c;更新YUM源。 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-com…

C++之this指针总结(二百二十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

SpringBoot启动输出了Mybatis-plus和Pagehelper的图标的解决方法

SpringBoot启动输出了Mybatis-plus和Pagehelper的图标 解决方法 Mybatis-plus mybatis-plus可以通过下面的配置关闭图标输出 mybatis-plus:global-config:banner: false #启动时不输出mp的图标pagehelper pagehelper要麻烦一些&#xff0c;需要在jvm的启动参数中进行配置…

使用docker安装部署kuboard并导入k8s集群

1 官网地址 https://kuboard.cn/install/v3/install.html#kuboard-v3-x-%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E2 找到推荐的安装方式 先点击左上角的安装 3 进入安装引导页面 复制出来里面的docker 命令&#xff0c;根据需求修改外面端口映射&#xff0c;KUBOARD_ENDPOINT…

Docker安装ElasticSearch/ES 7.10.0

目录 前言安装ElasticSearch/ES安装步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 安装步骤2&#xff1a;拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 安装步骤3&#xff1a;创建容器创建容器方…

Chatgpt solve | 井底之蛙

这是一个经典的物理问题&#xff0c;我们可以使用Python来解决它。青蛙每分钟爬升4米&#xff0c;然后滑下2米&#xff0c;所以每分钟净爬升2米。 我们可以编写一个循环来模拟这个过程&#xff0c;直到青蛙爬出井口。下面是一个Python程序来解决这个问题&#xff1a; def time_…

算法通关村第二关——链表反转(黄金)

算法通关村第二关——链表反转黄金挑战 K 个一组翻转链表方法一&#xff1a;自己写的方法二&#xff1a;头插法 K 个一组翻转链表 25. K 个一组翻转链表 方法一&#xff1a;自己写的 我自己写的方式有点长&#xff0c;属于一点点一路路解决那种&#xff0c;其实用到的是穿针…

安卓抓jdwskey

安装京东&#xff0c;VNET VNET下载地址 https://www.vnet-tech.com/zh/ 2给权限 打开 VNET --点击右下角 ▶ --保存 CA.pem 证书 --打开手机系统设置搜索 证书–点击安装刚刚保存的 CA.pem 如果开始出现数据表示已经有权限抓包了&#xff0c;下面给权限跳过&#xff0c;直接开…

第15篇ESP32 idf框架 wifi联网_WiFi AP模式_手机连接到esp32开发板

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

Haproxy集群调度器与部署

目录 一、Haproxy介绍&#xff1a; 1.Haproxy应用分析&#xff1a; 2.Haproxy的特性&#xff1a; 3.Haproxy常见的调度算法&#xff1a; 4.LVS、Nginx、HAproxy的区别&#xff1a; 4.1 Haproxy与lvs对比&#xff1a; 4.2 Haproxy与nginx对比&#xff1a; 5. Haproxy优点&#x…

设计模式之十:状态模式

状态模式通过改变对象内部的状态来帮助对象控制自己的行为。 这是一张状态图&#xff0c;其中每个圆圈都是一个状态。 最简单&#xff0c;第一反应的实现就是使用一个变量来控制状态值&#xff0c;并在方法内书写条件代码来处理不同情况。 package headfirst.designpatterns.…

微服务架构介绍

系统架构的演变 1、技术架构发展历史时间轴 ①单机垂直拆分&#xff1a;应用间进行了解耦&#xff0c;系统容错提高了&#xff0c;也解决了独立应用发布的问题&#xff0c;存在单机计算能力瓶颈。 ②集群化负载均衡可有效解决单机情况下并发量不足瓶颈。 ③服务改造架构 虽然系…

操作系统备考学习 day3 (2.1.1 - 2.1.6)

操作系统备考学习 day3 二、进程与线程2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组织2.1.4 进程控制2.1.5 进程间通信&#xff08;IPC&#xff09;2.1.6 线程和多线程模型 二、进程与线程 2.1 进程与线程 2.1.1 进程的概念和特征 进程&#…

通达OA漏洞检查工具V1.3

​注意 注意&#xff1a;通达OAv11.6前台任意文件删除任意文件上传漏洞会删除auth.inc.php&#xff0c;这可能会损坏OA系统谨慎操作 工具更新 本工具webshell采用蚁剑连接&#xff0c;密码均为x TongdaOATool本工具支持以下漏洞的验证和利用&#xff1a; 1、通达OA任意用户…

Vue通过ref修改 <el-input-number> 增减按钮的样式

Vue 为一个 <el-input-number> 设置了ref为‘inputNumberRef’, 通过这个ref获取<el-input-number>组件中的增、减按钮所在的<i>标签&#xff0c;并将它们的class分别改为el-icon-plus 和 el-icon-minus。 可以通过以下代码实现&#xff1a; <template&g…