printf(\}
3-28.编程,输入两个字符串s1、s2,将s1复制到s2并输出s1和s2。复制时,若字符串s1
中存在缩写形式 (如: a – z ) 应转换为字符串s2中的完整形式(abcd??xyz)。“-”号之前的字符必须小于“-”号之后的字符才是合法的缩写形式。例如,s1=abc-fg,则s2=abcdefg,如果s1=abc-af,则 s2=abc-af。应能够处理任意可显示的ASCII字符。 结果:输入:asd-fge-ak1-5sj abc
输出:asdefge-ak12345sj
分析:考察s1[i-1]、s1[i]和s1[i+1],若s1[i]==?-?且s1[i-1]< s1[i+1], 则展开s1[i-1]- s1[i+1]:
复制s1[i-1]+k(k=1,2,..)到s2.,否则只复制s1[i]到s2。
#include \main()/* sj1-3-28 */ {char s1[80],s2[80]; int i=1,k,j=1;
gets(s1); gets(s2); s2[0]=s1[0];
while(s1[i]!='\\0')
{if(s1[i]=='-'&&s1[i+1]>s1[i-1]) /* 出现s1[i-1]- s1[i+1]现象 */
for(k=1;s1[i-1]+k else s2[j++]=s1[i]; /* 未出现s1[i-1]- s1[i+1]现象,则将s1[i]复制到s2*/ ++i; /*考察下一字符 */ } s2[j]='\\0'; printf(\} 3-29. 编程,输入字符串,输出字符串中每个字符所出现的次数。如: 输入字符串: abcedabcdcd 则输出: a=2 b=2 c=3 d=3 e=1 结果:输入:abcedabcdcd 输出:a=2 b=2 c=3 e=1 d=3 分析:s1存放字符串,s2[k]存放字符s1[k]的个数,扫描s1[i](i=0,1,…),若s1[i]==s1[k](k=0,1,..i-1),则s2[k]加1。 #include \main()/* sj1-3-29 */ {char s1[80];int s2[80]={0},i=1,k; gets(s1);s2[0]++; while(s1[i]!='\\0') {for(k=0;k if(s1[i]==s1[k]) {s2[k]++; break;}/* 出现相同字符,该字符数加1 */ if(k>=i) s2[i]=1;/* 出现不同字符, 该字符数为1 */ ++i; } for(k=0;k<80;k++) /*输出字符数非0的字符s1[k]及其个数s2[k]*/ if(s2[k]!=0) printf(\printf(\} ?????????????3-30. 编程,输入一个长度不超过100的字符串,删除串中的重复字符后输出。如: 输入字符串: abacaeedabcdcd 则输出: abced 结果:输入:abacaeedabcdcd 输出:abced 分析: #include \main()/* sj1-3-30 */ {char s1[80]; int i=1,n,k,t; gets(s1); n=strlen(s1); while(s1[i]!='\\0') {for(k=0;k i++; /* 考察下一字符 */ } printf(\} 3-31. 编程,输入一行字符串,请将其中的字符按照单词进行分割,输出该行中包含的全部 单词。(单词是用空格、\\t或\\n分割的字符串。) 结果:输入:china 123 beijing abc 输出:1: china 2: 123 3: Beijing 4: abc 分析:输入一行字符,其中含空格、跳格和换行。用inword(初值为0) 表示单词的开始或 结束(=1,开始,=0,结束)。 读入空格、跳格或换行时,表示单词结束,令inword=0,输出该单词及其序号,若遇换行,表示输出了最后一个单词,退出。 读入非空格、跳格或换行时, 若inword=0,则该字符是单词的起始字符,令inword=1,单词计数器加1(nw++;)将该字符存入s数组(以便判断输出它)。 若inword不为0,则该字符是单词的一个字符,继续将该字符存入s数组。 #include \ #define YES 1 #define NO 0 main()/* sj1-3-31 */ {int nw,k,inword; char c,s[50]; inword=NO; /* inword=NO 已处理的最后一个字符是空格或\\n */ /* inword=YES 已处理的最后一个字符不是空格或\\n */ nw=0; /* 单词计数器置0 */ while(c=getchar()) { if(c==' '||c=='\\t'||c=='\\n') {inword = NO; /* 如果读入空格、跳格或换行,则一个单词结束 */ printf(\输出该单词及其序号 */ if(c=='\\n') break; /* 遇换行,表示输出了最后一个单词,退出*/ } else /* 读入的字符不是空格、跳格或换行 */ if(inword==NO) /* 如果前一个字符是空格*/ { inword=YES; /* 则c为单词的首字符, 置inword为YES */ k=0; s[k++]=c; /*将c记入数组s */ ++nw; /*进行单词计数 */ } else {s[k++]=c; s[k]='\\0';} /*非单词首字符记入数组s并在串尾加\\0*/ } } ?3-32. 编程,将任一正整数转换为二进制形式。 结果:输入:144 输出:n(10)=144 n(2)=1 0 0 1 0 0 0 0 分析:用除2取余数的方法化2进制,用数组存放2进制各位数字(从高位到低位存放)。输出时从高位的第一个非0数字开始输出。 main()/* sj1-3-32 */ { int j,n,k,a[16]={0}; scanf(\ k=15; j=n; while(j>0) /* 将十进制数转变为二进制数 */ { a[k--]=j%2; /* 二进制数低位放后面 */ j=j/2; } printf(\ for(k=0;a[k]==0;k++); for(j=0;j<16;j++) printf(\ printf(\ }