杭电OJ——第1000,1001题

今天第一次接触杭电OJ,感觉很新奇有趣。希望从今天开始其乐无穷的刷题之路吧微笑


1000题:

Problem Description
Calculate A + B.
 

Input
Each line will contain two integers A and B. Process to end of file.
 

Output
For each case, output A + B in one line.
 

Sample Input
  
  
1 1
 

Sample Output
  
  
2

答案:

#include <stdio.h>


int main(void)
{
    int a, b;
    while(scanf("%d%d", &a, &b) == 2) //最开始没有添加参数返回值判断
    printf("%d\n", a+b);
    return 0;
}

关于scanf的返回值知识:

1. scanf 函数是有返回值的,它的返回值可以分成三种情况
  1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);
      如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
      如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
  2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
  3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。

scanf的返回值由后面的参数决定
  scanf("%d%d", &a, &b);
  如果a和b都被成功读入,那么scanf的返回值就是2
  如果只有a被成功读入,返回值为1
  如果a和b都未被成功读入,返回值为0
  如果遇到错误或遇到end of file,返回值为EOF。
  且返回值为int型.
输入1, a
第一个%d, 从缓冲区读入1, 赋值给a; 
第二个%d, 从缓冲区读入'a',不匹配,scanf返回。
成功读入一个数据,scanf返回值是1。
--------------------------------------------------
输入a, 1
第一个%d, 从缓冲区读入'a', 不匹配,'a'在缓冲区保留; 
第二个%d, 从缓冲区读入'a',不匹配,scanf返回。
成功读入0个数据,scanf返回值是0。

题目1001:

Problem Description
Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).

In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n.
 

Input
The input will consist of a series of integers n, one integer per line.
 

Output
For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.
 

Sample Input
  
  
1 100
 

Sample Output
  
  
1 5050
AC答案:
#include<stdio.h> int main() {     long int a, i, sum;     while(scanf("%d", &a) != EOF)     {         sum = 0;         for(i = 1; i<=a; i++)         {             sum += i;         }         printf("%d\n\n",sum);     }     return 0; }
这个题的描述似乎是有问题的,因为提交的答案中每次输入一个n值时,按回车键换行时,输出结果会被立刻打印出来,而无法像问题显示那样能够一次输入2个n值。
当while条件为 while(scanf("%d", &a) != EOF)时,当输入一个字母时,程序会一直打印上一次的sum值,只能强行关闭退出。当改为while(scanf("%d", &a) == 1)便不会出现这个问题,分析原因可知:scanf是一种“模式匹配”函数,它总是试图把输入的字符组或数据流与其双括号内的转换格式符类型%d(或%d、%f、%c等)相匹配,并且在寻找匹配起始位置时,它会忽略空白字符(包括空格、回车、tab等),起始位置匹配成功后继续向后查找,直到遇到遇到不可能属于此格式类型%d的字符时停止,以确定终止位置,然后将起始和终止位置之间的字符串赋给相应的变量。匹配成功后继续进行下一轮匹配,如果输入字符与下一个格式类型无法正确匹配,则scanf忽略后续格式串中的格式类型,并退出,并且将不匹配字符放回到“原处”,即放回到输入数据流中,等待下一次调用scanf函数时来读取。
当while(scanf("%d", &a) != EOF),输入为整数时,scanf读取成功后返回1,while为真,当为字母时,scanf无法成功读取,将字母字符放回到输入流,返回0,while为真,变量a依然保持上一次成功读入后的值。由于输入流中有数据,则while(scanf("%d", &a) != EOF)会一直被调用,并每次均读取失败返回0,并将字母放回到输入流中,于是屏幕便一直打印输出上次的sum值。此时继续用键盘输入整数值也依然不会改变程序状态。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值