【C&C++】整数四则运算表达式的输出格式控制

目标

用户输入两个四位数以内的整数,请你对两个整数进行四则运算(为保证除法能正确计算,输入的第二个整数不能为0),要求输出的四则运算表达式是完整对齐的。

例如,给定输入1256和20,其符合上述对齐要求的四则运算的输出格式应该如下所示(为了让空格显示的更直观,这里暂用下划线_表示空格):

_1256 + 20___ = _____1276
_1256 - 20___ = _____1236
_1256 * 20___ = ____25120
_1256 / 20___ = _______62

相关知识

程序的输出格式对用户体验影响很大,用户往往因为输出格式不美观便抱怨软件设计的不好。

那么,如何对程序的输出格式进行控制呢?接下来我们介绍一下格式化输入输出,格式化输入输出可以用函数库stdio.h中的 scanf 和 printf 两个函数来实现。

scanf 函数

scanf 函数按照一定的格式从键盘输入数据。函数形式为:

scanf (<格式控制串> , <参数列表>) ;
<格式控制串> 是一个字符串,说明了输入数据要遵循的格式;

<参数列表> 是存放输入数据地址的列表,有多个输入数据时,参数之间用,分隔。
如果要把输入的数据写入一个变量,参数列表中需要使用变量的地址。
获取变量地址的方法为:&变量名,其中&是地址运算符,其运算结果是后面的变量的地址

例如从命令行读入一个整数、一个浮点数、一个整数,分别赋值给 num1、num2 和 num3。如下代码:

scanf(%d%f%d″, &num1, &num2, &num3);  
 //其中 %d 和 %f 均为转换说明符,分别表示读取的数据为整型和浮点型。

如果命令行输入为:12 34.5 678,则该函数执行的效果是:系统读取整数12并赋值给 num1,读取浮点数34.5并赋值给 num2,读取整数678并赋值给 num3。

scanf 函数常用的转换说明符如下表(省略%):

类型字符含义
d十进制整型量
o八进制整型量
x十六进制整型量
u无符号十进制整型
i整型
f实型的小数形式
e实型的指数形式
gf 和 e 的较短形式
c字符
s字符串
l 或 h放在任何整数转换说明符之前,用于输入 short 或 long 类型数据
l 或 L放在任何浮点转换说明符之前,用于输入 double 或 long double类型数据

printf 的输出格式控制

printf 函数按照指定的格式向屏幕输出数据。函数形式为:

printf (<格式控制串>,  <参数列表>) ;
<格式控制串> 一般是一个字符串,描述输出数据的格式。
格式控制串可以包含3种类型的字符:格式指示符、转义字符、普通字符(除格式指示符和转义字符外的其他字符)。其中:

格式指示符的作用是将参数列表中相应的输出数据转换为指定的格式输出

转义字符按照其含义输出相应的特殊符号

普通字符则按照原样输出

<参数列表> 存放输输出数据列表,有多个输出数据时,中间用,分隔。
格式指示符的数量、顺序与输出数据相对应。

printf 函数执行时,根据格式控制串中的格式指示符、转义字符和普通字符等,从左到右依次进行处理:遇到普通字符,则按照原样输出;遇到转义字符,则按照其含义输出相应的符号;遇到格式指示符,则将对应的输出数据按照格式指示符指定的方式输出。

格式指示符的一般形式为:

% <标志> <域宽> <精度> <转换说明符>

其中,<标志>、<域宽>和<精度>都是可选项,可以不出现。

printf 函数常用的标志如下表:

标志含义
-输出在域宽内左对齐
+在正数值之前显示一个加号,在负数值之前显示一个减号
空格在正数值之前显示一个空格
#与八进制转换说明符 0 一起使用时,在输出值之前加 0;与十六进制转换说明符 x 或 X 一起使用时,在输出值之前加 0x 或 0X
0用 0 填充域宽
多个标志可以联合使用

域宽

域宽一般为一个整数,指明了数据输出的宽度

如果数据实际长度小于域宽,则数据输出右对齐,即数据仍然按照域宽规定输出,在数据左边用空格补齐;

如果数据实际长度大于域宽,那么系统将自动突破域宽的限制,按照数据的实际长度进行输出。
【负号要占据一个字符位置。如果没有指明域宽,系统则按照数据的实际长度输出。】

精度

精度一般也是一个整数,对于不同类型的数据,精度的含义也不一样。

1.对于整数,精度表示至少要输出的数字个数。
如果数据实际长度小于精度,则左边用0补齐,使得数据长度等于精度;
如果数据实际长度大于精度,则自动突破精度限制,按照数据的实际长度输出。
省缺情况下整数的精度为12.对于浮点数,有两种情况。
(1)如果转换说明符为 e、E 和 f,精度表示小数点后的有效位数。
如果数据小数部分的实际长度小于精度,则在右边补齐0,使得小数部分长度等于精度;
如果数据小数部分的实际长度大于精度,则按照精度对数据进行舍入输出;

(2)如果浮点数的转换说明符为 g 和 G,精度表示打印数据的最大的长度。

3.对于字符串数据,精度表示字符串输出的最大长度。
如果输出字符串的实际长度小于精度,则按照字符串的实际长度输出;
如果字符串的实际长度大于精度,则按照精度截取输出字符串开头的 n 个字符(假设精度为 n )输出。

转换说明符指明了输出数据的类型信息。printf 函数常用的转换说明符如下表:

类型字符含义
d十进制整型量
o八进制整型量
x十六进制整型量
u无符号十进制整型
i整型
f实型的小数形式
e实型的指数形式
gf 和 e 的较短形式
c字符
s字符串
%输出%本身
l 或 h放在任何整数转换说明符之前,用于输出 short 或 long 类型数据
L放在任何浮点转换说明符之前,用于输出 long double类型数据

例如以域宽为10右对齐的方式输出15,然后再输出换行符(\n)

printf("%10d\n",15);

结果为:
在这里插入图片描述

目标具体输出格式要求如下:

  1. 两个整数各占5个字符的位置,如果整数不足5位,则第一个整数在前面用空格补齐,第二个整数在后面用空格补齐,运算符( + 、 - 、 * 、 / 、= 都是运算符)占1个字符,且运算符前后各留一个空格位置;
  2. 输出结果占10个字符位置,不足10位时前面用空格补齐。

编程实现:

//包含标准输入输出函数库
#include <stdio.h>

int main()
{
    //声明两个整型变量,用于存储输入的两个整数
    int x,y;
    //请在Begin-End之间添加你的代码,按要求格式输出四则运算式子
    /********** Begin *********/
    int s, d, p, c;
    scanf("%d\n", &x);
    scanf("%d", &y);
    s = x + y;
    d = x - y;
    p = x * y;
    c = x / y;
    printf("%5d + %-5d = %10d\n", x, y, s);
    printf("%5d - %-5d = %10d\n", x, y, d);
    printf("%5d * %-5d = %10d\n", x, y, p);
    printf("%5d / %-5d = %10d\n", x, y, c);
    /********** End **********/
    return 0;
}

测试结果为:
在这里插入图片描述
其中值得注意的是scanf函数后的变量前需要加取地址符&,而printf函数后的变量不需要加&;这是因为printf函数只需要获得参数的数值,而scanf需要拥有修改变量参数的能力。

如果对printf后的变量取地址,则会出现以下的情况:
在这里插入图片描述
系统提示的错误是 类型不匹配,即printf所需要的类型是int,而输出&x后的类型是int *,并且图中&x所对应的数值出现了很大的偏差,其中可能有宽度对其造成的影响。

在输出符号%后加上-可使输出字符为左对齐,如果不加则默认为右对齐。

  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是栈实现非负整数四则运算计算器的 C 代码: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_SIZE 100 // 定义栈的大小 // 定义栈结构体 typedef struct { int items[STACK_SIZE]; // 栈元素 int top; // 栈顶指针 } Stack; // 初始化栈 void initStack(Stack *s) { s->top = -1; } // 判断栈是否为空 int isEmpty(Stack *s) { return s->top == -1; } // 判断栈是否已满 int isFull(Stack *s) { return s->top == STACK_SIZE - 1; } // 入栈操作 void push(Stack *s, int num) { if (isFull(s)) { printf("栈已满,无法入栈。\n"); exit(1); } s->items[++(s->top)] = num; } // 出栈操作 int pop(Stack *s) { if (isEmpty(s)) { printf("栈为空,无法出栈。\n"); exit(1); } return s->items[(s->top)--]; } // 获取栈顶元素 int peek(Stack *s) { return s->items[s->top]; } // 计算表达式的值 int calculate(char *expr) { int i = 0, num = 0; Stack numStack, opStack; char c, op; initStack(&numStack); // 初始化数字栈 initStack(&opStack); // 初始化操作符栈 while (expr[i] != '\0') { c = expr[i]; if (isdigit(c)) { // 如果是数字 num = num * 10 + (c - '0'); if (!isdigit(expr[i+1])) { // 下一个字符不是数字,则表示数字已经结束 push(&numStack, num); // 将数字入栈 num = 0; // 将 num 置为零,用于下一个数字的计算 } } else if (c == '+' || c == '-') { // 如果是加或减 if (isEmpty(&opStack)) { // 操作符栈为空,直接入栈 push(&opStack, c); } else { while (!isEmpty(&opStack) && peek(&opStack) != '(') { // 将所有高优先级的操作符出栈 op = pop(&opStack); num = pop(&numStack); if (op == '+') { // 执行加法操作 push(&numStack, pop(&numStack) + num); } else { // 执行减法操作 push(&numStack, pop(&numStack) - num); } } push(&opStack, c); // 将当前操作符入栈 } } else if (c == '*' || c == '/') { // 如果是乘或除 if (isEmpty(&opStack) || peek(&opStack) == '+' || peek(&opStack) == '-') { // 操作符栈为空或栈顶为低优先级操作符,直接入栈 push(&opStack, c); } else { // 将所有高优先级的操作符出栈 while (!isEmpty(&opStack) && (peek(&opStack) == '*' || peek(&opStack) == '/')) { op = pop(&opStack); num = pop(&numStack); if (op == '*') { // 执行乘法操作 push(&numStack, pop(&numStack) * num); } else { // 执行除法操作 push(&numStack, pop(&numStack) / num); } } push(&opStack, c); // 将当前操作符入栈 } } else if (c == '(') { // 如果是左括号,直接入栈 push(&opStack, c); } else if (c == ')') { // 如果是右括号 while (!isEmpty(&opStack) && peek(&opStack) != '(') { // 将所有括号内的操作符出栈 op = pop(&opStack); num = pop(&numStack); if (op == '+') { // 执行加法操作 push(&numStack, pop(&numStack) + num); } else { // 执行减法操作 push(&numStack, pop(&numStack) - num); } } pop(&opStack); // 将左括号出栈 } i++; } // 将剩余的操作符出栈 while (!isEmpty(&opStack)) { op = pop(&opStack); num = pop(&numStack); if (op == '+') { // 执行加法操作 push(&numStack, pop(&numStack) + num); } else if (op == '-') { // 执行减法操作 push(&numStack, pop(&numStack) - num); } else if (op == '*') { // 执行乘法操作 push(&numStack, pop(&numStack) * num); } else if (op == '/') { // 执行除法操作 push(&numStack, pop(&numStack) / num); } } return pop(&numStack); // 返回最终的结果 } int main() { char expr[100]; printf("请输入表达式:\n"); scanf("%s", expr); printf("结果为:%d\n", calculate(expr)); return 0; } ``` 以上是栈实现非负整数四则运算计算器的 C 代码,使用方法为输入一个表达式并回车即可得到计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值