北林oj208基于顺序存储结构的图书信息表的最贵图书的查找

题目

描述

定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后查找价格最高的图书,输出相应图书的信息。

输入

总计输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。

输出

总计输出m+1行,其中,第一行是最贵图书的数目(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

代码

#include
using namespace std;
#include
#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<

写的比较乱,定义的book *a 是指针 ,但后面scan(),print(),都把此指针当成数组用,发现可行;后面找最贵的书expensive()函数,里把a 又当做了指针用

用指针比较好,数组总容易空间分配不够(runtime error),就需要手动改空间大小,

expensive()函数里面 我感觉应该把指针置空,在重新指向较贵的图书信息,但是会出问题

这个题还有另外一个方法:按价格排序,然后找连续最大的几个

你可能感兴趣的:(北林oj,算法,c++,visual,studio,大作业)