C程序简单的加减乘除运算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机技术基础课程设计C语言设计报告题目:简单的加减乘除运算
学院:化学工程学院
专业:制药工程专业
班级:050607
姓名:王兰兰
指导教师:顾煜新
设计日期:2007年1月6日
一. 选题背景
在现实生活中常需要对一些并不深奥但较长或繁琐的数字进行
简单的计算,可大大提高工作效率,节约时间.该程序可运用到C语言中的大部分知识,并且简单易懂,在选择分支下判断符号的优先级别,调用加减乘除的计算函数并转化表达式即可完成程序的运行 .选择该题目也有能力限制的原因,但不影响涵盖广泛的知识面.
二. 设计思路:
加减乘除的运算均是双目运算,计算式涉及两个数据和一个计算符号,所以,首先定义两个结构体变量,在结构体变量中再分别定义两个栈,所谓栈就是一个稍微复杂的数组,并且只能从后面加入数据和导出数据,就是所谓的后到先出,好比堆东西,在最上面的东西是最后放入的,但是却是最先取出的
struct
(
float a[100];
int top; /*用来记录栈顶的变量*/
}St; /*在外部定义了一个栈,好似定义了一个全局变量,此栈为数据栈*/
struct
(
char b[100];
int top; 〃也是用来记录栈顶的变量
}Op; //同上,此栈为运算符号栈
为了方便起见,选择用指针做参数来记录数据
void Pop_St(float *e) 〃用指针作参数直接记录数据,方便
在连续计算中涉及到计算符号优先级别的比较,所以调用函数完
成该比较.扩号的优先级别最高,其次是乘除,再次是加减,用>, = ,<来表示优先级别.
char Precede(char p)
(
char e;
switch(p)
(
case '+':
case '-':
if (Op.top!=-1&&Op.b[Op.top]!='(') e='>';
else e='<';
break;
case '*':
case '/': (
if (Op.b[Op.top]=='*'||Op.b[Op.top]==7'||Op.b[Op.top]==')') e='>';
else e='<';
break;
}
.
然后调用函数进行计算
进入程序的核心部分,把表达式转化为逆波兰表达式.
printf("Please input the expression:");
gets(str); //输入表达式
printf ("the change exprission is ");
while (*p!='\0')
(
if(*p>='0'&&*p<='9') /位口果输入的是数字
(
while (*p>='0'&&*p<='9') (
num=*p-'0'+num*10; //把用字符表示的数字转化为实际意义的数字,并且把
一串字符数字变成有实际意义的数字,如’ 1' '2' '3' '4'这是一串字符,转化成1234, 一千两百三十四putchar(*p);
p++;
}
Push_St(num); 〃把转化好的数字导入数据栈里
num=0;
putchar('');
}
最后再比较读入符号的优先级别,进行计算,并返回计算函数的返回值输出计算结果
printf("\nthe resule is %.f\n”,a);
三,程序流程图
输出提示性表达语句
输入计算表达式(以字
符串的格式)
将输入内容分别储存进
数据栈和和符号栈
当栈不为空,将栈里的符号依次导出,调动运算函数运算
四. 程序清单:
#include <stdio.h>
#include <stdlib.h>
#define Null 0
struct
(
float a[100];
int top; /*用来记录栈顶的变量*/
}St; /*在外部定义了一个栈,好似定义了一个全局变量,此栈为数据栈*/
struct
(
char b[100];
int top; /*也是用来记录栈顶的变量*/
}Op; /*同上,此栈为运算符号栈*/ void Push_St(float e)
(
if (St.top!=99) /*判断栈顶是否满了*/
(
St.top++; /*没满的话栈顶向前进一个*/
St.a[St.top]=e; /*在栈顶处放入一个数据*/
}
else printf ("Stack is Full\n");
} /*把一个数据推入栈中*/
void Pop_St(float e)
(
if ((St.top)!=-1) /*如果栈不是空的话*/
(
e=St.a[St.top]; / *把栈顶数据导出来*/
St.top--; /*栈顶向回退一个*/
}
else printf("Stack is empty\n");
} /*从栈中取出数据*/
void Push_Op(char e) /*此函数同上Push_St(float e),只不过因为是两个栈,所以需另编一个*/
(
if (Op.top!=99)
(
Op.top++;
Op.b[Op.top]=e;
}
else printf("Stack is Full\n");
}
void Pop_Op(char e) /*此函数同上Pop_St(float e),只不过因为是两个栈,所以需另
编一个*/
{
if (Op.top!=-1)
{
*e=Op.b[Op.top];
Op.top--;
}
else printf("Stack is Empty\n");
}
char Precede(char p) /*这里就是比较优先级了,如果运算符栈顶的符号的优先级比现
在读取的符号的优先级高的话,就返回一个〉,反之返回一个〉
*/
{
char e;
switch(p)
{
case '+':
case '-':
if (Op.top!=-1&&Op.b[Op.top]!='(') e='>';
else e='<';
break;
case
case '/': {
if (Op.b[Op.top]=='*'||Op.b[Op.top]==7'||Op.b[Op.top]==')') e='>';
else e='<';
break;
} {
if (Op.b[Op.top]=='*'||Op.b[Op.top]=='/'||Op.b[Op.top]==')') e='>';
else e='<';
break;
}
case '(':
{
e='<';
break;
}
case ')':
(
if(Op.b[Op.top]=='(') e='=';
else e='>';
break;
}
default: printf("Error\n");
}
return e;
} float Operate (float a,char e,float b) /* 运算*/
(
float c;
switch (e) /*判断符号,选择相应的运算*/
(
case '+':
(
c=a+b;
break;
}
case '-':
(
c=a-b;
break;
}
case '*':
(
c=a*b;
break;
}
case '/':
(
c=a/b;
break;
}
default: printf("error\n");
}
return c;
void trans(char str[]) /*这里是把我们习惯的运算表达使转化成逆波兰表达式,这
是本程序的核心。

*/
(
char *p,x,theta;
float num=0,b,a,c;
St.top=-1;
Op.top=-1; /*初始化两个栈,使两个栈为空*/
p=str;
printf("Please input the expression:");
gets(str); /*输入表达式*/
printf ("the change exprission is ");
while (*p!='\0')
(
if(*p>='0'&&*p<='9') /*如果输入的是数字*/
(
while (*p>='0'&&*p<='9') (
num=*p-'0'+num*10; /*把用字符表示的数字转化为实际意义的数字,并且把
一串字符数字变成有实际意义的数字,如’ 1' '2' '3' '4'这是一串字符,转化成1234, 一千两百三十四*/
putchar(*p);
p++;
}
Push_St(num); /*把转化好的数字导入数据栈里*/
num=0;
putchar(' ');
}
if (*p!='\0') /*如果输入的是运算符,这里默认输入的除了数字就是运
算符*/
(
switch(Precede(*p)) /*这里就是判断现在读入的运算符和运算符栈里的运
算符的优先级*/
(
case '<': /*如果返回的是〈着把现在读入的运算符导入栈*/
Push_Op(*p);
p++;
break;
case '=': /*如果返回的是=的话,直接把运算符栈顶的运算符扔了,
就是直接导出不用任何有意义的变量去记录,这里的x变量是无意的,可以认为是垃圾桶*/
Pop_Op(&x);
p++;
break;
case '>': /*如果返回的是>的话,把运算符栈顶的运算符导出来,
再把另一个数据栈里面的栈顶以及后面的两个数据导出来,进行运算*/
Pop_Op(&theta);
Pop_St(&b);
Pop_St(&a);
if (theta=='/'&&(b==0)) /*当运算符号为/时且a-b=0这时候是错误所以
c=-1; */
{
c=-1;
break;
}
else /*如果正常就输出运算符和数据并进行
运算,把运算结果再次推入数据栈*/
{
printf("%c ”,theta);
Push_St(Operate(a,theta,b));
break;
}
default:
break;
}
}
}
if (c!=-1) /*这里如果c不等于-1那么把栈里面未输出的符号挨个导出运算*/ {
while(Op.top!=-1)
{
Pop_Op(&theta);
putchar('');
printf("%c",theta);
Pop_St(&b);
Pop_St(&a);
if (theta=='/'&&(b==0)) /*注意,在导出栈里面未输出时可能也会出现除数为零的可能*/
{
printf("\nerror expression\n"); /* 这时c=-1*/
c=-1;
break;
}
Push_St(Operate(a,theta,b));
if(c!=-1) /*如果c还不是-1时才会输出结果*/ ( Pop_St(&a); printf("\nthe resule is %.f\n",a);
} } else printf("error exprission");
}
void main() /*因为我们学的是数据结构,强调数据封装化,再主函数中应尽力减少对数
据的处理,而对数据的处理应该用不同的函数去完成。

*/
(
char str[100]={'\0'};
trans(str);
}
五. 主要问题的解决方法
1.主要问题的解决方法及技术关键
表达式向逆波兰表达式转化的问题,定义出一个函数来完成这个转化过程.
对符号优先级别的判断,由选择分支结构来完成.
栈的技术由定义结构体变量完成.
2.技术关键
函数调用,结构体变量的定义使用
六. 设计结果说明:
1. 设计优点:
此程序简单易懂,操作方便,并且有很强的实用性,
2. 设计不足:
不能进行复杂的计算,应用不广.刻意避开了链表的使用,知识应用不
全.。

相关文档
最新文档