输入10(N)个名字存储在数组中,按字典排序输出

输入10(N)个名字存储在数组中,按字典排序输出

要输入N个名字储存在数组中。我们首先要明白输入的名字属字符串型变量,而c语言中对字符型数组和字符串型数组没有明确的区分。因此对于输入的名字只需借助一个N行20列的二维字符数组进行存储即可。为何是N行20列呢?对于c中二维数组的本质其实为若干个一维数组组合而成,对于我们输入的名字,每行(单个一维数组)存储一个名字即可,同理,在我们后面比较名字顺序,需要交换位置顺序时也是设置一个一维数组作为中间量完成位置交换。代码如下:

char name [N][20],t[N];//二维数组中第i行与i+1行比较,若需要交换,每一行即为一个一维数组。所以中间数组用一个一维数组足矣 
	for(i=0;i<N;i++)
	   gets(name[i]);//输入名字  

这里我们提一下gets函数和Puts函数,它本质上和 scanf(“%s”,name[i]);和printf(“%s”,name[i])的作用是相同的,但书写起来更加简便。接下来要解决的就是按字典排序的问题了。字典中对汉字是按照汉语拼音的顺序排列的,这样的问题在计算机中我们一般采用通过比较两个名字ASCLL码的方式解决。但是在字符串的比较上就要出问题了,我们做过打擂法比较大小的同学会自然而然地想到在这样的操作。

for(i=0;i<N-1;i++)//i行和其下一行比较,一行存储一个字符串 
	   for(j=i+1;j<N;j++)
	   	  if(name[i]>name[j])
	   	  {
	   	     t[N]=a[i];
	   	     a[i]=a[j];
	   	     a[j]=t[N];
	   	  }

这样写下来发现 ,诶~无法通过编译,原因在于字符串的比较不能简单的使用比较运算符来操作,而是使用相对应的函数strcmp函数解决(英文string compare的缩写)。同理若是需要名字的位置变换也不能简单地用=解决,而用strcpy(英文string copy)。到这里,我们这个题目涉及的核心问题便解决了,看下代码:

for(i=0;i<N-1;i++)//i行和其下一行比较,一行存储一个字符串 
	   for(j=i+1;j<N;j++)//比较函数strcmp,赋值函数strcpy 
	   	  if(strcmp(name[i],name[j])>0)
	   	  {
	   		strcpy(t,name[i]);
	   		strcpy(name[i],name[j]);
	   		strcpy(name[j],t);
	      }

看到这里有些小朋友就会疑惑了,strcpy函数不是比较两个一维数组嘛,怎么跑出来一个t呢。这里是函数本身的格式要求造成的,strcpy(字符串1,字符串2)字符串1,2可以是字符串常量,也可以是字符型数组名。t 就是我们上面定义的一维数组的组名。ok,最后借助for循环遍历一次,输出我们排列好的名字列即可。

for(i=0;i<N;i++)
	   puts(name[i]);//按顺序输出

最后,补充几个小问题。a:善于使用宏定义,我们如果在开头定义一个变量N,N的赋值由我们决定,后面我们的代码就能解决一类问题,灵活度会大大增加。

b:由于题目中使用了包含在string.h中的函数,若是还没有接触函数,容易忽略开头#include <string.h>的书写。

好了,完整代码如下:

//输入10个名字存储=在数组中,按字典排序输出//
#include <stdio.h> 
#include <string.h>
#define N 3
main() 
{
	int i,j; 
	char name [N][20],t[N];//二维数组中第i行与i+1行比较,若需要交换,每一行即为一个一维数组。所以中间数组用一个一维数组足矣 
	for(i=0;i<N;i++)
	   gets(name[i]);//输入名字  
	for(i=0;i<N-1;i++)//i行和其下一行比较,一行存储一个字符串 
	   for(j=i+1;j<N;j++)//比较函数strcmp,赋值函数strcpy 
	   	  if(strcmp(name[i],name[j])>0)
	   	  {
	   		strcpy(t,name[i]);//字符串2可以是字符串常量、字符型数组名,
	   		strcpy(name[i],name[j]);
	   		strcpy(name[j],t);
	      }
	for(i=0;i<N;i++)
	   puts(name[i]);//按顺序输出 
	
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值