图书信息管理系统:
出版社有一些图书数据保存在一个文本文件book.txt 中,为简单起见,在此假设每种图书只包括三部分信息:ISBN (书号)、书名和价格,文件中的部分数据如图2.1 所示。现要求实现一个图书信息管理系统,包括以下6个具体功能。
(1) 查找:根据指定的ISBN 或书名查找相应图书的有关信息, 并返回该图书在表中的位置序号。
(2) 插入:插入一种新的图书信息。
(3) 删除:删除一种图书信息。
(4) 修改:根据指定的ISBN, 修改该图书的价格。
(5) 排序:将图书按照价格由低到高进行排序。
(6) 计数:统计图书表中的图书数量
具体实现:
图书数据由用户输入,功能(5)暂不实现
#define OK 0
#define ERROR -1
#define OVERFLOW -2
#define MAXSIZE 10000 //顺序表的最大长度
typedef struct
{
char name[50]; // 书名
double price; // 单价
char isbn[20]; // ISBN码
}Book_T;
typedef Book_T ElemType;
typedef struct
{
ElemType *base; // 存储空间的基地址
int length; // 当前长度
}SqList_T; // 顺序表的结构类型为 Sqlist_T
int list_init(SqList_T *sq_list_pt)
{
sq_list_pt->base = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
if (sq_list_pt == NULL)
exit(OVERFLOW);
memset(sq_list_pt->base, 0, MAXSIZE * sizeof(ElemType));
sq_list_pt->length = 0;
return OK;
}
void list_destory(SqList_T *sq_list_pt)
{
if (sq_list_pt->base != NULL)
free(sq_list_pt->base);
sq_list_pt->base = NULL;
sq_list_pt->length = 0;
}
ElemType * element_locate(SqList_T sq_list_t, const char *isbn, int *idx)
{
ElemType *p_elem = NULL;
*idx = -1;
for (int i = 0; i < sq_list_t.length; i++)
{
if (0 == strcmp(sq_list_t.base[i].isbn, isbn))
{
p_elem = &sq_list_t.base[i];
*idx = i+1;
break;
}
}
return p_elem;
}
int list_insert(SqList_T *sq_list_pt, ElemType elem)
{
// 判断顺序表是否到达最大长度
if (sq_list_pt->length == MAXSIZE)
return ERROR;
int idx = sq_list_pt->length;
sq_list_pt->base[idx] = elem;
(sq_list_pt->length)++;
return OK;
}
int list_delete(SqList_T *sq_list_pt, const char *isbn)
{
// 判断顺序表是否为空
if (sq_list_pt->length == 0)
return ERROR;
int idx = 0; // idx 从1开始
if (element_locate(*sq_list_pt, isbn, &idx) != NULL)
{
for (int i = idx; i <= sq_list_pt->length; i++)
{
sq_list_pt->base[i-1] = sq_list_pt->base[i];
}
}
(sq_list_pt->length)--;
return OK;
}
int list_traverse(SqList_T sq_list_t)
{
printf("ISBN "
"书名 "
"单价 \n");
if (sq_list_t.length == 0)
{
printf("图书馆书籍为空\n");
return ERROR;
}
for (int i = 0; i < sq_list_t.length; i++)
{
printf("%-30s%-30s%-30.2f\n", sq_list_t.base[i].isbn,
sq_list_t.base[i].name, sq_list_t.base[i].price);
}
return OK;
}
int list_update(SqList_T *sq_list_pt, const char *isbn, double price)
{
// 判断顺序表是否为空
if (sq_list_pt->length == 0)
return ERROR;
ElemType *p_elem = NULL;
int idx = 0; // idx 从1开始
p_elem = element_locate(*sq_list_pt, isbn, &idx);
if (p_elem == NULL)
return ERROR;
p_elem->price = price;
return OK;
}
int main(void)
{
int num_of_book = 0;
Book_T book_arr[MAXSIZE] = {0};
SqList_T sq_list_t = {0};
list_init(&sq_list_t);
printf("请输入书籍数量:");
scanf("%d", &num_of_book);
printf("\n");
for (int i = 0; i < num_of_book; i++)
{
printf("请输入第%d本的信息\n", i+1);
printf("书籍名称:");
scanf("%50s", book_arr[i].name);
printf("书籍单价:");
scanf("%lf", &book_arr[i].price);
printf("书籍ISBN:");
scanf("%20s", book_arr[i].isbn);
printf("\n");
}
// 插入
for (int i = 0; i < num_of_book; i++)
{
list_insert(&sq_list_t, book_arr[i]);
}
// 遍历打印所有书籍
printf("打印图书馆所有书籍清单:\n");
list_traverse(sq_list_t);
printf("\n");
// 删除
char isbn[20] = {0};
printf("请输入删除书籍的ISBN码:");
scanf("%20s", isbn);
list_delete(&sq_list_t, isbn);
printf("打印图书馆所有书籍清单:\n");
list_traverse(sq_list_t);
printf("\n");
// 查找
ElemType *p_elem = NULL;
char book_info[300] = {0};
int idx = 0;
printf("请输入查找数据的ISBN码:");
scanf("%20s", isbn);
p_elem = element_locate(sq_list_t, isbn, &idx);
if (NULL != p_elem)
{
sprintf(book_info, "{\"name\":\"%s\",\"isbn\":\"%s\",\"price\":%.2f}",
p_elem->name, p_elem->isbn, p_elem->price);
printf("%s\n", book_info);
}
printf("\n");
// 修改
double price = 0;
printf("请输入书籍的ISBN码:");
scanf("%20s", isbn);
printf("请输入书籍现在的价格:");
scanf("%lf", &price);
if (ERROR == list_update(&sq_list_t, isbn, price))
{
printf("价格修改失败\n");
}
printf("打印图书馆所有书籍清单:\n");
list_traverse(sq_list_t);
printf("\n");
// 释放内存空间
list_destory(&sq_list_t);
return 0;
}
? 运行结果

顺序表可以随机存取表中任一元素,其存储位置可用一个简单、直观的公式来表示。然而,从另一方面来看,这个特点也造成了这种存储结构的缺点:在做插入或删除操作时,需移动大量元素。另外由于数组有长度相对固定的静态特性, 当表中数据元素个数较多且变化较大时,操作过程相对复杂,必然导致存储空间的浪费。所有这些问题,都可以通过线性表的另一种表示方法-链式存储结构来解决
数据结构第二版:C语言版【严蔚敏】 第二章 线性表
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定
我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排