怎样用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。
数的排序
好了,再来这样一道问题,我给你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");
}
已知矩阵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)
神奇的\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);