gpt4 book ai didi

c - 如何在 C 中制作一个接受两位数整数或字符的菜单界面?

转载 作者:行者123 更新时间:2023-11-30 14:46:05 26 4
gpt4 key购买 nike

过去几个小时我一直在摸索这个程序,但我似乎找不到让这个程序运行的方法。我一开始使用 switch 语句样式菜单,但后来遇到了一个问题,菜单会掉落并退出,我无法弄清楚这一点,所以我只是将代码切换到基于 if else 的菜单。该计划背后的想法如下:

编写并测试一个 C 程序,该程序实现基于堆栈的整数计算器。程序接受输入,直到输入 q。然而我的困难在于让菜单接受大于 10 的数字。

我的程序中的每个函数都正常工作,除非我输入一个两位数整数,它将单独存储这两个数字。我知道这是因为我有菜单设置来读取和使用字符,但我无法弄清楚如何让字符数组工作。我以前从未用 C 语言编程过,所以动态内存分配的想法暗示了我,因为我不完全确定何时需要它。这是迄今为止我拥有的程序的源代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>

#define SIZE 6

int stack[SIZE]; //stack size
int top = 0; //top of stack

void pop();
void clear();
void display();
void top_element();
void add();
void multiply();
void subtract();
void division();
void power();

int main()
{
char input;
int flag = 1;

while(flag == 1)
{
printf(": ");
scanf(" %c",&input);

if(isdigit(input))
{
if(top < SIZE)
{
stack[top] = input - '0';
top++;
}
else
printf("Error: stack overflow\n");
}
else if(input=='p')
pop();
else if(input=='c')
clear();
else if(input=='d')
display();
else if(input=='=')
top_element();
else if(input=='+')
add();
else if(input=='*')
multiply();
else if(input=='-')
subtract();
else if(input=='/')
division();
else if(input=='^')
power();
else if(input=='q')
flag = 0;
else
printf("Error: invalid command\n");
}
printf("Goodbye!\n");
return 0;
}

void pop()
{
if(top==0)
printf("Error: stack is empty\n");
else
top--;
}

void clear()
{
top=0;
}

void display()
{
int i;
if(top == 0)
printf("Error: stack is empty\n");

else
{
for(i = top - 1; i >= 0; i--)
printf("%d\n",stack[i] );
}
}

void top_element()
{
printf("%d\n",stack[top-1] );
}

void add()
{
if(top<2)
printf("Error: not enough operands for the requested operation\n");
else
{
int ans=stack[top-1]+stack[top-2];
stack[top-2]=ans;
top--;
}
}
void multiply()
{
int ans=stack[top-1]*stack[top-2];
stack[top-2]=ans;
top--;
}
void subtract()
{
if(top < 2)
printf("Error: not enough operands for the requested operation\n");
else
{
int ans = (stack[top-2] - stack[top-1]);
stack[top-2]=ans;
top--;
}
}
void division()
{
if(top < 2)
printf("Error: not enough operands for the requested operation\n");
else
{
if(stack[top-1]==0)
printf("Error: attempt to divide by 0\n");
else
{
int ans = (stack[top-2]/stack[top-1]);
stack[top-2]=ans;
top--;
}
}
}
void power()
{
if(top < 2)
printf("Error: not enough operands for the requested operation\n");
else
{
int ans = pow(stack[top - 2], stack[top - 1]);
stack[top - 2] = ans;
top--;
}
}

最佳答案

我有一些事情需要注意,并且不想将其变成 TLDR,因此我会尝试将每个问题分成单独的段落。你可以对这一切持保留态度。毕竟,这只是建议。

  • 您要查找的格式指令是%2[0123456789]。将指针传递到大小适合存储三个字符的位置(即 char Something[3];空字符的第三个字节)并检查返回值。该指令需要单独调用 scanf ,否则您可能会在稍后调试与空字段相关的问题时遇到麻烦,因此“绿灯”返回值指示您的程序成功处理良好的输入是 scanf("%2[0123456789]", ptr_into_array_of_char) 将返回 1。任何其他返回值均表示琥珀色红色 灯光发生了。请注意,我在这里非常严格地解释您的规范(不完整)...实际上,我只会使用 %d 并很高兴我的用户将患关节炎的机会减半输入 1 而不是 01(并且在不处理 %[ 时,您患动脉瘤的可能性也较小)。
  • 当我们犯一些语法错误时,我们的编译器通常会发出错误消息并中止编译,但这个要求违背了这一原则:“程序接受输入,直到输入 q。”我希望您的完整规范解释当用户偏离期望时会发生什么。我想您可能会发出错误,清除堆栈,读取到行尾,然后像程序重新启动一样操作...类似于 scanf("%*[^\n]"); getchar(); put("此处有错误消息");顶部 = 0;?我们通常使用一些组合键,例如 CTRL+d(在 Linux 上)或 CTRL+Z(在 Windows 上)来关闭 stdin,从而表示输入终止。
  • “动态内存分配的想法暗示了我”,因此您会很高兴知道您可能不应该在这里使用动态内存分配,除非您希望堆栈增长超出您设置的硬编码 6 个插槽,也许......
  • 我认为这个问题的标题很困惑;您不是在设计菜单,而是在实现语法。看看 gcc 的“菜单”是如何设计的以获取灵感。如果您曾经想围绕 stdin 设计菜单,请停止;也许您真正想要的是一个可以点击的 GUI,因为这不是 Unix 的工作方式。
  • 声明 void fubar(void); 后跟 void fubar() {/* SNIP */} 是由于一些技术历史文物而导致的未定义行为,并且相同适合int main()...这就是为什么你最好选择一本由有信誉的人写的专门教授 C 的书来学习 C。有很多微妙的细微差别可能会陷入困境你。
  • 在函数原型(prototype)等方面,请考虑堆栈是一种通用数据结构。作为另一种思想实验,考虑一下如果 strcpy 只对使用文件作用域声明的数组进行操作,那么使用它会是多么痛苦。从逻辑上讲,它的所有外部数据要求都应该来自它的参数,而不是来自变量,即使用文件范围声明的 stack
  • 我们被教导要谨慎地使用内存,在我看来,像这样仅使用变量作为控制表达式违反了这些教训。如果存在诸如 breakcontinuegoto 之类的结构,则可以使用一种更干净的替代方案,无需变量声明(因此可以使用额外的免费寄存器来用于其他用途) )是可能的。

关于c - 如何在 C 中制作一个接受两位数整数或字符的菜单界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52561889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com