C语言刷题 -- 多组输入排序


一、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,永远不是完美的。无论是刷题还是具体工程,任何阶段都是可以通过不断调试不断改善的。比如说,当前的这个答案程序在结束退出机制上没有做较好的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星papa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值