一、getchar 和 putchar
getchar() 和 putchar() 是属于 C 语言的库函数 ,C++是兼容 C 语言的,所以 C++ 中只要正确包 含头文件也可以正常使用这两个函数。
1.1 getchar()
函数原型如下:
int getchar (void) ;
1 . getchar() 函数返回 用户从键盘输入的一个字符 , 使用时不带有任何参数。
2 . 程序运行到这个命令就会暂停,等待用户从键盘输入 , 等同于使用cin 或 scanf() 方法读取一个字符。
3 . 原型定义在头文件 <cstdio>
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int ch = getchar();
cout << ch << endl;
cout << (char)ch << endl;
return 0;
}
- getchar() 不会忽略起首的空白字符,总是返回当前读取的第⼀个字符,无论是否为空格。
如果读取失败,返回常量 EOF ,由于 EOF 通常是 -1 ,所以返回值的类型要设为 int ,而不是 char 。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int ch = getchar();
cout << ch << endl;
return 0;
}
getchar() 通常 和 putchar() 是⼀对儿,配合使用的。
1.2 putchar()
函数原型如下:
int putchar( int character)
1 . putchar() 函数将它的参数字符输出到屏幕 , 它的原型定义在头文件 <cstdio>
2 . 操作成功时 , putchar() 返回输出的字符 , 否则返回常量 EOF
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int ch = getchar();
putchar(ch);
return 0;
}
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
putchar('x');
putchar('y');
putchar('z');
return 0;
}
二 、scanf 和 printf
scanf() 和 printf() 是属于C语言的库函数,C++是兼容 C 语言的,所以 C++ 中只要正确包含头文件也可以正常使用这两个函数。而且这两个函数在算法竞赛题目中使用的非常频繁,尤其是在输出格式控制中,所以接下来我们这里认真学习⼀下。
三 、 printf
函数原型如下 :
int printf ( const char * format, ... );
3.1 基本用法
1 . printf() 的作用是将参数文本输出到屏幕。
2 . 名字里面的 f 代表 format (格式化),表示可以定制输出文本的格式 。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
printf("Hello World!");
return 0;
}
1 . printf() 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。
2 . 为了让光标移到下一行的开头,可以在输出文本的结尾,添加⼀个换行符 \n 。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
printf("Hello World!\n");
return 0;
}
文本内部有换行 , 也是通过插入换行符来实现 :
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
printf("Hello\nWorld!\n");
printf("Hello\n");
printf("World\n");
return 0;
}
3.2 占位符
1 . printf() 可以在输出文本中指定占位符 。
所谓 “占位符” , 就是这个位置可以用其他值代入。
占位符的 第一个字符 一律用百分号 %
1 . 常用的占位符除了 %d , 还有 %s 表示代入的是字符串
2 . 输入文本里面可以使用 多个占位符
printf() 参数与占位符是一 一对应关系 , 如果有 n 个占位符 , printf() 的参数就应该有 n+1 个 。 如果参数个数少于对应的占位符 , printf() 可能会输出内存中的任意值 。
占位符列举 :
3.3 格式化输出
printf() 可以定制占位符的输出格式 。
限定宽度 :
1 . printf() 允许限定占位符的最小宽度。
2 . 如果没有达到最小宽度 , 对应数值的前面会添加空格 。
3 . 输出的值默认是右对齐 , 即输出内容的前面会有空格 ; 如果希望改成左对齐 , 在输出内容后面添加空格 , 可以在占位符的 % 的后面插入 一个 - 号 。
整数宽度限制 :
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
printf("%d\n",123);
printf("%5d\n",123);
printf("%5d\n",44);
printf("%5d\n",1234567);
printf("\n");
printf("%-5d\n",123);
printf("%-5d\n",44);
return 0;
}
浮点数宽度限制:
1 . 对于小数 , 这个限定符会限制所有数字的最小显示宽度 。
2 . 小数点后 默认有会保留6位 , 不够补零 。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
printf("%f\n",123.45);
printf("%12f\n",123.45);
return 0;
}
限定小数位数:
希望小数点后只保留两位 ----> %.2f
二者可以结合使用 :
最小宽度和小数位数这两个限定值 , 都可以用 * 代替 , 通过printf() 参数传入 。
四 、scanf
函数原型如下 :
int scanf ( const char * format, ... );
4.1 基本用法
1 . scanf() 函数用来读取用户的键盘输入 。
2 . 程序运行到scanf() 这个语句时 , 会停下来 , 等待用户从键盘输入 。
3 . 用户输入数据 、 按下回车键后 , scanf() 就会处理用户的输入 , 将其存入变量 。
4 . scanf() 语法跟 printf() 类似 。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int i = 0;
scanf("%d",&i);
printf("%d\n",i);
return 0;
}
1 . scanf() 第一个参数是一个格式字符串,里面会放置占位符,告诉编译器如何解读用户的输输入,需要提取的数据是什么类型。这是因为 C 语言的数据都是有类型的。
2 . scanf() 必须提前知道用户输入的数据类型,才能处理数据。3 . 它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。4 . scanf函数中存储数据的变量的前面必须加上 & 运算符(指针变量除外) , 因为scanf() 需要的是地址 , 必须将变量 i 的地址取出来传给 scanf函数 , 如果这里的变量 i 是数组 , 那就不用加 & 运算符( 后期会介绍)
一次从键盘读取多个变量 :
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d %d %d %d\n",a,b,c,d);
return 0;
}
scanf 函数中指定的格式和给程序输入的数据格式要严格匹配 , 否则可能输出错误的值 。
再举一个例子 :
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int i = 0;
int j = 0;
float x = 0;
float y = 0;
scanf("%d%d%f%f",&i,&j,&x,&y);
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("x = %f\n",x);
printf("y = %f\n",y);
return 0;
}
1 . scanf() 处理数值占位符时 ,会自动过滤空白字符 , 包括空格 、制表符 、 换行符等 。
2 . scanf() 处理用户输入的原理是 : 用户的输入先放入缓存 , 等到按下回车键后 , 按照占位符对缓存进行解读 。 解读用户输入时 , 会从上次解读遗留的第一个字符开始 。 直到读完缓存 , 或者遇到第一个不符合条件的字符为止 。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int x = 0;
float y = 0;
scanf("%d",&x);
printf("%d\n",x);
scanf("%f",&y);
printf("%f\n",y);
return 0;
}
小数有时候无法再内存中精确保存 。
4.2 占位符
scanf() 常用的占位符如下 , 与 printf函数的占位符基本一致 :
1 . 上面所有占位符 , 除了 %c 以外 , 都会自动忽略起首的空白字符 。 %c 不忽略空白字符 , 总是返回当前第一个字符 , 无论该字符是否为空格 。
2 . 如果要强制跳过字符前的空白字符 , 可以写成 scanf(" %c",&ch) , 即%c 前加上一个空格,表示跳过 零个 或 多个空白字符 。
强制跳过字符前面的空白字符 :
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char ch = 0;
scanf(" %c",&ch);
printf("%c\n",ch);
return 0;
}
所以 当 %c 和 %d 等占位符连用的时候 , 需要注意 , %c 默认不会跳过空白字符的 ,所以再输入的时候 , 需要注意 !
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a = 0;
char ch;
scanf("%d%c",&a,&ch);
printf("%d %c",a,ch);
return 0;
}
如果在输入的时候 , 就是想在整数和字符之间加上空格 , 那么scanf中的格式串中%c 的前面就要加上空格 。
强制跳过数据中的空白字符 :
总之要注意 , scanf中规定的输入格式和控制台输入数据的格式要保持一致才可能得到正确的结果。
4.3 scanf的返回值
1 . scanf() 的返回值是一个整数 , 表示成功读取的变量个数!
2 . 如果没有读取任何项 , 或者匹配失败 , 则返回0 。
3 . 如果在成功读取之前 , 发生了读取错误或读取到文件结尾 , 则返回常量EOF(-1)。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);
return 0;
}
掌握了scanf的返回值 , 我们一般会通过scanf 的 返回值来处理多组数据输入的竞赛题目 , 后期会逐步介绍。
4.4 练习
练习一:浮点除法
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
double r = a*1.0 / b;
printf("%.3lf\n",r);
return 0;
}
练习二:甲流疫情死亡率
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b ;
cin >> a >> b;
printf("%.3lf%%\n",b * 1.0 / a * 100);
return 0;
}
1 . 在 C 风格输入输出中,百分号
%
可以这样输出:printf("%%");
。2 . 注意a 和 b 的范围
3 . 百分比不是之间 b/a , 是需要除以 100.0 因为需要得到小数 , 所以是小数除法。
4 . 有时候 , 先乘 100 再除 a , 还是先除 a 后乘 100 是有差异的。
比如 : 4/8*100 和 4 * 100 /8
练习三:温度表达转化
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double f;
cin >> f;
double c = 5 * (f - 32) / 9 ;
printf("%.5lf\n",c);
return 0;
}
练习四:计算并联电阻的组值
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double r1 , r2;
cin >> r1 >> r2;
double r = 1 / (1/r1 + 1/r2);
printf("%.2lf\n",r);
return 0;
}
练习五:与圆相关的计算
#include <iostream>
#include <cstdio>
using namespace std;
const double PI = 3.14159;
int main()
{
double r , z , len , area;
cin >> r;
z = 2 * r;
len = 2 * PI * r;
area = PI * r * r;
printf("%.4lf %.4lf %.4lf\n",z,len,area);
return 0;
}
练习六:对齐输出
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a , b , c;
cin >> a >> b >> c;
printf("%8d %8d %8d\n",a,b,c);
return 0;
}
联系七:糖果游戏
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b,c,d,e;
cin >> a >> b >> c >> d >> e;
a /= 3 ; e+= a ; b += a;
b /= 3 ; a+= b ; c += b;
c /= 3 ; b+= c ; d += c;
d /= 3 ; c+= d ; e += d;
e /= 3 ; d+= e ; a += e;
printf("%5d%5d%5d%5d%5d\n",a,b,c,d,e);
return 0;
}