信奥竞赛

系列

剑指信奥 | C 语言之我的第一个信奥题

再谈数据和输出

在昨天,我们学习了 C 语言中变量的含义,还记得吗,变量有这样四个方面的含义:

  1. 数据类型:变量定义时都要声明一种数据类型。
  2. 变量名称:我们要为每个变量取一个适合的名字。
  3. 变量的值:为变量赋予值,这个值是可以变化的。
  4. 存储空间:程序运行时,值在内存的某个空间内。

我们昨天还布置了一个小练习:

计算 123 * 456 的结果,并输出这个结果,相信你已经做出来了:

#include <stdio.h>
int main() {
    int i = 123;
    int j = 456;
    printf("%d", i * j);
}
                

输出:56088

或许你已经注意到了,我们的输出语句中,有一个比较特殊的部分:

printf("%d", i * j);

对,就是这个百分号 % 是什么含义,有什么样的作用?

还记得吗,我们在讲 printf 时,说过这是一个“格式化输出函数”,这个 %d 就是格式化字符串的含义:

格式化字符串 format string,是一些程序设计语言在格式化输出 API 函数中用于指定输出参数的格式与相对位置的字符串参数

Wikipedia

简单的说,这些符号,就是指定了我们的数据输出的样式。

上面我们输出了一个整数,所以 d 代表十进制的数值,我们再来看一个例子:

#include <stdio.h>
int main() {
    float i = 1.0;
    float j = 3.0;
    printf("%f", i / j);
}
                

运行一下,我们发现结果是 0.333333。

float 是什么意思?

昨天我们说到过数据类型,int 是整形,但并不是 C 语言中唯一的类型,而这个 float 就是另外一种很常用的数据类型,叫做浮点型,通俗的说,就是小数的含义。

那么这个符号 / 又是什么含义?

这就是计算机里表示除法的符号。所以这个程序的输出是 0.333333,而格式化字符串 %f 的含义就是完整的输出最终的小数结果。

两个练习题:

  1. 把上面的格式化字符串改为 %.1f,查看输出。
  2. 把 i 和 j 定义为 int 类型,查看输出结果。

这样我们就知道了格式化字符串的含义,也了解了 C 语言中有多种数据类型。

数据的输入

在知道了数据的输出之后,我们自然会想到,数据既然能够输出,能不能输入呢?

答案当然是可以。

输出 output,是程序中的数据在经过各种计算后,为我们返回最后的结果。

输入 input,是向程序中传入我们提供好的数据,交由程序进行各种处理。

输入和输出代表了数据的两个不同的流向:

输入 - 加工 - 输出

那么,在 C 语言中,程序如何接受我们传入的数据?

我们来看一个简单的例子:

#include <stdio.h>
int main() {
    int i;
    scanf("%d", &i);
    printf("%d", i);
    return0;
}
                

在这段程序中,我们先声明了一个整型变量 i,然后使用了一个新的函数 scanf 用以接收向程序中输入的数据,最后又使用 printf 将这个变量的值输出来:

输入和输出

与 printf 类似,scanf 函数就是格式化输入的含义,由英文单词 scan 和 format 组成。

既然是格式化输入,也需要在接收时制定格式化字符串。

另外需要特别注意的是,在程序接收 i 的数据时,我们在 scanf 中写的是 &i,千万不要忘记在 i 的前面写上符号 &。

这个符号涉及到了 C 语言中的一个稍难的知识点,我们会在以后做详细的说明。

信奥 = ?

在我们掌握了输入和输出的方法以后,我们就可以开启信奥的旅程了!

没有什么能够阻挡,
你对自由的向往。
—— 蓝莲花
                

在信息学奥林匹克竞赛中,所有的算法题都有着固定的模式:

读入数据 - 计算结果 - 输出数据

  1. 读入数据的工作就交给 scanf 函数去做;
  2. 计算结果的过程就交给各种各样的算法来完成;
  3. 最后结果数据的输出就由 printf 函数负责;

这样我们的学习目标就更加明确了:怎样用各种各样的算法来完成对输入数据的处理,以匹配我们希望得到的结果。

下面,我们就来开启第一次信奥的挑战。

我完成的第一道信奥题

既然是第一次,我们从一个简单的题目入手:

【问题描述】 输入整数 i 和 j,输出 i 和 j 的差。

【输入样例】 78 56

【输出样例】 22

这是一个非常简单的题目,但是和信息学奥赛的题目是完全一样的形式。

这是一种解题方法:

#include <stdio.h>
int main() {
    int i, j, k;
    scanf("%d %d", &i, &j);
    k = i - j;
    printf("%d", k);
}
                

这样,当我输入数据 78 56 后,就会输出结果 22。

要注意,因为输入的两个数字中间有一个空格,所以在两个 %d 之间也要保留一个空格。

好啦,这样,我们就完成了信奥的第一次挑战,保留这份信息,我们继续前行!

最后,我们来布置一个稍微复杂一点的例题:

【问题描述】 输入三角形的三条边长,输出这个三角形的面积。

【输入样例】 23.4 56.7 76.5

【输出样例】 408.82

OK!我们今天的课就到这里,明天再见~

日积月累

  • format string 格式化字符串
  • float 单精度浮点数
  • input 输入
  • output 输出
  • scanf 格式化输入