简易计算器C#界面设计与代码

合集下载

简易计算器C语言代码

简易计算器C语言代码

简易计算器C语言代码 Last updated on the afternoon of January 3, 2021简易四则运算计算器计算机工具地历史而言,中国古代最早采用地一种计算工具叫筹策,又叫做算筹,这种算筹多用竹子制成,也有用木头,兽骨充当材料的,大约270枚一束,放在布袋里可随身携带。

直到今天仍在使用的住算盘,是中国古代计算工具领域中的另一项发明明代时的住算盘已经与现代的住算盘几乎相同。

17世纪初,西方国家的计算工具有了较大的发展。

英国数学家纳尔发现了“纳皮尔算筹”;英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘涂,乘方和开方运算,甚至可以计算三角函数,指数函数和对数函数。

这些计算工具不仅带动了计算的发展,也为现代计算器发展尊定了良好的基础,成为现代社会应用广泛的计算工具,如手机,操作系统上附带的多功能计算器。

项目设计目的掌握模块的划分;掌握结构体定义;掌握栈的操作;掌握函数的定义;掌握栈的基本操作;掌握VC的基本绘图库;掌握鼠标的响应操作;目设计内容设计一个含有界面的计算器,输入一个包含括号的表达式,使用栈数据类型实现整数的四则运算操作,开方运算。

项目设计要求根据分析,系统要求实现以下几点基本功能:可通过按钮输入数字、运算符;能通过按钮实现退格、清除功能;实现加、减、乘、除、开方运算功能;实现括号运算;显示运算结果;良好的交互界面。

项目详细设计功能模块图根据系统功能要求,主要含有四大模块,分别是计算器界面设计模块、计算器按键控制模块、四则混合运算模块、计算器记忆处理模块。

计算器界面设计模块:调用VC图形系统函数和字符函数画出计算器的界面,包括24个按钮和一个文本输入框。

计算机按键控制模块:计算器通过键盘按键值的判断,执行相应的操作,如接收数字输入等。

计算器计算处理模块。

计算处理模块主要完成可以包括括号的表达式运算,运算包括加,减,乘,除、开方。

计算处理模块在按键控制模块中被调用执行。

简易计算器C语言代码

简易计算器C语言代码

#include<stdio.h>#include<math.h>int main(void){int choice,t=1;printf("**********************计算器*****************************************\n"); printf(" 1.加法运算2.减法运算\n"); printf(" 3.乘法运算4.除法运算\n"); printf(" 5.平方运算6.开方运算\n"); printf(" 7.解一元二次方程By:_一念成殇、\n"); printf("**********************************************************************\n");printf("请选择您即将进行的运算方式(输入对应数字):");while(t==1){scanf("%d",&choice);if(choice>7) printf("请您输入正确的选项编号!\n");//加法if(choice==1){float addend_1,addend_2,sum;printf("请输入两个加数:\n");scanf("%f",&addend_1);scanf("%f",&addend_2);sum=addend_1+addend_2;printf("结果为:%.2f",sum);}//减法if(choice==2){float reduction,minuend,difference;printf("请输入被减数和减数:\n");scanf("%f",&reduction);scanf("%f",&minuend );difference=reduction-minuend ;printf("结果为:%.2f",difference);}//乘法if(choice==3){float multiplier_1,multiplier_2,product;printf("请输入两个乘数:\n");scanf("%f",&multiplier_1);scanf("%f",&multiplier_2);product= multiplier_1 * multiplier_2;printf("结果为:%.2f",product);}//除法if(choice==4){float dividend,divisor,conslut;printf("请输入被除数和除数:\n");scanf("%f",&dividend);scanf("%f",&divisor);conslut=dividend/divisor;printf("结果为:%.2f",conslut);}//平方if(choice==5){float base,power;printf("请输入底数:\n");scanf("%f",&base);power=base*base;printf("结果为:%.2f",power);}//开方if(choice==6){float power,base;printf("请输入需要开方的数:\n");scanf("%f",&power);base=sqrt(power);printf("结果为:%.2f",base);}//解一元二次方程if(choice==7){float a,b,c,delta,root_1,root_2;printf("方程一般形式:ax^2+bx+c=0,请输入其中常量a,b,c的值:\n"); scanf("%f",&a);if(a==0){printf("此方程不是一元二次方程!请重新输入!\n");}else{scanf("%f",&b);scanf("%f",&c);delta=(b*b)-(4*a*c);printf("△=%f\n",delta);if(delta<0){printf("此方程无实数根.\n");}else{root_1=(sqrt(delta)-b)/(2.0*a);root_2=((-b)-sqrt(delta))/(2.0*a);printf("解得:x1=%f x2=%f\n",root_1,root_2);}}}printf("\n\n\n\n请选择您即将进行的运算方式(输入对应数字):"); }return 0;}。

C语言实现计算器的两种方法

C语言实现计算器的两种方法

C语⾔实现计算器的两种⽅法本⽂实例为⼤家分享了C语⾔实现计算器的具体代码,供⼤家参考,具体内容如下C语⾔计算器两种⽅法//⼀般做法#include<stdio.h>#include<windows.h>//#include<assert.h>void menu(){printf("**************************\n");printf("****欢迎来到计算器页⾯****\n");printf("**** 1.add 2.mul *****\n");printf("*****3.sub 4.div1 *****\n");printf("*****0.exit *****\n");printf("**************************\n");}int add(int x, int y){return x + y;}int mul(int x, int y){return x * y;}int sub(int x, int y){return x - y;}int div1(int x, int y){return x / y;}int main(){int n = 1;menu();while (n){printf("请输⼊选项:\n");scanf("%d", &n);int x = 0, y = 0;/*printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);*///若将两个数字输⼊放在此处会出现输⼊错误时不能退出系统,⽽是显⽰“输⼊两个整数”的提⽰switch (n){case 1:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", add(x, y));break;case 2:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", mul(x, y));break;case 3:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", sub(x, y));break;case 4:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", div1(x, y));break;case 0:printf("退出计算器!\n");break;default:printf("输⼊错误,请重新输⼊!\n");}}}//使⽤函数指针数组解决计算器问题#include<stdio.h>#include<windows.h>//#include<assert.h>void menu(){printf("**************************\n");printf("****欢迎来到计算器页⾯****\n");printf("**** 1.add 2.mul *****\n");printf("*****3.sub 4.div1 *****\n");printf("*****0.exit *****\n");printf("**************************\n");}int add(int x, int y){return x + y;}int mul(int x, int y){return x * y;}int sub(int x, int y){return x - y;}int div1(int x, int y){return x / y;}int main(){int n = 1;menu();while (n){printf("请输⼊选项:\n");scanf("%d", &n);int(*arr[5])() = { 0,add,mul,sub,div1 };//转移表 //定义⼀个函数指针数组,存放函数地址if (n >= 0 && n < 5){int x = 0, y = 0;printf("请输⼊两个整数:>\n");scanf("%d%d", &x, &y);printf("%d\n", (*arr[n])(x,y));//输出结果}else{printf("输⼊有误,请重新输⼊!\n");scanf("%d", &n);}}system("pause");return 0;}两种⽅法相⽐,第⼀种相似代码较多,⽐较冗余;第⼆种代码简洁直观,程序效率⾼。

c简单计算器课程设计

c简单计算器课程设计

c 简单计算器课程设计一、课程目标知识目标:1. 让学生掌握简单计算器的基本操作,包括开机、关机、清除屏幕、输入数字和运算符号。

2. 使学生理解加、减、乘、除四则运算的基本概念,并能够在简单计算器上进行正确的运算操作。

3. 帮助学生识别计算器上各个按键的功能,了解其对应的数学意义。

技能目标:1. 培养学生运用简单计算器解决实际问题的能力,如购物找零、计算面积等。

2. 提高学生进行四则运算的速度和准确性,提高计算效率。

3. 引导学生掌握计算器使用技巧,如连续计算、顺序计算等。

情感态度价值观目标:1. 培养学生对计算器的正确态度,认识到计算器是学习数学的工具,而非替代品。

2. 激发学生学习数学的兴趣,让学生在轻松愉快的氛围中体验数学计算的乐趣。

3. 培养学生的合作意识,使学生在小组讨论和互助学习中提高沟通能力,培养团队精神。

本课程针对小学三年级学生设计,结合学生年龄特点,注重激发兴趣和培养动手操作能力。

课程内容紧密联系教材,将目标分解为具体的学习成果,便于后续教学设计和评估。

通过本课程的学习,学生将能够熟练运用简单计算器,提高数学计算能力,培养良好的学习习惯和团队协作能力。

二、教学内容1. 计算器的基本结构:引导学生认识计算器的外观、各部分名称及其功能。

- 教材章节:第三章第1节《认识计算器》- 内容列举:计算器按键布局、显示屏、开机与关机、清除键等。

2. 四则运算操作:讲解加、减、乘、除四则运算在计算器上的操作方法。

- 教材章节:第三章第2节《计算器的四则运算》- 内容列举:按键输入、运算顺序、连续运算、计算结果读取等。

3. 计算器使用技巧:教授计算器的高级使用技巧,提高计算效率。

- 教材章节:第三章第3节《计算器使用技巧》- 内容列举:百分比计算、乘方运算、记忆功能等。

4. 实践应用:结合实际生活场景,让学生运用计算器解决实际问题。

- 教材章节:第三章第4节《计算器在实际生活中的应用》- 内容列举:购物找零、计算面积、体积、速度等。

C语言实现计算器功能

C语言实现计算器功能

C语言实现计算器功能计算机科学中的计算器功能是一个非常常见的问题。

在C语言中,我们可以使用各种技术和算法来实现这个功能。

在本文中,我将介绍一种简单的实现方法,该方法可以处理基本的四则运算。

首先,我们需要定义我们的计算器结构。

在C语言中,我们可以使用结构来组织相关的数据和函数。

我们可以定义一个名为 Calculator 的结构体,它包含两个浮点数类型的操作数和一个字符类型的操作符。

```ctypedef structfloat operand1;float operand2;char operator;} Calculator;```接下来,我们可以定义一些辅助函数来执行各种计算。

我们可以使用switch 语句来根据操作符执行相应的操作。

我们可以使用 scanf 函数来读取用户输入的操作数和操作符。

```cfloat add(float operand1, float operand2)return operand1 + operand2;float subtract(float operand1, float operand2)return operand1 - operand2;float multiply(float operand1, float operand2)return operand1 * operand2;float divide(float operand1, float operand2)return operand1 / operand2;void calculate(Calculator* calculator)switch(calculator->operator)case '+':printf("Result: %f\n", add(calculator->operand1, calculator->operand2));break;case '-':printf("Result: %f\n", subtract(calculator->operand1, calculator->operand2));break;case '*':printf("Result: %f\n", multiply(calculator->operand1, calculator->operand2));break;case '/':printf("Result: %f\n", divide(calculator->operand1,calculator->operand2));break;default:printf("Invalid operator\n");break;}```现在我们可以编写一个主函数来演示我们的计算器功能。

简单介绍简易计算器的使用方法

简单介绍简易计算器的使用方法

简单介绍简易计算器的使用方法简易计算器使用方法计算器是我们日常生活中常见的小工具之一,它能够方便快捷地完成各种数学运算。

在本文中,我们将简单介绍一下简易计算器的使用方法,帮助大家更好地利用这个小工具。

一、开机与关闭使用简易计算器之前,首先需要开机。

通常,在计算器上会有一个电源开关,打开开关后,计算器便会自动启动。

要关闭计算器,只需要将电源开关关闭即可。

二、数字输入在简易计算器上,数字输入是最基本的操作。

计算器通常会有一个数字键盘,上面标有0到9的数字。

通过按下相应的数字键,可以输入需要计算的数值。

输入多位数时,只需按照正确的顺序依次按下每个数字键。

三、基本运算简易计算器能够完成四则运算,包括加法、减法、乘法和除法。

使用计算器进行基本运算时,需要按下特定的运算符键。

1. 加法:简易计算器上通常会有一个“+”键,按下该键后,计算器会把当前输入的数值记为被加数,再输入另一个数值,按下“=”键,计算器就会显示它们的和。

2. 减法:类似地,简易计算器上通常会有一个“-”键,按下该键后,计算器会把当前输入的数值记为被减数,再输入一个数值,按下“=”键,计算器就会显示它们的差。

3. 乘法:简易计算器上通常会有一个“×”键,按下该键后,计算器会把当前输入的数值记为被乘数,再输入一个数值,按下“=”键,计算器就会显示它们的积。

4. 除法:类似地,简易计算器上通常会有一个“÷”键,按下该键后,计算器会把当前输入的数值记为被除数,再输入一个数值,按下“=”键,计算器就会显示它们的商。

四、小数与分数计算除了整数运算,简易计算器还可以进行小数和分数的计算。

对于小数的输入,直接使用数字键盘即可,对于分数的输入,则需要使用特定的输入方式。

通常,在计算器上会有一个“分数”键或“1/x”键,按下该键后,计算器会进入分数输入模式,在屏幕上显示分子和分母的输入框,通过按下数字键来输入相应的分子和分母。

输入完毕后,按下“=”键,计算器就会进行分数的计算。

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

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

- - . 《程序设计基础(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时进入该函数,从而进行该功能函数的计算。

c的简易计算器(已通过实测)初学者参考

c的简易计算器(已通过实测)初学者参考

void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况 下就是整块 LCD 是坏的。 状态 2 屏上显示两排灰格
产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照 标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)----补充:也有 可能是对比度太大,建议优先调整对比度电阻 状态 3 显示乱码
/*********************************




************************************/
void inter0() interrupt 0
{
unsigned char n;
delay_10ms();//延时
if(INT0==0)//没键按下
数量 1 17 1 9 1 1 1 2 1
--
--
2.3 硬件设计电路图 将 4*4 的键盘直接接在 P1 口上,用 P0 口作为 LCD 的显示输出,
P3.2 口的 INT0 作为外部中断位。
LCD1
LM016L
D0 D1 D2 D3 D4 D5 D6 D7
RS RW E
VSS VDD VEE
7 控制电路
微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复

C语言实现简易计算器(可作加减乘除)

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语言编写计算器

#define MAX 80#define MAX1 40#define MAX2 40#define NULL 0#include <stdio.h>#include <math.h>typedef struct{double A[ MAX1 ];int top1;}shuju;typedef struct{char B[ MAX2 ];int top2;}yunsuanfu;void chushihua1(shuju *p) {p->top1 = 0;}void chushihua2(yunsuanfu *p) {p->top2 = 0;}int charu1(shuju *p,double x) {if(p->top1 >= (MAX1 - 1)) {return 0;}else{p->A[ p->top1 ] = x;p->top1++;return 1;}}int charu2(yunsuanfu *p,char x) {if(p->top2 >= (MAX2 - 1)){printf("you are wrong2\n");return 0;}else{p->B[ p->top2 ] = x;p->top2++;return 1;}}int chuzhuan1(shuju *p,double *x) {if(p->top1 < 0){return 0;}else{p->top1--;*x=p->A[ p->top1 ];return 1;}}int chuzhuan2(yunsuanfu *p,char *x){if(p->top2 < 0){printf("you are wrong22\n");return 0;}else{p->top2--;*x=p->B[ p->top2 ];return 1;}}int op(char f,char b){if((f == '(' && b == ')') || (f == '\0' && b == '\0')) return 2;else if(((b == '*' || b == '/') && (f == '+' || f == '-'))||(b == '(' && f != ')') || ((f == '(' || f == '\0') && (b == '+' || b == '/' || b == '-' || b == '*')))return -1;else if((b == '\0' && f != '(') || (b == ')' && f != '\0') || b == f || ((f == '*' || f == '/' || f == ')') && (b == '+' || b == '/' || b == '-' || b == '*')))return 1;else{printf("\t\t\tyou are wrong\n");return 0;}}double zhuanhuan(int x,int y,char a[]){int i, j=0, k;double n=0;for(i=x; i<y; i++){if(a[ i ] != '.')n = n*10+a[ i ]-'0';else j=i;}if(j == 0)return n;else{for(k=0; k < i-1-j; k++)n = n/10;return n;}}double f1(shuju *a,yunsuanfu *b) {double m, m1, m2;char x;chuzhuan2(b, &x);chuzhuan1(a, &m1);chuzhuan1(a, &m2);if(x == '*')m = m1*m2;else if(x == '+')m = m1+m2;else if(x == '-')m = m2-m1;else if(x == '/')if(m1 == 0){printf("\t\t\tyou are wrong\n");jieshu();}elsem = m2/m1;charu1(a, m);return m;}void f2(int j, yunsuanfu *b, char k[]) {charu2(b, k[ j ]);}void jiemian(){system("cls");printf("\n");printf("\t\t\t C O U N T E R\n");textcolor(5);cprintf("*********************************************************************** ********");printf("\n\n");printf("\t\t\tPlease input your exprssion\n");printf("\t\t\t ");}jieshu(){char c;printf("Are you contiune?(y/n) ");while(1){c = getch();printf("\n");if(c == 'y' || c == 'Y')main();else if(c == 'n' || c == 'N'){system("cls");printf("\n\n\t\t\t Thank you use the counter\n");printf("\t\t\t");getch();exit(0);}else{printf("\t\t\t");cprintf("Please input y/n!");printf("\n");printf("\t\t\t");continue;}}}main(){int i=0,j=0,bi,b1,B=0;double n,m1,m2,m=0;char k[ MAX ],ch='\0',x;shuju a;yunsuanfu b;chushihua1( &a );chushihua2( &b );charu2( &b, '\0' );jiemian();gets(k);while(k[ i ] != '\0'){if(k[ j ] == 's' && k[ j+2 ] == 'n'){j = j+3;i = j;B = 1;}else if(k[ j ] == 'c' && k[ j+2 ] == 's'){j = j+3;i = j;B = 2;}else if(k[ j ] == 't' && k[ j+2 ] == 'n'){j = j+3;i = j;B = 3;}else if(k[ j ] == 'l' && k[ j+2 ] == 'g'){j = j+3;i = j;B = 4;}else if(k[ j ] == 'l' && k[ j+1 ] == 'n'){j = j+2;i = j;B = 5;}while(k[ j ] == '.' || (k[ j ] >= '0' && k[ j ] <= '9' ))j++;n=zhuanhuan(i,j,k);switch(B){case 1: n=sin(n);break; case 2: n=cos(n);break; case 3: n=tan(n);break; case 4: n=log10(n);break; case 5: n=log(n);}charu1(&a, n);b1 = 0;while(b1 == 0){bi = op(ch, k[j] );if(bi == 0)jieshu();while(bi == 1){m = f1(&a, &b);chuzhuan2(&b, &ch);bi = op(ch, k[ j ]);charu2(&b, ch);}if(bi == -1){do{f2(j, &b,k);j++;}while(k[j ] == '(');j--;}else if(bi == 2){if(ch == '('){if(k[ j ] == ')')j++;chuzhuan2(&b, &ch);chuzhuan2(&b, &ch);charu2(&b, ch);continue;}else chuzhuan1(&a, &m); }b1 = 1;}if(k[ j ] == '\0')break;else{ch = k[ j ];j++;}i = j;B = 0;}printf("\t\t\t");textcolor(30);cprintf("The answer is %f",m); printf("\n");jieshu();}。

单片机简易计算器C代码

单片机简易计算器C代码

*****************************************************************************/ #include <>#include <>#include <>#define uchar unsigned char#define DATA=P0sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;/*----------------------------函数声明------------------------------*/void delay(unsigned int i);uchar keyscan(void);void LCD_Init(void);bit LCD_Busy(void);void LCD_Write_CMD(uchar command);void LCD_Write_DATA(uchar date);/*----------------------------delay------------------------------*/void delay(unsigned int i)//延时函数{while(i--);}/*----------------------------keyscan------------------------------*/uchar keyscan(void)//逐行扫描法{uchar H_line,L_line,Num=0;//行列值P3=0x1e; //行线第一条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='7';break;//7 按下相应的键显示相对应的码值case 0x17:Num='8';break;//8case 0x1b:Num='9';break;//9case 0x1d:Num='F';break;//Fcase 0x1e:Num='+';break;//+}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x1d; //行线第二条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='4';break;//4 按下相应的键显示相对应的码值case 0x17:Num='5';break;//5case 0x1b:Num='6';break;//6case 0x1d:Num='E';break;//Ecase 0x1e:Num='-';break;//-}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x1b; //行线第三条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='1';break;//1 按下相应的键显示相对应的码值case 0x17:Num='2';break;//2case 0x1b:Num='3';break;//3case 0x1d:Num='D';break;//Dcase 0x1e:Num='*';break;//*}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x17; //行线第四条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='0';break;//0 按下相应的键显示相对应的码值case 0x17:Num='A';break;//Acase 0x1b:Num='B';break;//Bcase 0x1d:Num='C';break;//Ccase 0x1e:Num='/';break;///}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x0f; //行线第五条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='b';break;//b 按下相应的键显示相对应的码值case 0x17:Num='o';break;//ocase 0x1b:Num='h';break;//hcase 0x1d:Num='R';break;//Rcase 0x1e:Num='=';break;//=号}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}while(Num!=0)return Num;}/*-------------------------LCD_Init---------------------*/void LCD_Init(void){EN=0;LCD_Write_CMD(0x38);delay(15);LCD_Write_CMD(0x38);delay(15);LCD_Write_CMD(0x38);delay(15);LCD_Write_CMD(0x0d);delay(15);LCD_Write_CMD(0x06);delay(15);LCD_Write_CMD(0x01);}/*-------------------------LCD_Busy---------------------*/bit LCD_Busy(void){bit result;RS=0; //读指令RW=1;EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);EN=0;return result;}/*----------------------LCD_Write_CMD----------------------------*/ void LCD_Write_CMD(uchar command){bit Busy_flag;Busy_flag=LCD_Busy();while(Busy_flag)Busy_flag=LCD_Busy(); // 判RS=0;RW=0;EN=1;P0=command;delay(100);EN=0;}/*----------------------LCD_Write_DATA----------------------------*/ void LCD_Write_DATA(uchar date){bit Busy_flag;Busy_flag=LCD_Busy();while(Busy_flag)Busy_flag=LCD_Busy(); // 判定LCD 是不是忙碌RS=1;RW=0;EN=1;P0=date;delay(10);EN=0;}/*----------------------------main--------------------------------*/void main(void){uchar key;long int num1=0,num2=0,result=0;int cnt1=0,cnt2=0,k;unsigned int flagcal=0,flagtrs=0;//运算符标志uchar rem0,rem1,rem2;//寄存运算符char num;unsigned char data Str1[10]={0};//寄存数据LCD_Init();LCD_Write_CMD(0x80);// 设置显示位置( 第一行开头)delay(500);LCD_Write_DATA('0');//测试用LCD_Write_CMD(0x80);while(1){key=keyscan();if(key=='R'){LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);break;}/*-------------------------------大体运算------------------------------*/ if (!(key=='o'||key=='b'||key=='h')){if(flagtrs==1) //进制转换启动条件{Str1[cnt1++]=key; //能存上了if(rem1=='o'){if(key>='A'&&key<='F'){LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('E');LCD_Write_DATA('r');LCD_Write_DATA('r');delay(500000);cnt1=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);break;}}if(rem1=='b'){if((key>='A'&&key<='F')||(key>='2'&&key<='9')){LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('E');LCD_Write_DATA('r');LCD_Write_DATA('r');delay(500000);cnt1=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);break;}}if(key>='A'&&key<='F'){LCD_Write_DATA(key);}}if(key>='0'&&key<='9'){LCD_Write_DATA(key);if(flagcal==0){num1=num1*10+key-'0';if(num1>||num1<-) //溢犯错误{LCD_Write_CMD(0x01);delay(5);LCD_Write_CMD(0x80);delay(5);LCD_Write_DATA('E');delay(5);LCD_Write_DATA('r');delay(5);LCD_Write_DATA('r');break;num1=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);}}else{num2=num2*10+key-'0';if(num2>||num2<-) //溢犯错误{LCD_Write_CMD(0x01);delay(5);LCD_Write_CMD(0x80);LCD_Write_DATA('E');delay(5);LCD_Write_DATA('r');delay(5);LCD_Write_DATA('r');break;num2=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);}}}if(key=='+'||key=='-'||key=='*'||key=='/'){LCD_Write_DATA(key);LCD_Write_CMD(0xc0);flagcal=1;switch(key){case '+':rem0='+';break;case '-':rem0='-';break;case '*':rem0='*';break;case '/':rem0='/';break;}}if(key=='='){LCD_Write_DATA('=');LCD_Write_CMD(0x8f);LCD_Write_CMD(0x04);switch(rem0){case '+':result=num1+num2;num2=0;num1=0;break;case '-':if(num1>=num2)result=num1-num2;else result=num2-num1;break;case '*':result=num1*num2;num2=0;num1=0;break;case '/':if(num2!=0)result=num1/num2;elseresult=9;num2=0;num1=0;break;default :result=num1;break;}if(result>||result<-) //溢犯错误{LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('E');LCD_Write_DATA('r');LCD_Write_DATA('r');break;result=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);}for(;result!=0;){num=result%10+'0';LCD_Write_DATA(num);result/=10;}if(num1<num2)LCD_Write_DATA('-');}}/*----------------------------------- 进制转换------------------------------*/ else{if(flagtrs==0){LCD_Write_DATA(key);flagtrs=1;switch(key){case 'o':rem1='o';break;case 'b':rem1='b';break;case 'h':rem1='h';break;}}else{LCD_Write_DATA(key);flagtrs=2;switch(key){case 'o':rem2='o';break;case 'b':rem2='b';break;case 'h':rem2='h';break;}if(rem1=='o'&&rem2=='b')//10-2{LCD_Write_CMD(0xc0);LCD_Write_DATA('o');LCD_Write_DATA('-');LCD_Write_DATA('b');LCD_Write_CMD(0x8f);LCD_Write_CMD(0x04);cnt2=cnt1-1;num1=cnt1+'0';LCD_Write_DATA('b');num1=0;//num=cnt2+'0';//LCD_Write_DATA(num); //测试用。

C语言简易计算器的实现

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语言实现简单计算器程序

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,在循环体中许多执⾏操作会将该数值保存到栈中,之后打印该值,⽤户体验度⽐较差。

c语言四则运算计算器

c语言四则运算计算器

c语言四则运算计算器C语言四则运算计算器摘要:计算器是我们日常生活中常见和实用的工具之一。

本文将介绍如何使用C语言编写一个简单的四则运算计算器。

首先,我们将了解四则运算的定义和原则。

然后,我们将逐步介绍计算器的实现,包括用户输入、运算符识别和运算结果输出。

最后,我们将通过示例演示计算器的使用,并讨论一些功能的改进。

1.引言计算器是一种用于执行基本数学运算的设备或工具。

它通常可以进行加法、减法、乘法和除法等四个基本运算符的操作。

许多计算器还具有其他功能,如求平方根、百分比计算等。

编写一个计算器程序涉及到基本的输入、运算和输出。

2.四则运算的定义与原则四则运算是指加法、减法、乘法和除法四个基本运算。

这些运算符有一定的运算规则和优先级,如乘法和除法优先于加法和减法。

在编写计算器程序时,我们需要遵循这些原则来确保正确的运算结果。

3.计算器的实现3.1 用户输入使用C语言编写计算器程序的第一步是获取用户的输入。

通常,用户可以通过控制台或图形用户界面输入计算表达式。

在本文中,我们将使用控制台输入。

用户输入应该是一个合法的表示式,其中包含数值和运算符。

3.2 运算符识别在得到用户输入后,我们需要识别表达式中的运算符,以便进行运算。

常见的运算符有加号(+)、减号(-)、乘号(*)和除号(/)。

我们可以使用条件语句或函数来判断输入的运算符,并将其转化为相应的计算操作。

3.3 运算结果输出一旦我们完成了运算,我们需要将结果输出给用户。

输出可以是一段文字或数字,可以打印在控制台上,也可以显示在图形界面上。

在C语言中,我们可以使用printf函数来输出结果。

根据需要,我们可以将结果四舍五入,设置特定的精度或格式。

4.示例演示让我们通过一个示例来展示计算器的使用。

假设用户输入表达式\。

C语言实现科学计算器的加减乘除平方开放运算

C语言实现科学计算器的加减乘除平方开放运算

C语言实现科学计算器的加减乘除平方开放运算科学计算器是一种能够进行各种高级数学运算的工具。

在这个项目中,我们将使用C语言实现一个简单的科学计算器,它能够执行加法、减法、乘法、除法、平方和开方等运算。

首先,让我们来设计计算器的基本框架。

我们可以使用一个循环来接受用户的输入,并根据输入的指令执行相应的运算。

我们可以使用一个变量来存储当前的结果,并在每次运算完成后更新该变量。

以下是一个简单的代码框架:```c#include <stdio.h>#include <math.h>int maidouble result = 0; // 存储当前的结果char operation; // 存储用户的指令while (1)//显示当前的结果printf("当前结果:%lf\n", result);//获取用户的指令printf("请输入指令:");scanf(" %c", &operation);//根据用户的指令执行相应的运算switch (operation)case '+'://执行加法运算break;case '-'://执行减法运算break;case '*'://执行乘法运算break;case '/'://执行除法运算break;case 's'://执行平方运算break;case 'r'://执行开方运算break;case 'q'://退出计算器return 0;default:printf("无效的指令\n");}}return 0;```在代码中,我们使用了`switch`语句来根据用户的指令执行相应的运算。

接下来,我们将详细说明每个运算的实现。

1.加法运算:用户可以输入两个数,并将它们相加。

c简单计算器代码

c简单计算器代码
}*/
}
break;
case IDC_NUM0:
{
GetDlgItemText(hwnd,IDC_TEXT,num,sizeof(num));
wsprintf(num,"%s0",num);
SetDlgItemText(hwnd,IDC_TEXT,num);
}
break;
case IDC_NUM1:
SetDlgItemText(hwnd,IDC_TEXT,num);
}
break;
case IDC_NUM8:
{
GetDlgItemText(hwnd,IDC_TEXT,num,sizeof(num));
wsprintf(num,"%s8",num);
SetDlgItemText(hwnd,IDC_TEXT,num);
}
else{
n3=n1+n2;
//ltoa()
//ltoa(n3,num3,16);
//wsprintf(num3,"%f",n3);
//MessageBox(hwnd,num3,num3,MB_OK);
gcvt(n3,c,num3);
SetDlgItemText(hwnd,IDC_NUM3,num3);
int i=strlen(num);
if(num[i-1]=='*'){
break;
}
wsprintf(num,"%s*",num);
SetDlgItemText(hwnd,IDC_TEXT,num);
}
break;
case IDC_CHU:
{
GetDlgItemText(hwnd,IDC_TEXT,num,sizeof(num));

C编写简易计算器附源代码超详细

C编写简易计算器附源代码超详细

超详细一、因为计算器设计的控件太多,不便使用控制台应用程序完成,所以这里使用Windows窗体应用程序,并命名为Calc,如下图所示:二、向窗体中拖入需要的控件,如下图所示:(完成效果图)结果显示区(作者博客左边的文本框)是TextBox控件,并修改其name为txtShow ,按键0~9为Button控件,并将其name分别修改为btn_0、btn_1、btn_2、btn_3、btn_4、btn_5、btn_6、btn_7、btn_8、btn_9;按键【负数】的name值修改为btn_sign,按键【.】的name 修改为btn_dot,按键【+ - * /】的name值分别修改为btn_add、btn_sub、btn_mul、btn_div,按键【=】的name值修改为btn_equ,按键【倒数】的name值修改为btn_rev,按键【平方】的name值修改为btn_sqr,按键【开方】的name值修改为btn_sqrt。

右边的计算器图片空间是PictureBox,作者博客控件是LinkLabel,可以不添加,以上所有控件均可按照需求添加,只保留自己需要的按钮控件和textbox控件即可。

三、代码部分(含解释),采用switch多分支语句编写using System;using System.Drawing;using System.Collections;using ponentModel;using ;using System.Data;namespace Calc{///<summary>/// QQ:6 温柔一刀C#简易计算器的实现///</summary>public class CalcForm :{private btn_0;private btn_1;private btn_2;private btn_3;private btn_4;private btn_5;private btn_6;private btn_7;private btn_8;private btn_9;private btn_add;private btn_sub;private btn_mul;private btn_div;private btn_sqrt;private btn_sign;private btn_equ;private btn_dot;private btn_rev;private txtShow;private btn_sqr;private PictureBox pictureBox1;private LinkLabel linkLabel1;///<summary>///必需的设计器变量。

用C语言实现多项式简单计算器的设计概要

用C语言实现多项式简单计算器的设计概要

用C语言实现多项式简单计算器的设计概要一、引言多项式是数学中重要的概念之一,在实际问题中经常用到。

多项式的运算包括加法、减法、乘法和除法等,因此设计一个多项式简单计算器是很有实用价值的。

本文将使用C语言实现多项式简单计算器的设计概要。

二、设计目标多项式简单计算器的设计目标是实现多项式的基本运算,包括多项式的输入、输出和常见运算。

具体目标如下:1.可以输入多项式,并以合适的格式显示出来;2.可以进行两个多项式的加法、减法和乘法运算;3.可以进行一个多项式的常数乘法;4.可以进行多项式的求导;5.可以根据给定点的横坐标,计算多项式的函数值;6.可以清空计算器的当前结果。

三、设计思路为了实现以上目标,需要设计以下功能模块:1.输入模块:从键盘获取用户输入,并将输入的多项式存储起来;2.输出模块:以合适的格式将多项式输出到屏幕上;3.加法模块:将两个输入的多项式相加,生成一个新的多项式;4.减法模块:将第二个输入的多项式从第一个输入的多项式中减去,生成一个新的多项式;5.乘法模块:将两个输入的多项式相乘,生成一个新的多项式;6.常数乘法模块:将一个输入的多项式与指定常数相乘,生成一个新的多项式;7.求导模块:对输入的多项式进行求导运算,生成一个新的多项式;8.函数值计算模块:根据给定点的横坐标,计算多项式在该点的函数值;9.清空模块:清空当前计算器的结果。

四、设计过程1.输入模块的设计输入模块可以通过逐项输入多项式的系数和指数,使用链表来存储多项式。

每一个链表节点包括系数(coefficient)和指数(exponent),使用两个变量分别存储。

可以引入一个头指针和一个尾指针来指向链表的首和尾部。

2.输出模块的设计输出模块将使用循环遍历链表,根据每个节点的系数和指数,将多项式以合适的格式输出到屏幕上。

3.加法模块的设计加法模块将根据两个链表的节点的指数进行比较,如果指数相等,则将系数相加,并将结果存储到一个新的链表中。

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

{ setText("7"); } private void btn8_Click(object sender, EventArgs e) { setText("8"); } private void btn9_Click(object sender, EventArgs e) { setText("9"); } private void btn0_Click(object sender, EventArgs e) { setText("0"); } private void btnPoint_Click(object sender, EventArgs e) { setDecimal(); } private void bgs e) { changeSign(); } private void btnEqual_Click(object sender, EventArgs e) { doEquals(); } private void btnAdd_Click(object sender, EventArgs e) { setOperator(1); } private void btnSub_Click(object sender, EventArgs e) {
private void changeSign() { double storNum; if (textBox1.Text.Length > 0) { storNum = double.Parse(textBox1.Text); storNum *= -1; textBox1.Text = storNum.ToString(); } btnEqual.Select(); //设置"="号的焦点 } //执行运算 private void doEquals() { if (isNokeydown) 号键 { mainNum2 = double.Parse(textBox1.Text); setText("clear"); Calc(mainNum1, mainNum2, opMain); isDone = true; isNokeydown = false; } } //设置运算类型 private void setOperator(int operation) { if (textBox1.Text.Length > 0) { opMain = operation; mainNum1 = double.Parse(textBox1.Text); isSecond = true; isDone = false; isNokeydown = true; btnEqual.Select(); //设置"="号的焦点 } } //设置小数点
isDone = false; } else { if (isKeyupclear) 键的判断 { textBox1.Text = textest; isKeyupclear = false; } else textBox1.Text += textest; } } } btnEqual.Select(); //设置"="号的焦点 //对是否按下clear
} public void Calc(double num1, double num2, int op) { double answer = 0; switch (op) //判断所进行的运算 { case 1: answer = num1 + num2; break; case 2: answer = num1 - num2; break; case 3: answer = num1 * num2; break; case 4: answer = num1 / num2; break; case 5: answer = num1 % num2; break; } setText(answer.ToString()); //显示结果 } //切换正负
setOperator(2); } private void btnMulti_Click(object sender, EventArgs e) { setOperator(3); } private void btnDivide_Click(object sender, EventArgs e) { setOperator(4); } private void btnC_Click(object sender, EventArgs e) { isSecond = false; setText("clear"); } private void btnSqrt_Click(object sender, EventArgs e) { doSquart(); } private void btnBackspace_Click(object sender, EventArgs e) { string old = textBox1.Text; if (old.Length > 1 && old != "0.") textBox1.Text = old.Substring(0, old.Length - 1); else textBox1.Text = "0."; }
//判断已经输入第二个数后按了"="
private void setDecimal() { if (!isDecimal) { setText("."); isDecimal = true; } btnEqual.Select(); //设置"="号的焦点 } private void btn1_Click(object sender, EventArgs e) { setText("1"); } private void btn2_Click(object sender, EventArgs e) { setText("2"); } private void btn3_Click(object sender, EventArgs e) { setText("3"); } private void btn4_Click(object sender, EventArgs e) { setText("4"); } private void btn5_Click(object sender, EventArgs e) { setText("5"); } private void btn6_Click(object sender, EventArgs e) { setText("6"); } private void btn7_Click(object sender, EventArgs e)
} }
简易计算器C#界面设计与代码
简易计算器是用vs2008编译的c#程序,仅供参考,存在不足之处,望大家见谅! windows界面设计
using using using using using using using using
System; System.Collections.Generic; ponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;
private void doSquart() { double storNum; storNum = double.Parse(textBox1.Text);
if (storNum > 0) { storNum = Math.Sqrt(storNum); textBox1.Text = storNum.ToString(); } else textBox1.Text = "负数不能开平方。"; btnEqual.Select(); //设置"="号的焦点 } private void btnπ_Click(object sender, EventArgs e) { setText("3.1415926"); } private void btnPercentage_Click(object sender, EventArgs e) { setOperator(5); } private void btnReciprocal_Click(object sender, EventArgs e) { doreciprocal(); } private void doreciprocal() { double storNum; storNum = double.Parse(textBox1.Text); if (storNum != 0) { storNum = 1 / storNum; textBox1.Text = storNum.ToString(); } else textBox1.Text = "除数不能为零。"; btnEqual.Select(); }
namespace 简易计算器 { public partial class Form1 : Form {
public Form1() { InitializeComponent(); } private int opMain = 0; // 运算类型,其中1(加法) 2(减法) 3(乘法) 4(除法) private double mainNum1 = 0; // 存储第一个数 private double mainNum2 = 0; // 存储第二个数 private bool isSecond = false; // 用来判断输入的是第一个还是第二 个数 private bool isDone = false; // 用来判断是否按了等于按钮 private bool isDecimal = false; // 用来判断是否有小数 private bool isNokeydown = false;// 用来判断是否没输入第二个数而 按了"="号键 private bool isKeyupclear = true;//用来判断是否按了clear键,程序开 始前默认按了; public void setText(string textest) //设置文本框的值 { if (textest.Equals("clear")) { textBox1.Text = "0."; isSecond = false; isDone = false; isDecimal = false; isKeyupclear = true; } else { if (isSecond) { textBox1.Text = textest; isSecond = false; isDecimal = false; } else { if (isDone) { textBox1.Text = textest;
相关文档
最新文档