RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1564679
Accepted
Nqweqweqwe
Nqweqweqwe
Asked:2024-02-04 15:50:16 +0000 UTC2024-02-04 15:50:16 +0000 UTC 2024-02-04 15:50:16 +0000 UTC

PascalABCNet,重新启动代码时该函数被调用两次

  • 772

昨天我做了一个计算器,点击检查代码健康按钮,发现由于设计过时,我的健康状况有 64%。我阅读了官方文档并重写了代码。现在代码的健康度显示为134%,但是当输入符号时,重新启动程序后,检查正确输入符号的功能将重新启动两次,然后您可以再次使用该程序。这是输出:

Введите знак(/,*,+,-): *
Введите первое число:  1
Введите второе число:  2
Ответ: 2
Введите знак(/,*,+,-): Вы используете несуществующий символ для вычисления!
Введите знак(/,*,+,-): Вы используете несуществующий символ для вычисления!
Введите знак(/,*,+,-): 

更新的代码:

{program calculator;}
label restart;
begin
  var rest: integer;
  restart: rest := 0;
  while rest <> 1 do
  begin
    var sign := ReadChar('Введите знак(/,*,+,-):');
    if (sign <> '-') and (sign <> '+') and (sign <> '/') and (sign <> '*') then begin
      writeln('Вы используете несуществующий символ для вычисления!');
      goto restart;
    end;
    var a := ReadInteger('Введите первое число: ');
    var b := ReadInteger('Введите второе число: ');
    if sign = '+' then begin
      writeln('Ответ: ', a + b);
    end;
    if sign = '-' then begin
      writeln('Ответ: ', a - b);
    end;
    if sign = '/' then begin
      if b <> 0 then begin
        writeln('Ответ: ', a / b);
      end
      else
    writeln('Нельзя делить на 0!');
      goto restart;
    end;
    if sign = '*' then begin
      writeln('Ответ: ', a * b);
    end;
  end;
end.
pascal
  • 1 1 个回答
  • 12 Views

1 个回答

  • Voted
  1. Best Answer
    Алексей Р
    2024-02-04T18:12:10Z2024-02-04T18:12:10Z

    事实上,该函数ReadChar()将用户输入的所有字符作为输入,包括 Enter,它由两个字符 CrLf(回车 + 换行)组成 - 这是两个字符的组合:回车和换行。它们用于 Windows 和 DOS 系统。回车符将光标返回到行首,换行符将光标移动到新行。
    如果稍微更改无效字符消息的输出行:

    writeln('Вы используете несуществующий символ для вычисления с кодом ['+ord(sign) + ']!');
    

    然后你就可以检查它。
    这该如何处理呢?ReadChar()经过对,的多次实验后ReadLn(),ReadlnChar()我得到的印象是 PascalABC 不适合循环中的数据输入(或者我的 IDE 实现是这样的),因为键盘输入缓冲区在下一次输入之前不会被清除,并且至少会跳过 CrLf那里。
    可能有一些函数/过程可以在下一次输入之前清除键盘输入缓冲区,但我还没有找到。
    我做了一个或多或少稳定的(对我来说)工作选择:

    {program calculator;}
    var
      signs: set of char := ['+', '-', '*', '/']; // задаем множество допустимых символов
      a, b: Integer;
      buf: string;
      sign: char;
    
    begin
      while True do
      begin
        buf := '';
        write('Введите знак(/,*,+,-) или # для выхода: ');
        while buf = '' do Readln(buf);
        sign := buf[1];
        if sign = '#' then break;
        if sign in signs then // проверяем, допустим ли символ - есть ли он во множестве
        begin
          a := ReadInteger('Введите первое число: ');
          b := ReadInteger('Введите второе число: ');
          case sign of  // вместо нескольких if
            '+': writeln('Ответ: ', a + b);
            '-': writeln('Ответ: ', a - b);
            '/':
              begin
                if b <> 0 then writeln('Ответ: ', a / b)
                else writeln('Нельзя делить на 0!');
              end;
            '*': writeln('Ответ: ', a * b);
          end;
        end
        else writeln('Вы используете несуществующий символ для вычисления с кодом [' + ord(sign) + ']!'); // выводим не только сообщение, но и ASCII - код недопустимого символа (для отладки, например)
      end;
      writeln('Калькулятор выключен');
    end.
    
    Введите знак(/,*,+,-) или # для выхода: +
    Введите первое число:  1
    Введите второе число:  3
    Ответ: 4
    Введите знак(/,*,+,-) или # для выхода: 45
    Вы используете несуществующий символ для вычисления с кодом [52]!
    Введите знак(/,*,+,-) или # для выхода: /
    Введите первое число:  45
    Введите второе число:  5
    Ответ: 9
    Введите знак(/,*,+,-) или # для выхода: *
    Введите первое число:  25
    Введите второе число:  45
    Ответ: 1125
    Введите знак(/,*,+,-) или # для выхода: *89
    Введите первое число:  
    78
    Введите второе число:  88
    Ответ: 6864
    Введите знак(/,*,+,-) или # для выхода: #
    Калькулятор выключен
    
    • 0

相关问题

  • 请帮我纠正流程图中的错误

  • Pascal ABC,使用 While 编写程序并重复

  • 如果 ['A','B','E','F'] 中的 s[i] 则写入运行时错误:索引超出数组范围。怎么修?

  • 如果有一个(按钮),则从每行文本的开头删除一个空格

  • 代码中的错误是什么?运行时错误:输入字符串格式不正确。您需要输入一个数字,整数部分为 3 位,小数部分为 4 位

  • 帮助输出 10 而不是 30 [关闭]

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5