基于链式存储的图书管理系统
6和7无法出现正确的结果
不知道哪里出错了
#include
#include
#include
#include
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("|======9.旧图书出库==================|\n");
printf("\n");
}
typedef struct
{
char no[20];
char name[50];
float price;
}book;
typedef struct Book
{
book data;
struct Book *next;
}Book;
typedef struct
{
Book* head;
Book* tail;
int length;
}SqList;
//初始化
int InitList_Sq(SqList *L)
{
L->head=(Book*)malloc(sizeof(Book));
L->head->next=NULL;
L->tail=L->head;
L->length=0;
return 0;
}
//图书信息的输入
int Input_Sq(SqList *L)
{
Book* p;
while(1)
{
p=(Book*)malloc(sizeof(Book));
if(!p)exit(-1);
scanf("%s",p->data.no);
scanf("%s",p->data.name);
scanf("%f",&p->data.price);
if(!strcmp(p->data.no,"0")&&!strcmp(p->data.name,"0")&&p->data.price==0)
{
break;
}
L->tail->next=p;
L->tail=p;
L->length++;
}
L->tail->next=NULL;
return 0;
}
//图书信息的输出
int Output_Sq(SqList *L)
{
Book* p;
if(L->length==0)
{
printf("库中没有图书\n");
return -1;
}
p=L->head->next;
printf("%d\n",L->length);
while(p!=NULL)
{
printf("%s ",p->data.no);
printf("%s ",p->data.name);
printf("%.02f\n",p->data.price);
p=p->next;
}
return 0;
}
//按价格降序
int Sort_Sq(SqList *L)
{
Book *p;
for(int i=0;ilength;i++)
{
p=L->head->next;
int j=0;
while(p&&jlength-1-i)
{
if(p->data.pricenext->data.price)
{
book t=p->data;
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
j++;
}
}
return 0;
}
//图书信息的修改
int RevisePrice_Sq(SqList *L)
{
int num=0;
float Avg_price=0;
Book *p,*q;
p=L->head->next;
q=L->head->next;
while(p)
{
Avg_price+=p->data.price;
num++;
p=p->next;
}
Avg_price/=num;
while(q)
{
if(q->data.price>=Avg_price)
{
q->data.price*=1.2;
}
else
{
q->data.price*=1.1;
}
q=q->next;
}
return 0;
}
//图书的逆序存储
int Reversed_Sq(SqList *L)
{
Book* p;
p=L->head->next;
L->head->next=NULL;
while(p)
{
Book* q;
q=p->next;
p->next=L->head->next;
L->head->next=p;
p=q;
}
return 0;
}
//查找最贵图书
int Expensive_Sq(SqList *L)
{
Book *p;
p=L->head->next;
Book* max=p;
Book* maxs[3];
while(p)
{
if(p->data.price>max->data.price)
{
max=p;
}
p=p->next;
}
p=L->head->next;
int k=0;
while(p)
{
if(p->data.price==max->data.price)
{
maxs[k]=p;
k++;
}
p=p->next;
}
printf("%d\n",k);
int i=0;
while(maxs[i]&&iprintf("%s ",maxs[i]->data.no);
printf("%s ",maxs[i]->data.name);
printf("%.02f\n",maxs[i]->data.price);
i++;
}
return 0;
}
//查找最爱图书
int Favour_Sq(SqList *L)
{
Book* Fbook[5];
int n;
scanf("%d",&n);
book Fbookname[n];
for(int i=0;i"%s",Fbookname[i].name);
}
Book* p;
int k=0;
for(int j=0;j0;
p=L->head->next;
while(p)
{
if(p->data.name==Fbookname[j].name)
{
Fbook[k]=p;
k++;
}
p=p->next;
}
if(k==0)
{
printf("抱歉,没有找到您要的书!\n");
}
else
{
printf("%d\n",k);
for(int i=0;iprintf("%s ",Fbook[i]->data.no);
printf("%s ",Fbook[i]->data.name);
printf("%.02f\n",Fbook[i]->data.price);
}
}
}
return 0;
}
//图书的按位置查找
int Select_Sq(SqList *L)
{
int num;
scanf("%d",&num);
int add[num];
int flag=0;
Book *p,*Found;
for(int i=0;i"%d",add+i);
}
for(int i=0;i0;
p=L->head->next;
while(p)
{
if(add[i]>0&&add[i]length)
{
Found=p;
flag=1;
}
p=p->next;
}
if(flag==0)
{
printf("查无此书!\n");
}
else
{
printf("%s ",Found->data.no);
printf("%s ",Found->data.name);
printf("%.02f\n",Found->data.price);
}
}
return 0;
}
//新图书入库
int Insert_Sq(SqList *L)
{
int n;
scanf("%d",&n);
book Ibook;
scanf("%s",Ibook.no);
scanf("%s",Ibook.name);
scanf("%f",&Ibook.price);
if(n<1||n>L->length)
{
printf("插入位置错误,请重新输入:\n");
}
else
{
Book *p;
p=L->head;
int j=0;
while(p&&(j1))
{
p=p->next;
j++;
}
Book *s;
s=(Book *)malloc(sizeof(Book));
s->data=Ibook;
s->next=p->next;
p->next=s;
L->length++;
}
return 0;
}
//旧图书出库
int Delete_Sq(SqList *L)
{
int num;
scanf("%d",&num);
if(num>L->length||num<1)
{
printf("输入位置错误,请重新输入:\n");
}
else
{
Book* p;
p=L->head;
Book* q;
int j=0;
while(p&&(j1))
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
L->length--;
}
return 0;
}
int main()
{
menu();
SqList *L;
L=(SqList*)malloc(sizeof(SqList));
InitList_Sq(L);
int choice;
scanf("%d",&choice);
switch(choice)
{
case 1:Input_Sq(L);
Output_Sq(L);
break;
case 2:Input_Sq(L);
Sort_Sq(L);
Output_Sq(L);
break;
case 3:Input_Sq(L);
RevisePrice_Sq(L);
Output_Sq(L);
break;
case 4:Input_Sq(L);
Reversed_Sq(L);
Output_Sq(L);
break;
case 5:Input_Sq(L);
Expensive_Sq(L);
break;
case 6:Input_Sq(L);
Favour_Sq(L);
break;
case 7:Input_Sq(L);
Select_Sq(L);
break;
case 8:Input_Sq(L);
Insert_Sq(L);
Output_Sq(L);
break;
case 9:Input_Sq(L);
Delete_Sq(L);
Output_Sq(L);
break;
default:printf("输入有误,请重新输入\n");
}
return 0;
}
写了这么多才想起来找错误啊。
要记住,写一点调试对了,再接着写。因为这样错误的范围就局限在你刚写的那些里面。
摘要:数据的表现形式常量以及常量的几种类型,结合常量类型编写程序求长方形的面积;
一、常量
(基础教材第24页)
常量:在程序运行过程中,其值不能被改变的量。
整型常量就是整常数,可以是十进制、八进制或十六进制三种。
前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
(1)十进制整常数:十进制整常数没有前缀,其数码为0~9;
例如:以下都是合法的十进制整常数:
2020,529, 724, -97,922,1024
以下各数不是合法的十进制整常数:
097(不能有前缀0),97H(含有非十进制数码H)
(2)八进制整常数:八进制整常数必须以0开头,即前缀为0,数码取值为0~7,八进制数通常是无符合数。
例如:以下都是合法的八进制数:
015(转成十进制后为13)、0101(转成十进制后为65)、0177777(转成十进制后为65535);
以下各数不是合法的八进制数:
256(无前缀),03A2(包含了非八进制数码),-0127(出现了负号)
(3)十六进制整常数:前缀为0X或0x,数码取值0~9, A~F或a~f。
例如:以下各数都是合法的十六进制整常数:
0X2A(转成十进制为42),0XA0(转成十进制为160),0xffff(转成十进制为65535)
以下各数不是合法的十六进制整常数:
5a(无前缀),0x3H(含有非十六进制数码)
十进制无符号整常数范围0~65535,有符号数范围-32768~+32767;
八进制无符号数表示范围0~0177777;
十六进制无符号数表示范围0X0~0XFFFF.
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
下面列举几个整数常量的实例:
212 /* 合法的 */
215u /* 合法的 */
0xFeeL /* 合法的 */
078 /* 非法的:8 不是八进制的数字 */
032UU /* 非法的:不能重复后缀 */
以下是各种类型的整数常量的实例:
85 /* 十进制 */
0213 /* 八进制 */
0x4b /* 十六进制 */
30 /* 整数 */
30u /* 无符号整数 */
30l /* 长整数 */
30ul /* 无符号长整数 */
二、实型常量
实型也称为浮点型。实型常量也称为实数或浮点数。实数在c语言中有两种形式:十进制小数形式、指数形式;
(1)十进制小数形式:由0~9和小数点组成(必须有小数点):
例如:0.0、25.0、3.14、0.13、5.0、300. 、-267.8230
(2)指数形式:由十进制数和阶码标志“e”或“E”以及阶码组成:
一般形式: a e n(a为十进制数,n为十进制整数) 其值为a*10^n(a乘以10的n次方)
例如:2.1e5
3.7E-2
0.5E7
-2.8E-12
以下不是合法的实数:
345
E7
-5
53.-E3
2.7e
在c语言中有时候会看到例如356f这个数,他和356. (注意356后有个小数点)是等价的
三、字符常量
用单引号括起来的一个字符
例如‘a’、‘b’、‘=’、‘+’、‘?’ 都是合法的字符常量。
注意:
转义字符:
是一种特殊的字符常量,以反斜线\开头,后跟一个或几个字符(书上p26)。转义字符具有特定的含义,例如,Printf()输出函数中的\n就是一个转义字符,代表换行;
举例:
输出:
四、字符串常量
用双引号括起来的若干的字符,例如 “hyh”、“lovely”;
字符串的字符个数称为字符串的长度。例如“hyh”长度为3,长度为零的字符串称为空串。
五、符号常量
例如:
#define PI 3.14
程序举例:
例题:使用define定义符号常量,求长方形面积;
编译、连接、执行:
程序分析:
1、使用define函数在开头定义长方形长(LENGTH)和宽(WIDTH),注意结尾不用打分号;
2、因为该题目中长和宽分别为10和5,都是整数,其乘积也是整数,故定义一个整型常量area,表示长乘以宽的值;
3、结合长方形面积公式,表示area、length和width的关系,赋值给area;
4、输出长方形面积。
注意:
define定义符号常量,结尾不需要分号“;”,而C语句要以分号“;”结尾。