输入: 第一行,两个整数 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() { } 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; }
时间: 2025-04-03 15:16:38 浏览: 42
### C语言实现多列排序的表格处理程序
为了实现一个多列排序的表格处理程序,可以通过以下几个方面来设计:
#### 1. 定义结构体存储表格数据
在C语言中,可以使用`struct`定义一个结构体来表示每一行的数据。假设表中有三列:整数、浮点数和字符串。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
typedef struct {
int id;
float score;
char name[MAX_NAME_LEN];
} Record;
```
上述代码定义了一个名为`Record`的结构体,用于存储每一条记录中的三个字段:`id`(整数),`score`(浮点数) 和 `name`(字符串)[^4]。
---
#### 2. 输入数据并存入数组
通过标准输入读取数据,并将其存储在一个动态分配的`Record`类型的数组中。
```c
int read_records(Record *records, int max_size) {
int count = 0;
printf("Enter records (ID Score Name), end with EOF:\n");
while (count < max_size && scanf("%d %f", &(records[count].id), &(records[count].score)) == 2) {
getchar(); // Consume newline character
fgets(records[count].name, sizeof(records[count].name), stdin);
size_t len = strlen(records[count].name);
if (len > 0 && records[count].name[len - 1] == '\n') {
records[count].name[len - 1] = '\0';
}
count++;
}
return count;
}
```
此函数允许用户输入多个记录,直到达到最大大小或遇到EOF为止[^5]。
---
#### 3. 使用`qsort`实现自定义排序逻辑
C标准库提供了`qsort`函数来进行快速排序。对于多列排序,可以根据不同的字段设置比较函数。
##### 升序排列按`id`
```c
int compare_by_id(const void *a, const void *b) {
const Record *record_a = (const Record *)a;
const Record *record_b = (const Record *)b;
return record_a->id - record_b->id; // Ascending order by ID
}
```
##### 降序排列按`score`
```c
int compare_by_score_desc(const void *a, const void *b) {
const Record *record_a = (const Record *)a;
const Record *record_b = (const Record *)b;
if (record_a->score > record_b->score) return -1;
if (record_a->score < record_b->score) return 1;
return 0; // Descending order by SCORE
}
```
##### 字典顺序排列按`name`
```c
int compare_by_name(const void *a, const void *b) {
const Record *record_a = (const Record *)a;
const Record *record_b = (const Record *)b;
return strcmp(record_a->name, record_b->name); // Lexicographical order by NAME
}
```
这些比较函数分别实现了基于不同字段的升序或降序排序[^6]。
---
#### 4. 主函数调用与测试
以下是完整的主函数部分,展示如何集成以上各模块的功能。
```c
void display_records(const Record *records, int size) {
for (int i = 0; i < size; ++i) {
printf("ID: %-5d | Score: %.2f | Name: %s\n", records[i].id, records[i].score, records[i].name);
}
}
int main() {
const int MAX_RECORDS = 100;
Record records[MAX_RECORDS];
int num_records = read_records(records, MAX_RECORDS);
qsort(records, num_records, sizeof(Record), compare_by_id);
printf("\nSorted by ID (Ascending):\n");
display_records(records, num_records);
qsort(records, num_records, sizeof(Record), compare_by_score_desc);
printf("\nSorted by Score (Descending):\n");
display_records(records, num_records);
qsort(records, num_records, sizeof(Record), compare_by_name);
printf("\nSorted by Name (Lexicographical Order):\n");
display_records(records, num_records);
return 0;
}
```
该程序首先让用户输入若干条记录,随后依次按照`id`升序、`score`降序和`name`字典顺序进行排序并显示结果[^7]。
---
### 总结
本方案展示了如何利用C语言的标准库函数`qsort`配合自定义比较函数实现多列排序功能。通过合理的设计结构体和灵活运用指针操作,能够高效地完成复杂的数据管理任务。
阅读全文
相关推荐



















