C语言程序设计-简单的计算器
C语言简易计算器的实现

目录一.课程设计目的 (1)二.设计环境 (1)三.设计内容 (1)四.设计说明 (2)五.设计程序流程图 (2)六.调试 (4)(1)错误原因分析一 (4)(2)语法错误 (5)(3)逻辑错误 (5)七. 调试结果图 (6)八. 结论与心得体会 (7)九.附录 (8)具体代码实现 (8)十.参考文献 (18)一.课程设计目的1.通过一个学期的学习,我认为要学号C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践来巩固我们的知识,特别是学计算机专业的,我们更应该注重这一环节,只有这样我们才能成为一个合格的计算机人才。
通过这一个课程设计,进一步来巩固所学的语句,如:循环,和分支结构的运用。
还要熟悉四则运算和函数的算法。
2.通过这次课程设计扩展自己的知识面,课本上的东西是远远不够的,可以通过上网或去图书馆查资料等方式得到一些新的知识,3.通过课程设计,加深对课程化设计思想的理解,能进行一个系统功能分析,并设计一个合理的模块化结构,提高程序开发能力。
二.设计环境1.硬件:一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz2.软件:安装有Microsoft visual c++6.0三.设计内容以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。
(1)定义一个结构体类型数组,输入0~9及+、--、*等符号的信息,将其信息存入文件中;(2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果;(3)画出部分模块的流程图;(4)编写代码;(5)程序分析与调试。
四.设计说明1)包含的功能有:加、减、乘、除运算,开方、平方等功能。
(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。
(3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。
c简单计算器课程设计

c 简单计算器课程设计一、课程目标知识目标:1. 让学生掌握简单计算器的基本操作,包括开机、关机、清除屏幕、输入数字和运算符号。
2. 使学生理解加、减、乘、除四则运算的基本概念,并能够在简单计算器上进行正确的运算操作。
3. 帮助学生识别计算器上各个按键的功能,了解其对应的数学意义。
技能目标:1. 培养学生运用简单计算器解决实际问题的能力,如购物找零、计算面积等。
2. 提高学生进行四则运算的速度和准确性,提高计算效率。
3. 引导学生掌握计算器使用技巧,如连续计算、顺序计算等。
情感态度价值观目标:1. 培养学生对计算器的正确态度,认识到计算器是学习数学的工具,而非替代品。
2. 激发学生学习数学的兴趣,让学生在轻松愉快的氛围中体验数学计算的乐趣。
3. 培养学生的合作意识,使学生在小组讨论和互助学习中提高沟通能力,培养团队精神。
本课程针对小学三年级学生设计,结合学生年龄特点,注重激发兴趣和培养动手操作能力。
课程内容紧密联系教材,将目标分解为具体的学习成果,便于后续教学设计和评估。
通过本课程的学习,学生将能够熟练运用简单计算器,提高数学计算能力,培养良好的学习习惯和团队协作能力。
二、教学内容1. 计算器的基本结构:引导学生认识计算器的外观、各部分名称及其功能。
- 教材章节:第三章第1节《认识计算器》- 内容列举:计算器按键布局、显示屏、开机与关机、清除键等。
2. 四则运算操作:讲解加、减、乘、除四则运算在计算器上的操作方法。
- 教材章节:第三章第2节《计算器的四则运算》- 内容列举:按键输入、运算顺序、连续运算、计算结果读取等。
3. 计算器使用技巧:教授计算器的高级使用技巧,提高计算效率。
- 教材章节:第三章第3节《计算器使用技巧》- 内容列举:百分比计算、乘方运算、记忆功能等。
4. 实践应用:结合实际生活场景,让学生运用计算器解决实际问题。
- 教材章节:第三章第4节《计算器在实际生活中的应用》- 内容列举:购物找零、计算面积、体积、速度等。
C语言程序设计-第四章简单计算器小程序-分支程序设计

P1 逻辑运算符 P2
或
逻辑运算符 P2
课堂练习: 求下面逻辑表达式的值: 2>1 && 4 && 7<3+!0
值为0
等价于((2>1)&&4)&&(7<(3+(!
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算的重要规则
a&&b:当a为0时,不管b为何值,结果为0
课堂练习:有下面定义的语句和逻辑表达式: int a=0,b=10,c=0,d=0 a && b && (c=a+10,d=100) 逻辑表达式执行后,a,b,c,d的值各为多少?
任务实现效果演示 例题源代码:switchcalculator.c
相关知识 1. switch语句 2. break语句
1 switch多分支选择结构
❖ 尽管用if…else if结构可以实现多分支,注但意当:分常支量较表多达时式,必程须序是结整构型较、复字杂符。型或枚举类型,不能是 实型表达式,每个case关键字后的常量表达式应互不相同
值为0 等价于i==(k>j),值为1
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算符与逻辑表达式
&&(逻辑与)、||(逻辑或)、!(逻辑非)(单目)
逻辑表达式的一般形式:
优先级: 1.由低到高: ||→ && → !; 2.多种运算符一起: = →|| →&& →关系运算符 →算术运算符→ !。
【】 简单计算器小程序:由用户输入运算数和四则运算符(+、-、*、/),输出计算结果。
【】
用c语言设计一个多功能计算器

用C语言设计一个多功能计算器实现功能:1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。
按‘C’清屏,按‘X’退出。
例如:输入:2+5输出:72)实现单运算符表达式计算的功能。
输入的操作数可以包含整数或浮点数。
如果遇到错误的表达式,应输出错误提示信息。
输入表达式如下:例如:输入:2+5输出:7目录摘要 (1)第一章引言 (3)1.1 计算器概述 (3)第二章设计任务及要求 (5)2.1 设计任务 (5)2.2 设计要求 (6)第三章计算器硬件设计 (7)3.1 方案说明 (7)3.2 设计单片机主体电路图 (8)第四章软件设计 (9)4.1 模块介绍 (9)4.2 程序流程图 (10)4.3 程序部分 (11)第五章总结 (16)参考文献 (17)摘要:[目录]一、课程设计题目及任务要求二、设计思路三、部分程序介绍四、程序框图五、汇编程序六、参考资料[原文]一、课程设计题目及任务要求请设计十进制加减法计算器。
要求能(不同时)显示3位输入和4位输出。
二、设计思路1、操作显示设备显示设备采用八片七段共阴极LED显示器,共设置16 个键,其中数字键0~9 共十个,接下来依次是加号键、减号键、等于号、清除键。
操作设备是两行八列共16键的简单键盘。
第一行从左至右分别为0、1、2、3、4、5、6、7,第二行分别为8、9、A(+)、B(-)、C(=)、D(清除键)、E (清除键)、F(清除键),“清除键”表示程序初始化,为下次输入准备。
2、程序实现功能(1)十进制加减法计算:输入范围为(1~999),该程序输入两个定点数,每个3位,输出4位;A为加,B为减,C为等于,输出为四位计算结果。
数据输入采用规范化输入,即必须输入3个数才算完成一个运算数的输入,两个运算数之间输入运算符A或者B,输入完成按C显示计算结果;(2)计算机复位功能:DEF均为清零重启,任何时候按下DEF中一个将重新开始;三、部分程序介绍(1)主程序(START)程序开始运行初始化程序,设置输入输出口PA、PB、PC,扫描键盘,输入两个待求数据和运算符,存入寄存器,等待输入等号同时显示第二个数,运行计算程序,并将计算结果分离,输出到显示器;(2)读键子程序(RD_KB)程序分别扫描两行键盘,若有键按下则通过移位的方式计算键码;若无键按下,则将键码缓存设置为10H,判断后进行相应的跳转。
C语言实现简易计算器(可作加减乘除)

C语⾔实现简易计算器(可作加减乘除)C语⾔实现简易计算器(加减乘除)计算器作为课设项⽬,已完成答辩,先将代码和思路(注释中)上传⼀篇博客已增添、修改、整理⾄⽆错且可正常运⾏虽使⽤了栈,但初学者可在初步了解栈和结构语法后理解代码#include <stdlib.h>#include <stdio.h>#include <string.h>#define IsDouble 0#define IsChar 1//_______________________________________________________________________________________________________________________________________________________ //1.⽀持浮点数和字符的栈typedef struct {char * buffer;int typesize;int top;int max;} stack;stack * CreateStack(int max, int typesize);//创建⼀个栈void DestroyStack(stack *);//释放栈的空间void ClearStack(stack *);//清空栈int Push(stack *, void *);//⼊栈int Pop(stack *, void *);//出栈int GetSize(stack *s);//得到栈的⼤⼩int GetTop(stack *, void *);//找到栈顶int IsEmpty(stack *);//判断是否为空栈,空则下溢int IsFull(stack *);//判断栈是否已满,满则溢出stack * CreateStack(int max, int typesize){stack * s = (stack*)malloc(sizeof(stack));//为栈s malloc内存if (!s) return 0;//为结构中buffer元素malloc内存s->buffer = (char *)malloc(sizeof(char) * max * typesize);if (!s->buffer) return 0;//初始化结构中的栈顶,最⼤值,类型⼤⼩s->top = -1;s->max = max;s->typesize = typesize;return s;}void DestroyStack(stack* s){free(s->buffer);//先释放buffer的空间free(s);//在释放s的空间}void ClearStack(stack * s){s->top = -1;//清空栈(栈头位置归零)}int Push(stack * s, void * data){if (IsFull(s)) return 0;//如果栈已满则return 0,防⽌溢出//栈未满则将栈头移动打动下⼀位置,并将data中的元素拷⼊栈中buffer的第top位置s->top++;memcpy(s->buffer + s->top*s->typesize, data, s->typesize);//⼊栈成功return 1return 1;}int Pop(stack * s, void * data){if (IsEmpty(s)) return 0;//出栈判断栈是否为空,若为空则return 0//栈未空则将buffer中top位置的字符拷⼊data记录,并让栈头向前移动⼀个位置memcpy(data, s->buffer + s->top*s->typesize, s->typesize);s->top--;//成功则return 1return 1;}int GetSize(stack *s){return s -> top+1;//栈头位置+1得到⼤⼩}int GetTop(stack *s, void * data){if (IsEmpty(s)) return 0;//如果栈空return 0//栈不为空则将top位置的字符拷回data记录,得到栈头memcpy(data, s->buffer + s->top*s->typesize, s->typesize);//成功则return 1;return 1;}int IsEmpty(stack * s){return s->top == -1;//如果top为-1则栈空}int IsFull(stack * s){return s->top == s->max-1;//如果top为max-1则栈满}//___________________________________________________________________________________________________________________________________________________ //2.定义⼀个cal类型,其中data存数时sign为IsDouble,存字符时,sign为Ischartypedef struct {double data;char sign;} cal;//3.查找对应符号(找到则返回该符号下标)(找不到则说明该部分为数字返回-1)int SearchCode(char ch){char * code = "+-*/()@";//@为终⽌符,算式输⼊结束int index = 0;//while (code[index]){if (code[index] == ch) return index;index++;}return -1;}//4.得到两个符号间的优先级//与SearchCode相对应,char GetPriority(char ch, char next){//创建⼀个perferen表,第i⾏(列)对应SearchCode函数中code中的第i个字符char perferen[7][7] = {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=E",">>>>E>>","<<<<<E="};//找到两个形参对应的字符int c = SearchCode(ch);int n = SearchCode(next);//如果找不到对应运算符(字符不是运算符⽽是为数字)return Eif (c==-1 || n==-1) return 'E';//如果找到两个对应运算符则按照优先级表返回两个运算符的优先级return perferen[c][n];}//5.四则运算double add(double a, double b) { return a+b; }double sub(double a, double b) { return a-b; }double mul(double a, double b) { return a*b; }double ddiv(double a, double b) { return a/b; }//整合四种运算double calcu(double a, char ch, double b){double (*calculation[4])(double,double) = {add,sub,mul,ddiv};return calculation[SearchCode(ch)](a,b);}//6.检测字符串int CheckStr(char * buffer){int n;//遍历字符串确保算式中⽆⾮法字符若检测到⾮法字符return 0,若都合法则return 1for (n = 0;buffer[n];n++){if ((SearchCode(buffer[n]) != -1 || buffer[n] == '.' || (buffer[n] >= '0' && buffer[n] <= '9')) && buffer[n] != '@') continue;else return 0;}buffer[n] = '@';//加上终⽌符,表⽰算式结束buffer[n+1] = '\0';return 1;}//7.得到数据转化为double类型存⼊rsint GetDigit(char * buffer, int * n, double * rs){char str[30];int i,j = 0;for (i = 0;SearchCode(buffer[*n]) == -1;i++){str[i] = buffer[*n];//从*n位置开始,将这⼀串数字字符存⼊str(*n)++;}str[i] = '\0';for (i = 0;str[i];i++){if (str[i] == '.') j++;}//如果⼀段⼩数有多个⼩数点或⼩数点在数字⾸尾,return 0if (j>1 || str[i-1] == '.' || str[0] == '.') return 0;//rs接收转化为double的数据*rs = atof(str);//操作成功return 1return 1;}//8.将⽤户输⼊的buffer字符串转化为可供程序运算的calstr数组int resolu(char * buffer, cal * calstr){int i = 0, j = 0;cal c;while (buffer[i]){if (SearchCode(buffer[i]) == -1){//如果得到数据不成功则return 0if (GetDigit(buffer,&i, &c.data) == 0) return 0;//如果成功得到数据则在c.sign标记为浮点数c.sign = IsDouble;//将c存⼊数组calstr中calstr[j++] = c;}else{//若符号为运算符//判断正负号if (buffer[i] == '-' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '-')){ i++;if (GetDigit(buffer,&i, &c.data) == 0) return 0;//在符号的下⼀位开始查找,若找不到数字return 0//否则,给数字取相反数,c.sign标记为浮点数,存⼊calstr中c.data = 0 - c.data;c.sign = IsDouble;calstr[j++] = c;} else//如果是正号,与符号处理⽅式同理if (buffer[i] == '+' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '+')){ i++;if (GetDigit(buffer, &i, &c.data) == 0) return 0;c.sign = IsDouble;calstr[j++] = c;}else{//如果不是正负号,则为运算符,先强制转换为double类型存在c.data⾥,然后c.sign标记为char类型,存⼊calstrc.data = (double)buffer[i++];c.sign = IsChar;calstr[j++] = c;}}}//操作蔡成功则return 1return 1;}//9.计算出结果int result(cal * calstr, double * rs){stack * pst = CreateStack(100,sizeof(char));//运算符栈stack * pnd = CreateStack(100,sizeof(double));//数据栈double num1,num2;int n = 0;char ch = '@';Push(pst, &ch);//在转换得到的calstr中遍历直到终⽌符'@"while(ch != '@' || !(calstr[n].sign == IsChar && (char)calstr[n].data == '@')){//如果calstr的n位上是浮点数,则将这个data压栈进⼊数据栈pnd中if (calstr[n].sign == IsDouble){Push(pnd, &(calstr[n].data));n++;}//反之,如果是运算符,则要检测优先级else{switch( GetPriority(ch, (char)calstr[n].data)){//如果运算符优先级较⼩,则让ch等于优先级⼤的符号并压⼊符号栈pst中case '<':ch = (char)calstr[n].data;Push(pst, &ch);n++;break;//如果结果为等号,让符号出栈暂存到ch中case '=':if (!Pop(pst, &ch)) return 0;n++;break;//如果ch优先级较⾼,则将前两个数字及运算符出栈,分别储存⾄num2,ch,num1中,进⾏运算,得到的结果再次压栈进⼊pnd中 case '>':if (!(Pop(pnd,&num2) && Pop(pst,&ch) && Pop(pnd,&num1))) return 0;num1 = calcu(num1,ch,num2);Push(pnd, &num1);break;//如果符号顺序出错,return 0case 'E':return 0;}}//检测是否可以得到栈顶符号,栈空则return 0if (!GetTop(pst, &ch)) return 0;}//如果栈中得到了最终结果,并且取出pnd中的最终结果到rs,return 1if (GetSize(pnd) == 1 && GetTop(pnd,rs)){DestroyStack(pst);DestroyStack(pnd);return 1;}//否则 return 0else{return 0;}}//10.⽤户交互函数void treatment(){char buffer[100];//⽤户输⼊的字符串(算式)cal calstr[50];//计算⽤的数组double rs = 0;//计算结果printf("Enter your equation:");gets(buffer);//让⽤户输⼊算式buffer//⽤户不输⼊"exit"就不退出while (!(buffer[0]=='e' && buffer[1]=='x' && buffer[2]=='i' && buffer[3]=='t')){//检查buffer中字符君合法,成功将buffer转化为⽤于计算的calstr数组,成功计算出结果存⼊rsif (CheckStr(buffer) && resolu(buffer,calstr) && result(calstr,&rs)){printf("\n%lf\n",rs);}else{printf("\nError!\n");}printf("Enter \"exit\"to quit");printf("\nEnter your equation:");gets(buffer);//再次让⽤户输⼊算式}printf("\nbye\n");}//11.主函数int main(){treatment();}参考⽂献链接如下[参考⽂献]()。
C语言简易计算器的实现

C语言简易计算器的实现C语言简易计算器是一种用于进行基本数学运算的程序。
实现一个简易计算器的关键是要能够解析用户输入的数学表达式,并将其转化为计算机可以理解的形式,然后进行计算,并输出结果。
下面是一个大约1200字以上的示例实现。
```c#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <ctype.h>#define MAX_SIZE 100//定义操作符的优先级int getPriority(char op)if (op == '+' , op == '-')return 1;else if (op == '*' , op == '/')return 2;elsereturn 0;//进行四则运算int calculate(int a, int b, char op)switch (op)case '+': return a + b;case '-': return a - b;case '*': return a * b;case '/': return a / b;default: return 0;}//将中缀表达式转换为后缀表达式void infixToPostfix(char* infixExp, char* postfixExp) char stack[MAX_SIZE];int top = -1;int j = 0;for (int i = 0; infixExp[i] != '\0'; i++)if (isdigit(infixExp[i])) { // 数字直接输出到后缀表达式while (isdigit(infixExp[i]))postfixExp[j++] = infixExp[i++];}postfixExp[j++] = ' ';i--;}else if (infixExp[i] == '(') { // 左括号压入栈stack[++top] = infixExp[i];}else if (infixExp[i] == ')') { // 右括号弹出栈内所有操作符并输出到后缀表达式,直到遇到左括号while (top != -1 && stack[top] != '(')postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';}top--; // 弹出栈顶的左括号}else { // 操作符while (top != -1 && getPriority(stack[top]) >=getPriority(infixExp[i]))postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';stack[++top] = infixExp[i];}}while (top != -1) { // 将栈内剩余操作符弹出并输出到后缀表达式postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';}postfixExp[j] = '\0';//计算后缀表达式的值int evaluatePostfix(char* postfixExp)char stack[MAX_SIZE];int top = -1;for (int i = 0; postfixExp[i] != '\0'; i++)if (isdigit(postfixExp[i])) { // 数字压入栈int num = 0;while (isdigit(postfixExp[i]))num = num * 10 + (postfixExp[i++] - '0');stack[++top] = num;i--;}else if (postfixExp[i] == ' ')continue;}else { // 操作符,弹出栈顶的两个数进行计算,并将结果压入栈int b = stack[top--];int a = stack[top--];int result = calculate(a, b, postfixExp[i]);stack[++top] = result;}}return stack[top];int maichar infixExp[MAX_SIZE];printf("请输入中缀表达式:");fgets(infixExp, sizeof(infixExp), stdin); // 读取用户输入//将中缀表达式转换为后缀表达式char postfixExp[MAX_SIZE];infixToPostfix(infixExp, postfixExp);printf("后缀表达式为:%s\n", postfixExp);//计算后缀表达式的值并输出int result = evaluatePostfix(postfixExp);printf("计算结果为:%d\n", result);return 0;```这个简易计算器的实现基于栈的数据结构。
C语言编程-简单的计算器

int i=0;
a[0]='$';
printf("请输入表达式,退出请输入q:\n\n");
scanf("%c",&x);
if(x=='q') break;
while(x!='\n')
{
a[++i]=x;
scanf("%c",&x);
}
a[i+1]='\0';
jieguo=jisuan(a);
}
j=j+1;
x=z;
if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);
l=l+1;
x=x+n*(a[k]-'0');
}
i=j+1;
}
else i=j;
shu.data[++shu.top].d1=x;
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
else if(a[i]=='*'||a[i]=='/')
C语言实现简单计算器程序

C语⾔实现简单计算器程序这两天在看⼀个C语⾔写的计算器程序,做了不少的功夫,跟着作者⼀步步的进⾏完善,了解了许多细节性的东西,在此⾃⼰做个总结,加深⾃⼰对程序的印象,也算是梳理。
在该计算器程序,能进⾏加减乘除、sin、cos、exp等操作,同时能进⾏数值保存功能。
⽽该计算器使⽤逆波兰表⽰法。
即所有运算符都跟在操作数的后⾯,⽐如下列表达式:(1 - 2) * (4 + 5)采⽤逆波兰表⽰法表⽰为:1 2 - 4 5 + *逆波兰表达法中不需要圆括号,只要知道每个运算符需要⼏个操作数就不会引起歧义。
计算器程序实现很简单,具体原理如下:while(/* 下⼀个运算符或操作数不是⽂件结束指⽰符 */)if(/* 是数 */)/* 将该数压⼊到栈中 */else if (/* 是运算符 */)/* 弹出所需数⽬的操作数 *//* 执⾏运算 *//* 将结果压⼊到栈中 */else if (/* 是换⾏符 */)/* 弹出并打印栈顶的值 */else/* 出错 */在程序设计中,使⽤模块化思想,getop函数来进⾏读⼊,该函数返回⼀个标识,⽤来标识读⼊的是什么类型。
主循环体中根据该标识执⾏相应的动作。
以下是该程序:(我将所有函数和变量放在同⼀⽂件)#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXOP 100#define NUMBER '0' //标识读⼊的是数字#define NAME 'n' //标识读⼊的是字符串(函数名或⾮法字符串)#define ALPHA 26int getop(char []);void push (double); //压栈double pop(void); //出栈void clear(void); //清空栈void mathfnc(char []); //执⾏相应的数学函数sin、cos、exp等int main(void){int type;int i, var = 0;double op1, op2,v;char s[MAXOP];double variable[ALPHA];for (i = 0; i < ALPHA; i++) //初始化⽤于保存数值的变量数组variable[i] = 0.0;while ((type = getop(s)) != EOF) //读取输⼊{switch (type){case NUMBER:push (atof(s));break;case NAME:mathfnc(s);break;case '+':push (pop() + pop());break;case '*':push (pop() * pop());break;case '-':op2 = pop();push (pop() - op2);break;case '/':op2 = pop();if (op2 != 0.0)push (pop() / op2);elseprintf ("error: zero divisor\n");break;case '%':op2 = pop();if (op2 != 0.0)push (fmod(pop(), op2));elseprintf ("error: zero divisor\n");break;case '?': //打印栈顶元素op2 = pop();printf ("\t%.8g\n", op2);push (op2);break;case '=': //保存数值pop();if (var >= 'A' && var <= 'Z')variable[var - 'A'] = pop();elseprintf ("error: no variable name\n");break;case 'c':clear();break;case 'd': //复制栈顶元素op2 = pop();push(op2);push(op2);break;case 's': //交换栈元素op1 = pop();op2 = pop();push(op1);push(op2);case '\n':v = pop(); //v保存最后的⼀次结果printf ("\t%.8g\n", v);break;default:if (type >= 'A' && type <= 'Z')push(variable[type - 'A']);else if (type == '@') //输⼊的字符@表⽰最近⼀次结果值 push(v);elseprintf ("error: unknown command %s\n", s);break;}var = type;}return 0;}/* ----------------------------------------------------------- */#define MAXVAL 100int sp = 0; //标识栈顶double val[MAXVAL];void push(double f){if (sp < MAXVAL)val[sp++] = f;elseprintf ("error: stack full, can't push %g\n", f);}double pop(void){if (sp > 0)return val[--sp];else{printf ("error: statck empty\n");return 0.0;}}void clear(void){sp = 0;}void mathfnc (char s[]){double op2;if (strcmp (s, "sin") == 0)push(sin(pop()));else if(strcmp (s, "cos") == 0)push(cos(pop()));else if(strcmp (s, "exp") == 0)push(exp(pop()));else if(strcmp (s, "pow") == 0){op2 = pop();push (pow(pop(), op2));}elseprintf ("error: %s not supported\n", s);}/* ----------------------------------------------------------- */#include <ctype.h>int getch(void);void ungetch(int);int getop(char s[]){int i, c;while ((s[0] = c = getch()) == ' ' || c == '\t') //过滤开头的空⽩字符;s[1] = '\0';i = 0;if (islower(c)) //判断是否为⼩写字母,也即读取由⼩写字母组成的字符串 {while (islower(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);if (strlen (s) > 1)return NAME;elsereturn c;}if (!isdigit(c) && c != '.' && c != '-')return c;if (c == '-') //⽤于判断是负数还是减操作{if (isdigit(c = getch()) || c == '.')s[++i] = c;else{if (c != EOF)ungetch(c);return '-';}}if (isdigit(c)) //收集整数部分while (isdigit(s[++i] = c = getch()));if (c == '.') //收集⼩数部分while (isdigit(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);return NUMBER;}/* ----------------------------------------------------------- *//** 引⽤以下两个函数是因为:程序不能确定它已经读⼊的输⼊是否⾜够 ** 除⾮超前多读⼊⼀些输⼊,在本程序中,读⼊⼀些字符合成⼀个数字 ** 所以在看到第⼀个⾮数字字符之前,已经读⼊的数的完整性是不能确定的* 由于程序要超前读⼊⼀个字符,这样就导致最后⼜⼀个字符不属于当前所要读⼊的数*/#define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void){return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch (int c){if (bufp >= BUFSIZE)printf ("ungetch: too many characters\n");elsebuf[bufp++] = c;}该程序虽然简单,但是还是存在⼀些⼩⼩的问题,⽐如没有数据时进⾏pop的话,会打印栈中⽆数据同时返回数值0.0,在循环体中许多执⾏操作会将该数值保存到栈中,之后打印该值,⽤户体验度⽐较差。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
- - . 《程序设计基础(C)》课程设计报告简易计算器设计学生姓名:学号:班级:指导老师:日期:309工作室设计目录一、设计目标2二、总体设计4三、详细设计6四、调试与测试12五、分析及结论13六、参考文献14【附录】16一、设计目标设计一个C语言程序(简单计算器设计)具体要求:在功能上功能尽量模拟windows操作系统中的计算器,系统界面不做强制要求。
主要功能:进行+、-、*、/、三角函数、对数、幂等各项数学运算,能够进行进制间的相互转换与计算。
二、总体设计1、程序设计组成框图2、设计思路简单计算器的设计的程序中主要调用的函数有:数学函数的定义和I/O函数;设计思路和理念在于一切追求简便易操作原理,通过个人的构思和设计以及调试运行设计出这一款简单的计算器。
3、程序设计流程图三、详细设计1、功能函数①函数的功能:两数的+、-、*、/计算、求平均函数的入口:从main()的if(flag==1)开关结构中进入,即flag的值为1时进入该函数,从而进行该功能函数的计算。
函数调用关系:被主函数调用,由if()开关结构中进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构。
2、功能函数②函数的功能: x的y次方的计算、两数的求余、以x为底y的对数函数的入口:从main()的if(flag==2)开关结构中进入,即flag的值为2时进入该函数,从而进行该功能函数的计算。
函数调用关系:被主函数调用,由if()开关结构中进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构。
3、功能函数③函数的功能: 单个数值sin、cos、tan的计算,以e为底的指数、求绝对值函数的入口:从main()的if(flag==3)开关结构中进入,即flag的值为3时进入该函数,从而进行该功能函数的计算。
函数调用关系:被主函数调用,由if()开关结构中进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构4、功能函数④函数的功能: 单个数值的ln值、以10为底的对数、取整、平方、立方计算函数的入口:从main()的if(flag==4)开关结构中进入,即flag的值为4时进入该函数,从而进行该功能函数的计算。
函数调用关系:被主函数调用,由if()开关结构中进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构5、功能函数⑤函数的功能: 单个数值的倒数、阶乘函数的入口:从main()的if(flag==5)开关结构中进入,即flag的值为5时进入该函数,从而进行该功能函数的计算。
函数调用关系:被主函数调用,由if()开关结构中进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构6、功能函数⑥函数的功能: 进行进制间的转换函数的入口:从main()的if(flag==6)开关结构中进入,即flag的值为6时进入该函数,从而进行该功能函数的计算。
函数调用关系:被主函数调用,由if()开关结构中进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构7、功能函数主菜单——本函数由本组成员共同设计函数的功能:提供本计算器的几个功能选项,方便用户使用函数的入口:从main函数的while(command_begin=='Y'||command_begin=='y')开始,当输入“Y”时进入本菜单。
函数调用关系:被主函数调用,由while()结构进入。
函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"8、功能函数主函数——本函数由本组成员共同设计函数的功能:欢迎页面及退出画面提示四、调试与测试1、调试方法打开Microsoft Visual C++ 6.0,先将各个功能函数的的内容清空,只保留主函数main(),然后编译检验main()函数中是否有错,如果没有错误,再连接、运行。
确认main()函数一切无误后,然后依次加入功能函数①②③进行调试。
当所有的功能函数都加上且正确无误时,就可以进入下一个环节—程序的测试。
2、测试方法:运行程序,然后进入简易计算器的界面,在这里需要做的就是把自己当成一个公司的程序使用者,来对该程序进行使用,看该程序有哪些方面用着不够爽,把这些问题依次整理出来,再对源程序进行修改,在这个过程中也需要对程序进行调试,不过不必将各个功能函数的的内容清空再进行如上述的调试方法,而是,改一部份运行一次,看是否有无错误。
若所有的错误都改过来了,且运行无误,那就大功告成了。
【在调试中遇到的问题:】调试过程中,我们遇到诸多小问题,但都在我们共同讨论后解决了。
1、问题:标点符号在输入的时候,使用的是中文输入法,这种错误一般都难以发现,让修改的时候找不到目标。
解决方法:用“替换”。
如果程序中的error很多,不管error是什么,先将标点替换成英文的标点。
2、问题:调试时,有的时候编译后没什么问题,就是在点击连接link时出现了错误。
而且,这种错误让我们不知道怎么修改。
但是我们的程序的确正确。
解决方法:将源程序保存(save),然后关掉Microsoft Visual C 6.0,重新启动MicrosoftVisua C6.0,五、分析及结论A、在设计中实现了设计目标能进行简单的数学运算,在功能上极力地模仿windows计算器B、其中遇到的问题输入时,scantf()函数中出现非地址项,某变量未进行类型定义,以及语句末尾缺少分号等常见的低等错误。
解决办法:根据Microsoft Visual C 6.0的错误提示(error)与警告(warning)回到源程序逐一对错误和警告修改,每修改一次调试一次。
C、该程序的不足生成的可执行程序操作界面不美观,用Microsoft Visual C 6.0编写,未使用标准的Turbor C 2.0中的图库,所以不好看,但是这中DOS界面的东西再怎么弄都不好看,强烈建议下学期开课C++。
D、实践心得通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习c语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
经过C语言课程设计实践学习,使我对c语言有了更进一步的认识和了解,板通过实践,我也发现我的好多不足之处,首先是在程序输入上还不够熟练,经常按错字母,通过学习也有所改进;再有对c语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对c语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
熟练地掌握了C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。
进一步掌握各种函数的应用,以及文件的读写操作等我认为要学好c语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。
只有这样我们才能成为合格的计算机人材。
六、参考文献(1)《C语言程序设计.普措才仁版》(2)《C语言程序设计.谭浩强版》(3)《全国计算机等级考试——二级C语言.2008版》(4)《C语言上机指导》(5)《Microsoft Visual C++ 6.0指南》(6)C语言之家(.cstudyhome.)(7)C语言教室(.vcok.)【附录】源程序清单#include<stdio.h>#include<math.h>#include<string.h>#include<conio.h>#include<stdlib.h>void main(){char command_begin; //开始字符int flag;int act;int i;double first_number;double second_number;double value_jia,value_jian,value_cheng,value_chu,value_pingjun;double value_mi,value_yu,value_duishu;double value_sin,value_cos,value_tan;double value_exp,value_ln,value_log;double value_floor,value_n,value_2,value_3,value_daoshu,value_fabs;printf("\n\n");printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃**********************************************************┃\n"); printf(" ┃***┏━━━━━━━━━━━━━━━━━━━━━━━━┓***┃\n"); printf(" ┃***┃************************************************┃***┃\n"); printf(" ┃***┃************************************************┃***┃\n"); printf(" ┃***┃*** 欢迎使用简易计算器系统****┃***┃\n"); printf(" ┃***┃*** ****┃***┃\n"); printf(" ┃***┃*** ****┃***┃\n"); printf(" ┃***┃*** 2013.07.05 ****┃***┃\n"); printf(" ┃***┃************************************************┃***┃\n");printf(" ┃***┃************************************************┃***┃\n");printf(" ┃***┗━━━━━━━━━━━━━━━━━━━━━━━━┛***┃\n");printf(" ┃**********************************************************┃\n");printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("\n\n");printf("printf("printf(" 【输入Y,按回车键开始使用】\n\n");printf("是否开始?(Y/N): ");scanf("%c",&command_begin);system("CLS");printf("\n"); //由本组成员共同设计while(command_begin=='Y'||command_begin=='y'){//当接收Y/y命令时执行计算器程序printf(" 【请选择计算类别】\n\n");printf("*····································*\n");printf("* *\n");printf("* (1). 两数的+、-、*、/计算、求平均*\n");printf("* *\n");printf("* (2). x的y次方的计算、两数的求余、以x为底y的对数*\n");printf("* *\n");printf("* (3). 单个数值sin、cos、tan的计算,以e为底的指数、求绝对值*\n");printf("* *\n");printf("* (4). 单个数值的ln值、以10为底的对数、取整、平方、立方计算*\n");printf("* *\n");printf("* (5). 单个数值的倒数、阶乘*\n");printf("* *\n");printf("* (6). 进制之间的转换*\n");printf("* *\n");printf("*····································*\n");printf("\n\n");printf("请输入1、2、3、4、5或6(按回车键继续):\n");printf("\n\n\n\n\n");scanf("%d",&flag); //由本组成员共同设计if(flag==1){system("CLS");printf("\n\n");printf("请输入两个数字,中间用空格隔开:\n\n\n");scanf("%lf%lf",&first_number,&second_number);if(second_number==0){value_jia=first_number+second_number;//加法printf("两数之和:%lf\n",value_jia);value_jian=first_number-second_number;//减法printf("两数之差:%lf\n",value_jian);value_cheng=first_number*second_number;//乘法printf("两数之积:%lf\n",value_cheng);value_chu=first_number/second_number;//除法printf("两数之商:除数不能为零,如果需要求商,请重新输入:\n");//除法value_pingjun=value_jia/2;//求平均printf("平均数是:%lf\n",value_pingjun);}else{value_jia=first_number+second_number;//加法printf("两数之和:%lf\n",value_jia);value_jian=first_number-second_number;//减法printf("两数之差:%lf\n",value_jian);value_cheng=first_number*second_number;//乘法printf("两数之积:%lf\n",value_cheng);value_chu=first_number/second_number;//除法printf("两数之商:%lf\n",value_chu);value_pingjun=value_jia/2;//求平均printf("平均数是:%lf\n",value_pingjun);}}if(flag==2){system("CLS");printf("\n\n");printf("请输入两个数字,中间用空格隔开:\n\n\n");scanf("%lf%lf",&first_number,&second_number);if(second_number==0){value_mi=pow(first_number,second_number);//幂次printf("x的y次幂:%lf\n",value_mi);printf("取余为:除数不能为零,如果需要求余,请重新输入:\n");//取余printf("以x为底y的对数为:计算结果趋于无穷,无法显示:\n");//x为底y的对数}else{value_mi=pow(first_number,second_number);//幂次printf("x的y次幂:%lf\n",value_mi);value_yu=fmod(first_number,second_number);//取余printf("取余为:%lf\n",value_yu);value_duishu=(log10(second_number)/log10(first_number));//x为底y的对数printf("以x为底y的对数为:%lf\n",value_duishu);}}if(flag==3){system("CLS");printf("\n\n");printf("请输入一个数字:");scanf("%lf",&first_number);if(first_number>0){value_sin=sin(first_number);//求sinprintf("sin值:%lf\n",value_sin);value_cos=cos(first_number);//求cosprintf("cos值:%lf\n",value_cos);value_tan=tan(first_number);//求tanprintf("tan值:%lf\n",value_tan);value_exp=exp(first_number);//以e为底的指数printf("exp值:%lf\n",value_exp);value_fabs=fabs(first_number);//求绝对值printf("x的绝对值:%lf\n",value_fabs);}if(first_number==0){value_sin=sin(first_number);//求sinprintf("sin值:%lf\n",value_sin);value_cos=cos(first_number);//求cosprintf("cos值:%lf\n",value_cos);value_tan=tan(first_number);//求tanprintf("tan值:%lf\n",value_tan);value_exp=exp(first_number);//以e为底的指数printf("exp值:%lf\n",value_exp);value_fabs=fabs(first_number);//求绝对值printf("x的绝对值:%lf\n",value_fabs);}if(first_number<0){value_sin=sin(first_number);//求sinprintf("sin值:%lf\n",value_sin);value_cos=cos(first_number);//求cosprintf("cos值:%lf\n",value_cos);value_tan=tan(first_number);//求tanprintf("tan值:%lf\n",value_tan);value_exp=exp(first_number);//以e为底的指数printf("exp值:%lf\n",value_exp);value_fabs=fabs(first_number);//求绝对值printf("x的绝对值:%lf\n",value_fabs);}}if(flag==4){system("CLS");printf("\n\n");printf("请输入一个数字:");scanf("%lf",&first_number);if(first_number>0){value_ln=log(first_number);//求lnprintf("ln值:%lf\n",value_ln);value_log=log10(first_number);//以10为底的对数printf("10为底的对数:%lf\n",value_log);value_floor=floor(first_number);//取整printf("x取整:%lf\n",value_floor);value_2=pow(first_number,2);//求x的平方printf("x的平方:%lf\n",value_2);value_3=pow(first_number,3);//求x的立方printf("x的立方:%lf\n",value_3);}if(first_number==0){printf("ln值:计算结果趋于无穷,无法显示:\n");//求lnprintf("10为底的对数:计算结果趋于无穷,无法显示:\n");//以10为底的对数value_floor=floor(first_number);//取整printf("x取整:%lf\n",value_floor);value_2=pow(first_number,2);//求x的平方printf("x的平方:%lf\n",value_2);value_3=pow(first_number,3);//求x的立方printf("x的立方:%lf\n",value_3);}if(first_number<0){value_exp=exp(first_number);//以e为底的指数printf("exp值:%lf\n",value_exp);printf("ln值:X不能小于0,请重新输入:\n");//求lnprintf("10为底的对数:Y不能小于0,请重新输入:\n");//以10为底的对数value_floor=floor(first_number);//取整value_2=pow(first_number,2);//求x的平方printf("x的平方:%lf\n",value_2);value_3=pow(first_number,3);//求x的立方printf("x的立方:%lf\n",value_3);}}if(flag==5){system("CLS");printf("\n\n");printf("请输入一个数字:");scanf("%lf",&first_number);if(first_number>0){value_n=1;//求阶乘for(i=1;i<(first_number+1);i++)value_n=value_n*i;printf("n阶乘:%lf\n",value_n);value_daoshu=1/first_number;//求倒printf("x的倒数:%lf\n",value_daoshu);}if(first_number==0){value_n=1;//求阶乘for(i=1;i<(first_number+1);i++)value_n=value_n*i;printf("n阶乘:%lf\n",value_n);printf("x的立方:%lf\n",value_3);printf("x的倒数:0不能求倒\n");//求倒}if(first_number<0){printf("n阶乘:所输入数字无法求阶乘,请重新输入:\n");//求阶乘value_daoshu=1/first_number;//求倒printf("x的倒数:%lf\n",value_daoshu);}}if(flag==6)lab:{system("CLS");printf("\n\n");printf("八进制转换为其他进制请输入8,\n十进制转换为其他进制请输入10,\n十六进制转换为其他进制请输入16,\n请按照需要输入8、10或16:");scanf("%d",&act);if(act==8)//八进制转换为十进制、十六进制{printf("请输入一个八进制数字:\n\n");scanf("%o",&first_number);printf("八进制%o\n\n",first_number);printf("转换为:\n");printf("十进制%u\n",first_number);printf("十六进制%x\n",first_number);}if(act==10)//十进制转换为八进制、十六进制{printf("请输入一个十进制数字:\n\n");scanf("%d",&first_number);printf("十进制%u\n\n",first_number);printf("转换为:\n");printf("八进制%o\n",first_number);printf("十六进制%x\n",first_number);}if(act==16)//十六进制转换为八进制、十进制{printf("请输入一个十六进制数字:\n\n");scanf("%x",&first_number);printf("十六进制%x\n\n",first_number);printf("转换为:\n");printf("八进制%o\n",first_number);printf("十进制%u\n",first_number);}if(act!=8&&act!=10&&act!=16){printf("输入有误,请重新输入\n\n\n");goto lab;}}printf("\n\n\n\n");printf("是否继续运算?(Y/N) :");fflush(stdin);//清空缓存区scanf("%c",&command_begin);system("CLS");}printf("\n\n\n");printf(" * ························*\n");printf(" * *\n"); printf(" * *\n"); printf(" * --------------------谢谢使用------------------- *\n"); printf(" * *\n"); printf(" * *\n"); printf(" * ························*\n");printf("\n\n\n");printf(" 程序设计:\n\n");printf("printf("printf(" 【程序退出】\n\n\n\n\n");} //由本组成员共同设计。