printf(\ } }
3-12. 编程,按学生的序号输入10名学生的成绩,按照分数由高到低的顺序输出学生的名次、
序号和成绩,要求成绩相同的学生具有相同的名次。 结果:输入:2 4 6 8 9 23 43 21 9 4 输出: 1: 7 43 2: 6 23 3: 8 21 4: 5 9 4: 9 9 5: 4 8 6: 3 6 7: 2 4 7: 10 4 8: 1 2
分析:用选择法排序。a[j][0]--序号,a[j][1]—名次。a[j][2]-- 成绩 main()/* sj1-3-12 */ {int j,k,e,t,a[10][3]; for(j=0;j<10;j++) {scanf(\ for(j=0;j<9;j++) {t=j;
for(k=j+1;k<10;k++) if(a[t][2]
t= a[0][1];
for(k=1;k<10;k++) /* 相同成绩,名次也一样 */ if(a[k-1][2]== a[k][2]) a[k][1]=t; else a[k][1]=++t; for(k=0;k<10;k++)
printf(\ }
3-13. 编程,输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文
数)。 结果: 1*1=1 2*2=4 3*3=9 11*11=121 22*22=484 26*26=676 101*101=10201 111*111=12321 121*121=14641
202*202=40804 212*212=44944
分析:对j循环(j=1~255),将j*j的各位数字放入数组,输出具有对称性质的j. main()/* sj1-3-13 */
{int e,f,c,t,n=0,a[10]; long j,k;
for(j=1;j<256;j++) { k=j*j; t=0;
while(k>0) {a[t++]=k;k=k/10;} for(c=0,e=t-1;c
3-14. 编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的
从小到大排列字符串并输出。 结果:输入:13579 24acf
输出:1234579acf
分析1:先将两个字符串合并成一个字符串,然后按从小到大排序。 #include \ #include \ main( ) /* sj1-3-14 */ { char a[80],b[80]; int i,j=0,k,t; gets(a); gets(b); printf(“a=%s,b=%s\\n”a,b);
while(a[j]!=’\\0’) j++; /* 找a串尾 */ i=0;
while(b[i]!=’\\0’) a[j++]= b[i++]; /* b串接在a串尾 */
k=strlen(a); for(i=0;i for(j=i+1;j if(a[t]>a[j]) t=j; p=a[i];a[i]=a[t];a[t]=p; } printf(“a=a+b=%s\\n”,a); } 分析2:对b串的每个字符b[i]在a串中找插入位置j,将a[j],a[j+1],a[j+2],…均向后移 动1个位置,然后将b[i]存入a[j].直到b串的每个字符均插入完毕为止。 #include \ #include \ main( ) /* sj1-3-14 */ { char a[80],b[80]; int i,j,k; gets(a); gets(b); for(i=0;b[i]!='\\0';i++) /* a,b合并到a */ {j=0; while(b[i]>=a[j]&&a[j]!='\\0') j++; /* 找b[i]在a中的插入位置j */ if(a[j]=='\\0') {a[j]=b[i];a[j+1]='\\0';} else {for(k=strlen(a)+1;k>j;k--) a[k]=a[k-1]; /* 将a[k]向后移1个位置 */ a[j]=b[i]; /* 将b[i]存入a[j] */ } } puts(a); } 3-15. 编程,输入两个已经按从小到大顺序排列好的字符串,合并两个字符串,使合并后的 字符串中字符从大到小排列并输出。 结果:输入:13579 24acf 输出:fca9754321 分析:先将两个字符串合并成一个字符串,然后按从大到小排序。 #include \ #include \ main( ) /* sj1-3-15 */ { char a[80],b[80]; int i,j,k,t,p; gets(a); gets(b); printf(\ strcat(a,b); /* b串接在a串尾 */ k=strlen(a); for(i=0;i for(j=i+1;j printf(\ } 3-16. 编程,输入两个字符串s1和s2,在s1中删除任何s2中有的字符。例如,s1:“abc123ad”, s2:“a1”,则输出“bc23d”。 结果:输入:abc123ad a1 输出:bc23d 分析:对s2中每个字符s2[i]到s1中寻找它,将s1中出现的所有s2[i]均删除。若s1[j] 应删除,则用s1[j]后面的字符向前移动的方法覆盖s1[j],达到删除s1[j]的目的。 #include \ #include \ main( ) /* sj1-3-16 */ { char s1[80],s2[80]; int i,j,k; gets(s1); gets(s2); for(i=0;s2[i]!='\\0';i++) /* 删除s1中的与s2[i]相同的字符 */ {j=0; while(s1[j]!='\\0') /* 在s1中找s2[i]并删除 */ {if(s2[i]==s1[j]) /* 找到s1[j],用向前移动的方法覆盖s1[j] */ for(k=j;k s1[k]=s1[k+1]; /* 将s1[j+1]~s1尾('\\0')向前移1个位置,删除s1[j] */ j++; } } puts(s1); } 3-17. 编程,输入一行文字,判断该行文字是否是回文。 例如,读入:MA DAM I MAD AM 输出:YES 读入:ABCDBA. 输出:NO 结果:输入:MA DAM I MAD AM 输出:MA DAM I MAD AM YES 输入:ABCDBA 输出:ABCDBA NO 分析:对字符串S,若s[i]==s[n-i-1](i=0,1,…,n/2)),则为回文。 #include \ main()/* sj1-3-17 */ { char s[80]; int p,n; gets(s); p=0; n=strlen(s); while(p if(s[p]!=s[n-p-1]) /*比较对称的两个字符 */ { printf(\ else p++; if(p>=n/2) printf(\ } 3-18. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入。输出最长的字符串。 结果:输入:china Beijing Chongqing Shanhai 输出:max=Chongqing 分析:用循环输入各字符串并求其长度,找最大长度并输出相应字符串。输入空串(长度为0)时结束循环。 #include \#include \main( ) /* sj1-3-18 */ {int i,k,m; char s[80],max[80]; i=1; gets(s); m=0; while((k=strlen(s))!=0) /* 输入空串时结束循环 */ { if(k>m) {m=k;strcpy(max,s);} /* 比较并记录最长字符串 */ gets(s); } printf(\} 3-19. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入,输出最大字符串。 结果:输入:China Beijing Chongqing Shanhai 输出:max= Shanhai 分析:用循环输入各字符串并求其长度,找最大字符串并输出。输入空串(长度为0)时结束循环。 #include \#include \main( ) /* sj1-3-19 */ {int i,k,m; char s[80],max[80]; i=1; gets(s); strcpy(max,s); while((k=strlen(s))!=0) /* 输入空串时结束循环 */ { if(strcmp(max,s)<0) strcpy(max,s); /* 比较并记录最大字符串 */ gets(s); } printf(\} 3-20.“1898─要发就发”。将不超过2004的所有素数从小到大排成第一行,第二行上的每个 数都等于它“右肩”上的素数与“左肩”上的素数之差。编程,输出第二行数中满足下列条件的整数:第二行数中若干个连续整数的和恰好是1898。 第一行:2 3 5 7 11 13 17 ..... 1997 1999 2003 第二行: 1 2 2 4 2 4 ..... 2 4 结果:输出:2,3,。。。,1987,1997,1999,2003 *******results************* No。1:sum=1898