分类排序(函数)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
从键盘输入10个整数(10个整数均不相同), 然后再从键盘中输入一个整数a,
如果该整数a为奇数, 且与这10个整数中的任一个数相同,则删掉与a相同的 这个数,并将剩下的9个数按升序排序输出;
若a为偶数, 且与这10个数都不同,则加入a,并将这11个数降序排 序输出;
否则,则将这10个数奇数在前,偶数在后, 降序排列输出。
例如,10个数分别为6,89,34,12, 0,-8,78,15,9,3.
若a为9,则输出为:-8,0,3, 6,12,15,34,78,89.
若a为2,则输出为:89,78, 34,15,12,9,6,3,2,0,-8.
若a为7或者12,则 输出为:89,15,9,3,78,34,12,6,0,-8.
要求:使用函数解决本题,至少编写以下几个函数,
1、升序排序函数void sort(int a[], int n);
2、查找函数int find(int a[],int n,int value)----在大小为n的a数组中查找值为value的元素,找到就返回元素的下标,找不到,就返回-1;
3、输出函数display(int a[], int n)---逐个输出数组a的元素;
4、反转数组函数void reverse(int a[], int n)----将数组逆序。
输入
测试数据的组数n
第一组测试数据的10个整数
第一组的整数a
第二组测试数据的10个整数
第二组的整数a
......
第n组测试数据的10个整数
第n组的整数a
输出
第一组数据排序输出
第二组数据排序输出
.......
第n组数据排序输出
样例输入
1 2 3 4 5 6 7 | 3 6 89 34 12 0 -8 78 15 9 3 9 6 89 34 12 0 -8 78 15 9 3 2 6 89 34 12 0 -8 78 15 9 3 7 |
样例输出
1 2 3 | -8 0 3 6 12 15 34 78 89 89 78 34 15 12 9 6 3 2 0 -8 89 15 9 3 78 34 12 6 0 -8 |
提示
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <stdio.h> #define FAILED_FIND_IN_ARRAY -1 struct Array { int data[16]; int size; }; void scanToArray(struct Array *array); int findInArray(struct Array *array, int data); void sortArray(struct Array *array); void reverseArray(struct Array *array); void sortArrayInOddAndEven(struct Array *array); void printArray(struct Array *array); int main() { int ctrl; scanf("%d", &ctrl); while (ctrl--) { struct Array array = {}; scanToArray(&array); int number; scanf("%d", &number); if (number % 2 != 0 && findInArray(&array, number) != FAILED_FIND_IN_ARRAY) { array.size -= 1; for (int i = findInArray(&array, number); i < array.size; ++i) { array.data[i] = array.data[i + 1]; } sortArray(&array); } else if (number % 2 == 0 && findInArray(&array, number) == FAILED_FIND_IN_ARRAY) { array.data[array.size] = number; array.size += 1; sortArray(&array); reverseArray(&array); } else { sortArrayInOddAndEven(&array); } printArray(&array); } return 0; } void scanToArray(struct Array *array) { array->size = 10; for (int i = 0; i < array->size; ++i) { scanf("%d", &array->data[i]); } } int findInArray(struct Array *array, int data) { for (int i = 0; i < array->size; ++i) { if (array->data[i] == data) { return i; } } return -1; } void sortArray(struct Array *array) { for (int i1 = 0; i1 < array->size - 1; ++i1) { for (int i2 = 0; i2 < array->size - 1 - i1; ++i2) { if (array->data[i2] > array->data[i2 + 1]) { int data = array->data[i2]; array->data[i2] = array->data[i2 + 1]; array->data[i2 + 1] = data; } } } } void reverseArray(struct Array *array) { for (int i = 0; i < array->size / 2; ++i) { int data = array->data[i]; array->data[i] = array->data[array->size - 1 - i]; array->data[array->size - 1 - i] = data; } } void sortArrayInOddAndEven(struct Array *array) { struct Array odd = {}, even = {}; for (int i = 0; i < array->size; ++i) { if (array->data[i] % 2 == 0) { even.data[even.size] = array->data[i]; even.size += 1; } else { odd.data[odd.size] = array->data[i]; odd.size += 1; } } sortArray(&odd); reverseArray(&odd); sortArray(&even); reverseArray(&even); for (int i = 0; i < odd.size; ++i) { array->data[i] = odd.data[i]; } for (int i = 0; i < even.size; ++i) { array->data[i + odd.size] = even.data[i]; } } void printArray(struct Array *array) { printf("%d", array->data[0]); for (int i = 1; i < array->size; ++i) { printf(" %d", array->data[i]); } printf("\n"); } |