zl程序教程

您现在的位置是:首页 >  后端

当前栏目

编写排序程序,排序的元素在命令行中输入,完成排序后输出

命令行输入输出排序 元素 编写 完成
2023-09-14 08:56:53 时间

问题分析

  这个问题的解决方法,不在于怎么排序,或者说使用哪种方法来排序

  重点是:

  1、因为平时练习的时候,都是将数组的元素写死的,或者使用scanf从标准输入中获取输入的数据,或者从文件中读取的,那么,怎么从命令行接收数据,并且对数据进行排序呢?

  2、命令行接收到的数据,是什么格式,虽然输入的是数字,但是会被当做字符串,那么怎么做转换?

 

解决方案

  1、要想在命令行中传递参数给程序,可以在主函数定义两个参数,一个argc,一个argv,名称随意,在程序中,通过访问这两个参数来访问传入的参数。其中argc表示在命令行中启动程序时,参数的个数(包括程序名);argv为一个数组,表示的命令行参数的每一个参数值(统一被当成字符串,可以手动转换为其他格式)。比如sort 1 3 2,对1 3 2排序,其中argc为4,argv[0]为"sort"(也就是程序名),argv[1]为"1",argv[2]为"3",argv[3]为"2",注意这里都是字符串。

  2、格式转换可以使用atoi()来讲字符串转换为整数,之后可以使用(int)x来进行强制类型转化

 

代码

#include <stdio.h>

// 使用简单的冒泡排序为例
void BubbleSort(int a[], int n)
{
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = i+1; j < n; j++) {
            if (a[i] > a[j]) {
                int t = a[i]; a[i] = a[j]; a[j] = t;
            }
        }
    }
}

// 注意这里main函数的两个参数,一个是int类型的参数,另外一个是char **类型
int main(int argc, char * argv[])
{
    // 数组长度为参数个数减1,因为要除去程序名本身
    int length = argc - 1;
    int arr[length];
    int i;

    // 从第2个参数开始转换为数组
    for (i = 1; i < argc; i++) {
        arr[i-1] = (int)atoi(argv[i]);
    }

    BubbleSort(arr, length);

    for (i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

  

运行实例

[root@ubuntu ~]$ # compile source code
[root@ubuntu ~]$ gcc -o sort sort.c
[root@ubuntu ~]$ 
[root@ubuntu ~]$ ./sort 9 7 3 5 1 6 8 4 0 9 7
0 1 3 4 5 6 7 7 8 9 9 
[root@ubuntu ~]$