Excellence(2015 Pacific Northwest Region Programming Contest—Division 2)(字符串排序问题)



题目链接:http://codeforces.com/gym/100819     

题目如上图所示,翻译过来就是:先输入一个整数n,代表这个班上学生的数量,然后下面紧接着有n行,

每行由       名字+一个空格+姓  (last name(中间一个空格)first name)。  (n不大于100,名与姓字符串长度不大于10)

输出要求: 对名字进行排序,先对姓排序,按小到大排序,  例如  Anna <Bob <Codeforces,然后在对姓相同但名不同的,对名进行从小到大的排序,规律与上文相同。 




这道题,应该算一道水题,但是却花了我挺长的时间,因为我对  strcmp函数不是很熟悉 ,所以我花了很长的时间去debug,但是我觉得挺划算的,经过这道题,我克服自己对字符串问题的恐惧心理,并不是因为他难,而是复杂,一不小心就在写bug。


这题运用到       strcpy(str1,str2)   字符串的抄写函数,(将str2赋给str1) 

                       strcmp(str1,str2) 字符串的比较函数,

                                                        当str1与str2相等时    返回值为0

                                                        当str1大于str2时     返回值为正数

                                                         当str1小于str2时   返回值为负数


            还有一点是运用了选择排序, 每经过一个循环,找出最小的字符串,然后和    未决定位置且最前面的字符串    交换位置,即每次循环决定一个位置,和冒泡相似,冒泡是决定最后一个位置,选择排序是决定第一个位置。

运用上面的足以解决这道题。

附代码:


#include<stdio.h>#include<string.h>char name[110][20],str[110][20],min[20];     //  name代表名     str 代表姓氏 int main(){int n;while (scanf("%d",&n)!=EOF){memset(name,'\0',sizeof(name));     memset(str,'\0',sizeof(str));int i,j,t,temp;for(i=0;i<n;i++){scanf("%s %s",name[i],str[i]);} for (i=0;i<n;i++){strcpy(min,str[i]);t=-1;for (j=i+1;j<n;j++){if (strcmp(str[j],min)<0){strcpy(min,str[j]);t=j;  }}if (t==-1) continue;strcpy(min,str[i]);//选择排序strcpy(str[i],str[t]); strcpy(str[t],min);strcpy(min,name[i]);strcpy(name[i],name[t]);strcpy(name[t],min);}for (temp=1;temp;){temp=0;for (i=0;i<n-1;i++){if (strcmp(str[i],str[i+1])==0){if (strcmp(name[i],name[i+1])>0){temp++;strcpy(min,str[i]);strcpy(str[i],str[i+1]); strcpy(str[i+1],min);strcpy(min,name[i]);strcpy(name[i],name[i+1]);strcpy(name[i+1],min);}}}}for (i=0;i<n;i++){printf ("%s %s\n",name[i],str[i]);}}return 0;}