C++语言程序设计

我们直接写出程序代码如下，详细的注释已夹在程序代码中间：

| 例8-20

#include "stdio.h"
#include "string.h"
#define N 5
struct user //定义结构类型user
{
char name[7];//长度为7的字符数组name
char tel[9]; //长度为9的字符数组tel
};
void getstr(struct user *p,int n)
//输入n个用户的数据，存入p指向的结构体数组中
{
int i;
printf("\nPlease input %d's users' data:",n);
for(i=0;i<n;i++)
scanf("%s%s",p[i].name,p[i].tel);//输入每个用户的数据
}
void sortstr(struct user *p,int n)
//对p所指向的结构数组各元素进行排序,以name作为关键字
{
int i,j,k;
struct user t;
for(j=0;j<n-1;j++) //选择法排序
{
k=j;
for(i=j+1;i<n;i++)
if(strcmp(p[i].name,p[k].name)<0)
//如果后面的元素的用户名小于前面元素的用户名，则需要交换。
k=i;
strcpy(t.name,p[k].name);//用字符串拷贝函数交换数组元素的成员值
strcpy(t.tel,p[k].tel);
strcpy(p[k].name,p[j].name);
strcpy(p[k].tel,p[j].tel);
strcpy(p[j].name,t.name);
strcpy(p[j].tel,t.tel);
}
}
void outstr(struct user *p,int n) //输出p指向的结构数组的各元素
{
int i;
for(i=0;i<n;i++)
printf("%s %s\n",p[i].name,p[i].tel);
}
void main()
{
user w[N];//声明结构user的数组w
getstr(w,N);//读如N位用户的数据，放入数组w中
sortstr(w,N);//将w数组中N位用户的数据进行排序
outstr(w,N);//输出这N位用户的数据
}

这里需要说明的是，由于字符串总是以'\0'作为结束标志，因而为了使name中能存放6个字符，就应当将其长度定义成7；同样的，tel的长度应定义为9。
程序中用到的N是一个符号常量，可在程序开头使用define命令给出具体定义。
由于在主函数中调用的三个函数都提供了相同的实参（结构数组w和符号常量N），因而在定义三个函数的时候相应的形参也都应是一致的。当一维数组的数组名作实参时，对应的形参可定义为相同类型的一维数组或类型相同的指针变量。程序中采取后一种方式，即结构类型user的指针变量p。
调用函数时，通过虚实结合，使指针变量p指向结构数组w的首地址，整型变量n接收符号常量N的值。在getstr函数中，读入n位用户数据是通过for循环实现的，并且通过指针变量p来引用每位用户的姓名域和电话域，引用的方式为：p[i].name和p[i].tel。所以读入n位用户数据的过程可以用for语句实现如下：
for(i=0;i<n;i++)
scanf("%s%s",p[i].name,p[i].tel);
在sortstr函数中，采用了选择排序的方法对n位用户的name字符串进行排序。这里要注意到，由于p[i].name是一个字符串，所以比较两个字符串（p[i].name和p[k].name）的大小的时候，一定要用strcmp函数，而不能写成p[i].name<p[k].name。同样，当进行字符串赋值的时候，也应该使用strcpy函数来实现，而不能直接写成的p[i].name=p[k].name。的形式。
对于outstr函数，则是简单地用for语句将数组每个元素输出，包括每个user结构的name域和tel域。