问题描述
这个程序是一个简单的计算器。 首先抱歉我的英语不好,我想知道 '\a' 和 '%2.f' 是什么意思 我知道 %f 是双倍的,但为什么是“2”。在'f'之前? 就在结束之前,我们将 'dgt' 设置为 'c-48' 我想知道为什么是 '-48' 我是一名信息学专业的学生,我刚开始,你有什么特别的建议给我吗?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
printf("Simple Calculator: \nValid inputs are +-*/=and digits 0,...,9\n");
printf("Your input: \n");
double r = 0.0;
double dgt = 0.0;
char lst_opt = '+';
const int nxt_dgt = 1;
const int nxt_opt = 2;
int nxt_npt = nxt_dgt;
while (1)
{
char c = _getch();
switch (c)
{
case '+':
case '-':
case '*':
case '/':
if (nxt_npt != nxt_opt)
{
printf("\a");
break;
}
printf("%c",c);
lst_opt = c;
nxt_npt = nxt_dgt;
break;
case '=':
if (nxt_npt != nxt_opt)
{
printf("\a");
break;
}
printf("\n=%.2f",r); //double,but why .2?
nxt_npt = nxt_opt;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (nxt_npt != nxt_dgt)
{
printf("\a");
break;
}
printf("%c",c);
dgt = c-48;
switch (lst_opt)
{
case '+': r += dgt; break;
case '-': r -= dgt; break;
case '*': r *= dgt; break;
case '/': r /= dgt; break;
}
nxt_npt = nxt_opt;
break;
}
}
_getch();
}
解决方法
-
\a
是什么意思?
像\n
一样,转义字符表示“换行”,它也是一个转义字符,意思是“警报”,在“打印”时发出哔声。
您可以查找信息(包括其他特殊转义字符)Here。
- 为什么是负 48?
在代码中,它试图从一个字符中获取一个整数。它使用字符 '0'~'9' 在 ACSII Table 中的排序方式,而不是像 if(c == '3') i = 3;
这样的操作。可以看到,'0'~'9'从48到57是紧密排列的,也就是说,'0' - 48
的结果是0,其他的也一样。
%2.f
您知道 %f
用于打印 float
变量,这很好,但是还有更多需要了解。您可以格式化变量的打印方式。
2.
代表“打印浮点数至少 2 个字符宽,也没有
应打印小数位”。更多 printf()
格式信息 Here。
'\a'是什么意思
这个其实有点晦涩。出现在字符常量或字符串文字中的转义序列 \a
表示一个字符,当传递到终端时,会在不改变输出位置的情况下发出和/或显示警报信号。信号的详细信息因环境而异,但可能会产生蜂鸣声或导致屏幕闪烁或类似情况。这几天很少使用。
& '%2.f' 我知道 %f 是 double 但为什么是 '2.'在'f'之前?
有关 printf
格式字符串的信息,您最好查找好的参考资料——我推荐在线手册页(搜索关键字“man printf”),尽管语言规范文档是最终的权威。教科书和教程通常不会涵盖很多细节。
如果这样做,您会发现 2
是(最小)字段宽度,而 .
是 .0
的简写,指示 {{1} } 发出零小数位。
就在结束之前,我们将 'dgt' 设置为 'c-48' 我想知道为什么是 '-48'
理解数字字符和它们所代表的数字之间是有区别的。 48 是字符 printf
的 ASCII 码,C 要求后面的每个十进制数字都比前一个大一,所以,假设实现使用 ASCII 兼容的字符代码,'0'
将任何十进制数字字符转换为其相应的数值。
然而,这将更安全、更惯用地表达为 dgt-48
。这更清楚,因为它至少提供了有关正在发生的事情的线索,并且它甚至适用于使用与 ASCII 不兼容的字符编码的实现。
\a 用于发出声音 c-48 :如注释中所述,48 是字符“0”的 ascii 值。所以c-48将ascii字符'0' .. '9'转换为整数值0 ... 9 在打印的文档中,您可以看到 %2.f 表示您打印的浮点值在小数点左侧至少有 2 个字符且没有小数点,例如: 2.643 -> ' 2' 123.4 -> '123'