(C语言版)科学计算器设计
- 格式:doc
- 大小:39.00 KB
- 文档页数:11
c 课程设计计算器报告一、教学目标本课程的教学目标是使学生掌握C语言的基本语法,熟练使用C语言进行程序设计。
具体分为三个部分:1.知识目标:学生需要掌握C语言的基本语法,包括数据类型、运算符、控制结构、函数等。
2.技能目标:学生能够使用C语言编写简单的程序,解决实际问题。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生解决问题的能力。
二、教学内容教学内容主要包括C语言的基本语法和程序设计的基本方法。
具体安排如下:1.第一章:C语言概述,介绍C语言的历史和发展,理解C语言的特点。
2.第二章:数据类型和运算符,学习C语言的基本数据类型和运算符。
3.第三章:控制结构,学习C语言的条件语句和循环语句。
4.第四章:函数,学习C语言的函数定义和调用。
5.第五章:数组和字符串,学习C语言的数组和字符串操作。
6.第六章:指针,学习C语言的指针概念和应用。
7.第七章:结构体和文件,学习C语言的结构体和文件操作。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法:1.讲授法:讲解C语言的基本语法和概念。
2.案例分析法:通过分析实际案例,让学生理解C语言的应用。
3.实验法:安排实验课程,让学生动手编写C语言程序。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C程序设计语言》2.参考书:《C Primer Plus》、《C和指针》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、编程环境五、教学评估本课程的评估方式包括平时表现、作业、考试等。
具体安排如下:1.平时表现:占课程总评的30%,包括课堂参与度、提问回答、小组讨论等。
2.作业:占课程总评的30%,包括课后练习、编程任务等。
3.考试:占课程总评的40%,包括期中考试和期末考试。
评估方式要求客观、公正,能够全面反映学生的学习成果。
我们将根据学生的实际情况,及时给予反馈,帮助学生提高。
六、教学安排本课程的教学进度安排如下:1.每周一次课,每次课2小时。
《可视化编程技术课程设计》报告题目仿照Windows系统计算器设计计算器1.引言计算器的产生和发展是建立在电子计算机基础之上的,现代社会很需要一个健全、高效率的计算器。
为了提高自己的实践能力和将来开发一个更实用更全能更智能的计算器,以设计与实现计算器为课题。
此次设计的计算器应用软件从visual studio 2012编程环境中开发,是一个简单的窗体应用程序,实现简单的计算器功能。
以微软自带的计算器为模板,设计了简单易懂的计算器。
这款计算器不仅实现了简单的四则运算的功能,还可以进行复杂数学运算,和进制转换(十进制转二进制、八进制、十六进制)。
具有简洁的外观,即时准确的获得所需要要计算的结果,充分降低了数字计算器的难度和所需要的时间,对人们生活和学习具有有很大的帮助。
2. 系统设计(1)功能设计本计算器由四大模块,分别为:1.标准计算器(即为主窗口)2.科学型计算器3.程序员计算器(进制转换)4.开发者介绍(2)界面设计主窗口界面(from1)科学型计算器界面(from2)程序员界面(from3)开发者介绍(from4)1.文本框的设置:textBox1.Text = "0";窗口启动前:Form1.x = 0;//point:1 ;nopoint: 0Form1.a = 0;//1:+ 2:- 3:* 4:/Form1.b = 0;//判D断?是否执行过运算执行过运算Form1.shu1 = 0;Form1.shu2 = 0;Form1.result = 0;2.按键的设置:数字键及小数点:public static void number(object sender, TextBox textBox1){Button btn = (Button)sender;if ( == "one"){if (x == 1)//判断有小数点Ì{textBox1.Text = textBox1.Text + '1';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 1";elsetextBox1.Text = (textBox1.Text + '1').ToString(); }if ( == "two"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '2';return;}if (b != 0){textBox1.Text = "0";b = 0;}textBox1.Text = " 2";elsetextBox1.Text = (textBox1.Text + '2').ToString(); }if ( == "three"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '3';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 3";elsetextBox1.Text = (textBox1.Text + '3').ToString(); }if ( == "four"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '4';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 4";elsetextBox1.Text = (textBox1.Text + '4').ToString(); }if ( == "five"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '5';return;if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 5";elsetextBox1.Text = (textBox1.Text + '5').ToString(); }if ( == "six"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '6';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 6";elsetextBox1.Text = (textBox1.Text + '6').ToString(); }if ( == "seven"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '7';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 7";elsetextBox1.Text = (textBox1.Text + '7').ToString(); }{if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '8';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 8";elsetextBox1.Text = (textBox1.Text + '8').ToString(); }if ( == "nine"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '9';return;}if (b != 0){textBox1.Text = "0";b = 0;}if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 9";elsetextBox1.Text = (textBox1.Text + '9').ToString(); }if ( == "zero"){if (x == 1)//判断有无小数点{textBox1.Text = textBox1.Text + '0';return;}if (b != 0)//两个数的界限判断?{textBox1.Text = "0";b = 0;if (double.Parse(textBox1.Text) == 0)textBox1.Text = " 0";elsetextBox1.Text = (textBox1.Text + '0').ToString();}}public void one_Click(object sender, EventArgs e){number(sender, textBox1);}public void Form1_Load(object sender, EventArgs e){textBox1.Text = "0";}public static void point(object sender, TextBox textBox1){if (double.Parse(textBox1.Text) == 0)x = 1;textBox1.Text = (textBox1.Text + '.').ToString();}public void xiaoshudian_Click(object sender, EventArgs e){point(sender, textBox1);}运算符号1(加减乘除、退格。
c 简单计算器课程设计一、课程目标知识目标:1. 让学生掌握简单计算器的基本操作,包括开机、关机、清除屏幕、输入数字和运算符号。
2. 使学生理解加、减、乘、除四则运算的基本概念,并能够在简单计算器上进行正确的运算操作。
3. 帮助学生识别计算器上各个按键的功能,了解其对应的数学意义。
技能目标:1. 培养学生运用简单计算器解决实际问题的能力,如购物找零、计算面积等。
2. 提高学生进行四则运算的速度和准确性,提高计算效率。
3. 引导学生掌握计算器使用技巧,如连续计算、顺序计算等。
情感态度价值观目标:1. 培养学生对计算器的正确态度,认识到计算器是学习数学的工具,而非替代品。
2. 激发学生学习数学的兴趣,让学生在轻松愉快的氛围中体验数学计算的乐趣。
3. 培养学生的合作意识,使学生在小组讨论和互助学习中提高沟通能力,培养团队精神。
本课程针对小学三年级学生设计,结合学生年龄特点,注重激发兴趣和培养动手操作能力。
课程内容紧密联系教材,将目标分解为具体的学习成果,便于后续教学设计和评估。
通过本课程的学习,学生将能够熟练运用简单计算器,提高数学计算能力,培养良好的学习习惯和团队协作能力。
二、教学内容1. 计算器的基本结构:引导学生认识计算器的外观、各部分名称及其功能。
- 教材章节:第三章第1节《认识计算器》- 内容列举:计算器按键布局、显示屏、开机与关机、清除键等。
2. 四则运算操作:讲解加、减、乘、除四则运算在计算器上的操作方法。
- 教材章节:第三章第2节《计算器的四则运算》- 内容列举:按键输入、运算顺序、连续运算、计算结果读取等。
3. 计算器使用技巧:教授计算器的高级使用技巧,提高计算效率。
- 教材章节:第三章第3节《计算器使用技巧》- 内容列举:百分比计算、乘方运算、记忆功能等。
4. 实践应用:结合实际生活场景,让学生运用计算器解决实际问题。
- 教材章节:第三章第4节《计算器在实际生活中的应用》- 内容列举:购物找零、计算面积、体积、速度等。
用C语言设计一个多功能计算器实现功能:1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。
按‘C’清屏,按‘X’退出。
例如:输入:2+5输出:72)实现单运算符表达式计算的功能。
输入的操作数可以包含整数或浮点数。
如果遇到错误的表达式,应输出错误提示信息。
输入表达式如下:例如:输入:2+5输出:7目录摘要 (1)第一章引言 (3)1.1 计算器概述 (3)第二章设计任务及要求 (5)2.1 设计任务 (5)2.2 设计要求 (6)第三章计算器硬件设计 (7)3.1 方案说明 (7)3.2 设计单片机主体电路图 (8)第四章软件设计 (9)4.1 模块介绍 (9)4.2 程序流程图 (10)4.3 程序部分 (11)第五章总结 (16)参考文献 (17)摘要:[目录]一、课程设计题目及任务要求二、设计思路三、部分程序介绍四、程序框图五、汇编程序六、参考资料[原文]一、课程设计题目及任务要求请设计十进制加减法计算器。
要求能(不同时)显示3位输入和4位输出。
二、设计思路1、操作显示设备显示设备采用八片七段共阴极LED显示器,共设置16 个键,其中数字键0~9 共十个,接下来依次是加号键、减号键、等于号、清除键。
操作设备是两行八列共16键的简单键盘。
第一行从左至右分别为0、1、2、3、4、5、6、7,第二行分别为8、9、A(+)、B(-)、C(=)、D(清除键)、E (清除键)、F(清除键),“清除键”表示程序初始化,为下次输入准备。
2、程序实现功能(1)十进制加减法计算:输入范围为(1~999),该程序输入两个定点数,每个3位,输出4位;A为加,B为减,C为等于,输出为四位计算结果。
数据输入采用规范化输入,即必须输入3个数才算完成一个运算数的输入,两个运算数之间输入运算符A或者B,输入完成按C显示计算结果;(2)计算机复位功能:DEF均为清零重启,任何时候按下DEF中一个将重新开始;三、部分程序介绍(1)主程序(START)程序开始运行初始化程序,设置输入输出口PA、PB、PC,扫描键盘,输入两个待求数据和运算符,存入寄存器,等待输入等号同时显示第二个数,运行计算程序,并将计算结果分离,输出到显示器;(2)读键子程序(RD_KB)程序分别扫描两行键盘,若有键按下则通过移位的方式计算键码;若无键按下,则将键码缓存设置为10H,判断后进行相应的跳转。
计算器编程 c语言用C语言设计计算器程序源代码#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#include <stdio.h>#include <math.h>int main() {char op;double num1, num2, result;printf("请输入一个数学表达式(例如:2 + 3):\n"); scanf("%lf %c %lf", &num1, &op, &num2);switch(op) {case '+':result = num1 + num2;break;case '-':result = num1 - num2;break;case '*':result = num1 * num2;break;case '/':if(num2 == 0) {printf("错误:除数不能为0!\n");return 0;} else {result = num1 / num2;}break;case '^':result = pow(num1, num2);break;default:printf("错误:不支持的操作符!\n");return 0;}printf("结果为:%lf\n", result);return 0;}```该程序首先要求用户输入一个数学表达式,然后使用scanf函数读取表达式中的操作数和运算符。
接下来,使用switch语句根据运算符执行相应的计算,并将结果存储在result变量中。
最后,程序输出计算结果。
实验报告课程名称:windows软件开发实习实验项目:科学计算器工业大学实验报告(适用计算机程序设计类)专业班级:软件1006 学号:101201622 :鑫可实验名称:附件A 工业大学实验报告(适用计算机程序设计类)专业班级:软件1006 学号:101201622 :鑫可实验步骤或程序:一、关于Visual C++:Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment,IDE)。
Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。
这些组件通过过一个名为Developer Studio的组件集成为和谐的开发环境。
Microsoft的主力软件产品。
Visual C++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。
所以实际中,更多的是以Visual C++6.0为6平台。
Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。
比如,它允许用户进行远程调试,单步执行等。
还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。
其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。
这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。
二、设计要点1、基本要求:设计的系统界面要美观大方,操作合理,有必要的提示。
科学计算器设计(C语言版)学校:学院:计算机信息工程学院语言平台:作者:日期:一、背景和目的计算器是现代日常生活中使用较为频繁的工具之一,常用的计算器有简易版和科学计算器两种模式。
简易版的计算器不支持表达式运算,每次只能输入一个数据或者运算符来计算,而科学计算器除了容纳简易版计算器的功能外,还支持表达式运算,用户可以输入一个合法的算术表达式来得到所需的结果。
常用的算术表达式有三种,前缀表达式,中缀表达式和后缀表达式。
中缀表达式:我们平时书写的表达式就是中缀表达式,形如(a+b)*(c+d),事实上是运算表达式形成的树的中序遍历,特点是用括号来描述优先级。
后缀表达式:也叫逆波兰表达式,事实上是算数表达式形成的树的后序遍历。
中缀表达式(a+b)*(c+d)的后缀表达式是ab+cd+*,它的特点就是遇到运算符就立刻进行运算。
前缀表达式:算数表达式形成的树的前序遍历。
日常所书写的是中缀表达式,但是计算机内部是用后缀表达式计算,所以此程序的用户使用中缀表达式作为输入,程序将中缀表达式转化为后缀表达式后再进行运算并输出结果。
由于今后工作将使用C语言进行开发,而C语言是一个功能强大并且很灵活的语言,为复习和巩固C编程,故决定用C语言编写一个科学计算器。
本次开发采用C语言,以面对过程思想进行开发,使用的数据结构有队列和栈。
二、模块设计本次开发,使用的控制台输入,并直接在控制台输出。
科学计算器的功能组件如下:三、详细设计宏:#define TESTﻩﻩﻩ//表示测试阶段#define MAX_SIZE 100 //表达式长度#defineLBRACKET 0ﻩﻩ//左括号#define RBRACKET 1ﻩ//右括号#define ADD 2ﻩﻩ//加#defineSUB 3ﻩ//减#define MUL 4ﻩ//乘#define DIV 5 ﻩ//乘#define INT 6ﻩﻩ //整数#define DOUBLE 7ﻩﻩ//浮点数数据结构:表达式节点struct ExprNode{int n; ﻩ//表达式节点类型double p; ﻩ//表达式节点数据};中缀表达式:struct ExprNode infixExpr[MAX_SIZE];int infixLen;后缀表达式:struct ExprNode suffixExpr[MAX_SIZE];int suffixLen;后缀转换栈:int transStack[MAX_SIZE];int transTop;后缀表达式运算栈:struct ExprNode calcuStack[MAX_SIZE];int calcuTop;函数过程:__inline int get_char( char *c )缓冲变量无字符则读入字符读入成功返回0,否者返回-1int input_expr( void )读入表达式若输入非法字符则返回-1,否则返回0int pri( int a, int b )优先级计算若a优先于b则返回-1,否则返回0int trans_expr( void)中缀表达式转换为后缀表达式括号不匹配返回-1,否则返回0__inline int maxn( int a, int b )求最大值struct ExprNode calcu( struct ExprNode *a, structExprNode *b, int c)计算a和b做c运算的结果int calcu_expr(void )计算后缀表达式表达式计算失败返回-1,否则为0ﻩvoid show( void )输出运算结果代码:#include<stdio.h>//#define TESTﻩ//表示测试阶段#define MAX_SIZE 100ﻩ//表达式长度#define LBRACKET 0ﻩ//左括号#define RBRACKET 1ﻩ//右括号#define ADD 2ﻩﻩﻩ//加#define SUB 3 ﻩ//减#define MUL 4 ﻩ//乘#define DIV 5ﻩﻩ//乘#define INT 6ﻩﻩ//整数#define DOUBLE 7ﻩ//浮点数structExprNode{intn;ﻩ//表达式节点类型ﻩdouble p;ﻩ//表达式节点数据};struct ExprNode infixExpr[MAX_SIZE];//中缀表达式int infixLen;struct ExprNode suffixExpr[MAX_SIZE];ﻩ//后缀表达式int suffixLen;int transStack[MAX_SIZE];ﻩﻩ//后缀转换栈int transTop;struct ExprNode calcuStack[MAX_SIZE]; //后缀表达式运算栈int calcuTop;//缓冲变量无字符则读入字符//读入成功返回0,否者返回-1__inline int get_char( char *c){if ( *c == '\0' ) return scanf( "%c", c );return 0;}//读入表达式//若输入非法字符则返回-1,否则返回0int input_expr( void ){ﻩchar c = 0;int flag = 0, error = 0, s, i;ﻩinfixLen = 0;ﻩwhile ( get_char(&c) != -1)ﻩ{switch ( c )ﻩ{ﻩcase '\n': flag = -1; break;case '(': infixExpr[infixLen++].n = LBRACKET; c = 0; bre ak;ﻩﻩcase ')': infixExpr[infixLen++].n = RBRACKET; c = 0; break;case '+': infixExpr[infixLen++].n = ADD; c = 0;break;ﻩcase '-': infixExpr[infixLen++].n = SUB; c = 0; break;case '*': infixExpr[infixLen++].n = MUL; c =0; break;ﻩcase '/': infixExpr[infixLen++].n = DIV; c =0; break;ﻩﻩdefault:ﻩif ( c>= '0' && c<= '9' || c == '.' ){if ( c != '.' )ﻩﻩ{ﻩﻩinfixExpr[infixLen].n = INT;ﻩinfixExpr[infixLen].p = c-'0';ﻩﻩs = 0;ﻩﻩ}ﻩﻩﻩelse{ﻩinfixExpr[infixLen].n = DOUBLE;ﻩﻩﻩinfixExpr[infixLen].p =0;ﻩﻩﻩs =1;ﻩ}ﻩ c = 0;ﻩﻩwhile( get_char(&c) != -1 )ﻩﻩﻩ{ﻩif ( c >= '0' && c <= '9' )ﻩﻩﻩ{ﻩﻩﻩﻩﻩinfixExpr[infixLen].p = infixExpr[infixLen].p*10+(c-'0');ﻩﻩﻩﻩif( s) s++;ﻩ c = 0;ﻩﻩﻩﻩ}else if ( c== '.' )ﻩ{ﻩﻩif ( s )ﻩﻩﻩﻩﻩ{ﻩﻩerror =-1;ﻩﻩ}ﻩﻩﻩﻩelseﻩﻩ{ﻩﻩﻩinfixExpr[infixLen].n = DOUBLE;ﻩﻩs++;ﻩﻩﻩﻩﻩ}ﻩﻩﻩc = 0;ﻩﻩﻩ}ﻩﻩelse break;ﻩﻩ}ﻩﻩﻩif ( infixExpr[infixLen].n == DOUBLE )ﻩﻩ{ﻩfor ( i = 1; i < s; i++ )ﻩ{ﻩﻩﻩinfixExpr[infixLen].p /= 10;ﻩﻩ}ﻩﻩﻩ}ﻩinfixLen++;ﻩﻩﻩ}ﻩﻩelseﻩﻩ{ﻩﻩﻩerror = -1;ﻩc= 0;ﻩ}ﻩﻩbreak;ﻩ}ﻩif ( flag )break;};ﻩreturn error;}//优先级计算//若a优先于b则返回-1,否则返回0int pri( int a, int b ){ﻩint c[2], p[2], i;c[0] = a; c[1] = b;ﻩfor ( i =0; i < 2; i++)ﻩ{ﻩswitch ( c[i] )ﻩ{ﻩcase LBRACKET: p[i] = 0;break;ﻩcase ADD:ﻩcase SUB: p[i] = 1; break;caseMUL:ﻩcase DIV: p[i]= 2; break;ﻩﻩﻩﻩ}ﻩ}ﻩif ( p[0] >=p[1] ){ﻩreturn -1;ﻩ}ﻩreturn 0;}//中缀表达式转换为后缀表达式//括号不匹配返回-1,否则返回0int trans_expr( void ){int i, error = 0, flag;ﻩsuffixLen = 0;transTop = 0;ﻩfor ( i = 0; i < infixLen;i++){ﻩif( infixExpr[i].n >=INT )ﻩ//当读到数字直接送至输出队列中ﻩ{ﻩsuffixExpr[suffixLen++] =infixExpr[i];ﻩﻩ}ﻩﻩelse if ( infixExpr[i].n > RBRACKET )//当读入运算符时ﻩﻩ{ﻩ//将栈中所有优先级高于或等于T的运算符弹出,送至输出队列while ( transTop > 0 )ﻩ{ﻩif ( pri( transStack[transTop-1], infixExpr[i].n ) ) ﻩﻩ{ﻩﻩsuffixExpr[suffixLen++].n = transStack[--transTop];ﻩ}ﻩﻩﻩelse break;}ﻩﻩ//再把运算符入栈ﻩﻩﻩtransStack[transTop++] = infixExpr[i].n;ﻩ}else if ( infixExpr[i].n == LBRACKET )ﻩ//读到左括号时总是将它压入栈中ﻩ{ﻩﻩﻩtransStack[transTop++] = infixExpr[i].n;ﻩ}ﻩﻩelseﻩ//读到右括号时ﻩ{ﻩﻩﻩflag = -1;ﻩﻩ//将靠近栈顶的第一个左括号上面的运算符依次全部弹出,送至输出队列ﻩﻩﻩwhile ( transTop > 0 )ﻩﻩ{ﻩﻩif (transStack[transTop-1] == LBRACKET )ﻩﻩ{ﻩflag = 0;ﻩbreak;ﻩﻩﻩ}suffixExpr[suffixLen++].n = transStack[--transTop]; ﻩﻩ}ﻩﻩﻩ//再丢弃左括号ﻩﻩif( flag ) error = -1;ﻩﻩelse transTop--;ﻩ}ﻩ}ﻩwhile (transTop > 0 )ﻩ{if ( transStack[transTop-1] == LBRACKET )ﻩ{ﻩerror = -1;ﻩ}suffixExpr[suffixLen++].n =transStack[--transTop];ﻩ}ﻩ//在测试阶段输出后缀表达式#ifdef TESTﻩfor ( i = 0; i < suffixLen;i++ )ﻩ{ﻩﻩswitch(suffixExpr[i].n )ﻩ{ﻩcase ADD: printf( "+ " );break;ﻩcase SUB: printf( "- " ); break;case MUL: printf( "*" );break;ﻩcase DIV: printf( "/ " ); break;ﻩcaseINT: flag = suffixExpr[i].p; printf( "%d ", flag ); break; ﻩcase DOUBLE: printf( "%lf ", suffixExpr[i].p); break;}}#endifﻩreturn error;}//求最大值__inline int maxn(int a, int b ){ﻩif (a >= b ) return a;ﻩreturn b;}//计算a和b做c运算的结果struct ExprNode calcu( struct ExprNode *a, struct ExprNode *b,intc ){struct ExprNode r;int i, j;r.n = maxn( a->n, b->n);ﻩswitch ( c )ﻩ{case ADD:r.p=(a->p)+(b->p); break;ﻩcase SUB: r.p = (a->p)-(b->p); break;case MUL: r.p = (a->p)*(b->p); break;case DIV: r.p = (a->p)/(b->p);ﻩﻩﻩif ( r.n == INT )ﻩ {ﻩﻩﻩﻩi=a->p;ﻩ j = b->p;ﻩﻩ if ( i%j ) r.n = DOUBLE;ﻩ }break;}returnr;}//计算后缀表达式//表达式计算失败返回-1,否则为0int calcu_expr(void ){int i, j, error = 0;structExprNode a[2], r;ﻩcalcuTop = 0;for ( i = 0; i < suffixLen && !error; i++ )ﻩ{if (suffixExpr[i].n >= INT ) //读到数字就将它压入栈S中ﻩ{ﻩﻩcalcuStack[calcuTop++] = suffixExpr[i];ﻩ}ﻩelse //读到运算符ﻩﻩ{ﻩﻩ//从栈中依次弹出两个数X和Yﻩfor ( j = 0; j < 2; j++ )ﻩﻩ{ﻩﻩﻩif( calcuTop ) a[j] = calcuStack[--calcuTop];else error = -1;ﻩ}//以"X运算符Y"的形式计算出结果,再将结果压入栈Sif( !error )ﻩﻩ{ﻩﻩcalcuStack[calcuTop++] = calcu( &a[1],&a[0], suffixExpr [i].n);ﻩﻩ}ﻩ}ﻩ}if (calcuTop !=1 ) error = -1;ﻩreturn error;}//输出运算结果void show(void ){ﻩinti, n;#ifndef TESTﻩfor ( i = 0; i < suffixLen; i++ )ﻩ{ﻩswitch ( infixExpr[i].n )ﻩ{ﻩcase LBRACKET: printf( "(" ); break;ﻩcaseRBRACKET: printf( ") " ); break;ﻩcase ADD: printf( "+ " );break;ﻩcase SUB: printf( "- " ); break;--ﻩﻩcase MUL: printf( "*" ); break;ﻩcase DIV: printf( "/ " );break;case INT: n = infixExpr[i].p; printf( "%d", n ); break;case DOUBLE: printf( "%lf ", infixExpr[i].p ); break;ﻩ}}#endifif ( calcuStack[0].n == INT ){ﻩn = calcuStack[0].p;printf( "= %d\n", n );ﻩ}ﻩelseﻩ{printf( "= %lf\n",calcuStack[0].p );}}int main( int argc, char argv[] ){doﻩ{ﻩif ( input_expr() ){ﻩprintf( "请输入正确的表达式!\n" );ﻩﻩﻩcontinue;ﻩ}ﻩﻩif ( trans_expr() != -1&& calcu_expr() != -1 )ﻩ{ﻩﻩshow();ﻩ}elseﻩ{ﻩﻩﻩprintf( "请输入正确的表达式!\n");ﻩ}}while ( 1 );return0;}--。