C语言实现 计算器(堆栈)

合集下载

简易计算器C语言代码

简易计算器C语言代码

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

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

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

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

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

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

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

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

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

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

计算器计算处理模块。

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

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

处理模块是通过栈来实现的,分别定义了两个顺序栈,一个用来存放操作符栈,一个用来存放操作数栈。

计算器记忆处理模块。

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语言计数器编程基础问题,并详细介绍c语言计数器编程的基础知识和实践应用。

【引言】计数器是计算机编程中常用的一种数据结构,它可以用来记录某个事件发生的次数或者执行某个任务的进度。

在C语言中,计数器可以通过使用变量或者数组来实现。

本文将详细介绍C语言计数器编程的基础知识和实践应用,希望能对初学者有所帮助。

【1. C语言计数器的基础知识】在C语言中,计数器通常是一个整型变量或者整型数组。

它用来存储一个事件发生的次数。

计数器的初始化可以通过赋初值或者置零来实现。

【2. 使用单个变量实现C语言计数器】使用单个变量实现计数器是最简单的方法之一。

以下是一个示例代码:c#include <stdio.h>int main() {int count = 0; 计数器初始化为0for (int i = 0; i < 10; i++) {count++; 事件发生,计数器加1}printf("事件发生的次数为:d\n", count); 输出计数器的值return 0;}在以上示例代码中,我们通过使用一个整型变量`count`来实现计数器。

通过循环10次,每次循环中计数器加1,最终输出计数器的值。

【3. 使用数组实现C语言计数器】当需要同时统计多个事件的发生次数时,可以使用数组来实现计数器。

以下是一个示例代码:c#include <stdio.h>int main() {int count[5] = {0}; 计数器初始化为0for (int i = 0; i < 10; i++) {int event = i 5; 模运算获取事件索引count[event]++; 事件发生,对应计数器加1}for (int i = 0; i < 5; i++) {printf("事件d发生的次数为:d\n", i, count[i]); 输出各个计数器的值}return 0;}在以上示例代码中,我们通过使用一个长度为5的整型数组`count`来实现计数器。

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;}```现在我们可以编写一个主函数来演示我们的计算器功能。

计算器编程c语言

计算器编程c语言

计算器编程 c语言用C语言设计计算器程序源代码#include <dos.h> /*DOS接口函数*/#include <math.h> /*数学函数的定义*/#include <conio.h> /*屏幕操作函数*/函数*/#include <stdio.h> /*I/O#include <stdlib.h> /*库函数*/变量长度参数表*/#include <stdarg.h> /*图形函数*/#include <graphics.h> /*字符串函数*/#include <string.h> /*字符操作函数*/#include <ctype.h> /*#define UP 0x48 /*光标上移键*/#define DOWN 0x50 /*光标下移键*/#define LEFT 0x4b /*光标左移键*/#define RIGHT 0x4d /*光标右移键*/#define ENTER 0x0d /*回车键*/void *rar; /*全局变量,保存光标图象*/使用调色板信息*/struct palettetype palette; /*int GraphDriver; /* 图形设备驱动*/int GraphMode; /* 图形模式值*/int ErrorCode; /* 错误代码*/int MaxColors; /* 可用颜色的最大数值*/int MaxX, MaxY; /* 屏幕的最大分辨率*/double AspectRatio; /* 屏幕的像素比*/void drawboder(void); /*画边框函数*/初始化函数*/void initialize(void); /*计算器计算函数*/void computer(void); /*改变文本样式函数*/ void changetextstyle(int font, int direction, int charsize); /*窗口函数*/void mwindow(char *header); /*/*获取特殊键函数*/int specialkey(void) ;设置箭头光标函数*//*int arrow();/*主函数*/int main(){设置系统进入图形模式 */initialize();/*运行计算器 */computer(); /*系统关闭图形模式返回文本模式*/closegraph();/*/*结束程序*/return(0);}/* 设置系统进入图形模式 */void initialize(void){int xasp, yasp; /* 用于读x和y方向纵横比*/GraphDriver = DETECT; /* 自动检测显示器*/initgraph( &GraphDriver, &GraphMode, "" );/*初始化图形系统*/ErrorCode = graphresult(); /*读初始化结果*/如果初始化时出现错误*/if( ErrorCode != grOk ) /*{printf("Graphics System Error: %s\n",显示错误代码*/grapherrormsg( ErrorCode ) ); /*退出*/exit( 1 ); /*}getpalette( &palette ); /* 读面板信息*/MaxColors = getmaxcolor() + 1; /* 读取颜色的最大值*/MaxX = getmaxx(); /* 读屏幕尺寸 */MaxY = getmaxy(); /* 读屏幕尺寸 */getaspectratio( &xasp, &yasp ); /* 拷贝纵横比到变量中*/计算纵横比值*/ AspectRatio = (double)xasp/(double)yasp;/*}/*计算器函数*/void computer(void){定义视口类型变量*/struct viewporttype vp; /*int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;操作数和计算结果变量*/float num1=0,num2=0,result; /*char cnum[5],str2[20]={""},c,temp[20]={""};定义字符串在按钮图形上显示的符号 char str1[]="1230.456+-789*/Qc=^%";/**/mwindow( "Calculator" ); /*显示主窗口 */设置灰颜色值*//*color = 7;getviewsettings( &vp ); /* 读取当前窗口的大小*/width=(vp.right+1)/10; /* 设置按钮宽度 */设置按钮高度 */height=(vp.bottom-10)/10 ; /*/*设置x的坐标值*/x = width /2;设置y的坐标值*/y = height/2; /*setfillstyle(SOLID_FILL, color+3);bar( x+width*2, y, x+7*width, y+height );/*画一个二维矩形条显示运算数和结果*/setcolor( color+3 ); /*设置淡绿颜色边框线*/rectangle( x+width*2, y, x+7*width, y+height );/*画一个矩形边框线*/设置颜色为红色*/setcolor(RED); /*输出字符串"0."*/outtextxy(x+3*width,y+height/2,"0."); /*/*设置x的坐标值*/x =2*width-width/2;设置y的坐标值*/y =2*height+height/2; /*画按钮*/for( j=0 ; j<4 ; ++j ) /*{for( i=0 ; i<5 ; ++i ){setfillstyle(SOLID_FILL, color);setcolor(RED);bar( x, y, x+width, y+height ); /*画一个矩形条*/rectangle( x, y, x+width, y+height );sprintf(str2,"%c",str1[j*5+i]);/*将字符保存到str2中*/outtextxy( x+(width/2), y+height/2, str2);移动列坐标*/x =x+width+ (width / 2) ;/*}y +=(height/2)*3; /* 移动行坐标*/x =2*width-width/2; /*复位列坐标*/}x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y); /*移动光标到x,y位置*/显示光标*/arrow(); /*putimage(x,y,rar,XOR_PUT);m=0;n=0;设置str2为空串*/strcpy(str2,""); /*当压下Alt+x键结束程序,否则执行下面的循环while((v=specialkey())!=45) /**/{当压下键不是回车时*/while((v=specialkey())!=ENTER) /*{putimage(x,y,rar,XOR_PUT); /*显示光标图象*/if(v==RIGHT) /*右移箭头时新位置计算*/if(x>=x0+6*width)如果右移,移到尾,则移动到最左边字符位置*//*{x=x0;m=0;}else{x=x+width+width/2;m++;否则,右移到下一个字符位置*/} /*if(v==LEFT) /*左移箭头时新位置计算*/if(x<=x0){x=x0+6*width;m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/else{x=x-width-width/2;m--;} /*否则,左移到前一个字符位置*/if(v==UP) /*上移箭头时新位置计算*/if(y<=y0){y=y0+4*height+height/2;n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/else{y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/if(v==DOWN) /*下移箭头时新位置计算*/if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/else{y=y+height+height/2;n++;} /*否则,移到下边一个字符位置*/putimage(x,y,rar,XOR_PUT); /*在新的位置显示光标箭头*/ }将字符保存到变量c中*/c=str1[n*5+m]; /*判断是否是数字或小数点*/if(isdigit(c)||c=='.') /*{如果标志为-1,表明为负数*/if(flag==-1) /*{将负号连接到字符串中*/strcpy(str2,"-"); /*flag=1;} /*将标志值恢复为1*/将字符保存到字符串变量temp中*/ sprintf(temp,"%c",c); /*将temp中的字符串连接到str2中*/strcat(str2,temp); /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,str2); /*}if(c=='+'){将第一个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算加法标志值*/act=1; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='-'){如果str2为空,说明是负号,而不是减号*/ if(strcmp(str2,"")==0) /*设置负数标志*/flag=-1; /*else{将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*act=2; /*做计算减法标志值*/setfillstyle(SOLID_FILL,color+3);画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}}if(c=='*'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算乘法标志值*/act=3; /*setfillstyle(SOLID_FILL,color+3); bar(2*width+width/2,height/2,15*width /2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='/'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算除法标志值*/act=4; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,"0."); /*显示字符串*/}if(c=='^'){将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算乘方标志值*/act=5; /*设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='%'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算模运算乘方标志值*/act=6; /*setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='='){将第二个操作数转换为浮点数*/num2=atof(str2); /*根据运算符号计算*/switch(act) /*{case 1:result=num1+num2;break; /*做加法*/case 2:result=num1-num2;break; /*做减法*/case 3:result=num1*num2;break; /*做乘法*/case 4:result=num1/num2;break; /*做除法*/case 5:result=pow(num1,num2);break; /*做x的y次方*/case 6:result=fmod(num1,num2);break; /*做模运算*/ }设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*将结果保存到temp中*/sprintf(temp,"%f",result); /*outtextxy(5*width,height,temp); /*显示结果*/}if(c=='c'){num1=0; /*将两个操作数复位0,符号标志为1*/num2=0;flag=1;strcpy(str2,""); /*将str2清空*/设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}如果选择了q回车,结束计算程序*/if(c=='Q')exit(0); /*}putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/返回*/return; /*}/*窗口函数*/void mwindow( char *header ){int height;cleardevice(); /* 清除图形屏幕 */setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*//* 设置视口大小 */ setviewport( 20, 20, MaxX/2, MaxY/2, 1 );height = textheight( "H" ); /* 读取基本文本大小 */settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/输出标题*/outtextxy( MaxX/4, 2, header ); /*setviewport( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/ 画边框*/drawboder(); /*}画边框*/void drawboder(void) /*{定义视口类型变量*/struct viewporttype vp; /*setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/将当前视口信息装入vp所指的结构中*/getviewsettings( &vp );/*画矩形边框*/rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*}/*设计鼠标图形函数*/int arrow(){int size;定义多边形坐标*/int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*设置填充模式*/setfillstyle(SOLID_FILL,2); /*/*画出一光标箭头*/fillpoly(8,raw);测试图象大小*/size=imagesize(4,4,16,16); /*分配内存区域*/rar=malloc(size); /*存放光标箭头图象*/getimage(4,4,16,16,rar); /*putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/return 0;}/*按键函数*/int specialkey(void){int key;等待键盘输入*/while(bioskey(1)==0); /*key=bioskey(0); /*键盘输入*/只取特殊键的扫描值,其余为0*/ key=key&0xff? key&0xff:key>>8; /*return(key); /*返回键值*/}。

用堆栈实现四则运算c语言

用堆栈实现四则运算c语言

用堆栈实现四则运算c语言堆栈是一种常见的数据结构,它符合先进后出的原则。

在四则运算中,我们可以借助堆栈这种数据结构实现运算,方便高效,不易出错。

堆栈的实现包括两个基本操作:Push(入栈)和Pop(出栈)。

我们可以以此设计四则运算。

首先,我们需要将输入的四则运算表达式转换成后缀表达式。

后缀表达式也叫逆波兰表达式,相对于中缀表达式而言,运算符在后面,操作数在前面,这样方便计算机进行读取和计算。

例如:中缀表达式:5+3*2后缀表达式:5 3 2 * +将中缀表达式转换成后缀表达式,我们需要用到堆栈。

具体的实现方法是,从左向右遍历表达式,如果是数字,则直接输出;如果是符号,则将其与堆栈顶的符号进行比较,如果优先级高就入栈,否则不断将符号出栈并输出,直到当前符号优先级大于堆栈顶符号优先级,最后将当前符号入栈。

例如:表达式:5+3*2堆栈操作:1.将5输出,堆栈为空2.遇到+号,入栈3.将3输出,堆栈顶为+号4.遇到*号,入栈5.将2输出,堆栈顶为*号6.输出*号,堆栈顶为+号7.输出+号,堆栈为空得到后缀表达式:5 3 2 * +有了后缀表达式,我们可以用堆栈进行计算。

具体方法是,从左向右遍历后缀表达式,如果是数字则入栈,如果是符号则将栈顶两个数字出栈并进行计算,将结果入栈,最终得到最终的计算结果。

例如:后缀表达式:5 3 2 * +堆栈操作:1.将5入栈2.将3入栈3.遇到*号,出栈3和2,进行计算得到6,将6入栈4.将栈顶元素5出栈5.遇到+号,出栈6和5,进行计算得到11,将11入栈得到计算结果:11通过堆栈实现四则运算,可以有效简化我们的计算流程,避免复杂的优先级判断和计算错误。

同时,堆栈为我们提供了一种更加高效的数据结构,不仅在四则运算中可以发挥作用,在其他应用中也很常见。

当然,在实际应用中,我们需要考虑到多种情况的处理,例如负数、小数、括号等,以及错误处理等细节问题,才能保证算法的正确性和可靠性。

STC89c52单片机 计算器C语言程序

STC89c52单片机 计算器C语言程序

STC89c52单片机计算器C语言程序STC89C52单片机计算器C语言程序下面是STC89C52单片机计算器的C语言程序,适用于P2位选P0段选时钟12MHZ。

程序代码如下:includedefine uchar unsigned chardefine uint unsigned intuchar Led[17] = {0x3f。

0x06.0x5b。

0x4f。

0x66.0x6d。

0x7d。

0x07.0x7f。

0x6f。

0x77.0x7c。

0x39.0x5e。

0x79.0x71.0x00};long float Number[]={0,0,0,0};uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};long int D[] = {0,0,0,0,0,0,0,0};uchar code C[] = {0x0.0xFE。

0xFD。

0xFB。

0xF7.0xEF。

0xDF。

0xBF。

0x7F};uchar k=16;uchar b;long float Out_put;uchar e=0;uchar g=0;uchar L=0;uchar g1=0;uchar g2=0;uchar g3=0;uchar g4=0;char j=-1;uchar m=0;uchar n=0;uchar x=0;程序中包含了头文件和宏定义,以及数码管段选、数码管显示位控制寄存器、数码管显示内容寄存器、数码管位选、按键控制变量等各种变量。

其中,Led数组存储了数码管的段选值,Number数组存储了数字,A数组存储了数码管的位选值,D数组存储了数码管的显示内容,C数组存储了数码管的位选值,k、b、Out_put、e、g、L、g1、g2、g3、g4、j、m、n、x 等变量用于按键控制和运算。

代码中没有明显的格式错误,可以直接使用。

下面是已经修改过的文章:uchar xo = 0./*控制开始计数小数点的变量*/long int result;void Delay(uint o) {uint i。

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语言简易计算器的实现

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语言是一种广泛应用于系统编程和嵌入式开发的高级编程语言。

它以其强大的功能和高效的执行速度而闻名于世。

在本文中,我们将使用C语言编写一个简单的计算器程序,该程序可以进行基本的四则运算。

在开始编写计算器程序之前,我们首先需要了解一些基础的C语言知识。

C语言中的变量是用于存储和操作数据的容器。

在计算器程序中,我们将使用变量来存储用户输入的数值和运算结果。

在编写计算器程序时,我们需要使用C语言中的运算符来进行数值计算。

C语言中常见的运算符包括加法运算符(+)、减法运算符(-)、乘法运算符(*)和除法运算符(/)。

这些运算符可以用于执行加减乘除等基本的数学运算。

为了实现计算器功能,我们需要使用C语言中的控制结构来控制程序的执行流程。

C语言中常见的控制结构包括条件语句(if-else语句)和循环语句(for循环和while循环)。

通过使用这些控制结构,我们可以根据用户输入的选择执行不同的计算操作,并且可以重复执行计算操作直到用户选择退出。

下面是一个简单的计算器程序的示例代码:```c#include <stdio.h>int main() {char operator;double num1, num2, result;printf("请输入运算符(+、-、*、/):");scanf("%c", &operator);printf("请输入两个数值:");scanf("%lf %lf", &num1, &num2);switch (operator) {case '+':result = num1 + num2;printf("两个数的和为:%.2lf\n", result); break;case '-':result = num1 - num2;printf("两个数的差为:%.2lf\n", result); break;case '*':result = num1 * num2;printf("两个数的积为:%.2lf\n", result);break;case '/':if (num2 != 0) {result = num1 / num2;printf("两个数的商为:%.2lf\n", result);} else {printf("除数不能为0\n");}break;default:printf("无效的运算符\n");break;}return 0;}```在上述代码中,我们首先定义了一个字符变量`operator`,用于存储用户输入的运算符;定义了两个双精度浮点数变量`num1`和`num2`,用于存储用户输入的两个数值;定义了一个双精度浮点数变量`result`,用于存储运算结果。

计算器c语言代码

计算器c语言代码

计算器c语言代码计算器C语言代码计算器是一种常见的工具,用于进行数值计算和数学运算。

计算器通常具有基本的四则运算功能,可以执行加法、减法、乘法和除法运算,同时还可以进行其他高级计算,比如开方、求幂、取余等。

在本文中,我们将介绍如何使用C语言编写一个简单的计算器。

我们需要定义计算器的基本功能。

我们可以使用函数来实现不同的计算操作。

下面是一个示例代码,实现了加法、减法、乘法和除法四种功能:```c#include <stdio.h>// 加法函数double add(double a, double b) {return a + b;}// 减法函数double subtract(double a, double b) {return a - b;}// 乘法函数double multiply(double a, double b) { return a * b;}// 除法函数double divide(double a, double b) { if (b == 0) {printf("除数不能为零!\n"); return 0;}return a / b;}int main() {double num1, num2;char operator;printf("请输入两个操作数:");scanf("%lf %lf", &num1, &num2); printf("请输入操作符:");scanf(" %c", &operator);switch (operator) {case '+':printf("结果:%lf\n", add(num1, num2));break;case '-':printf("结果:%lf\n", subtract(num1, num2));break;case '*':printf("结果:%lf\n", multiply(num1, num2));break;case '/':printf("结果:%lf\n", divide(num1, num2));break;default:printf("无效的操作符!\n");break;}return 0;}```在上面的代码中,我们使用了四个函数来实现不同的计算操作。

c语言中的堆栈

c语言中的堆栈

c语言中的堆栈
摘要:
1.堆栈的定义和作用
2.堆栈在C 语言中的实现
3.堆栈的常用操作
4.堆栈在C 语言中的应用
5.总结
正文:
C 语言中的堆栈是一种数据结构,它按照“先进后出”的原则存储数据。

堆栈的定义和作用主要体现在以下几个方面:
首先,堆栈是一种线性数据结构,它的存储单元有序排列,可以通过访问最近的元素来访问任意元素。

这种结构使得堆栈能够方便地实现“后进先出”(LIFO)的特性。

其次,堆栈在C 语言中主要作为函数调用和返回的机制。

当一个函数被调用时,程序会将该函数的返回地址和参数等数据压入堆栈;当函数执行完毕后,程序会从堆栈中弹出返回地址和其他数据,从而实现函数的返回。

此外,堆栈在C 语言中还有一些常用的操作,如push(入栈)、pop (出栈)、top(查看堆栈顶元素)等。

这些操作使得程序员可以更方便地使用堆栈来解决问题。

堆栈在C 语言中有着广泛的应用。

除了用于函数调用和返回,堆栈还可以用于实现递归、动态内存分配、错误处理等功能。

这些应用使得堆栈成为了
C 语言中不可或缺的数据结构。

总之,C 语言中的堆栈是一种具有重要作用的数据结构,它不仅用于实现函数调用和返回,还可以用于解决许多实际问题。

c语言实现栈详细代码

c语言实现栈详细代码

c语言实现栈详细代码栈(Stack),又称堆栈,是一种后进先出(LIFO,Last In First Out)的数据结构,它只允许在一段端点进行插入和删除操作,这个端点被称为栈顶。

C语言实现栈的基本思路是建立一个结构体,结构体中包含一个数组和栈顶指针top。

数组用来存放栈中元素,top指针指向栈顶元素的下标。

实现栈的操作包括压栈(push)、出栈(pop)和获取栈顶元素(get_top)。

下面是详细代码:```#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100 //栈的最大长度typedef struct stack {int data[MAX_SIZE]; //栈中元素int top; //栈顶指针} Stack;//初始化栈void init(Stack *s) {s->top = -1; //栈顶指针初始化为-1,表示栈为空}//判断栈是否为空int is_empty(Stack *s) {return s->top == -1;}//判断栈是否已满int is_full(Stack *s) {return s->top == MAX_SIZE-1;}//压栈void push(Stack *s, int value) {if (is_full(s)) {printf("Stack is full, cannot push!\n");return;}s->data[++(s->top)] = value; //栈顶指针先加1,再将元素入栈}//出栈void pop(Stack *s) {if (is_empty(s)) {printf("Stack is empty, cannot pop!\n");}s->top--; //栈顶指针减1,表示栈顶元素已删除}//获取栈顶元素int get_top(Stack *s) {if (is_empty(s)) {printf("Stack is empty, cannot get top element!\n"); return -1;}return s->data[s->top]; //返回栈顶元素}int main() {Stack s;init(&s); //初始化栈for (i = 0; i < 5; i++) {push(&s, i); //压入5个元素}printf("Top element: %d\n", get_top(&s)); //获取栈顶元素while (!is_empty(&s)) {printf("%d ", get_top(&s)); //依次输出栈中元素pop(&s); //弹出栈顶元素}return 0;}```代码中定义了一个结构体,包含一个整型数组data和一个整型变量top,数组用来存放栈中元素,top表示栈顶指针。

c语言计数器代码

c语言计数器代码

c语言计数器代码
以下是C语言计数器代码:
```c
#include <stdio.h>
int main() {
int count = 0; // 初始化计数器为0
char input;
printf("按回车键进行计数,按q退出程序:\n");
while (1) {
input = getchar(); // 从标准输入获取用户输入的字符
if (input == '\n') { // 如果用户输入的是换行符,则计数器加1
count++;
printf("计数器当前值为:%d\n", count);
} else if (input == 'q') { // 如果用户输入的是'q',则退出程序
break;
}
}
return 0;
}
```
该程序使用了一个while循环来不断获取用户输入的字符,并根据用户输入的字符进行相应的操作。

如果用户输入的是换行符,则计数器加1,并输出计数器的当前值;如果用户输入的是'q',则退出程序。

程序会一直运行直到用户输入'q'或者程序出现错误。

1。

C语言简单计算器程序源代码

C语言简单计算器程序源代码

C语言简单计算器程序源代码以下是一个简单的C语言计算器程序的源代码:```c#include <stdio.h>int maichar operator;double num1, num2;printf("请输入运算符:");scanf("%c", &operator);printf("请输入两个数字:");scanf("%lf %lf", &num1, &num2);switch (operator)case '+':printf("%.2lf + %.2lf = %.2lf", num1, num2, num1 + num2); break;case '-':printf("%.2lf - %.2lf = %.2lf", num1, num2, num1 - num2); break;case '*':printf("%.2lf * %.2lf = %.2lf", num1, num2, num1 * num2);break;case '/':if (num2 != 0)printf("%.2lf / %.2lf = %.2lf", num1, num2, num1 / num2);elseprintf("除数不能为0");break;default:printf("无效的运算符");}return 0;```这个程序首先提示用户输入一个运算符,然后再提示输入两个数字。

接下来,程序会根据输入的运算符执行相应的计算,并打印结果。

在计算除法时,程序会检查除数是否为0,如果为0,则打印错误信息。

请注意,这只是一个非常简单的计算器程序,没有考虑很多错误处理情况。

C语言课程设计(计算器)

C语言课程设计(计算器)

目录1 前言 (2)2 需求分析 (2)2.1要求 (2)2.2任务 (2)2.3运行环境 (2)2.4开发工具 (2)3 概要设计 (2)3.1系统流程图 (3)3.2查询函数流程图 (4)4 详细设计 (8)4.1分析和设计 (8)4.2具体代码实现 (9)5 课程设计总结 (25)参考文献 (25)致谢 (26)1 前言编写一个程序来实现算术计算器。

通过结构体数组和共用体数组来存放输入的每一数字或运算符号的记录(包括1.2.3等数字, +、--、*、等运算符号), 然后将其信息存入文件中。

输入一个算术计算式, 就在屏幕上显示结果。

2 需求分析2.1要求(1)用C语言实现程序设计;(2)利用结构体、共用体进行相关信息处理;(3)画出查询模块的流程图;(4)系统的各个功能模块要求用函数的形式实现;(5)界面友好(良好的人机互交), 程序要有注释。

2.2任务(1)定义一个结构体类型数组, 输入0~9及+、--、*等符号的信息, 将其信息存入文件中;(2)输入简单的加减乘除算术计算式, 并在屏幕上显示计算结果;(3)画出部分模块的流程图;(4)编写代码;(5)程序分析与调试。

2.3运行环境(1)WINDOWS2000/XP系统(2)TurboC2.0编译环境2.4开发工具C语言3 概要设计3.1系统流程图如图3.1所示。

图3.1系统流程图3.2查询函数流程图4 详细设计4.1分析和设计在程序的开头部分定义了结构替类型, 用来存放按钮信息struct s_button /*按键的结构体*/{int sx,sy,ex,ey;char *head;int press;}button[17]; /*图表按键数*/char far *vid_mem;static int tx=32,ty=3; /*静态变量*/float v1=0.0,v2=0.0;用输入函数input()来输入按键放在s_button数组中。

C语言编写一个计算器界面(可视化界面和多功能)

C语言编写一个计算器界面(可视化界面和多功能)

C语⾔编写⼀个计算器界⾯(可视化界⾯和多功能)⽬录引⾔计算器总结引⾔在⼤学期间,C 语⾔或者数据结构等课程,⽼师会要求学⽣编写⼀个⼩项⽬练⼿,或者期末编写⼀个⼩软件等课程设计。

今天在电脑看到⼤⼀学C语⾔时,实验课上写的计算器功能,挺有意思。

所以在此分享给学C语⾔的学弟学妹,记得收藏保留!计算器简单版本计算器,主要实现的是简单两个数的加法,减法,乘法,除法,求余功能。

⽤户可以在主菜单选择需要计算的功能,然后根据⽤户输⼊的数字,进⾏计算,输出结果。

⾸先,我们定义五个⽅法,实现两个数的加法,减法,乘法,除法,求余功能。

代码如下:// 加法float add(float a, float b) {return a + b;}// 减法float sub(float a, float b) {return a - b;}// 乘法float mul(float a, float b) {return a * b;}// 除法float mod(float a, float b) {return a / b;}// 求余int com(int a, int b) {return a % b;}然后定义⼀个打印主菜单界⾯的函数,使⽤简介美观的菜单界⾯,供⽤户选择要计算的功能,代码如下:// 打印主功能菜单void printMenu() {// 清屏// system("cls");printf("|----------------------- 计算器 -----------------------|\n");printf("| |\n");printf("| By -- 陈⽪的JavaLib |\n");printf("| |\n");printf("|---------------------- 1:加法 -----------------------|\n");printf("|---------------------- 2:减法 -----------------------|\n");printf("|---------------------- 3:乘法 -----------------------|\n");printf("|---------------------- 4:除法 -----------------------|\n");printf("|---------------------- 5:求余 -----------------------|\n");printf("|---------------------- 6:退出 -----------------------|\n");printf("| |\n");printf("|----------------------- 计算器 -----------------------|\n");}最后,我们在主函数 main 中,定义⼀个 while 循环代码块,不断读取⽤户输⼊的内容,进⾏数字计算,代码如下:int main() {// 选择的功能int select = 0;// 定义算术的两个数float a, b;while (select != 6){select = 0;// 打印主菜单printMenu();// 只允许选择菜单栏内的数字,不是则重新选择while (select < 1 || select > 6) {printf("请输⼊菜单功能(1-6):");scanf("%d", &select);}if (6 == select) {printf("\n|----------------- 欢迎使⽤计算器!再见!-----------------|\n"); return 0;}printf("\n请输⼊两个数(⽤空格隔开两个数):");scanf("%f %f", &a, &b);switch (select) {case 1:printf("%f+%f=%f\n\n", a, b, add(a, b));break;case 2:printf("%f-%f=%f\n\n", a, b, sub(a, b));break;case 3:printf("%f*%f=%f\n\n", a, b, mul(a, b));break;case 4:printf("%f/%f=%f\n\n", a, b, mod(a, b));break;case 5:printf("%f/%f=%d\n\n", a, b, com((int)a, (int)b));break;case 6:default:break;}}}下⾯我们演⽰⼏个例⼦,能更加直观体验计算器的功能:菜单功能选择错误,会提⽰重新选择加法除法退出简单版本计算器,完整代码如下:#include <stdio.h>#include <stdlib.h>// 加法float add(float a, float b) {return a + b;}// 减法float sub(float a, float b) {return a - b;}// 乘法float mul(float a, float b) {return a * b;}// 除法float mod(float a, float b) {return a / b;}// 求余int com(int a, int b) {return a % b;}// 打印主功能菜单void printMenu() {// 清屏// system("cls");printf("|----------------------- 计算器 -----------------------|\n");printf("| |\n");printf("| By -- 陈⽪的JavaLib |\n"); printf("| |\n");printf("|---------------------- 1:加法 -----------------------|\n");printf("|---------------------- 2:减法 -----------------------|\n");printf("|---------------------- 3:乘法 -----------------------|\n");printf("|---------------------- 4:除法 -----------------------|\n");printf("|---------------------- 5:求余 -----------------------|\n");printf("|---------------------- 6:退出 -----------------------|\n");printf("| |\n");printf("|----------------------- 计算器 -----------------------|\n");}/*** 简单版本计算器功能 By -- 陈⽪的JavaLib* @return*/int main() {// 选择的功能int select = 0;// 定义算术的两个数float a, b;while (select != 6){select = 0;// 打印主菜单printMenu();// 只允许选择菜单栏内的数字,不是则重新选择while (select < 1 || select > 6) {printf("请输⼊菜单功能(1-6):");scanf("%d", &select);}if (6 == select) {printf("\n|----------------- 欢迎使⽤计算器!再见!-----------------|\n");return 0;}printf("\n请输⼊两个数(⽤空格隔开两个数):");scanf("%f %f", &a, &b);switch (select) {case 1:printf("%f+%f=%f\n\n", a, b, add(a, b));break;case 2:printf("%f-%f=%f\n\n", a, b, sub(a, b));break;case 3:printf("%f*%f=%f\n\n", a, b, mul(a, b));break;case 4:printf("%f/%f=%f\n\n", a, b, mod(a, b));break;case 5:printf("%f/%f=%d\n\n", a, b, com((int)a, (int)b));break;case 6:default:break;}}}总结在⼤学期间,如果是计算机类的专业,⼀般都会学习 C 语⾔,作为编程⼊门语⾔,⼤家⼀定要学习好此门语⾔,⽽且如果学好了,其实学习其他编程语⾔就很容器上⼿的,不同语⾔其实⼤同⼩异,只要你编程思维提升了,基础语法掌握了,才能学习更加深⼊的知识。

用c语言编写计算器

用c语言编写计算器
疑问:为什么不能像MessageBox一样把字符串做为返回值返回呢???
这就涉及到C语言中函数返回指针的问题了
int i=20;
char cStr[3];
itoa(i,cStr,10);
char* f1()
{
return "adsfadsfasd";
}
在函数内部返回函数内构建的指针有可能出现数据混乱.
DWORD dwMydrivers;
dwMydrivers = GetLogicalDrives();
TCHAR cDrivers[256];
itoa(dwMydrivers,cDrivers,2); //转换为字符串
strrev(cDrivers); //反转字符串
(8)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字
(9)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
5、得到系统中有哪些逻辑驱动器
DWORD GetLogicalDrives(VOID);
返回值的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A存在于系统中;位1设为1表示存在B驱动器;以次类推。
编辑Main_OnCommand方法:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_BTNHELLO:
MessageBox(NULL,TEXT("世界你好"),TEXT("问好"),MB_OK);
{
switch(id)
{
case IDC_OK:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gets( inputString0 ); //从键盘接收输入的计算字符串inputString0
strcpy( inputString , inputString0 ); //为了不改变输入的字符串inputString0,用inputString来充当计算过程中的
/********************************************************************
* 程序中所用到的头文件 *
********************************************************************/
bool check(char A_string[]);
template<class Type>class Stack;
template<class Type>
class StackNode
{
friend class Stack<Type>;
private:
Type data;
template <class Stack_type> //用计算符号op计算数字number_1 和 number_2
Stack_type caculate( char op, const Stack_type number_1, const Stack_type number_2 );
II: 检查括号是否匹配,如果匹配,再检查是否出现在合法位置 如:(8*(7-4)不匹配,以及65*(72+98)(70-45)匹配但是不合法
III: 检查计算数与计算符号的数量是否合格 如:+23-4* 、23-4*、+23-4 等等
IV: 检查输入小数的时候小数点是否输入过多以及智能改正 如:将3....2*10+8 看成3.2*10+8
};
template<class Type>
void Stack<Type>::push(Type item)
{
_top=new StackNode<Type>(item,_top);
NumItem++;
}
template<class Type>
void Stack<Type>::pop()
*函数名称:isOperand *
*函数表述: 检查ch是否为操作数 *
*输入值: char ch *
*返回值: 检查ch是否为操作数,是则返回1,否则返回0 *
********************************************************************/
********************************************************************/
//#define Stack stack //之所以不直接用stack是因为我打算完成整个程序后自己练习写个"Stack.h"
char *parsing(char A_string[]); //将将传入的中缀计算字符串A_string转化成后缀计算字符串并返回一个指针
float result(char A_string[]); //计算用函数“char *parsing(char A_string[]);”转化过的后缀计算字符串的值
StackNode<Type> *link;
StackNode(Type D=0,StackNode<Type> *L=NULL):link(L),data(D){}
};
template<class Type>
class Stack
{
public:
Stack():_top(NULL),NumItem(0){}
【下边是检测数据,检测结果与期望结果吻合】
【注:输入数据结尾没有“#”,以为在我的程序里面要它没用】
()*2+3# 期望结果:输入有误
(3+3)*3+1*(1+3)-3/2+3*3# 期望结果:29.5
1+2*(4-5)+45# 期望结果:44.000000
(1.454+2.6)*3.09+4# 期望结果:16.5269
//exit(0);
}
else
{
strcpy( inputString , mark(inputString) ); //进行标记inputString并且返回赋值给inputString
strcpy( inputString , parsing(inputString) ); //将【经过处理】的中缀计算字符串返回并且赋值给inputString
{
StackNode<Type> *p;
p=_top;
_top=_top->link;
delete p;
NumItem--;
}
template<class Type>
Type Stack<Type>::top()
{
return _top->data;
cout <<"最终结果:"<<result(inputString)<<endl;
} //计算最终的结果
}
return 0;
}
/********************************************************************
V: 检查连续输入大于两个符号时候是否能智能修改,“不能”则-> 对于3+-2 给出判断结果:输入有误
VI: 接V:如果判断能够改正,则-------------------------------> 将4++++++++++++5看成4+5并计算
VII:检测“0”是否出现在分母上
//inputString0.以后计算用到计算字符串的时候都将inputString传递,而原始字符串
//inputString0不变
if(check(inputString)==false)
{
cout <<"输入有误!"<<endl;
* 自定义函数 *
********************************************************************/
bool isOperand(char ch); //检查是否为操作数
int priority( char op); //设置操作等级并返回操作符op的等级
#include<iostream>
#include<cstring>
using namespace std;
/********************************************************************
* 宏定义 *
#define MAX_LENGHT 50 //预先假设计算字符串最多有500个字符
#define MAX 10 //一般情况下输入要计算的数不会超过10位
/********************************************************************
void push(Type item);
void pop(); //Type pop();
Type top();
void MakeEmpty();
bool empty();
private:
int NumItem;
StackNode<Type> *_top;
+23-4*# 期望结果:输入有误
23-4*# 期望结果:输入有误
+23-4# 期望结果:输入有误
3+-2# 期望结果:输入有误
4+++++++++++++++5# 期望结果:9
********************************************************************/
}
/********************************************************************
* 主函数 *
********************************************************************/
(1.4a54+2f.6)*3.09s+4ff# 期望结果:16.5269
(56-23)/8-4# 期望结果:0.125
34+p(u89-12.3)k/3# 期望结果:59.5667
89.5*749+25)# 期望结果:输入有误
89.5*749+25# 期望结果:67060.500000
/********************************************************************
相关文档
最新文档