题目
描述
定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后查找价格最高的图书,输出相应图书的信息。
输入
总计输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计输出m+1行,其中,第一行是最贵图书的数目(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。
代码
#include<iostream>
using namespace std;
#include<iomanip>
#define initsize 1000 //分配空间为1000
typedef struct book {
string id;
string name;
float money;
};
typedef struct sqlist {
book* a;//因为后续是数组用法所以还是数组,不能动态分配
int length;//当前长度
};
//输出函数
void print(sqlist& p) {
for (int i = 0; i < p.length; i++)
cout << p.a[i].id << " " << p.a[i].name << " " << fixed << setprecision(2) << p.a[i].money << endl;
}
//输入函数
void scan(sqlist& p) {
int i = -1;
do {
i++;
cin >> p.a[i].id >> p.a[i].name >> p.a[i].money;
} while (i < p.length - 1);
}
void expensive(sqlist& p,sqlist &expense)
{
expense.a = &p.a[0];//expense.a是指针用法,expense.a指向最贵的图书信息
int j = 0;
for (int i = 1; i < p.length; i++) {
if (p.a[i].money == expense.a->money)
{
j++;
*(expense.a + j) = p.a[i];
}
else if (p.a[i].money > expense.a[0].money)
{
//expense.a = NULL;
//我认为这里应该把指针清空,然后重新指向最贵图书信息,但是加上这句运行卡住不出结果,删掉反而可以运行成功
j=0;
*(expense.a) = p.a[i];
}
else continue;
}
expense.length = j + 1;
}
int main() {
sqlist list, expense;
expense.a = NULL;//指针初始化,保障安全
expense.a = new book;//指针动态分配方式
list.a = new book[initsize];//数组静态分配方式
int length;
cin >> length;
list.length = length;
scan(list);
expensive(list,expense);
cout << expense.length<<endl;
print(expense);
}
写的比较乱,定义的book *a 是指针 ,但后面scan(),print(),都把此指针当成数组用,发现可行;后面找最贵的书expensive()函数,里把a 又当做了指针用
用指针比较好,数组总容易空间分配不够(runtime error),就需要手动改空间大小,
expensive()函数里面 我感觉应该把指针置空,在重新指向较贵的图书信息,但是会出问题
这个题还有另外一个方法:按价格排序,然后找连续最大的几个