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

### C语言选择练习方法 为了帮助学习者更好地掌握C语言的基础知识并进行有效的训练,可以通过以下方式找到适合自己的选择资源: #### 资源推荐 网络上存在大量关于C语言的选择资源[^1]。这些目通常涵盖了基础语法、数据类型、运算符、控制语句等内容,非常适合初学者巩固知识点。 #### 目示例 以下是几个常见的C语言选择及其解析: 1. **变量声明** 哪种类型的变量用于存储整数? A. float B. double C. int D. char 正确答案:C. int 2. **条件判断** 如果 `if` 条件不成立,则执行哪部分代码? A. if 后面的代码块 B. else 后面的代码块 C. 不会执行任何代码 D. 编译错误 正确答案:B. else 后面的代码块 3. **循环结构** 下列哪个关键字用于提前结束循环? A. break B. continue C. exit D. stop 正确答案:A. break #### 自动化工具 对于希望更加高效地进行的学习者来说,可以考虑构建一个简单的自动化程序。通过定义一个结构体来表示每道目,并将其存入数中以便随机抽取和测试[^3]。下面是一个实现该功能的小型代码片段: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> struct ques { char question[300]; char select[5][100]; char answer; }; int main() { struct ques questions[] = { {"哪种类型的变量用于存储整数?", {"float", "double", "int", "char"}, 'C'}, {"如果 if 条件不成立, 则执行哪部分代码?", {"if 后面的代码块", "else 后面的代码块", "不会执行任何代码", "编译错误"}, 'B'}, {"下列哪个关键字用于提前结束循环?", {"break", "continue", "exit", "stop"}, 'A'} }; srand(time(NULL)); int randomIndex = rand() % (sizeof(questions)/sizeof(struct ques)); printf("Question: %s\n", questions[randomIndex].question); for(int i=0;i<4;i++) { printf("%d. %s\n", i+1, questions[randomIndex].select[i]); } char userAnswer; printf("请输入您的答案(A/B/C/D): "); scanf(" %c", &userAnswer); if(userAnswer == questions[randomIndex].answer){ printf("恭喜您! 答案正确!\n"); } else{ printf("很遗憾, 答案错误。\n正确答案是:%c\n", questions[randomIndex].answer); } return 0; } ``` 此代码能够随机选取一道目供用户作答,并即时反馈结果。 #### 排序检测算法应用实例 另外,在实际编程过程中遇到的一些复杂逻辑也可以转化为选择形式考察理解能力。例如,给定一段代码判断其是否实现了正确的顺序排列检查功能[^2]。如下所示即为一种利用双标记法验证序列是否单调递增递减的方法。 ```c #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main(){ int N = 0; scanf("%d",&N); int arr[N],i=0; int flag1=0,flag2=0; for(i=0;i<N;i++){ scanf("%d",&arr[i]); if(i>0){ if(arr[i]>arr[i-1]){ flag1=1; } else{ flag2=1; } } } if(flag2+flag1==1){ printf("sorted\n"); } else{ printf("unsorted\n"); } return 0; } ``` 上述代码展示了如何通过设置两个布尔标志位来判定输入是否处于严格升序者降序状态之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

火星papa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值