结构体 第8关:数据表排序

问题遇到的现象和发生背景

第8关:数据表排序

用代码块功能插入代码,请勿粘贴截图

现代数据库的出现为人们管理各种数据提供了极大的方便,可以说,现在很少有行业背后没有数据库作为支撑。一个典型关系型数据库内部用一张张“表”存储数据,表内的数据代表着现实世界中客观实体的信息,可以说是客观实体的集合。以下是一个“表”的例子:

food num buyDate price
juice 1 2019-12-21 10.209
banana 10 2020-02-02 129.98
apple 9 2020-1-19 34.55
apple 3 2020-01-19 32.2
其中
| food | num | buyDate | price |
可以称为“表头”,里面每一列各不相同的字符串(比如food)作为列名唯一地标识每一列。表头告诉我们这张表将从哪些维度描述客观实体。
之后的每一行称为“元组”,每一个元组对应一个客观实体,每一列中内容的含义和表头所描述的应一致。例如表中的第一个元组:
| juice| 1|2019-12-21|10.209|

现在的任务是,为某张表按照一定的关键字顺序排序并输出。为了简化任务,题目将表中的数据类型限制为:

INT:整型数据,同 C 语言中的 int,没有前导 0,排序时按照数字大小排序;

REAL:实数,同C语言中的 double,排序时按照数字大小排序。同时本题中实数的有效数字不会超过 8 位;

VARCHAR:字符串,仅包含大写或小写英文字母,长度不超过 100,排序时按照 C 语言中 strcmp 的规则进行比较;

DATE:日期,格式为 year-month-day,排序时按照日期先后进行排序。输入时保证日期格式一定合法,year 是一个四位数字,但是不保证 month 和 day 一定有两位数字。

按照一定的关键字顺序排序意味着当两个元组的第一关键字值相等的时候,比较第二关键字,以此类推。不会出现所有关键字对应的值都相等的情况。测试说明
输入:
第一行,两个整数 row 和 col,分别为表的行数(除去表头)和表的列数,列数在 100 及以内,行数在 1000 及以内;

第二行,col 个用一个空格分隔的VARCHAR 类型字符串(列名),代表表头,列名之间保证各不相同;

第三行,col 个用一个空格分隔的字符串,只可能是 INT,REAL,VARCHAR 或 DATE,代表每一列中数据的类型;接下来 row 行,每行 col 个用一个空格分隔的数据,每个数据遵循所在列的数据类型的构造规则,每一行代表一个元组。

之后若干行为关键字顺序,每行包括一个列名和一个数字,用一个空格分隔。第 i 行的列名代表第 i 关键字,跟在它后面的数字为 1 或 −1,如果是 1 则该关键字按升序排列,−1 则按降序排列。关键字之间不会重复,此部分行数不会超过列数。

输出:输出排好序的表格,第一行是表头,接下来 row 行是相应的元组。每个数据之间用一个空格分隔。请按原样输出数据。

例如测试集 1 的输入是:
5 5
orderID food num buyDate price
INT VARCHAR INT DATE REAL
1 apple 5 2020-1-09 34.55
2 banana 10 2020-01-9 129.98
3 juice 1 2019-12-21 10.209
4 apple 3 2020-01-09 32.2
5 apple 2 2020-1-9 20.1
buyDate 1
food -1
price 1
测试集 1 的运行结果为:
orderID food num buyDate price
3 juice 1 2019-12-21 10.209
2 banana 10 2020-01-9 129.98
5 apple 2 2020-1-9 20.1
4 apple 3 2020-01-09 32.2
1 apple 5 2020-1-09 34.55-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWNUM 1007
#define COLNUM 107
#define LEN 107
#define INT 0
#define REAL 1
#define VARCHAR 2
#define DATE 3
int type[COLNUM], sp[COLNUM][2], row, col, n;
char title[COLNUM][LEN];
typedef struct table
{
union attr
{
char varchar[LEN];
double real;
int date;
int intNum;
} A;
char rawData[LEN];
} T;
T t[ROWNUM][COLNUM];

/Begin/

void readTable()
{
int i,j;
char a[COLNUM][LEN];
scanf("%d%d",&row,&col);
for(i=0;i<col;i++)
scanf("%s ",&title[i]);
for(i=0;i<col;i++)
scanf("%s ",&a[i]);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
scanf("%d %s %d %d-%d-%d",&A.intNum,&A.varchar[])
}
}

}

void readSP()
{

}

int cmp(const void *a, const void *b)
{

}

void printTable()
{

}

/End/

int main()
{
readTable();
readSP();
qsort(t, row, sizeof(*t), cmp);
printTable();
return 0;
}

你可以看下我博客中的qsort函数,让你轻松排序