《一个很基础的ACM习题》
来源:互联网 发布:淘宝偏远地区 编辑:程序博客网 时间:2024/06/15 20:42
ACM的编程题目大多具有一定的挑战性,能够锻炼研发人员的开发能力,开拓思路和提高研发趣味。在http://poj.org/problemlist上列有众多的问题可供选择和解答,其中第一个基础的练习是如下所述:
(ID1000)Description
计算a加b。
Input
两个整数a和b,其中0≤a, b≤10。
Output
输出a与b的和。
Sample Input
1 2
Sample Output
3
一般的研发人员拿到这个题目会感到非常好笑,觉得这种题目未免太过于简单或者说轻松了,实质上这么想的话就违背了该题目所要考查的意思了,我以为该题目从研发的角度至少有下面几种思路:
(1)注意到输入的范围,两个大小在0~10的整数,这里考查了正则表达式的技术,如果使用scanf来进行单个有效性判断则无法覆盖很多情况,缺乏输入的稳定性和健壮性;
(2)程序的健壮性,这里涉及防御式编程的思想;
(3)快速写出程序,要求我们不去使用已有的函数库,那么就快速写出符合题目的正则过滤,所以又涉及敏捷开发的思想;
(4)便于复用,模块化编程。
正则匹配是该题目的核心所在,以下是参考代码:
void problem_id1000(){ char buf[1024] = {0}; printf("input a and b(0<=a,b<=10):\n"); fgets(buf, MAX_LINE_LENGTH, stdin); buf[strlen(buf) - 1] = '\0'; /*简易的正则表达式匹配*/ int len = strlen(buf); int i; BOOL ans = true; int matcher = 0; /*四次匹配*/ int m_a, m_b; /*所需要的两个数字*/ for (i = 0; i < len; ) { if (matcher == 0 || matcher == 2) { int tmp = buf[i] - '0'; int tmp1 = -1; if ((tmp<0) || (tmp > 9)) { ans = fail; } i++; if (tmp == 1) { tmp1 = buf[i] - '0'; if (tmp1 != 0) { ans = fail; } i++; } if (ans == true) { if (matcher == 0) { if (tmp1 == 0) { m_a = 10; } else { m_a = tmp; } } else { if (tmp1 == 0) { m_b = 10; } else { m_b = tmp; } } } } if (matcher == 1) { while (buf[i] == ' ' || buf[i] == '\t') { i++; } } if (matcher == 3) { while (buf[i] == ' ' || buf[i] == '\t') { i++; } if (buf[i] != '\n' && buf[i] != '\0' && buf[i] != '\r') { // printf("i = %d, %d\n", i, buf[i] - '\0'); ans = fail; /* r表示是Unix换行风格 */ } } /*有效性判断*/ matcher++; if (matcher == 4) { break; /*四次匹配结束*/ } if (ans == fail) { break; /*匹配失败,错误处理*/ } } printf("-------------------------------------------------\n"); if (ans == true) { printf("a = %d, b= %d, a+b = %d\n", m_a, m_b, m_a + m_b); } else { printf("wrong input, check the number again\n"); }}
各位可以自己书写main函数,调用该接口函数,多多想一些测试用例,改进该程序,然后enjoy it!
- 《一个很基础的ACM习题》
- ACM习题-有趣的问题
- 一个JavaScript 的习题
- OJ习题acm求数列的和
- 关于对ACM习题的学习计划
- 数组的基础和习题
- 一个很简单的JAVA习题!求答案!
- ACM大量习题题库
- ACM大量习题题库
- ACM大量习题题库
- ACM大量习题题库
- 北大ACM习题参考答案
- ACM大量习题题库
- ACM习题J-10
- ACM习题K-11
- ACM习题L-12
- ACM习题N-14
- ACM习题O-15
- NSURLResponse的suggestedFilename中文乱码问题
- android使用ant自动化打包
- platform_device(平台设备)和platform_driver(平台驱动)及平台设备驱动工作原理
- Spring 总结
- MSDN上发现了一篇很好的WCF入门教程
- 《一个很基础的ACM习题》
- 使用wget下载Oracle软件
- Linux下ssl+apache开机自动启动脚本
- testable function
- AS3 EaseButton --- 继续自:EaseSprite
- javascript 打印不显示按钮的方法
- VMWare Server在Windows Server 2008下疑似NAT工作不正常
- UI设计的定义以及定位
- Openssl 移植至arm-linux