主页 > 科技动态 >c语言编程求出加减乘除运算符。具体问题看问题补充。谢谢。

c语言编程求出加减乘除运算符。具体问题看问题补充。谢谢。

作者: 时间:2020-07-04 125° 科技动态
c语言编程求出加减乘除运算符。具体问题看问题补充。谢谢。
是否允许用括号?追问

不可以追答

代码比较长,我发到我的空间去了
经测试,应该是个完美的解决方案。
destinyai/item/755c10833e4735874514cfe8追问

您好,我试着运行了一下,我的c设计学习与试验系统报错提示我说:nosuchfileordirectory(没有这个文件或目录,我百度的),我截图您看一下:请问我应该怎么做?(本人新手,最多入门级别,啥都不懂,请大侠不吝赐教,谢谢!)

追答

奇怪,这个应该是Windows里的标准库。这个无所谓,你把#include去掉然后把代码里带有assert(false)的那行去掉就行了。这是我调试用的。另外,为了在你的那个C/C++程序设计学习与实验系统里运行,我做了点小修改。现在的代码同时适用于你的平台,以及VC6.0。修改后的代码我已经提交到百度空间了,就是上面那个链接。
PS:VC6.0的编译与运行快捷键是F5。

visual c++ 2010经典第六章6.8.1计算器265页
书上从原理到实现讲的清清
代码我也有
需要我可以发给你
希望能帮到你
请采纳
代码:
// Ex6_10Extended.cpp
// A program to implement a calculator accepting parentheses
#include // For stream input/output
#include // For the exit() function
#include // For the isdigit() function
#include // For the strcpy() function
using std::cin;
using std::cout;
using std::endl;
void eatspaces(char* str);// Function to eliminate blanks
double expr(char* str);// Function evaluating an expression
double term(char* str, int& index);// Function analyzing a term
double number(char* str, int& index); // Function to recognize a number
char* extract(char* str, int& index); // Function to extract a substring
const int MAX(80);// Maximum expression length,
// including '\0'
int main()
{
char buffer[MAX] = {0};// Input area for expression to be evaluated
cout << endl
<< "Welcome to your friendly calculator."
<< endl
<< "Enter an expression, or an empty line to quit."
<< endl;
for(;;)
{
cin.getline(buffer, sizeof buffer);// Read an input line
eatspaces(buffer);// Remove blanks from input
if(!buffer[0])// Empty line ends calculator
return 0;
cout << "\t= " << expr(buffer)// Output value of expression
<< endl << endl;
}
}
// Function to eliminate spaces from a string
void eatspaces(char* str)
{
int i(0);// 'Copy to' index to string
int j(0);// 'Copy from' index to string
while((*(str + i) = *(str + j++)) != '\0')// Loop while character
// copied is not \0
if(*(str + i) != ' ')// Increment i as long as
i++;// character is not a space
return;
}
// Function to evaluate an arithmetic expression
double expr(char* str)
{
double value(0.0);// Store result here
int index(0);// Keeps track of current character position
value = term(str, index);// Get first term
for(;;)// Indefinite loop, all exits inside
{
switch(*(str + index++))// Choose action based on current character
{
case '\0':// We're at the end of the string
return value;// so return what we have got
case '+':// + found so add in the
value += term(str, index);// next term
break;
case '-':// - found so subtract
value -= term(str, index);// the next term
break;
default:// If we reach here the string
cout << endl// is junk
<< "Arrrgh!*#!! There's an error"
<< endl;
exit(1);
}
}
}
// Function to get the value of a term
double term(char* str, int& index)
{
double value(0.0);// Somewhere to accumulate
// the result
value = number(str, index);// Get the first number in the term
// Loop as long as we have a good operator
while(true)
{
if(*(str + index) == '*')// If it's multiply,
value *= number(str, ++index);// multiply by next number
else if(*(str + index) == '/')// If it's divide,
value /= number(str, ++index);// divide by next number
else
break;
}
return value;// We've finished, so return what
// we've got
}
// Function to recognize a number in a string
double number(char* str, int& index)
{
double value(0.0);// Store the resulting value
if(*(str + index) == '(')// Start of parentheses
{
char* psubstr(nullptr);// Pointer for substring
psubstr = extract(str, ++index);// Extract substring in brackets
value = expr(psubstr);// Get the value of the substring
delete[]psubstr;// Clean up the free store
return value;// Return substring value
}
// There must be at least one digit...
if(!isdigit(*(str + index)))
{ // There's no digits so input is junk...
cout << endl
<< "Arrrgh!*#!! There's an error"
<< endl;
exit(1);
}
while(isdigit(*(str + index)))// Loop accumulating leading digits
value = 10*value + (*(str + index++) - '0');
// Not a digit when we get to here
if(*(str + index) != '.')// so check for decimal point
return value;// and if not, return value
double factor(1.0);// Factor for decimal places
while(isdigit(*(str + (++index))))// Loop as long as we have digits
{
factor *= 0.1;// Decrease factor by factor of 10
value = value + (*(str + index) - '0')*factor;// Add decimal place
}
return value;// On loop exit we are done
}
// Function to extract a substring between parentheses
// (requires cstring)
char* extract(char* str, int& index)
{
char buffer[MAX];// Temporary space for substring
char* pstr(nullptr);// Pointer to new string for return
int numL(0);// Count of left parentheses found
int bufindex(index);// Save starting value for index
do
{
buffer[index - bufindex] = *(str + index);
switch(buffer[index - bufindex])
{
case ')':
if(0 == numL)
{
size_t size = index - bufindex;
buffer[index - bufindex] = '\0';// Replace ')' with '\0'
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
cout << "Memory allocation failed,"
<< " program terminated.";
exit(1);
}
strcpy_s(pstr, index-bufindex, buffer); // Copy substring to new memory
return pstr;// Return substring in new memory
}
else
numL--;// Reduce count of '(' to be matched
break;
case '(':
numL++;// Increase count of '(' to be
// matched
break;
}
} while(*(str + index++) != '\0'); // Loop - don't overrun end of string
cout << "Ran off the end of the expression, must be bad input."
<< endl;
exit(1);
}追问

抱歉,分暂时还是不能给。我试了一下,还是报错,截图给您看一下:不知道是不是我平台的问题,你们似乎用的都是正规6.0平台吧?那个东西我也有,可是写好之后怎么运行啊?(本人没找到运行按键)(多说两句,现在就你和冰火梦幻了,我在等待他的回复,因为他说他的方案是完美性质。如果明天晚上之前还没见他回复或者他的方案没成功,那这200分就归您了)

追答

把所有nullptr改成NULL
nullptr是最新c++标准 NULL是老标准
你分给他吧我累了追问

呵呵,实在对不起,我把所有的nullptr换成NULL还是不行,幸亏您宽宏大度,不在乎这点分了,但不管怎说,您对我的帮助我还是很感谢,冰火梦幻的方案确实很完美,分我就给他了,见谅。祝您每天开心!本回答被网友采纳设多几个变量按顺序排下来然后输出就行了,我不记得单词了,就不献丑了你这个有没有要求运算时间,限定运算规模?追问

一切都没要求,只要编程求出运算符即可,要的是编程源代码追答

留个位置,有点思路,写写看。
另外问一下,是要输出1组可能即可还是要输出所有的?追问

可以的话,输出所有的。抱歉现在才看到您的回复
C语言编程中,怎样使输出的加减乘除是运算符?


#include
#include
#define N 100

typedef struct{//操作数栈
float d[N];
int len;//len相当top
}stacks,*lists;

typedef struct{//运算
char c[N];
int len;//len相当于top
}stack,*list;

int init(list p);//stack 初始化
int inits(lists p);//stacks 初始化
int pushs(lists p,float m);// stacks
int push(list p,char c);//stack 入栈
int pops(lists p,float *m);//stacks 出栈
int pop(list p,char *c);//stack出栈
int in(char c);//判断C是否为数 是则返回 1 否则 返回 0
char pre(char s,char c);//判断s c的优先级 s>c return '>'; sf=value(s);//计算表达式的长度
printf("f=%.5f\n",f);//输出表达时的值 注 只输出前五位小数
printf("continue input 1,break input 0\n");
scanf("%d",&n); printf("\n");//判断是否继续进操作是则输入 1,否则输入 0
if(!n) break;}
}

int init(list p){
if(!p) {printf("Error,init stack NULL\n"); return 0;}
p->len=0;
return 1;
}
int inits(lists p){
if(!p) {printf("Error,init stacks NULL\n"); return 0;}
p->len=0;
return 1;
}
int pushs(lists p,float m){
if(!p) {printf("Error,pushs stacks NULL\n"); return 0;}
p->d[p->len++]=m; return 1;
}
int push(list p,char c){
if(!p) {printf("Error,push stack NULL\n"); return 0;}
p->c[p->len++]=c; return 1;
}
int pops(lists p,float *m){
if(!p) {printf("Error,push stacks NULL\n"); return 0;}
*m=p->d[--p->len]; return 1;
}
int pop(list p,char *c){
if(!p) {printf("Error,push stack NULL\n"); return 0;}
*c=p->c[--p->len]; return 1;
}
int in(char c){//判断C是否为数据 是则返回 1 否则 返回 0
if(c>='0'&&c<='9'||c=='.') return 1; return 0;}
char pre(char s,char c){//判断s c的优先级 s>c return '>'; s if((s=='-')||(s=='+')){
if((c=='*')||(c=='(')||(c=='/'))
r=m;
else r=k; }
if((s=='*')||(s=='/')){
if((c=='(')) r=m;
else r=k;}
if(s=='('){
if(c==')') r=n;
else r=m;}
if(s==')')
r=k;
if(s=='#') {
if(c=='#') r=n;
else r=m;}
return r;
}
float operate(float a,char t,float b){//对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b
if(t=='-') return a-b;if(t=='+') return a+b;
if(t=='*') return a*b;if(t=='/') return a/b; }

float value(char s[]){
stacks opnd;stack optr;char *p,*pr,x,t; float a,b,m=0;
inits(&opnd); init(&optr);int k=0,i,tp=10;
push(&optr,'#');//将'#'压入栈optr中,作结束标志
p=pr=s;//初始化 指针 p pr 使pr p 指向 表达式
while(*p!='#'||optr.c[optr.len-1]!='#'){//当p指向的操作符 和optr 中的栈顶元素都为'#'时 操作结束
if(in(*p))//如果p指向数字 则把 数字字符串转化为实型(float)数据 并存入栈opnd中
{
m=0; k=0;tp=10;
while(in(*p)) p++;//使p指向下一个运算符
while(pr!=p)
{
if(*pr!='.')//如果pr指向小数点 则跳过
m=(m+*(pr++)-'0')*10;//将单个字数字符转化为数据 并逐位求和
else{//如 12.3 -> 1230
k=p-pr; pr++; }
}
for(i=0,tp=10;i{
tp=tp*10;
if(i==k-1)
tp=tp/10;
}
pushs(&opnd,m/tp); //输入栈opnd中
}
else switch(pre(optr.c[optr.len-1],*p)){
case'<':push(&optr,*p);p++;pr=p;break;
case'=':pop(&optr,&x);p++;pr=p;break;
case'>':pop(&optr,&t);pops(&opnd,&b);pops(&opnd,&a);//输出一个操作符和两个数据
pushs(&opnd,operate(a,t,b));break;} //运算
}
return opnd.d[opnd.len-1]; //返回表达式的值
}应输入加减乘除运算符吧就是直入计算表达式吧这个需要你自己定义测表达式中的字符,是数字正常,是加减乘除则变为加减乘除,你输入的加减乘除号,系统是不认的,只有让系统自己输入就行了,不过这个有点难,要涉及到宏定还要判断符号优先级……printf("a+b=%d",a+b);
显示的结果就是a+b=值专写烂程...呵呵#include
#include
int main()
{
int a=0,b=0,i,flag=0;
char c,s[100];
printf("please input :");
scanf("%s",s);
for(i=0;i {
if(s[i] >= 48)
{
if(flag == 0)
a=a*10+s[i] - 48;
else
b=b*10+s[i] - 48;
}
else
{
flag++;
c=s[i];
}
}
switch(c)
{
case '+' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a+b); break;
case '-' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a-b); break;
case '*' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a*b); break;
case '/' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a/b); break;
}
return 0;
}本回答被网友采纳printf("+ - * /");
就是写在引号里
C语言编程中,怎样使输出的加减乘除是运算符?
char ch;
ch=getchar();
putchar();
switch(ch)
{
case '+': result=a+b;break;
default:printf("输入有误!\n");
}
编程里的符号[]怎么打?
切换到英文输入法,直接就能敲出来键盘上挨着Enter键的呢两个符号,其实就是下表符本回答被提问者采纳你都会打了还问干嘛
上一篇:
下一篇:

中国食品科技网|广州友邦资讯科技招聘|深圳科技资讯|网站地图