ACM编程入门:菜鸟的经典错误与筛选法解析

需积分: 50 3 下载量 153 浏览量 更新于2024-08-20 收藏 517KB PPT 举报
"这篇文档是关于ACM程序设计中针对菜鸟常见错误的讲解,特别是与筛选法相关的部分。文中列举了几个典型错误示例,并提供了正确的处理方式。" 在ACM程序设计,尤其是在解决算法竞赛问题时,筛选法是一种常用的算法技术。筛选法通常用于在数组或集合中查找特定条件的元素,如找出所有的素数、最大值或最小值等。然而,对于初学者来说,编写能够正确处理多组输入数据的程序往往是个挑战。文档中的内容主要针对这些挑战进行了阐述。 1. 初学者的第一个常见错误是程序无法处理多组输入数据。例如,一个简单的加法问题,如1089A+B,需要读取多个输入对并分别求和。最初的代码只会处理单个输入对,如: ```c #include<stdio.h> void main() { int a, b; scanf("%d%d", &a, &b); printf("%d\n", a+b); } ``` 2. 为了解决这个问题,可以使用`while`循环来检测文件结束符(EOF)。但是,如果使用`while(scanf(...)!=0)`,可能会导致死循环,因为EOF的值是-1而非0: ```c #include<stdio.h> void main() { int a, b; while(scanf("%d%d", &a, &b)!=EOF) // 错误:可能导致死循环 printf("%d\n", a+b); } ``` 3. 修正上述错误的方式是在`while`条件后去除分号,确保循环体内的代码被执行: ```c #include<stdio.h> void main() { int a, b; while(scanf("%d%d", &a, &b)!=EOF) { // 去掉分号 printf("%d\n", a+b); } } ``` 4. 另一个初学者常犯的错误是在循环条件后面误加分号,导致循环体未被执行: ```c #include<stdio.h> void main() { int a, b; while(scanf("%d%d", &a, &b)!=EOF); // 错误:分号导致循环体未执行 printf("%d\n", a+b); } ``` 在编写处理多组数据的程序时,应特别注意这些陷阱。理解EOF的正确用法以及避免在循环条件后添加分号是避免这类错误的关键。此外,良好的编程习惯,如代码审查和测试,也能帮助发现并修复这些问题。通过不断地实践和学习,ACM新手可以逐步成长为熟练的程序员。