首页 > 专题系列 > C基础练习 > C语言程序设计-图书价格统计[结构体应用]
2013
12-11

C语言程序设计-图书价格统计[结构体应用]

10082 图书价格统计

【问题描述】用结构数组保存书的信息。现有N(N<50)本图书,每本图书包括书名(长度小于30的字符串)、出版社(长度小于15的字符串)、数量(整数)、单价(浮点数)信息,读入书 的信息并按单价由少到多的顺序输出各书的所有信息,然后输出购买这些书的总费用。
【输入形式】第一行为一个整数N,表示图书数量,接下来的N行中每行包含一本书的信息数据,各数
据之间由空格分隔。
【输出形式】输出前N行,为按单价排序的所有书的信息,第N+1行为购买这些书的总费用(保留到小点后两位)。
【样例输入】3
C-Programming       qinghu                50    25.50
DataStruct              jixiegongye         30    31.55
OpratingSystem      gaodengjiaoyu     60    18.30

【样例输出】OpratingSystem      gaodengjiaoyu    60     18.30
C-Programming        qinghu               50     25.50
DataStruct               jixiegongye        30      31.55
3319.50
【样例说明】(1)输入的所有书的信息用英文以及数字(不能是汉字)表示。
(
2)输出
前N行的格式设定为:”%-30s%-20s%-10d%-.2f\n”。
【评分标准】本题共2个测试点,每个测试点1.0分,共2.0分。

#include <stdio.h>
#include <stdlib.h>
typedef struct _book
{
	char name[30];
	char press[15];
	int count;
	float price;

}book;
int comp(const void *p1, const void *p2)
{
	return (*(book *)p1).price> (*(book *)p2).price ? 1 : -1;
}
int main()
{
	int n;
	scanf("%d",&n);
	/*book* books = (book *)malloc(n * sizeof(book));*/
	book books[50];
	int i;
	float costs = 0;
	for(i=0;i<n;i++)
	{
		scanf("%s", &books[i].name);
		scanf("%s", &books[i].press);
		scanf("%d", &books[i].count);
		scanf("%f", &books[i].price);

		costs += books[i].count * books[i].price;
	}
	qsort(books,n,sizeof(books[0]), comp);
	for (i=0;i<n;i++)
	{
		printf("%-30s%-20s%-10d%-.2f\n", books[i].name, books[i].press, books[i].count, books[i].price);
	}
	printf("%.2f\n",costs);
	return 0;
}

  1. 在方法1里面:

    //遍历所有的边,计算入度
    for(int i=0; i<V; i++)
    {
    degree = 0;
    for (j = adj .begin(); j != adj .end(); ++j)
    {
    degree[*j]++;
    }
    }

    为什么每遍历一条链表,要首先将每个链表头的顶点的入度置为0呢?
    比如顶点5,若在顶点1、2、3、4的链表中出现过顶点5,那么要增加顶点5的入度,但是在遍历顶点5的链表时,又将顶点5的入度置为0了,那之前的从顶点1234到顶点5的边不是都没了吗?

  2. 老实说,这种方法就是穷举,复杂度是2^n,之所以能够AC是应为题目的测试数据有问题,要么数据量很小,要么能够得到k == t,否则即使n = 30,也要很久才能得出结果,本人亲测