题目描述
定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据完成图书信息表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。
输入
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计n+1行,第1行是修改前所有图书的平均价格,后n行是价格修改后n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
样例输入 Copy
9787302257646 Data-Structure 35.00 9787302164340 Operating-System 50.00 9787302219972 Software-Engineer 32.00 9787302203513 Database-Principles 36.00 9787810827430 Discrete-Mathematics 36.00 9787302257800 Data-Structure 62.00 9787811234923 Compiler-Principles 62.00 9787822234110 The-C-Programming-Language 38.00 0 0 0
样例输出 Copy
43.88 9787302257646 Data-Structure 42.00 9787302164340 Operating-System 55.00 9787302219972 Software-Engineer 38.40 9787302203513 Database-Principles 43.20 9787810827430 Discrete-Mathematics 43.20 9787302257800 Data-Structure 68.20 9787811234923 Compiler-Principles 68.20 9787822234110 The-C-Programming-Language 45.60
思路分析:
先计算一下平均价格,然后再将大于和小于平均数的分别加就行了。
代码如下:
#include<bits/stdc++.h>//注释都写在了每一行的上面
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLW -2 //不能加O?
#define MAXSIZE 100
//Status是函数返回类型,其值是函数结果返回代码
typedef int Status;
//创建一个链表 ,相当于创造了一个新的数据类型,相当于int a ;a为int型的变量
typedef struct
{
string number;
string name;
double price;
} book;
typedef struct LNode
{
book data;
LNode * next;
} LNode,* LinkList;
Status InitList(LinkList &L)//链表的初始化
{
L=new LNode;
if(!L)exit( OVERFLW);
L->next=NULL;
return OK;
}
Status ListInsert(LinkList &L,int i,string number,string name,double price)//插入数据元素
{
//关键就是找到i-1这个节点
int j=0;
LNode *p;
p=L;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL||j>i-1)return ERROR;
LNode *s=new LNode;
s->data.number=number;
s->data.name=name;
s->data.price=price;
s->next=p->next;
p->next=s;
return OK;
}
//尾插法创建单链表
void CreateList_R(LinkList &L)
{
L=new LNode;
LNode *r,*p;
r=L;
// cout<<"请输入"<<n<<"个节点的值"<<endl;
for(int i=1; ; i++)
{
p=new LNode;
cin>>p->data.number>>p->data.name>>p->data.price;
r->next=p;
r=p;
if(L->data.number[0]=='0'&&L->data.name[0]=='0'&&L->data.price==0)//只需要判断name的第一个字符就行了
break;
}
r->next=NULL;
}
int main()
{
LinkList L;
InitList(L);
string number,name;
double price;
// CreateList_R(L);
int x=0;
double sum=0.0;
for(int i=1; ; i++)
{
cin>>number>>name>>price;
if(number[0]=='0'&&name[0]=='0'&&price==0)//只需要判断name的第一个字符就行了
break;
else
{
ListInsert(L,i,number,name,price);
sum=sum+price;
x++;
}
}
sum=(sum*1.0)/(1.0*x);
printf("%.2f\n",sum);
LNode *q;
q=L;
q=q->next;
for(int i=1;; i++)
{
if(q->data.price<sum)
{
q->data.price=q->data.price*1.2;
}
else
{
q->data.price=q->data.price*1.1;
}
q=q->next;
if(q==NULL)
break;
}
q=L;
q=q->next;
for(int i=1;; i++)
{
cout<<q->data.number<<' '<<q->data.name<<' ';
printf("%.2f\n",q->data.price);
q=q->next;
if(q==NULL)
break;
}
return 0;
}