新手最常见的误解和错误

=scanf  忘记 &

输入与输出的次序

有题目的要求如下

http://125.221.232.253/JudgeOnline/problem.php?cid=1090&pid=1

样例输入

4
3 4 4
3 4 5
3 4 6
3 4 7
样例输出
Acute triangle
Right triangle
Obtuse triangle
NO

这个题目有多组数据(示例中是4组), 是不是要全部先读入所有的数据, 然后再产生所有的输出呢? 答案是你可以这样做,但是没有必要。完全可以读入一个,处理一个,也就是,在屏幕上的输入输出效果如下也是正确的:

4
3 4 4
Acute triangle
3 4 5
Right triangle
3 4 6
Obtuse triangle
3 4 7
NO

输入的约束条件

比如下面的题目:

编写程序,给出一个其值不超过12345678的正整数,求出它是几位数。

有些同学的代码类似下面的

1 int n;
2 scanf("%d", &n)
3 if(n <= 12345678)

第3行的判断是没有必要,每个题目提交以后OJ都会用数据来测试你的程序,题意保证测试你程序的数据不超过12345678,并不需要你自己来检查。

题目中给定条件约束往往决定了能使用什么方法,比如下面的题目:

2010省赛题:数字整除
题目描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。

注意到n的范围远远超过了int,long long所能表示的范围,所以你无法用一个整数类型存储n,解决的方法是用字符串来存储n,再模拟除法。

范围往往决定了你需要的存储空间,比如下面的题目

问题 G: 实验7_3:多行字符串反转输出

题目描述
输入多行字符串,把这些字符串逆序且反转输出。

输入
输入多个(小于30个)字符串,每行一个字符串,字符串长度不超过30

这意味你可以定义一个字符数组 char s[30][31]; 来存储所有的输入

多组数据状态的初始化

先来看一组数据的例子,求1到n的总和

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int i, n;
 6     int sum = 0;
 7
 8     scanf("%d", &n);
 9     for(i = 1; i <=n; i++)
10         sum += i;
11     printf("%d\n", sum);
12
13     return 0;
14 }

sum初始化为0是大家熟悉的, 但是如果要求输入多个n,分别求1到n的总和呢?许多同学会犯错,见下面的第6行,sum 清0只进行了一次,后面sum的计算是在前一次的基础上进行的

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int i, n;
 6     int sum = 0;
 7
 8     while(scanf("%d", &n) != EOF) {
 9         for(i = 1; i <= n; i++)
10             sum += i;
11         printf("%d\n", sum);
12     }
13
14     return 0;
15 }

对于多组数据,如果状态是针对每一组数据,则每一组数据都应该初始化其状态一次,见下面的第9行

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int i, n;
 6     int sum;
 7
 8     while(scanf("%d", &n) != EOF) {
 9         sum = 0;
10         for(i = 1; i <= n; i++)
11             sum += i;
12         printf("%d\n", sum);
13     }
14
15     return 0;
16 }

读整数后再读入字符串

一个常见的情况是先读入整数n,再读入n个字符串(我们假定是各自有独立的行)

如果字符串中没有空格,则可以使用下面的代码

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int n;
 6     char s[80];
 7
 8     scanf("%d", &n);
 9     while(n--) {
10         scanf("%s", s);
11         puts(s);
12     }
13
14     return 0;
15 }

但是字符串有空格的话,你必须用类似gets的函数,比如下面的样例

样例输入
2
zhe shi hui yin ni dong ma?
yukkuri shite itte ne!!!

你必须使用类似下面的代码,注意第9行。 因为样例的整数 2后面有回车, 如果是scanf("%s", s);则会跳过回车接收后面真正的字符串;但是gets不会,它直接碰到回车的话会认为接收到了一个空串。为了避免该情况的发生,我们用getchar()吃掉回车键。然后再用gets接收就没有问题了。

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int n;
 6     char s[80];
 7
 8     scanf("%d", &n);
 9     getchar();
10     while(n--) {
11         gets(s);
12         puts(s);
13     }
14
15     return 0;
16 }

下面第8行的做法也是可行的,scanf里面的\n会忽略调换行,但不推荐同学们这样写。

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int n;
 6     char s[80];
 7
 8     scanf("%d\n", &n);
 9     while(n--) {
10         gets(s);
11         puts(s);
12     }
13
14     return 0;
15 }
时间: 2024-10-01 06:13:20

新手最常见的误解和错误的相关文章

网页设计,常见的6个错误!

对于网页设计的SEO优化,应该是一个老生常谈的话题,为什么总是每隔一段时间,就会再次强调网页设计对搜索优化的重要性,主要的原因就是,总是有一些SEO新手持续的犯一些没有必要的错误,为此,我会再次强调这个问题. 那么,SEO网页设计,常见的6个错误有哪些? 1.瀑布流的无限加载 瀑布流技术算是一个热门的技术,主要用于改善用户体验,但在某些方面却严重影响了SEO效果,如果你曾经认真的分析瀑布流网站,你会发现它并不能抓取AJAX加载的相关内容. 那么目前解决这个问题的最好的办法,应该是增加侧栏,保留最

A query was run and no Result Maps were found for...原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误

今天遇到一个问题,原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误 报错的结果是这样的: A query was run and no Result Maps were found for the Mapped Statement 'cn.zrgk.dao.RoleMapper.getRoleList'. It's likely that neither a Result Type nor a Result Map was specified. org.apache.

Java 中最常见的 5 个错误

在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 1.Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 NullPointerException.下面代码片段会从另一个方法获得一个集合: List<String> accountIds = person

常见反编译产生错误 k__BackingField 解决办法

常见反编译产生错误 k__BackingField 解决办法     无聊反编译小蚂蚁出现上千的错同样的错 private bool <EnableRuntimeHandler>k__BackingField;        [CompilerGenerated]        private bool <EnableSDE>k__BackingField;        [CompilerGenerated]        private bool <EnableStopw

常见的Android开发错误及解决办法

9个常见的Android开发错误及解决办法: 1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致. 2. 布局文件不可以有大写字母 3. 抛出如下错误WARNING: Application does not specify an API level requirement!, 是由于没有指定users sdk的缘故,修改AndroidManifest.xml文件. 加入:<uses-sdkandroid:minSdkVersion="8″>

oracle rac 常见安装、管理错误

1. 安装CRS失败,或执行root.sh报错,可能原因: (1) 节点间的时间不同步,解决方法:使用ntp服务 (2) Linux下启用了默认的防火墙,导致执行root.sh报错: Failure at final check of Oracle CRS stack. 10 解决方法:禁用iptables ,注释/etc/pam.d/other ; # service iptables stop; # chkconfig iptables off. (3) 裸设备的权限问题,可能因为操作系统重

mysql 常见的几个错误问题

Mysql常见的几个错误问题及解决方法: 1.问题: mysql DNS反解:skip-name-resolve 错误日志有类似警告: 点击(此处)折叠或打开 120119 16:26:04 [Warning] IP address '192.168.1.10' could not be resolved: Name or service not known 120119 16:26:04 [Warning] IP address '192.168.1.14' could not be reso

python新手常犯的17个错误

1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 "SyntaxError :invalid syntax") 该错误将发生在类似如下代码中: 1 2 if spam== 42 print('Hello!') 2) 使用 = 而不是 ==(导致"SyntaxError: invalid syntax") = 是赋值操作符而 == 是等于比较操作.该错误发生在如下代码中: 1 2 if spam

java远程调用(rmi)常见的两个错误

java的 rmi远程调用给分布式编程带来极大的方便,在使用rmi过程中若遇到以下两个问题,可以尝试如下的解决方法 错误 1 : java.rmi.server.ExportException : remote object implements illegal remote interface; nested exception is : java.lang.IllegalArgumentException : illegal remote method encountered : , 解决方