vlambda博客
学习文章列表

怎样用c语言来解决排序问题

定义一维数组


假如给你一个问题,让你输入10个地区的面积(面积为整数),对它们由小到大进行排序,并且输出排序的结果。

从小到大排一排


那么,要搞清楚这个问题之前,我们得先来看看,怎么定义一个一维数组?


是这样的,int a[5] 

a就是数组的名字,5就是这个数组的个数,a[5]里面放着a[0],a[1],a[2],a[3],a[4]这样的数


可以这样理解,a[5]是房子的名字,房子里住着a[0],a[1],a[2],a[3],a[4]这样的租客。


为什么明明房子叫a[5],里面却没有住着a[5]这样的数字呢???你有见过跟房子叫同名的人吗。哈哈哈,开个玩笑。主要呢,计算机是从0开始算起的,比如说有3个数,如果没有特别说明的话,那么他们会是0,1,2


好了。明白什么怎么定义一纬数组了,那么我们怎么样来赋值呢??

可以这样,int a[5]={2,4,6,8,10}

这样子的意思是,我们的a[0]租客跟2产生了联系,a[0]=2;同样的,a[1]=4,a[2]=6


假如说我们这样,定义了5个人,却只有3个被赋予了值,其他的没说,那要怎么办??

比如 int a[5]={2,4,6}

我房子里住了5个人,但是却只给我3个数,好比就只有人交了房租。

这样其实有可能是,你给后面那几个没收到数的免租了,也就是a[3]和a[4]都等于0。

怎样用c语言来解决排序问题


数的排序


好了,再来这样一道问题,我给你10个数,分别是0,1,2,3,4,5,6,7,8,9。然后我现在想让你倒序把他们输出来。

int i,a[10]={0,1,2,3,4,5,6,7,8,9};

for(i=9;i>=0;i--)

    printf("%d\t",a[i]);

printf("\n");


现在给你5个数,然后让他们进行从小到大排序,你会怎么排??


其实我们有一种方法,叫选择法

比如这样,1,5,4,2,6

这样5个数,第一个数和第二个数比较,谁小谁就放第一个数的位置,再跟第三,第四和第五用同样的方法,这样就能保证我们第一个一定是最小的了。


同样的,第二小的也用同样的方法,第三小的也是。这样就能保证我们的输出了。既然这样的话,我们来看看一开始问到的那道题。


开始做题

假如给你一个问题,让你输入10个地区的面积(面积为整数),对它们由小到大进行排序,并且输出排序的结果。


首先,我们来输入10个数

int a[10];

int i;

printf("请输入10个面积:\n");

for(i=0;i<=9;i++)

    scanf("%d",&a[i]);


然后,得到数后,我们就该开始进行排序了。

for(i=0;i<=8;i++)

    for(j=i+1;i<=9;j++)

        if(a[i]>a[j])

        {

         t=a[i];

        a[i]=a[j];

        a[j]=a[t]

         }


最后的最后,只要把这些数都输出就可以啦。

printf("排序后的面积依次是:\n");

for(i=0;i<=9;i++)

    printf("%d\t",a[i]);

printf("\n");


其实呢,排序除了选择法,还有另外一种,冒泡法(又叫沉底法)


道理是这样的,就是左右两个数比较,大的就放后面,这样,我们就会发现。到最后的那个数,就是最大的了。


我们来看一下程序吧,这个过程稍微有点复杂,看不懂也没关系。

for(j=0;j<=8;j++)

    for(i=0;i<=8-j;i++)

         if(a[i]>a[i+1])

        {

         t=a[i];

         a[i]=a[i+1];

         a[i+1]=t

          }



定义二维数组


刚学习了一纬数组,现在我们来定义一下二维数组把

int a[2][3]={{1,2,3},{4,5,6}}


这里就是,2行3列的意思,有多少行就有多少个小括号(当然可以省略,但是考试的时候要知道它的存在。尽管你看不到,但是它依然存在)


在这里面,我们第一行就有a[0][0],a[0][1],a[0][2]这样的存在,同样的,第二行也会有a[1][0],a[1][1],a[1][2]这样的存在。

当然对于他们的赋值,可以参考一纬数组,或者在后台留言~


然后如果遇到了

int a[2][3]={{1,2,3},{}}这样的,第二行空白的,就是类似第一数组的免租,emm没错,就是3个0。房东太懒了,懒得写~


接下来我们来做一道题

将一个二维数组a={{1,2,3},{4,5,6}}的行列元素互换,存到另一个二维数组b中并输出。

这里我们分成三步来写吧~


首先,也就最简单最重要的第一步,定义

int a[2][3]={{1,2,3},{4,5,6}};

int b[3][2];


第二步,就是让他们互换

这里我们必须要知道,我们想要实现的结果就是,让a[i][j]=b[j][i]

就是让a[0][1]=b[1][0]嘛

那我们就一起来写一下吧,也刚好熟悉一下二维数组的代码

int i,j;

for(i=0;i<=1;i++)

    for(j=0;j<=2;j++)

        b[j][i]=a[i][j];

这里可以先暂停一下下,好好看


最后一步,就是把我们互换好的数输出就可以了

printf("数组b为:\n");

for(j=0;j<=2;j++)

{

for(i=0;i<=1;i++)

    printf("%d\t",b[j][i]);

printf("\n");

}

怎样用c语言来解决排序问题


已知矩阵a={{1,2,3},{9,8,7},{-10,10,5}},请编写程序求出其中值最大的那个元素

int i,j,max;

int a[3][3]={{1,2,3},{9,8,7},{-10,10,5}};

max=a[0][0];

for(i=0;i<=2;i++)

    for(j=0;j<=2;j++)

        if(a[i][j]>max)

             max=a[i][j];


定义字符数组


字符数组其实跟前面的好像

比如你要输入一个“I L U”

可以写成char c[5]={'I',' ','L',' ','Y'}


或者也可以用二维数组,输出一个很好看的图案

比如char c[3][3]={{' ','*',' '},{'*',' ','*'},{' ','*',' '}}



输出数组

接下来我们来了解一下,怎么样输出字符数组吧

(1)简单粗爆,挨个输出,printf("%c",)

比如,定义一个字符串“I Have”,然后输出这个字符串。

char c[6]={'I','','H','a','v','e'}

int i;

for(i=0;i<=9;i++)

    printf("%c",c[i]);

printf("\n");


(2)整体输出printf("%s")或puts()

char c[6]={'I','','H','a','v','e'}

printf("%s\n",c);

或者把printf("%s\n",c)直接换成puts(c)

怎样用c语言来解决排序问题


神奇的\0


char c[5]={'I','','L','',\0,'Y'}

puts(c)

这样子输出来的,就只会是"I L "了

因为\0后面的不输出

不过这个\0更多的时候是放在最后


输入字符数


(1)挨个单词输入scanf("%s%s%s…",)

(2)整句输入gets()


挨个输入的,我们来看一下

char c1[12],c2[12],c3[12];

scanf("%s%s%s",c1,c2,c3);

这里后面不需要加&

不过这种输入方法并不是这种很好的方法,因为懒得去算单词有多少个字符,所以用12来代替,粗略估计。单词如果字符不够12个的,那么剩下的都被用\0来代替。


第二种

char c[18];

gets(c);


统计单词数

输入一行由空格和单词组成的字符串(字符数在80以内),请统计有多少个单词


char c[81];

int i,dangcishu=1

gets(c);

for(i=0;c[i]!='\0';i++)

if(c[i]=='  '&&c[i+1]!='  ')

        dancishu++;

printf("有%d个单词",dangcishu);


我们先来看一下这个程序它有没有问题,假如左边是'  '右边不是

类似I am a boy. 这里达到条件的,就有三个,所以再加上单词原始数等于1,所以,总共4个。

但是,假如假如是 空格 I am a boy

这样触发机制的就有4个,如果再加上原始单数1,那就是5个,明显不合适

所以其实我们可以加上一个先决条件

if(c[0]==' ')

    dancishu=0;

这样就可以解决这方面的问题了


好,再来,前面可能有空格,那么后面呢,我们知道最后一个是\0,它并不是空格,假如\0前面也有一个空格

其实,只需要多补充一个c[i+1]!='\0'就可以解决问题了。最后是变成

if(c[i]==' '&&c[i+1]!=' '&&c[i+1]!='\0')


char c[81];

int i,dangcishu=1;

gets(c);

if(c[0]=='  ')

    dangcishu=0;

for(i=0;c[i]!='\0';i++)

    if(c[i]=='  '&&c[i+1]!='  '&&c[i+1]!='\0')

        dancishu++;

printf("有%d个单词",dangcishu);