该想法来源于老师布置的一个作业,让在Linux环境下写一个冒泡排序,当时正好讲了命令行参数,于是拿命令行参数写了一个。
在Windows环境下,大多数童鞋们,估计平时不很接触命令行参数,int argc, char* argv[] 这两个变量,argc表示你在执行该程序时在命令行输入的参数。我用的IDE是VS2015,首先我们要用上命令行参数,就得模拟一个命令行输入,在此以VS2015为例。【调试->冒泡排序法属性->调试->命令参数】如下图:
第一步:点击调试。
第二步:最后一项XXX属性。
第三步:点击调试。
第四步:修改命令参数,我这里写了18个命令参数,这个大家可以根据自己的需求写。
然后我们的设置就配置好了。由于命令参数都是字符串类型,所以我们还需要对将字符串类型的数字转为int类型,可以这么看,二维的char类型数组就是一维的字符串(即string)。我们将命令参数分别导入translate(char*temp)函数中进行字符翻译,由于我们输入的数字可能大于10,用了指针的方法,一位一位的读取该位字符表示的数字,最后进行拼凑和保存。
long int translate(char*temp)
{
long int sum = 0;
int t = 0;
while (temp[t])
{
sum = sum * 10 + (temp[t] - 48);
t++;
}
return sum;
}
命令参数argc表示输入参数个数,如果不定义,则只有一个参数,也就是argc=1,此时argv表示的是执行的程序路径和名称。如果输入多个,则argc=输入参数个数+1,此时argv[0] 表示执行程序的路径和名称,arg[1],arg[2].....等剩下的就是按你的顺序输入的字符串参数。然后我们将乱序的字符或者字符串进行翻译保存并进行最后的比较。
void sort(int my_argc, char*my_argv[])
{
int i, j;
char temp;
long int Result_Of_translate[18];
for (int i = 0; i < my_argc - 1; i++)
{
Result_Of_translate[i] = translate(my_argv[i + 1]);
printf("the translation of the %d number is: %ld \r\n", i + 1, Result_Of_translate[i]);
}
for (j = 0; j<my_argc - 1 - 1; j++)
for (i = 0; i<my_argc - 1 - 1 - j; i++)
if (Result_Of_translate[i]>Result_Of_translate[i + 1])
{
temp = Result_Of_translate[i];
Result_Of_translate[i] = Result_Of_translate[i + 1];
Result_Of_translate[i + 1] = temp;
}
printf("the final result of sort is: \r\n");
for (i = 0; i<my_argc - 1; i++)
printf(" %ld ", Result_Of_translate[i]);
printf(" \r\n");
}
上边代码中long int Result_Of_translate[18]是一个静态数组,也可以写成一个动态的数组,动态的更加完美,想写动态数组的可以百度一下怎么写动态数组(链接附上)。
但是在Linux中有些不同,我用的Linux版本是 乌班图16.04版本,可以直接写成
long int Result_Of_translate[my_argc]//数组[]直接传入argc参数
这么写的好处是在Linux系统中运行的时候不限制输入的参数个数,可以自动识别出来。
我是这么写的,最后没有报错。
最后,贴上完整的代码:(Windows版)(我这里有预编译,不喜欢的朋友可以去掉)
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
long int translate(char*temp);
void sort(int my_argc, char*my_argv[]);
int main(int argc, char* argv[])
{
sort(argc, argv);
system("pause");
return 0;
}
long int translate(char*temp)
{
long int sum = 0;
int t = 0;
while (temp[t])
{
sum = sum * 10 + (temp[t] - 48);
t++;
}
return sum;
}
void sort(int my_argc, char*my_argv[])
{
int i, j;
char temp;
long int Result_Of_translate[18];
for (int i = 0; i < my_argc - 1; i++)
{
Result_Of_translate[i] = translate(my_argv[i + 1]);
printf("the translation of the %d number is: %ld \r\n", i + 1, Result_Of_translate[i]);
}
for (j = 0; j<my_argc - 1 - 1; j++)
for (i = 0; i<my_argc - 1 - 1 - j; i++)
if (Result_Of_translate[i]>Result_Of_translate[i + 1])
{
temp = Result_Of_translate[i];
Result_Of_translate[i] = Result_Of_translate[i + 1];
Result_Of_translate[i + 1] = temp;
}
printf("the final result of sort is: \r\n");
for (i = 0; i<my_argc - 1; i++)
printf(" %ld ", Result_Of_translate[i]);
printf(" \r\n");
}
我们在Windows下的运行结果如下:
同时,也附上Linux版本的代码:(可以根据输入参数个数的不同自动识别输入的个数进行排序)
#include <stdio.h>
long int translate(char*temp);
void sort(int argc,char*argv[]);
int main(int argc, char* argv[])
{
sort( argc, argv);
return 0;
}
long int translate(char*temp)
{
long int sum = 0;
int t = 0;
while (temp[t])
{
sum = sum * 10 + (temp[t] - 48);
t++;
}
return sum;
}
void sort(int argc, char*argv[])
{
int i, j;
char temp;
long int Result_Of_translate[argc-1];
for (int i = 0; i < argc-1; i++)
{
Result_Of_translate[i] = translate(argv[i + 1]);
printf("the result of the %d number's translating is: %ld \r\n", i + 1, Result_Of_translate[i]);
}
for (j = 0; j<argc - 1 - 1; j++)
for (i = 0; i<argc - 1 - 1 - j; i++)
if (Result_Of_translate[i]>Result_Of_translate[i + 1])
{
temp = Result_Of_translate[i];
Result_Of_translate[i] = Result_Of_translate[i + 1];
Result_Of_translate[i + 1] = temp;
}
printf("the final result of sort is: \r\n");
for (i = 0; i<argc - 1; i++)
printf(" %ld ", Result_Of_translate[i]);
printf(" \r\n");
}
我们将它进行保存,编译和执行:
编译运行:(15个数字)
我们换10个数字试试:
以上就是在Windows环境下 和在Linux环境下的命令参数的冒泡排序法了。那个命令参数确实是个好东西,写之不易,希望对大家有帮助,谢谢大家观看啦。