一、C语言例题
-
Description
N个整数,将其排序输出。输入 第一行是一个整数K(1<-K=-20),表示有多少个样例,每个样例的第一行是一个整数N(1<=N<=1000))和一个字符X,X为A时表示升序排序,为D时为降序排列;第二行为N个整数,每个整数都可以使用int表示,每个之间用一个空格隔开。
每个样例输出一行,按排序要求输出整数,每个整数之间输出一个空格。(最后一个整数后不要有空格) -
Sample Input
2
3 A
3 5 2
4 D
2 5 7 3 -
Sample Output
2 3 5
7 5 3 2
二、解题思路
- 纯C语言描述。
- 题目规定了输入输出数据的范围和格式,关键内容包括:整数类型、多行输入多行输出、空格分隔、回车换行。
- 针对数排序,升序和降序的要求:A升序、B降序。
- 主流程图:
三、程序答题
#include "stdio.h"
#define MAX_LENGTH 1000
#define IS_CHAR_A_OR_D(x) ((x) == 'A' || (x) == 'D')
//################### 冒泡排序 ####################//
void BubbleSort(int* arr, int length ,char type)
{
for (int j = length - 1; j >= 0; j--)//控制趟数
{
for (int i = 0; i + 1 <= j; i++)//控制每趟多少次
{
if (type == 'A')
{
if (arr[i] > arr[i + 1])
{
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
else
{
if (arr[i] < arr[i + 1])
{
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
}
}
}
//################### 排序过程处理 ####################//
int MySortingProcess()
{
//建立二位数组
int MyArray[20][MAX_LENGTH] = { {0},{0} };
//样例个数输入
int sample = 0;
int re = 0;
char sort_type = 'A';//排序类型//A:从小大大;D:从大到小
int cnt = 0;//单列数组个数
char space = NULL;
while ( sample<1 || sample> 20)
{
printf("\n开始...\n请输入sample数量,范围[1-20]:\n");
re = scanf("%d", &sample);
if (sample < 1 || sample > 20)
{
printf("Sample数量输入范围有误 ! %d\n",sample );
return 1;
}
}
//sample循环
for ( int i=0;i<sample;i++)
{
//单例总数输入 和 排列方法输入
printf("请输入第%d个sample数列数量和排序类型。\n数列数量范围[1-1000],排序类型\"A\"或\"D\"[A:从小到大;D:从大到小]:\n",i+1);
scanf("%d%c%c",&cnt,&space,&sort_type);
if ( space == '\n' || sort_type == '\n')
{
printf("第%d个数列类型输入异常 ! \n", i + 1);
return 20;
}
if (cnt > 1000 || cnt < 0 )
{
printf("第%d个数列数量%d 范围超出 ! \n",i+1 ,cnt);
return 21;
}
if(space != ' ')
{
printf("第%d个数列分隔符不是空格! \n", i + 1);
return 22;
}
if (!IS_CHAR_A_OR_D(sort_type))
{
printf("第%d个数列排序类型%c不正确 ! \n", i+1, sort_type);
return 23;
}
//输入数据
printf("请输入第%d个sample数列数据:\n",i+1);
for (int j = 0; j < cnt*2-1; j++)
{
if (j == 0||j % 2 == 0)
{
scanf("%d", &MyArray[i][j/2]);
}
else
{
scanf("%c", &space);
}
}
//按类型冒泡排序
BubbleSort(&MyArray[i][0], cnt , sort_type);
}
//输出
printf("排列输出数列数据:\n");
for (int k = 0; k < sample; k++)
{
for (int m=0; m < MAX_LENGTH; m++)
{
if (MyArray[k][m] == 0)
{
printf("\r\n");
break;
}
printf("%d ", MyArray[k][m]);
}
}
return 0;
}
//################### 结论显示 ####################//
void PrintResult(int code)
{
switch (code)
{
case 0:
printf("\n==>_Success_ 成功\n");
break;
case 1:
printf("\n_FAIL_\n");
break;
default:
printf("\n_ERROR_\n");
break;
}
}
//################### main ####################//
int main()
{
//返回结果
int result = 0;
printf("Sample Input:\n2\n3 A\n3 5 2\n4 D\n2 5 7 3\n");
printf("Sample Output:\n2 3 5\n7 5 3 2\n");
while (1)
{
//排序过程处理
result = MySortingProcess();
//结论显示
PrintResult(result);
}
return 1;
}
四、小结
虽然题目做出来了,然而程序永远有bug,永远不是完美的。无论是刷题还是具体工程,任何阶段都是可以通过不断调试不断改善的。比如说,当前的这个答案程序在结束退出机制上没有做较好的处理。