#include
#include //字符串处理函数的头文件
#define N 2
typedef struct BLOCK{/*在编程中使用typedef目的一般有两个,
一个是给变量一个易记且意义明确的新名字,
另一个是简化一些比较复杂的类型声明。*/
int n;
char name[50][20];
}Block;
void sort(char array[][20],int n);
int main(void)
{
Block num[N];
int i,j;
for(i=0;i<N;i++)
{
num[i].n=0;
}
for(j=0;j<N;j++)
{
scanf("%d",&num[j].n);
for(i=0; i<=num[j].n; i++)
{
gets(num[j].name[i]);
}
}
for(j=0;j<N;j++)
{
sort(num[j].name,num[j].n);
}
for(j=0;j<N;j++)
{
printf("=== sorted names ===\n");
for(i=1; i<=num[j].n; i++)
{
puts(num[j].name[i]);
}
}
return 0;
}
void sort(char array[][20],int n)
{
char temp[20];
int i,j,k;
for(i=1; i<=n-1; i++)
{
k=i;
for(j=i+1; j<=n; j++)
{
if(strcmp(array[k],array[j])>0)
k=j;
}
if(i!=k)
{
strcpy(temp,array[i]);
strcpy(array[i],array[k]);
strcpy(array[k],temp);
}
}
}
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
#include <stdio.h>
#include <string.h>//字符串处理函数的头文件
#define N 2
typedef struct BLOCK{/*在编程中使用typedef目的一般有两个,
一个是给变量一个易记且意义明确的新名字,
另一个是简化一些比较复杂的类型声明。*/
int n;
char name[50][20]; //定义一个二维数组
}Block;
void sort(char array[][20],int n);//函数声明
int main(void)
{
Block num[N];//定义2个结构体变量
int i,j;
for(i=0;i<N;i++)
{
num[i].n=0;//将每个变量的n置为0
}
for(j=0;j<N;j++)
{
scanf("%d",&num[j].n);//输入每个变量中的字符串个数
for(i=0; i<=num[j].n; i++)
{
gets(num[j].name[i]);//分别输入每个变量中的多个字符串
}
}
for(j=0;j<N;j++)
{
sort(num[j].name,num[j].n);//对每个结构体变量中的多个字符串进行排序
}
for(j=0;j<N;j++)
{
printf("=== sorted names ===\n");
for(i=1; i<=num[j].n; i++)
{
puts(num[j].name[i]);//输出排好序的字符串
}
}
return 0;
}
void sort(char array[][20],int n)
{
char temp[20];
int i,j,k;
for(i=1; i<=n-1; i++)//循环,典型的冒泡排序,两个for循环
{
k=i;
for(j=i+1; j<=n; j++)
{
if(strcmp(array[k],array[j])>0)//比较字符串大小
k=j;
}
if(i!=k)//需要交换两个字符串
{
strcpy(temp,array[i]);
strcpy(array[i],array[k]);
strcpy(array[k],temp);
}
}
}
姓名按字符由小到大排序问题?