时间限制: 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组数据排序输出
样例输入
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
样例输出
-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
提示
解决方案
#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");
}