计算机等级考试二级C语言程序设计专项训练题——程序设计题(四)
31、请编写函数void fun(char xx[]),函数的功能是:将字符串数组xx中下标为奇数的字符按其ASCII值从大到小的顺序进行排序。
例如:源字符串为:abcdefgh,则处理后字符串为:ahcfedgb。
#include <stdio.h> #include <string.h> void fun(char xx[]) { } int main() { char xx[81]; printf("Enter a string : "); gets(xx); printf("The original string is : "); puts(xx); fun(xx); printf("The string after modified : "); puts(xx); return 0; }
void fun(char xx[]) { int i,j,k; char ch; i=strlen(xx); for(j=1;j<i-2;j=j+2) for(k=j+2;k<i;k=k+2) if (xx[j]<xx[k]) { ch=xx[j]; xx[j]=xx[k];xx[k]=ch; } }
32、请编写函数void fun(char xx[]),其功能是:从字符串xx中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
例如:若源字符串为:abcdhgfe,则处理后字符串为:dcbaefgh。 若源字符串为:123498765,则处理后字符串为:432195678。
#include <stdio.h> #include <string.h> void fun(char xx[]) { } int main() { char xx[81]; printf("Enter a string : "); gets(xx); printf("The original string is : "); puts(xx); fun(xx); printf("The string after modified : "); puts(xx); return 0; }
void fun(char xx[]) { int i,j,k,half; char ch; i=strlen(xx); half=i/2; for(j=0;j<half-1;j++) for(k=j+1;k<half;k++) if(xx[j]<xx[k]) { ch=xx[j];xx[j]=xx[k];xx[k]=ch; } if (i%2) half++; for (j=half;j<i-1;j++) for (k=j+1;k<i;k++) if (xx[j]>xx[k]) { ch=xx[j];xx[j]=xx[k];xx[k]=ch; } }
33、请编写函数void fun(char xx[]),其功能是:从字符串xx中间一分为二,左边部分按字符的ASCII值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
例如:若源字符串为:abcdhgfe,则处理后字符串为:hgfedcba。 若源字符串为:123498765,则处理后字符串为:876594321。
#include <stdio.h> #include <string.h> void fun(char xx[]) { } int main() { char xx[81]; printf("Enter a string : "); gets(xx); printf("The original string is : "); puts(xx); fun(xx); printf("The string after modified : "); puts(xx); return 0; }
void fun(char xx[]) { int i,j,k,half; char ch; i=strlen(xx); half=i/2; for(j=0;j<half-1;j++) for(k=j+1;k<half;k++) if(xx[j]<xx[k]) { ch=xx[j];xx[j]=xx[k];xx[k]=ch; } for (j=half-1,k=i-1;j>=0;j--,k--) { ch=xx[j]; xx[j]=xx[k]; xx[k]=ch; } }
34、编写一个函数fun(char *str,char *substr),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。
例如,若字符串str为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",则函数返回值是6。
#include <stdio.h> #include <string.h> int fun(char *str,char *substr) { } int main() { char str[81], substr[3] ; int n ; printf("输入原字符串:") ; gets(str) ; printf("输入子字符串:") ; gets(substr) ; n=fun(str, substr) ; printf("n=%d\n", n) ; return 0; }
int fun(char *str,char *substr) { int n=0; char *p , *r; while (*str) { p=str; r=substr; while(*r) if (*r==*p) {r++; p++; } else break; if (*r=='\0') n++; str++; } return n; }
int fun(char *str,char *substr) { int i,cnt=0; for(i=0;str[i]!='\0';i++) if(str[i]==*substr && str[i+1]==*(substr+1)) cnt++; return cnt; }
35、请编写函数void fun(char xx[]),函数的功能是:将字符串数组xx中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号,将标点符号均转换为空格)仍重新存入字符串数组xx中。
例如:源字符串为:I am a student,则处理后字符串为:student a am I。
特别说明:若源字符串末尾有一个标点,则转换后的字符串开头有一个空格。
#include <stdio.h> #include <string.h> void fun(char xx[]) { } int main() { char xx[81]; printf("Enter a string : "); gets(xx); printf("The original string is : "); puts(xx); fun(xx); printf("The string after modified : "); puts(xx); return 0; }
void fun(char xx[]) { int len,i,j,k,s; char str[81]; len=strlen(xx); s=k=0; for (i=len-1;i>=0;i--) // 从当前字符串尾部开始向前倒序循环,实现单词倒排 { if((xx[i]>='A' && xx[i]<='Z')|| (xx[i]>='a' && xx[i]<='z')) k++; // 如果当前字符是字母a~z或A~Z,则k加1 else // 否则将长度为k的单词顺序存入到字符串数组str中 { for(j=1;j<=k;j++) str[s++]=xx[i+j]; k=0; // 将k值清0,以方便下一个单词的长度计数 } if(!((xx[i]>='A' && xx[i]<='Z')|| (xx[i]>='a' && xx[i]<='z'))) str[s++]=' '; // 如果当前字符不是字母a~z或A~Z,则以空格代之存入到字符串数组str中 } for(j=1;j<=k;j++) // 此时的k值为当前字符串中第一个单词的长度,但在上一个for循环中没能存入到字符串数组str中,所以在这里将其存入到str中 str[s++]=xx[i+j]; str[s]='\0'; strcpy(xx,str); // 将倒排好的当前字符串重新存回到xx中 }
void fun(char xx[]) { int i,len; char str[81]={0}; len=strlen(xx); for (i=len-1;i>=0;i--) if(!((xx[i]>='A' && xx[i]<='Z')|| (xx[i]>='a' && xx[i]<='z'))) { strcat(str,xx+i+1); strcat(str," "); xx[i]='\0'; } strcat(str,xx); strcpy(xx,str); }