#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);
}
}
}