c程序设计语言问题分析,C语言高级语言程序设计(一)-第三章 程序设计方法-问题分析.ppt...

C语言高级语言程序设计(一)-第三章 程序设计方法-问题分析

* * * * * * 问题3.3 程序实现 #include #define MAXLINE 512 int main() { char c,s1[MAXLINE],s2[MAXLINE]; int i,j; i = j = 0; gets(s1); while(s1[i] != '\0'){ s2[j++] = s1[i]; if(s1[i+1] == '-' && s1[i] < s1[i+2]){ for(c = s1[i]+1; c < s1[i+2]; c++) s2[j++] = c; i = i+2; } else i++; } s2[j] = '\0'; puts(s2); return 0; } 问题3.3 :测试 测试数据期望结果数据类型 a-dabcd正常 a-c-u-B abcdefghijklmnopqrstu-B 特殊 a-d d-aabcd d-a特殊 Z-b Z[\]^_`ab 特殊 a-b-cabc边界 -a-8-a-8非正常 a-aa-a非正常 问题3.3 :常见问题及分析 处理带空格的输入串 不要用scanf来读输入串,建议用getchar或gets来读输入串; 字符串没有结束标志 在用getchar读入一个字符串及生成扩展字符串s2时,一定要给字符串置一个结束符(’\0’);(通过实例演示一下现象) 问题3.3 :常见问题及分析(续) 用a-d, a-b, a-d-g作输入观察下面程序现象。如何调试? //c3_3a.c #include #define MAXLINE 512 int main() { char c,s1[MAXLINE],s2[MAXLINE]; int i,j; i = j = 0; gets(s1); while(s1[i] != '\0'){ s2[j++] = s1[i]; if(s1[i+1] == '-' && s1[i] < s1[i+2]){ for(c = s1[i]+1; c <= s1[i+2]; c++) s2[j++] = c; i = i+3; } else i++; } s2[j] = '\0'; puts(s2); return 0; } 问题3.3 :其它方法 其实在上述代码实现中,数组s2可以省略,如: //c3_3b.c #include #define MAXLINE 512 int main() { char c,s1[MAXLINE]; int i=0; gets(s1); while(s1[i] != '\0'){ putchar(s1[i]); if(s1[i+1] == '-' && s1[i] < s1[i+2]){ for(c = s1[i]+1; c < s1[i+2]; c++) putchar(c); i = i+2; } else i++; } putchar('\n'); return 0; } 其它方法? 问题3.3 :思考 若要求扩展符‘-’两边的字符为同类(即均为小写字母、大写字母或数字字符),即 出现Z-b、8-B这种情况将不扩展,程序如何修改? 其实在扩展字符操作前 if(s1[i+1] == '-' && s1[i] < s1[i+2]){ 增加一个判断扩展符两边的字符是否同类的函数即可。 if(s1[i+1] == ‘-’ && s1[i] < s1[i+2] && isCongener(s1[i],s1[i+2]) ){ 判断两个字符是否是同类的函数实现如下: int isCongener(char c1, char c2) { if(isupper(c1) && isupper(c2)) return 1; if(islower(c1) && islower(c2)) return 1; if(isdigit(c1) && isdigit(c2)) return 1; return 0; } isupper, islower, isdigit均为系统标准库函数。使用前要加: #include #include int a[1000],j; void expand( int s[1000],int i ) { int k; j=0; for(k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值