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语言程序设计-第四章简单计算器小程序-分支程序设计
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语言计算器文档
一、简介
C语言计算器是一款采用C语言开发的免费计算器,用户可以使用它
来执行基本的数学计算,包括简单的加减乘除,以及乘方、平方根等更高
级的运算。
C语言计算器的实现相对简单,但它具有良好的扩展性,功能
强大。
此外,还添加了注释功能,方便用户理解每一行代码的功能及实现。
1、基本运算:它能够实现基本的运算,包括加减乘除、乘方、平方
根等。
2、复杂运算:它还能够实现复杂的运算,比如三角函数运算,对数、指数等。
3、可视化界面:它提供一个可视化的界面,支持用户直观的计算、
显示计算结果,并可以方便地查看历史记录。
4、注释功能:它提供注释功能,用户可以添加注释,方便理解每一
行代码的功能及实现,更好地使用计算器。
二、实现原理
1、字符串处理:由于C语言计算器的输入是字符串,因此首先要对
用户输入的字符串进行解析,把字符串拆分为数学运算符、数字和其他字
符等部分,以便后续的计算。
2、数学函数:拆分完字符串之后。
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语言简易计算器
#include <stdio.h>char token;/*定义程序要使用到的一些函数*/void match( char expectedToken ) /*对当前的标志进行匹配*/{if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/ else{printf("cannot match\n");exit(1); /*匹配不成功,退出程序*/}}int low( void )/*用于计算表达式中级别最低的运算*/{int result = mid(); /*计算比加减运算优先级别高的部分*/while(( token == '+' ) || ( token == '-' ))if ( token == '+'){match('+'); /*进行加法运算*/result += mid();break;}else if ( token == '-'){match('-'); /*进行减法运算*/result -= mid();break;}return result;}int mid( void )/*用于计算表达式中级别较高的运算*/{int div; /*除数*/int result = high(); /*计算比乘除运算优先级别高的部分*/while(( token == '*' ) || ( token == '/' ))if ( token == '*'){match('*'); /*进行乘法运算*/result *= high();break;}else if (token == '/'){match('/'); /*进行除法运算*/div = high();if( div == 0 ) /*需要判断除数是否为0*/{printf( "除数为0.\n" );exit(1);}result /= div;break;}return result;}int high( void )/*用于计算表达式中级别最高的运算,即带()的运算*/{int result;if( token == '(' ) /*带有括号的运算*/{match( '(' );result = low();/*递归计算表达式*/match(')');}else if ( token>= '0'&&token<='9' ) /*实际的数字*/{ungetc( token, stdin ); /*将读入的字符退还给输入流,为读取整个数*/scanf( "%d", &result ); /*读出数字*/token = getchar(); /*读出当前的标志*/}else{printf("The input has unexpected char\n"); /*不是括号也不是数字*/exit(1);}return result;}main(){int result; /*运算的结果*/printf("*****************************************\n");printf("**Welcome to use this simple calculator**\n");printf("**Please input a multinomial like **\n");printf("** 6-3*(5-1)/2+14/7 **\n");printf("*****************************************\n");token = getchar(); /*载入第一个符号*/result = low(); /*进行计算*/if( token == '\n' ) /* 是否一行结束*/printf( "The answer is : %d\n", result );else{printf( "Unexpected char!");exit(1); /* 出现了例外的字符*/}scanf("%d",result);return 0;}。
计算器编程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)》课程设计报告简易计算器设计学生姓名:学号:班级:指导老师:日期: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时进入该函数,从而进行该功能函数的计算。
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语⾔实现简易计算器(加减乘除)计算器作为课设项⽬,已完成答辩,先将代码和思路(注释中)上传⼀篇博客已增添、修改、整理⾄⽆错且可正常运⾏虽使⽤了栈,但初学者可在初步了解栈和结构语法后理解代码#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语⾔计算器的代码。
计算器实现的功能有:加、减、乘、除、求余。
功能简单,但对于初学者的我来说能把它写出来,排除每个错误依旧是个难题。
前后两种代码是由⾃⼰所学东西的质量决定的,如有错误,请前辈指出。
最初版本的计算器:1 #include<stdio.h>23int checkPassword();45int add(int x,int y);67int sub(int x,int y);89int multi(int x,int y);1011float quo(float x1,float y1);1213int com(int x,int y);1415int x,y;1617int result;1819int select;2021float result1;2223float x1,y1;2425int success,psw;2627int a;2829int i;3031int t;323334353637void main()3839 {4041 printf("请输⼊密码:\n");4243 i=0;4445do{46474849 scanf("%d",&a);50515253if( a!=1234 && i<2)5455 printf("请重新输⼊密码:\n");5657else5859 i=3;6061 i++;6263 }while( i<=2);6465if(a==1234)6667 {6869for(t=1;t!=6;t=select)7071 {72737576777879 printf("+=============================+\n"); 8081 printf("+======计=算=器=主=菜=单======+\n"); 8283 printf("+=============================+\n"); 8485 printf("+==========1、加法==========+\n"); 8687 printf("+==========2、减法==========+\n"); 8889 printf("+==========3、乘法==========+\n"); 9091 printf("+==========4、除法==========+\n"); 9293 printf("+==========5、求余==========+\n"); 9495 printf("+==========6、退出==========+\n"); 9697 printf("+=============================+\n"); 9899100101102103 printf("请输⼊你的选择:\n");104105 scanf("%d",&select);106107108109switch(select)110111 {112113114115case1:116117 printf("请输⼊两个数:\n");118119 scanf("%d%d",&x,&y);120121 result=add(x,y);122123 printf("%d+%d=%d\n",x,y,result);124125break;126127case2:128129 printf("请输⼊两个数:\n");130131 scanf("%d%d",&x,&y);132133 result=sub(x,y);134135 printf("%d-%d=%d\n",x,y,result);136137break;138139case3:140141 printf("请输⼊两个数:\n");142143 scanf("%d%d",&x,&y);144145 result=multi(x,y);146147 printf("%d*%d=%d\n",x,y,result);148149break;150151case4:152153 printf("请输⼊两个数:\n");154155 scanf("%f%f",&x1,&y1);156157 result1=quo(x1,y1);159 printf("%f/%f=%f\n",x1,y1,result1); 160161break;162163case5:164165 printf("请输⼊两个数:\n");166167 scanf("%d%d",&x,&y);168169 result=com(x,y);170171 printf("%d/%d=%d\n",x,y,result); 172173break;174175case6:176177break;178179default:180181 printf("请输⼊1~5之间的数\n"); 182183break;184185186187188189 }190191 }192193 }194195 }196197int add(int x,int y)198199 {200201int sum;202203 sum=x+y;204205return sum;206207 }208209int sub(int x,int y)210211 {212213int sub;214215 sub=x-y;216217return sub;218219 }220221int multi(int x,int y)222223 {224225int multi;226227 multi=x*y;228229return multi;230231 }232233float quo(float x,float y)234235 {236237float quo;238239 quo=x/y;240241return quo;243 }244245int com(int x,int y)246247 {248249int com;250251 com=x%y;252253return com;254255 }256257int checkPassword( int psw)258259 {260261if(psw==1234)262263 success=1;264265else266267 success=-1;268269return success;270271 }改版后的计算器:1 #include<stdio.h>23int yanzheng(int );45void caidan();67void jiafa(int,int);89void jianfa(int,int);1011void chengfa(float,float);1213void chufa(float,float);1415void mo(int,int);16171819void main(){2021int x,m;2223int y;2425float a,b;2627 printf("请输⼊密码:\n");2829 scanf("%d",&x);3031 m=yanzheng(x);3233if(m==1){3435 caidan();3637//int y;3839//float a,b;4041for(;y!=6;){4243 printf("请输⼊选项:\n"); 4445 scanf("%d",&y);4647if(y>=1 && y<6){4849 printf("请输⼊要运算的两个数:\n");5051 scanf("%f%f",&a,&b);5253 }54555657switch(y){5859case1 :jiafa(a,b);break;6061case2 :jianfa(a,b);break;6263case3 :chengfa(a,b);break;6465case4 :chufa(a,b);break;6667case5 :mo(a,b);break;6869case6 :break;7071default : printf("选项输⼊错误!请重试\n");break; 7273 }7475 }7677 }7879 }808182838485int yanzheng(int x){8687int i,m;8889for(i=1,m=0;i<3;i++){9091if(x==1234){9293 m=1;9495break;9697 }9899 printf("请重新出⼊密码:");100101 scanf("%d",&x);102103104105 }106107return m;108109 }110111112113void caidan(){114115 printf("+=============================+\n"); 116117 printf("+======计=算=器=主=菜=单======+\n"); 118119 printf("+=============================+\n"); 120121 printf("+==========1、加法==========+\n"); 122123 printf("+==========2、减法==========+\n"); 124125 printf("+==========3、乘法==========+\n"); 126127 printf("+==========4、除法==========+\n"); 128129 printf("+==========5、求余==========+\n"); 130131 printf("+==========6、退出==========+\n"); 132133 printf("+=============================+\n"); 134135 }136137138139void jiafa(int x,int y){140141int sum;142143 sum=x+y;144145 printf("%d\n", sum);146147 }148149150151void jianfa(int x,int y){152153int cha;154155 cha=x-y;156157 printf("%d\n", cha);158159 }160161162163void chengfa(float x,float y){164165float ji;166167 ji=x*y;168169 printf("%f\n", ji);170171 }172173174175void chufa(float x,float y){176177float shang;178179 shang=x/y;180181 printf("%f\n", shang);182183 }184185186187void mo(int x,int y){188189int mo;190191 mo=x%y;192193 printf("%d\n", mo);194195 }。
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语言实现简单计算器功能(1)
C语⾔实现简单计算器功能(1)本⽂为⼤家分享了C语⾔实现简单计算器功能的具体⽅法,供⼤家参考,具体内容如下这⼏天⼀直上控制语句,在学完if、switch和循环语句后,为了巩固所学知识点,想给学⽣出⼀道简单的计算器程序。
题⽬如下:通过所学的知识(选择语句、循环语句)完成⼀个简单的计算器编程,要求不许抄袭,只能⽤⾃⼰所学的知识点,不可引⽤⽹上⾃⼰的不懂的程序。
要求的格式如下图:要求以这样的⼀种格式进⾏输出,并能通过选择完成不同的功能。
如:选择1,完成整数相加功能,算完后⼜能回到该页⾯。
经过分析,我简单的写了⼀段代码,代码如下:#include <stdio.h>void main(){while(1) // while循环操作,实现计算机功能提⽰{int a = 0;int x = 0;int y = 0;int result = 0;printf("****欢迎使⽤计算器****\n");printf("[1] 完成两个整数相加\n");printf("[2] 完成两个整数相减\n");printf("[3] 完成两个整数相乘\n");printf("[4] 完成两个整数取整\n");printf("[5] 完成两个整数取余\n");printf("[0] 退出计算器系统\n");printf("请选择:");scanf("%d",&a);if(a < 0 || a > 5) // 判断输⼊的是否在0~5范围内,不在输出错误提⽰{printf("选择有误,请重新选择!\n");continue;}elseif(0 == a) // 当输⼊为0时需要退出系统{printf("欢迎下次使⽤!\n");break;}switch(a) // 使⽤switch语句进⾏对每个功能的具体操作{case 1: // 加法操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x+y;printf("结果为:%d\n",result);break;case 2: // 减法操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x-y;printf("结果为:%d\n",result);break;case 3: // 乘法操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x*y;printf("结果为:%d\n",result);break;case 4: // 取整操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x/y;printf("结果为:%d\n",result);break;case 5: // 取余操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x%y;printf("结果为:%d\n",result);break;default:break;}}}这样就能简单完成⼀个两个整数的计算器功能。
c语言计算器原理
c语言计算器原理随着计算机技术的发展,计算器作为基本的数学运算工具,已经广泛地应用于各个领域。
在计算机编程中,C语言是一种通用的、面相过程的编程语言,它可以用来开发各种类型的应用程序,包括计算器。
本文将介绍使用C语言编写计算器的原理和方法。
一、计算器的基本原理计算器的基本原理是利用数学运算的原理,通过编程实现加、减、乘、除等基本运算功能。
在C语言中,可以使用各种运算符和函数来实现这些运算,例如“+”、“-”、“*”、“/”等运算符,以及“abs”、“sqrt”等函数。
这些运算符和函数可以被嵌入到程序中,以实现各种复杂的数学运算。
二、计算器的设计思路设计一个计算器需要考虑到以下几个问题:1.用户界面:计算器需要有一个直观、易于使用的用户界面,以便用户能够输入要计算的表达式并得到结果。
2.表达式解析:计算器需要能够解析用户输入的表达式,并将其转换为计算机能够处理的数学运算。
3.运算执行:计算器需要能够执行解析后的表达式,并输出结果。
4.错误处理:计算器需要能够处理各种可能的错误情况,例如无效的输入、除以零等。
基于以上思路,我们可以设计一个简单的计算器程序,它使用命令行界面,支持基本的加、减、乘、除运算,并能够处理一些常见的错误情况。
三、计算器的实现方法实现一个计算器需要使用C语言的输入输出函数、字符串处理函数和数学函数等。
下面是一个简单的计算器程序示例:```c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>intmain(){charexpression[100];printf("请输入表达式(如:2+3*4):");fgets(expression,sizeof(expression),stdin);expression[strcspn(expression,"\n")]='\0';//去掉换行符doubleresult=0;intsign='+';//默认运算符为加号inti=0;while(expression[i]!='\0'){if(expression[i]==sign){//如果是运算符,则执行相应的运算if(i+2>strlen(expression)){//确保后面还有数字printf("无效的表达式\n");return1;//返回错误码}doublenum1=atof(expression+i+1);//获取第一个数字result+=num1;//进行运算i+=2;//跳过运算符和数字}elseif(isdigit(expression[i])){//如果是数字,则添加到结果中result+=expression[i]-'0';//进行加法运算}else{//遇到非数字和非运算符字符时,结束表达式解析并输出结果break;}i++;//移动到下一个字符}printf("结果为:%f\n",result);//输出结果return0;//返回正常结束代码}```以上代码实现了一个简单的命令行计算器程序,它使用fgets函数从标准输入读取用户输入的表达式,并使用字符串处理函数和数学函数进行表达式解析和运算。
C语言项目三 基本语句——模拟计算器
任务3.1 启动计算器
任务实施
(4)程序编码:
system("color 0A"); printf("\t\t\t\t欢迎使用计算器\n"); printf("请输入第一个操作数:"); scanf("%d",&a); printf("请输入第二个操作数:"); scanf("%d",&b); printf("%d+%d=%d\n",a,b,a+b); printf("%d-%d=%d\n",a,b,a-b); printf("%d*%d=%d\n",a,b,a*b);
修改任务一,使得计算机可以根据用户输入的运算符进行计算。
任务3.2 进行一次计算
任务准备
选择语句有两种:一种是 if语句,另一种是switch 语句。选择语句有判 断能力,主要通过判断来对程序的流程进行选择。 关系运算符和关系表达式
关系运算符与中学学习的比较运算符基本一致,主要用于比较两个操作 数之间的大小关系。 表3.1 关系运算符
任务3.1 启动计算器
任务准备
编译预处理 3、 宏定义命令 宏定义命令是用来将一个标识符定义为一个字符串,标识符被称为宏名 ,被定义的字符串被称为替换文本。宏定义有两个格式:简单宏定义和 带参数的宏定义。 (1)简单宏定义 #define <宏名> <字符串> 例如:#define PI 3.1415926 一个标识符(PI)被定义为宏后,标识符PI便是宏名。在程序中凡是出 现PI的地方,先将PI替换为3.1415926,这称为红替换,替换后才进行编 译。宏替换只是简单的替换,不好自动加上括号或其他符号。
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数组中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1.3 整型数据
2.1 数据类型与表达式
清华大学出版社
2.1 数据类型与表达式
2.1.3 整型数据
说明: (1) 实际上,常用的整型变量类型是:int 或 short。 (2) 特别强调:short 所适用的数据范围为 -32768~32767。
例如:short x=32768; x的赋值超出了-32768~32767的范围,会出现数据溢出,程序运行结 果错误。为避免数据溢出,超出-32768~32767范围的数据,要定义为 int 或long。
清华大学出版社
2.1 数据类型与表达式
2.1.1 C语言数据类型
所谓数据类型,就是在存储数据时,编译系统根据数据的大小分配不同 大小的存储空间,即不同类型的数据分配不同长度的存储单元,采用不同的存 储形式。例如:基本整型(int),Visual C++6.0分配4字节存储空间,字符型
(char),Visual C++6.0分配1字节存储空间。
C语言程序设计
清华清大华学大出学出版版社社
项目2 计算器程序
学习目标
熟练掌握C语言的常量与变量 掌握C语言的数据类型分类 重点掌握C语言的整型和浮点型数据的表示方法、
分类、存储单元及取值范围 重点掌握算术运算符和算术表达式 掌握赋值运算符和赋值表达式 重点掌握整型、浮点型数据的格式化输入与输出 理解C语言程序设计的步骤
}
清华大学出版社
2.1 数据类型与表达式
2.1.5 基本算术运算符和算术表达式
1.基本的算术运算符
清华大学出版社
2.1 数据类型与表达式
2.1.5 基本算术运算符和算术表达式
说明:
(1) 优先级:指同一个表达式中,不同运算符进行计算时的先后次序。例如:
数学中的先乘除,后加减,就是乘除的优先级高于加减。
2.1.2 常量与变量
6. 变量的赋值 C语言规定:变量定义后,要赋值,才能使用。如果变量不赋值就使用,系统 会自动给其一个不可预测的值。因此,要求变量要“先定义,赋值后,再使用 ”。 例如:
int b ;
float f ;
char c;
b=5 ;
f=3.56 ;
c=’a’;
C语言允许在定义变量的同时对变量赋初值,称为变量的初始化。例如:
清华大学出版社
2.1 数据类型与表达式
2.1.1 C语言数据类型
说明: (3) 枚举类型是一种整数类型。定义枚举时,使用关键字enum,后面跟着一 个枚举的名字(标识符),然后就是一个枚举值列表,列出所有可能的值。枚 举型变量的值,就从枚举值列表中选取。 (4) 空类型( void ), void数据类型表示“没有值”的意思。 void类型 主要用于声明没有返回值的函数或通用指针。 (5) 派生类型是根据已定义的一个或多个数据类型,根据实际需要,组合声 明的复合数据类型。在C语言中,派生类型有指针类型、数组类型、结构体类 型、共用体类型和函数类型。
清华大学出版社
2.1 数据类型与表达式
2.1.2 常量与变量
【示例2-1】已知圆半径r,求圆周长c和圆面积s的值(结果保留小数点后2位小数)
#include <stdio.h>
#define PI 3.1416
int main()
{ float r,c,s;
scanf("%f",&r);
c=2*PI*r; s=PI*r*r;
五入)。
(4) 如果参加+、-、*、/ 运算的两个数有一个为浮点数,则结果为浮点数。
如: 5/2.0的值是2.5。
(5) 求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。
一般情况,余数的符号与被除数符号相同。例如-8%5的值是-3,8%-5的值
是3 。
清华大学出版社
2.1 数据类型与表达式
清华大学出版社
2.1 数据类型与表达式
2பைடு நூலகம்1.4 浮点型数据
浮点型数据又称为实数,即有小数点的数据。
1. 浮点型常量的表示方法
浮点型常量有十进制小数和指数两种表示形式。
(1) 十进制小数形式:由数字0~9和小数点组成(必须有小数点)。
例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均为合法的
Visual C++6.0编译系统会为a和b两个变量各分配4字节的存储空间,并按
整数方式存储数据。
变量定义格式:
类型说明符 变量1, 变量2,…;
其中,类型说明符是C语言的数据类型,如整型类型说明符int、字符型类型
说明符char、浮点型类型说明符 float等。
例如:int a, b, c;
/*声明a,b,c为整型变量*/
清华大学出版社
2.1 数据类型与表达式
2.1.4 浮点型数据
说明:
(1) 有效数字是指数据在计算机中存储和输出时能够精确表示的数字位数。
对于超过有效数字的数字位,系统存储时自动舍去。
(2) 定义变量时是选择float还是定义double型,要根据存储数据要求的有
效数字来确定。
例如:
float x,y;
int b=5;
/*声明b为整型变量,初值为5*/
float f=3.56;
/*声明f为浮点型变量,初值为3.56*/
char c='a';
/*声明c为字符型变量,初值为'a' */
清华大学出版社
2.1 数据类型与表达式
2.1.2 常量与变量
【示例2-2】变量定义和赋值示例。 #include <stdio.h> int main() { int a,b; a=234; printf("\n%d , %d \n",a,b); return 0; }
(x,y为单精度浮点型量,有效数字6位)
double a,b,c; (a,b,c为双精度浮点型量,有效数字15位)
清华大学出版社
2.1 数据类型与表达式
2.1.4 浮点型数据
【示例2-3】浮点型数据有效数字示例。
#include <stdio.h>
int main()
{
float a;
/*说明变量 a为单精度型
浮点数。
(2)指数形式:由十进制数、标志“e”或“E”以及指数(只能为整数,可以
带符号)组成。
其一般形式为a E n (a为十进制数,n为十进制整数)。
如1.23E5 、123e3、123E3、0.23E6都是浮点数的合法表示,都表示浮点
数123000。
以下是不合法的浮点数表示:345 (无小数点),1.23E2.3 (指数不能为
清华大学出版社
2.1.1 C语言数据类型
2.1 数据类型与表达式
C语言规定的主要数据类型:
清华大学出版社
2.1 数据类型与表达式
2.1.1 C语言数据类型
说明: (1) 在C语言中,数据类型可分为:基本类型、枚举类型、空类型和派生类型 四大类。基本类型使用频率最高,包括:整型类型和浮点类型,整型类型又包 括基本整型(int)、短整型(short int)、长整型(long int)、双长 整型(long long int)、字符型(char)和布尔型(bool)。浮点类型 又分为单精度浮点型(float)、双精度浮点型(double )和复数浮点型 (float_complex,double_complex,long long _complex)。 (2) C语言为每个类型定义了一个标识符,称为类型说明符。例如,整型用 int标识、字符型用char标识、单精度浮点型用float标识。
清华大学出版社
2.1 数据类型与表达式
2.1.3 整型数据
1. 整型常量的表示方法 整型常量的表示方法有十进制、八进制和十六进制。
十进制整型常量。没有前缀,其数码为0~9。 以下是合法的十进制整型常量:237,-568,65535,1627。 以下是不合法的十进制整型常量:0x23(不能有前导0x),23D (含有非十 进制数码)。
清华大学出版社
2.1 数据类型与表达式
2.1.3 整型数据
2. 整型变量的分类 C语言整型变量,根据整型数据大小和存储的不同,又分为int (基本整型)、 short (短整型) 、long(长整型) 、long long(双长整型) 、 unsigned int( 无符号基本整型)、unsigned short (无符号短整型)、 unsigned long(无符号长整型)、unsigned long long(无符号双长 整型)等类型。
例如:int b;
b =5;
b
变量名
5
变量值
存储单元
图 2-1 清华大学出版社
2.1 数据类型与表达式
2.1.2 常量与变量
4.变量的定义
C语言规定:程序里使用的每个变量都必须定义,也就是说必须“先定义,后
使用”。在程序编译时,编译系统会根据变量类型为定义的变量在内存中分配
一定大小的存储单元。
例如 int a,b;
清华大学出版社
项目2:计算器程序
计算器程序功能描述
简单计算器: 编程实现对输入的两个数值,进行加、减、乘、除、
求余数的运算。(输出结果,保留小数点后两位数)。 科学计算器:
编程实现除简单计算器加、减、乘、除、求余数的运 算外,还能实现求平方根、幂次方、指数、对数、正弦 和余弦函数值。(输出结果,保留小数点后两位数)。
*/
double b;
/*说明变量 b为双精度型
*/
a=3.14159265358979323846; /*为a赋值*/