2.1 输入/输出模型
2.2 printf函数
2.2.1 转换说明
printf函数的转换指定符(完整解释)
2.2.2 转义序列
2.3 scanf函数
示例:
2.3.1 scanf的函数工作原理
2.3.2 格式串中的普通字符
2.3.2 格式串中的普通字符
课后作业
简答题
1.printf的作用是什么?
printf函数的作用:显示格式串的内容,并用后面表达式的值替换格式串种的转换说明。printf函数用于将格式化的数据输出到stdout缓冲区中。
2.printf 函数的格式串中可以包含普通字符和转换说明,printf对这两者的处理有何不同?转换说明的作用是什么?
printf会将普通字符原样输出到目标设备。转换说明是以'%'开始的,指示printf如何取得相应的变量,并将其格式化后输出。转换说明决定了如何解释相应的变量(例如作为整数、浮点数、字符等),以及如何格式化(例如宽度、精度、填充字符等),可以对输出格式进行精确的控制。
3.scanf的作用是什么?
scanf函数是C语言中的一个标准输入函数,用于从标准输入设备(stdin)读取格式化输入。它可以读取stdin中不同类型的输入数据,并根据格式字符串指定的方式,将读入的数据存储到程序指定的变量中。
4.scanf 函数的格式串中可以包含普通字符、空白字符和转换说明,scanf对这三者的处理有何不同?
普通字符: 对于scanf,格式字符串中的普通字符(不包括空白字符和'%')必须与输入流中的字符严格匹配才能继续执行,否则输入过程中断。
空白字符: 在scanf格式串中,空白字符(如空格、制表符和换行符)可以匹配输入中的零个或多个空白字符。
转换说明: 类似于printf,转换说明告诉scanf如何读取输入并将其转换为相应类型的数据。转换说明还包括如何处理输入字段的宽度、读取特定类型的数据等信息。
5.写一个程序,实现分数相加。用户以分子/分母的形式输入分数,程序打印相加后的结果(化为最简分数)。如:
输入:
Enter first fraction: 5/6
Enter second fraction: 3/4
输出:
The sum is 19/12
(注:利用欧几里得算法求最大公约数,进行分数简化)
// 利用欧几里得算法求a和b的最大公约数
int gcd(int a, int b) {
// 首先确保a>=b
if (a < b) {
int tmp = a;
a = b;
b = tmp;
}
// 当b不为0时,计算a除以b的余数r,将b的值赋给a,r的值赋给b
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
/*
* 递归求解欧几里得算法
* 递归的出口: b=0时,a的值就是最大公约数
* 递归体:只要b不是0,把b赋值成a,把a%b赋值给b,再次调用函数自身
*/
int gcd_recursion(int a, int b) {
// 递归的出口
if (b == 0) {
return a;
}
// 递归体
return gcd_recursion(b, a % b);
}
int main(void) {
int num1, denom1; // 第一个分子分母
int num2, denom2; // 第二个分子分母
printf("请输入第一个分数(分子/分母): ");
scanf("%d/%d", &num1, &denom1);
printf("请输入第二个分数(分子/分母): ");
scanf("%d/%d", &num2, &denom2);
int result_num = num1 * denom2 + num2 * denom1;
int result_denom = denom1 * denom2;
// 欧几里得算法求最大公约数
int result_gcd = gcd(result_num, result_denom);
// 下面进行结果分数的化简,特殊情况是最大公约数等于结果分母,此时分数可以化简成一个整数
if (result_gcd == result_denom) {
printf("两个分数的和是一个整数,即:%d\n", (result_num / result_denom));
}
else {
// 结果是一个分数
printf("两个分数的和是一个分数,即:%d/%d\n", (result_num / result_gcd), (result_denom / result_gcd));
}
return 0;
}
(根据王道训练营和参考《C语言程序设计、现代方法》整理)