C语言程序计算器设计

合集下载

c语言设计计算器课程设计

c语言设计计算器课程设计

c语言设计计算器课程设计一、课程目标知识目标:1. 学生能够掌握C语言基本语法和数据类型,特别是整型、浮点型的运用。

2. 学生能够理解并运用顺序结构、选择结构和循环结构进行程序设计。

3. 学生能够运用C语言的算术运算符,实现基本的数学运算功能。

技能目标:1. 学生能够编写简单的C程序,实现加、减、乘、除等基本计算功能。

2. 学生能够通过键盘输入数据,并处理输入异常。

3. 学生能够运用调试工具检查并修正程序中的错误。

情感态度价值观目标:1. 学生培养编程的兴趣,认识到编程在解决问题中的重要性。

2. 学生在学习过程中形成合作意识,培养团队精神。

3. 学生通过编程解决实际问题,体验成就感,增强自信心。

分析课程性质、学生特点和教学要求:本课程针对的是高一年级学生,他们对C语言已有一定的基础知识,具备基本的编程能力。

课程性质为实践性较强的编程课程,旨在让学生通过动手实践,掌握C语言编程技巧。

教学要求注重培养学生的实际编程能力,将理论知识与实际应用相结合。

课程目标分解:1. 学生能够独立完成一个简单的计算器程序,实现加、减、乘、除功能。

2. 学生能够运用所学知识对程序进行优化,提高计算器的运算效率和用户体验。

3. 学生通过课程学习,培养良好的编程习惯和解决问题的能力。

二、教学内容本课程教学内容紧密结合课程目标,确保学生能够系统地学习和掌握C语言编程计算器的制作。

1. C语言基本语法和数据类型复习:回顾整型、浮点型等基本数据类型,强调其在计算器程序中的应用。

2. 运算符和表达式:详细介绍C语言的算术运算符,如加、减、乘、除等,并讲解表达式的构成和计算规则。

3. 控制结构:- 顺序结构:巩固顺序执行的概念,并应用于计算器程序。

- 选择结构:讲解if语句,实现计算器的不同运算功能。

- 循环结构:介绍for和while循环,实现重复计算功能。

4. 输入输出函数:教授scanf和printf函数的使用,实现用户与计算器程序的交互。

C语言实现简单计算器

C语言实现简单计算器

C语⾔实现简单计算器本⽂实例为⼤家分享了C语⾔实现简单计算器的具体代码,供⼤家参考,具体内容如下实现效果如图:实现代码如下:#include<stdio.h>#include<windows.h>//gotoxy#include<conio.h>#define width 80#define height 30void gotoxy(int x, int y);void GreateFrame(){int i = 0;for (i = 0 ; i < width; i += 2){gotoxy(i, 0); printf("■");gotoxy(i, height); printf("■");}for (i = 0; i < height + 1; i++){gotoxy(0 , i); printf("■");gotoxy(width, i); printf("■");}}void Add(){float i, j;printf("*加法运算*\n");scanf_s("%f %f", &i, &j);printf("%5.2f + %5.2f=%5.2f\n", i, j, i+j); _getch();}void Sub(){float i, j;printf("*减法运算*\n");scanf_s("%f %f", &i, &j);printf("%5.2f - %5.2f=%5.2f\n", i, j, i -j); _getch();}void Mul(){float i, j;printf("*乘法运算*\n");scanf_s("%f %f", &i, &j);printf("%5.2f * %5.2f=%5.2f\n", i, j, i * j); _getch();}void Div(){float i, j;printf("*除法运算*\n");scanf_s("%f %f", &i, &j);printf("%5.2f / %5.2f=%5.2f\n", i, j, i / j); _getch();}int main(int argc, char* argv[]){int choose;while (1){GreateFrame();gotoxy(width / 3, height / 3 + 2);printf("1.加法");gotoxy(width / 3, height / 3 + 4);printf("2.减法");gotoxy(width / 3, height / 3 + 6);printf("3.乘法");gotoxy(width / 3, height / 3 + 8);printf("4.除法");gotoxy(width / 3, height / 3 + 10);printf("5.退出程序");gotoxy(width / 3, height / 3);printf("请选择你要计算的⽅式:( )\b\b"); scanf_s("%d", &choose);switch (choose){case 1:system("cls");Add(); break;case 2:system("cls");Sub(); break;case 3:system("cls");Mul(); break;case 4:system("cls");Div(); break;case 5:exit(0);}system("cls");}}void gotoxy(int x, int y){COORD POS;POS.X = x;POS.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),POS);}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

C课程设计(计算器)[转载]

C课程设计(计算器)[转载]
循环结构可以简化代码,提高程序的可读性和可维护性。
04
C语言函数
函数的定义和声明
函数定义:函数是完成特定任务的独立代码块,可以重复使用 函数声明:在函数定义之前,需要先声明函数,以便编译器知道函数的存在 函数参数:函数可以接受参数,参数可以是变量、常量或其他表达式 函数返回值:函数可以返回一个值,返回值可以是任何类型的数据
2010年代,全球科学家共 同研发了第一台量子计算

计算器的应用场景
家庭日常计算:如购物、做饭等 学校教育:如数学、物理等学科的教学和练习 商业计算:如财务、会计等业务的计算和统计 科研计算:如科学研究、工程计算等数据的处理和分析
02
C语言基础
C语言概述
C语言是一种高级 编程语言,广泛应 用于系统编程、嵌 入式系统、驱动程 序等领域。
01
计算器概述
计算器的基本功能
加减乘除运算 平方、开方、求余等高级运算 存储和读取数据
计算器模式切换(如科学计算器、工 程计算器等)
单位转换(如长度、重量、温度等)
计算器设置(如时间、日期、闹钟等)
计算器的发展历程
1820年,英国数学家查尔 斯·巴比奇发明了第一台差
分机
1960年代,日本科学家发 明了第一台便携式电子计
执行流程:函 数被调用后, 会按照函数体 中的代码顺序
执行
返回值:函数 执行完成后,
可以通过 return语句返
回一个值
结束调用:函 数执行完成后, 会返回到调用 函数的位置, 继续执行后面
的代码
05
计算器功能实现
输入输出处理
输入:键盘输入,支持数字、运算符号等 输出:显示屏显示计算结果 处理:计算器内部进行计算,包括加减乘除等基本运算 错误处理:输入错误时,给出提示信息,如“输入错误,请重新输入”

c语言简单计算器程序

c语言简单计算器程序

c语言简单计算器程序以下是一个简单的C语言计算器程序,它可以执行基本的加法、减法、乘法和除法操作。

用户可以输入两个操作数和操作符,然后程序将输出计算结果。

```c#include <stdio.h>// 函数声明float add(float num1, float num2);float subtract(float num1, float num2);float multiply(float num1, float num2);float divide(float num1, float num2);int main() {char operator;float num1, num2, result;// 获取用户输入printf("Enter first number: ");scanf("%f", &num1);printf("Enter operator (+, -, *, /): ");scanf(" %c", &operator); // 注意空格,避免读取上一个输入的换行符printf("Enter second number: ");scanf("%f", &num2);// 执行计算switch (operator) {case '+':result = add(num1, num2);break;case '-':result = subtract(num1, num2);break;case '*':result = multiply(num1, num2);break;case '/':result = divide(num1, num2);break;default:printf("Invalid operator\n");return 1; // 退出程序,返回错误码}// 输出结果printf("Result: %.2f\n", result);return 0;}// 函数定义float add(float num1, float num2) {return num1 + num2;}float subtract(float num1, float num2) {return num1 - num2;}float multiply(float num1, float num2) {return num1 * num2;}float divide(float num1, float num2) {if (num2 != 0) {return num1 / num2;} else {printf("Error: Division by zero\n");return 0; // 在实际应用中,可能需要采取其他处理方式,这里简单返回0 }}```这个程序首先提示用户输入第一个数字、运算符和第二个数字。

c语言实验报告计算器

c语言实验报告计算器

c语言实验报告计算器C 语言实验报告计算器一、实验目的本次 C 语言实验的主要目的是通过编写程序实现一个简单的计算器功能,加深对 C 语言基本语法、数据类型、控制结构和函数的理解和运用,提高编程能力和解决实际问题的能力。

二、实验要求1、实现基本的四则运算(加、减、乘、除)功能。

2、能够处理用户输入的合法表达式,并输出计算结果。

3、具备错误处理能力,如除数为 0 、输入不合法等情况。

三、实验环境本次实验使用的编程环境是 Visual Studio Code,编译器为 GCC。

四、算法设计与思路(一)整体思路首先,需要从用户那里获取输入的表达式。

然后,对表达式进行解析和计算。

在计算过程中,需要根据运算符的优先级进行相应的运算。

为了实现这个过程,可以使用栈来存储运算符和操作数。

(二)具体算法1、定义一个栈来存储运算符,另一个栈来存储操作数。

2、逐字符读取输入的表达式。

如果是数字字符,则将其转换为数字并压入操作数栈。

如果是运算符,则根据运算符的优先级进行处理。

如果当前运算符的优先级高于栈顶运算符的优先级,则将其压入运算符栈。

否则,从操作数栈中弹出两个操作数,从运算符栈中弹出一个运算符,进行相应的运算,并将结果压入操作数栈。

3、当表达式读取完毕后,依次从运算符栈和操作数栈中弹出元素进行计算,直到运算符栈为空,此时操作数栈中的唯一元素即为表达式的计算结果。

五、代码实现```cinclude <stdioh>include <stdlibh>include <ctypeh>//定义栈的最大容量define MAX_SIZE 100//定义操作符栈typedef struct {char itemsMAX_SIZE;int top;} OperatorStack;//定义操作数栈typedef struct {double itemsMAX_SIZE;int top;} OperandStack;//初始化操作符栈void initOperatorStack(OperatorStack stack) {stack>top =-1;}//初始化操作数栈void initOperandStack(OperandStack stack) {stack>top =-1;}//判断操作符栈是否为空int isOperatorStackEmpty(OperatorStack stack) {return stack>top ==-1;}//判断操作数栈是否为空int isOperandStackEmpty(OperandStack stack) {return stack>top ==-1;}//操作符入栈void pushOperator(OperatorStack stack, char op) {if (stack>top < MAX_SIZE 1) {stack>items++stack>top = op;} else {printf("Operator stack overflow!\n");exit(1);}}//操作数入栈void pushOperand(OperandStack stack, double num) {if (stack>top < MAX_SIZE 1) {stack>items++stack>top = num;} else {printf("Operand stack overflow!\n");exit(1);}}//操作符出栈char popOperator(OperatorStack stack) {if (!isOperatorStackEmpty(stack)){return stack>itemsstack>top;} else {printf("Operator stack underflow!\n");exit(1);}}//操作数出栈double popOperand(OperandStack stack) {if (!isOperandStackEmpty(stack)){return stack>itemsstack>top;} else {printf("Operand stack underflow!\n");exit(1);}}//获取操作符的优先级int getPriority(char op) {switch (op) {case '+':case '':return 1;case '':case '/':return 2;default:return -1;}}//计算表达式double calculate(char expression) {OperatorStack opStack;OperandStack numStack; initOperatorStack(&opStack);initOperandStack(&numStack);int i = 0;while (expressioni!='\0'){if (isdigit(expressioni)){double num = 0;while (isdigit(expressioni)){num = num 10 +(expressioni '0');i++;}if (expressioni ==''){double fraction = 01;i++;while (isdigit(expressioni)){num +=(expressioni '0') fraction; fraction /= 10;i++;}}pushOperand(&numStack, num);} else if (expressioni =='('){pushOperator(&opStack, expressioni);i++;} else if (expressioni ==')'){while (opStackitemsopStacktop!='('){double num2 = popOperand(&numStack);double num1 = popOperand(&numStack);char op = popOperator(&opStack);if (op =='+'){pushOperand(&numStack, num1 + num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op =='/'){if (num2 == 0) {printf("Division by zero!\n");exit(1);}pushOperand(&numStack, num1 / num2);}}popOperator(&opStack);i++;} else {while (!isOperatorStackEmpty(&opStack) &&getPriority(opStackitemsopStacktop) >= getPriority(expressioni)){double num2 = popOperand(&numStack);double num1 = popOperand(&numStack);char op = popOperator(&opStack);if (op =='+'){pushOperand(&numStack, num1 + num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op =='/'){if (num2 == 0) {printf("Division by zero!\n");exit(1);}pushOperand(&numStack, num1 / num2);}}pushOperator(&opStack, expressioni);i++;}}while (!isOperatorStackEmpty(&opStack)){double num2 = popOperand(&numStack);double num1 = popOperand(&numStack);char op = popOperator(&opStack);if (op =='+'){pushOperand(&numStack, num1 + num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op =='/'){if (num2 == 0) {printf("Division by zero!\n");exit(1);}pushOperand(&numStack, num1 / num2);}}return popOperand(&numStack);}int main(){char expression100;printf("Enter an expression: ");scanf("%s", expression);double result = calculate(expression);printf("Result: %f\n", result);return 0;}```六、实验结果与分析(一)测试用例及结果以下是一些测试用例及其对应的结果:1、输入:"2 + 3",输出:50000002、输入:"5 2",输出:30000003、输入:"3 4",输出:120000004、输入:"6 / 2",输出:30000005、输入:"2 + 3 4",输出:140000006、输入:"(2 + 3) 4",输出:200000007、输入:"5 / 0",输出:Division by zero!(二)结果分析从测试结果来看,程序能够正确计算基本的四则运算表达式,包括有括号的情况。

计算器c语言课程设计

计算器c语言课程设计

计算器c语言课程设计 The Standardization Office was revised on the afternoon of December 13, 2020设计分析:我做的是一个计算器程序,属于B级。

题目要求如下:1、完善计算器程序,改为可对实数操作。

2、完善程序,改为多个操作数基本四则运算,遇到z为止。

3、增加函数,完成四则混合运算,增加相应的主菜单选项4、添加语句,使四则运算具有测试功能。

5、可扩充其功能。

所给的计算器源程序中已有基本的加、减、乘、除和开方运算,我所要做的就是添加一个可以进行四则混合运算功能的类。

本程序所要用到的头文件有如下几种:process,iostream,conio,stdlib,math和assert.原程序中已经定义了加、减、乘、除和开方的运算,它用了类oopcalc将这几个基本运算进行封装。

类中包含以下几个函数:void calcadd();void calcsub();void calcdiv();void calcmult();void calcfartocel();void calcceltofar();void calcsroot();void exitprog();void menu();void badinput();每个函数的参数形式如下:int add(float x,float y);int sub(float x, float y);int div(float x, float y);int mult(float x, float y);int fartocel(float x);int celtofar(float x);int sqroot(float x);原程序对这几个函数分别做了如下定义: int oopcalc::add(float x, float y) {val = x + y;return val;}int oopcalc::sub(float x,float y) {val = x - y;return val;}int oopcalc::div(float x, float y) {val = x / y;return val;}int oopcalc::mult(float x, float y) {val = x * y;return val;}int oopcalc::fartocel(float x){int cel = ((x - 32) * 5) / 9;return cel;}int oopcalc::celtofar(float x){int f;f = x * 9 / 5 + 32;return f;}int oopcalc::sqroot(float x){int g = sqrt(x);return g;}首先要把程序改为可对实数进行操作,由于原程序中的操作数类型都是整形,因此我所采用的办法就是把“int”依次改成“float”。

C语言课程设计 简单计算器程序.

C语言课程设计  简单计算器程序.
else
{ printf("Sym栈空\n"); return; }
}
void NumPush()//压栈
{
If(Num.top<MaxSize-1)
{
Num.data[++Num.top]=ston(expr,&i);
}
else
{
printf("Num栈满\n"); return;
}
}
定义逆波兰(后缀式)表达式的计算函数(出栈)
将算术表达式转化为逆波兰表达式计算逆波兰表达式的值

3.1栈的定义与使用
首先定义两个栈,一个字符型,一个双精度型,程序代码如下:
Struct
{
char data[MaxSize];//存放表达式的字符数组
int top;//栈顶指针
}Sym;/*符号*///作为存放运算表达式的栈使用
struct
{
{
if(Sym.top<MaxSize-1)
{ Sym.data[++Sym.top]=calc[i++]; }
else
{ printf("Sym栈满\n"); return; }
}
void SymPop() //出栈
{
if(Sym.top>=0)
{ expr[++t]=Sym.data[Sym.top--];}
(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:a当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入(后缀)逆波兰表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级;b、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。

C语言程序设计编程任务书——计算器

C语言程序设计编程任务书——计算器

开发一个计算器程序一.软件目标所开发软件的目标是开发一个基于对话框的计算器应用程序。

其所能实现的具体功能有加、减、乘、除、平方、开方,以及各种函数变换,并且能够将输入错误的数值清除后再进行重新输入。

二.软件设计基本操作流程1.在VC6.0中新建一个MFC应用程序,以xxx_1命名,选择基于对话框形式,点击确定。

2.在程序的主界面上设计计算器的操作界面,如添加数字按钮和功能按钮以及编辑框和相应框。

3.为按钮、编辑框、相应框添加相应函数,并且在DLG文件中加入变量和函数。

4.设计对话框的内容,如个人信息等。

界面风格界面主要以计算机的操作界面为主,整个界面均布有数字键,功能键和清除按键,而没有添加其他的按键和文字,整体设计十分简单。

软件功能模块整个界面的正上方是计算器的输入和输出界面,左侧为数字按键,而右侧则为功能按键。

三.软件实现过程1. 用MFC AppWizard(exe) 创建一个基于对话框应用程序(1)打开VC6.0,选择文件>新建>工程> MFC AppWizard(exe)。

(2)输入自己的工程名称为xxx_1,点击确认。

(3)在接下来的应用向导中选择基本对话框选项,点击完成后进入主界面。

2. 主界面设置(1)在dialog上右键选择插入一个Dialog,在弹出的对话框中录入开发者的相关信息。

(2)点击IDD_XXX_1_DIALOG,布置计算器主界面,如图三.添加消息映射函数,编写主程序及注释。

编写程序的头文件,加入程序运行必要的头文件,包括#include "string.h" #include "math.h" #include "stdlib.h" 在类向导中关联各个按钮,并一一对应编辑数字键所对应的函数代码,其他数字也按如下方式编写void CXxx_1Dlg::OnButtoNum1() // 数字键1的响应事件{ UpdateData(1); // MFC的窗口函数,刷新编辑框的数据if(m_str=="") // 如果之前没有进行输入,则1为第一个输入的数字m_str="1";elsem_str+="1"; // 如果之前有输入,则1与之前输入的数字一起组成新的数字UpdateData(0);}清除按钮的函数代码void CXxx_1Dlg::OnButtoClear() // 清除按键的响应事件{ UpdateData(1);m_str=""; // 将编辑框的内容清除UpdateData(0);}各个符号运算{ UpdateData(1);if(m_str=="") // 判断前面是否有数字输入m_str=""; // 若前面无数字输入,则点击"+"无效,将显示框还原elsem_str+="+"; // 若前面有数字输入,则将"+"连接到数字的后面UpdateData(0);}void CXxx_1Dlg::OnButtonOperation2() // "-"按键的响应事件{ // 原理与"+"的代码相同UpdateData(1);if(m_str=="")m_str="";elsem_str+="-";UpdateData(0);}void CXxx_1Dlg::OnButtonOperation3() // "*"按键的响应事件{ // 原理与"+"的代码相同UpdateData(1);if(m_str=="")m_str="";elsem_str+="*";UpdateData (0);void CXxx_1Dlg::OnButtonOperation4() // "/"按键的响应事件{ // 原理与"+"的代码相同UpdateData(1);if(m_str=="")m_str="";elsem_str+="/";UpdateData(0);}以及高级运算的计算void CXxx_1Dlg::OnButtonOperation5() // "平方"按键的响应事件{ UpdateData(1);if(m_str=="") // 前面没有数字输入,则点击无效m_str="";else{int i=atoi(m_str); // 利用cstring中的atoi函数将字符串转换成整型类型的数字i=i*i; // 平方运算m_str.Format("%d",i); // 利用format函数将整数转换为字符串类型}UpdateData(0);void CXxx_1Dlg::OnButtonOperation6() // "开方"按键的响应事件{ UpdateData(1);if(m_str=="") // 前面没有数字输入,则点击无效m_str="";else{float f; // 定义float类型的变量f,用来存储开方的结果int num=atoi(m_str); // 利用cstring中的atoi函数将字符串转换成整型类型的数字f=sqrt(num); // 开方的函数m_str.Format("%.2f",f); // 利用format函数将浮点数类型转换为字符串类型}UpdateData(0);}void CXxx_1Dlg::OnButtonOperation7() // "sin"按键的响应事件{ UpdateData(1);if(m_str=="") // 前面没有数字输入,则点击无效m_str="";else{float f=atof(m_str); // 利用cstring中的atof函数将字符串类型转换成float类型,方便操作float y=sin(f); // 三角函数运算m_str.Format("%.2f",y); // 利用format函数将浮点数类型转换为字符串类型}UpdateData(0);}void CXxx_1Dlg::OnButtonOperation8() //"cos"按键的响应事件{ UpdateData(1);if(m_str=="") // 前面没有数字输入,则点击无效m_str="";else{float f=atof(m_str); // 利用cstring中的atof函数将字符串类型转换成float类型,方便操作float y=cos(f); // 三角函数运算m_str.Format("%.2f",y); // 利用format函数将浮点数类型转换为字符串类型}UpdateData(0);}void CXxx_1Dlg::OnButtonOperation9() //"tan"按键的响应事件{ UpdateData(1);if(m_str=="") // 前面没有数字输入,则点击无效m_str="";else{float f=atof(m_str); // 利用cstring中的atof函数将字符串类型转换成float类型,方便操作float y=tan(f); // 三角函数运算m_str.Format("%.2f",y); // 利用format函数将浮点数类型转换为字符串类型}UpdateData(0);}相应的运算关系为for(int j=i+1,m=0;j<len;j++){ latter+=m_str.GetAt(j);}float s1=atof(former); // 定义float类型的变量s1,用来存储将former字符串转换为float型数字的结果。

c语言简易计算器报告

c语言简易计算器报告

C语言简易计算器报告介绍本文将介绍如何使用C语言编写一个简易的计算器。

计算器可以进行基本的四则运算,包括加法、减法、乘法和除法。

设计思路1.首先,我们需要定义计算器的操作符和操作数。

操作符可以是+, -, *,/,操作数是两个整数或浮点数。

2.接下来,我们需要编写一个函数来接收用户输入的操作符和操作数,并进行相应的计算。

我们可以将这个函数命名为calculate。

3.在calculate函数中,我们根据用户输入的操作符,执行相应的计算操作,并返回计算结果。

如果用户输入的操作符不合法,我们将返回一个错误提示。

4.最后,我们在主函数中调用calculate函数,并显示计算结果。

代码实现下面是实现一个简易计算器的C语言代码:#include <stdio.h>float calculate(char operator, float operand1, float operand2) { float result;switch (operator) {case'+':result = operand1 + operand2;break;case'-':result = operand1 - operand2;break;case'*':result = operand1 * operand2;break;case'/':if (operand2 != 0) {result = operand1 / operand2;}else {printf("错误:除数不能为0\n");return-1; // 返回错误代码}break;default:printf("错误:无效的操作符\n");return-1; // 返回错误代码}return result;}int main() {char operator;float operand1, operand2;float result;printf("请输入操作符和操作数(格式为:操作数1 操作符操作数2):");scanf("%f %c %f", &operand1, &operator, &operand2);result = calculate(operator, operand1, operand2);if (result != -1) {printf("计算结果为:%f\n", result);}return0;}使用说明1.用户需要按照指定格式输入操作数和操作符,例如:2 + 3。

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语言课程设计

设计分析:我做的是一个计算器程序,属于B级。

题目要求如下:1、完善计算器程序,改为可对实数操作。

2、完善程序,改为多个操作数基本四则运算,遇到z为止。

3、增加函数,完成四则混合运算,增加相应的主菜单选项4、添加语句,使四则运算具有测试功能。

5、可扩充其功能。

所给的计算器源程序中已有基本的加、减、乘、除和开方运算,我所要做的就是添加一个可以进行四则混合运算功能的类。

本程序所要用到的头文件有如下几种: process,iostream,conio,stdlib,math和assert.原程序中已经定义了加、减、乘、除和开方的运算,它用了类oopcalc将这几个基本运算进行封装。

类中包含以下几个函数:void calcadd();void calcsub();void calcdiv();void calcmult();void calcfartocel();void calcceltofar();void calcsroot();void exitprog();void menu();void badinput();每个函数的参数形式如下:int add(float x,float y);int sub(float x, float y);int div(float x, float y);int mult(float x, float y);int fartocel(float x);int celtofar(float x);int sqroot(float x);原程序对这几个函数分别做了如下定义:int oopcalc::add(float x,float y){val = x + y;return val;}int oopcalc::sub(float x,float y){val = x — y;return val;}int oopcalc::div(float x, float y){val = x / y;return val;}int oopcalc::mult(float x,float y){val = x *y;return val;}int oopcalc::fartocel(float x){int cel = ((x — 32) *5) / 9;return cel;}int oopcalc::celtofar(float x){int f;f = x * 9 / 5 + 32;return f;}int oopcalc::sqroot(float x){int g = sqrt(x);return g;}首先要把程序改为可对实数进行操作,由于原程序中的操作数类型都是整形,因此我所采用的办法就是把“int”依次改成“float”。

用c语言编写简易计算器

用c语言编写简易计算器

在c51中用c语言编写简易计算器#include<reg52.h>#define BYTE unsigned charint jh;int a;int b;int c; /*c是符号*//*按键的值*/sbit P11=P1^3;sbit P12=P1^2;sbit P13=P1^1;sbit P14=P1^0;BYTE disply[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(int ms) //延时函数{while(ms--){ int h;for( h=0;h<=250;h++){;}}}void get_jianzhi() //获取键盘值的函数{BYTE disi;BYTE gaosi;gaosi=P2;P2=0x0f;delay(10 );disi=P2;gaosi=gaosi+disi;switch(gaosi){case 0xee:{jh=0;break;}case 0xde:{jh=1;break;}case 0xbe:{jh=2;break;}case 0x7e:{jh=3;break;}case 0xed:{jh=4;break;}case 0xdd:{jh=5;break;}case 0xbd:{jh=6;break;}case 0x7d:{jh=7;break;}case 0xeb:{jh=8;break;}case 0xdb:{jh=9;break;}case 0xbb:{jh=10;break;}case 0x7b:{jh=11;break;}case 0xe7:{jh=12;break;}case 0xd7:{jh=13;break;}case 0xb7:{jh=14;break;}case 0x77:{jh=15;break;}}do{P2=0xf0;}while(P2!=0xf0);}void show() /*显示函数*/{BYTE m; /*千位*/BYTE h; /*百位*/BYTE j; /*十位*/BYTE i; /*个位*/P3=0xff;if(c==14){b=0;}else{ }while(P2==0xf0) /*有键按下则跳出循环函数*/{j=0;i=0;h=0;m=0;if(b!=0) /*b不为0则显示b并判断它有几位数*/{if(b>99) {h=b/100;j=(b-h*100)/10;i=b%10;}else{if(b>9){j=b/10;i=b%10;}else{i=b;}}}else{if(a>999){ m=a/1000;h=(a-m*1000)/100;j=(a-m*1000-h*100)/10;i=a%10;}else{if(a>99){h=a/100;j=(a-h*100)/10;i=a%10;}else{if(a>9){j=a/10;i=a%10;}else{i=a;}}}}if(m!=0){ P11=0; P0=disply[i]; delay(5);P0=0x00;P11=1;P12=0;P0=disply[j];delay(5);P0=0x00;P12=1;P13=0;P0=disply[h];delay(5);P0=0x00;P13=1;P14=0;P0=disply[m]; delay(5);P14=1;P0=0x00;}else { if(h!=0){P11=0; P0=disply[i]; delay(5);P0=0x00;P11=1;P12=0;P0=disply[j]; /*判断要显示的数字是几位数*/delay(5);P0=0x00;P12=1;P13=0;P0=disply[h]; delay(5);P0=0x00;P13=1;}else{if(j!=0){P11=0;P0=disply[i];delay(5);P0=0x00;P11=1;P12=0;P0=disply[j]; delay(5);P0=0x00;P12=1;}else{P11=0;P0= P0=disply[i];}}}}}void main(){BYTE k=0; /*用来判断是给a还是b赋值*/P2=0xf0;a=0; /*第一次按键值的初始化*/b=0; /*第二次按键值的初始化*/bat:show();delay(10 );get_jianzhi() ;P2=0xf0;if(jh==15) /*按了清除键的话,全部清零*/ {a=0;b=0;c=0;}else{if(jh>=0&&jh<=9) /*按了数字键*/{if(k==0) /*判断是给a还是b赋值*/{a=a*10+jh;}else{b=b*10+jh;}goto bat;}else{if(a==0&&b==0) /*在开始时只按功能键的话,返回*/{goto bat;}else{k=1;if(b==0){c=jh;}else{switch(c) /*运算法则*/{case 10: { a=a+b;break;}case 11: {a=a-b;break;}case 12: {a=a*b;break;}case 13: {a=a/b;break;}case 15:{ break; } /*按'='的话,不运算*/}c=jh;}goto bat;}}goto bat;}}。

《c 面向对象程序设计简单计算器的设计》

《c  面向对象程序设计简单计算器的设计》

面向对象程序设计----简单计算器的设计一、问题描述简单计算器的基本功能如下:1.四则运算,例如加减乘除等;2.除了整数的运算也可实现小数的各类运算;3.判断非法操作,例如判定1/0为非法操作;4.其他特性;这个简易计算器只实现以上所述功能,即实现简单计算。

二、设计思路计算器起始运行在归零状态,此时只接受数字输入,当按下一个数字按钮时,计算器只显示用户输入第一个操作数,用户在该状态下可以继续输入数字。

1.当第一个数字输入完成后,可以接受第二个操作数。

2.在数字输入结束进行运算后,按下=按钮可以根据前面按下的操作符计算结果显示,表示计算完成。

3.在上述计算过程中都可以接受双击等号回到清零状态。

三、功能函数设计:1.数字按钮这个是通过最基本的OnButton()将0~9十个数字按钮的单击消息处理函数用类向导全部关联到此,适文本框应该只是显示当前单击的数字;2.小数点按钮函数OnDecimal这个函数主要是实现小数点在计算器的相关功能3.列表在算法的函数OnSelchangeOperatorList()这一类按钮包括“+”“-”“*”“/”,它们的单击消息在同一个处理函数中进行处理,以同样的方法把这四个按钮的单击操作关联到此函数中,使四则运算法则在列表中通过选择去实现。

4.“=”符号函数OnEnquall()实现计算器中等号的功能,双击时也可使编辑框的数字归零。

四、编码实现:int calculator_type_i;double count=10,value=0;double Input_data_int=0,Input_data_dec=0;double Inputdata1=0,Inputdata2=0;char datatostr_buffer[10];bool decimal=FALSE;以上代码是添加的全局变量,为正确获取键盘输入供所有按钮函数使用。

// TODO: Add extra initialization herem_OperatorBox.AddString("-");m_OperatorBox.AddString("*");m_OperatorBox.AddString("/");m_OperatorBox.AddString("+");以上代码是初始化列表框,并使其在程序运行时具有“加”“减”“乘”“除”可选择功能。

基于c语言的计算器的设计与实现

基于c语言的计算器的设计与实现

基于c语言的计算器的设计与实现基于C语言的计算器的设计与实现计算器是我们日常生活中经常使用的工具,它可以帮助我们进行各种数学运算,如加减乘除、开方、求幂等。

在计算器的设计与实现中,C语言是一种非常常用的编程语言,因为它具有高效、灵活、可移植等优点。

下面我们来介绍一下基于C语言的计算器的设计与实现。

1. 设计思路在设计计算器时,我们需要考虑以下几个方面:(1)用户界面设计:计算器的用户界面应该简洁明了,易于操作。

一般来说,我们可以采用命令行界面或图形界面的方式来实现。

(2)输入输出处理:计算器需要能够接收用户输入的数值和运算符,并输出计算结果。

在处理输入输出时,我们需要考虑到输入的合法性和输出的格式。

(3)运算处理:计算器需要能够进行各种数学运算,如加减乘除、开方、求幂等。

在进行运算时,我们需要考虑到运算的优先级和运算的精度。

2. 实现步骤在实现计算器时,我们可以按照以下步骤进行:(1)设计用户界面:根据需求,设计计算器的用户界面,包括输入框、输出框、数字键、运算符键等。

(2)处理输入输出:在输入框中接收用户输入的数值和运算符,并进行合法性检查。

在输出框中输出计算结果,并进行格式化处理。

(3)实现运算处理:根据用户输入的运算符,进行相应的数学运算。

在进行运算时,需要考虑到运算的优先级和运算的精度。

(4)测试和调试:在实现计算器后,需要进行测试和调试,确保计算器的功能正常。

3. 实例代码下面是一个简单的基于C语言的计算器的实例代码:#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){double num1, num2, result;char op;printf("请输入第一个数:"); scanf("%lf", &num1);printf("请输入运算符:"); scanf(" %c", &op);printf("请输入第二个数:"); scanf("%lf", &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");exit(1);}result = num1 / num2;break;case '^':result = pow(num1, num2);break;case 's':result = sqrt(num1);break;default:printf("运算符不合法!\n");exit(1);}printf("计算结果为:%.2lf\n", result);return 0;}在这个实例代码中,我们使用了switch语句来根据用户输入的运算符进行相应的数学运算。

C语言计算器程序设计报告

C语言计算器程序设计报告

C语言集中上机实验报告一、需求分析(1)制作一个计算器,能够计算四则混合运算以及乘方和开方,并显示出正确的结果。

(2)程序能根据运算符的高低进行运算(开放符号置左置右不影响正常运算)(3)可以输入括号二、设计思路(1)运用栈以及结构体来实现,将数字与运算符分别放在结构体与栈里面,将栈以及结构体里的字符数值一一匹配计算,将得出的结果保存到另一个栈里(zhan3)。

(2)开始,对所输入的字符串进行转化,把运算符存放在zhan2里面,把数值存放到data结构体里面,然后进行运算和操作。

(3)运用循环来实现无限输入,用数组nibo来跟踪整个过程,每次运算后将值置空,若检测到空,计算得出结果,退出输入q。

三、流程图四、主程序段#include<stdio.h>#include<math.h>#include<malloc.h>double jisuan(char a[]){int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;char nibo[50],zhan2[50];//zhan2存放的是运算符double x,n,l,z=0,zhan3[50];//暂存结果typedef struct{double d1;int d2;}dd;typedef struct{dd data[50];int top;}zhan1;zhan1 *shu;shu=(zhan1 *)malloc(sizeof(zhan1));shu->top=0;while(a[i]!='\0'){if(a[i]>='0'&&a[i]<='9'){z=0;j=i+1;while(a[j]>='0'&&a[j]<='9'){j++;}j--;for(k=i;k<=j;k++){z=z*10+a[k]-'0';}j=j+1;//j跳到数字后一位x=z;if(a[j]=='.')//如果是小数的话就把小数和整数一起加上{l=1;i=j+1;j=i+1;while(a[j]>='0'&&a[j]<='9'){j++;}j--;for(k=i;k<=j;k++){n=pow(0.1,l);l=l+1;x=x+n*(a[k]-'0');}i=j+1;}else i=j;shu->data[++shu->top].d1=x;shu->data[shu->top].d2=++cnt;nibo[++t1]='0'+shu->data[shu->top].d2;nibo[t1+1]='\0';}//如果是数字那么就保存到结构体里的dd数组里的第二个成员里else if(a[i]=='('){zhan2[++t2]=a[i];i++;}else if(a[i]==')'){j=t2;while(zhan2[j]!='('){nibo[++t1]=zhan2[j];nibo[t1+1]='\0';j--;}t2=j-1;i++;}else if(a[i]=='+'){while(t2>0&&zhan2[t2]!='('){nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}else if(a[i]=='-'){if(a[i-1]=='$'){a[0]='0';i=0;}else if(a[i-1]=='('){a[i-1]='0';a[i-2]='(';i=i-2;t2--;}else{while(t2>0&&zhan2[t2]!='('){nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}}else if(a[i]=='*'||a[i]=='/'){while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#'){nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}else if(a[i]=='^'||a[i]=='#'){while(zhan2[t2]=='^'||zhan2[t2]=='#'){nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}}//把输出的多项式中的数字字符先转换成数值型存入结构体里,然后把加减乘除等的字符存入到zhan2里--这是转化过程并存储入站//下面就是开始计算结果相当于出站的过程把dd结构体里的数值取出和zhan2的字符来进行运算,当前结果存储到zhan3里,就用nibo数组来判断是否计算完毕while(t2>0){nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}j=1;t3=0;while(j<=t1){if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#')//{for(i=1;i<=shu->top;i++){if((int)(nibo[j]-'0')==shu->data[i].d2){m=i;break;}}zhan3[++t3]=shu->data[m].d1;}else if(nibo[j]=='+'){zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];t3--;}else if(nibo[j]=='-'){zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];t3--;}else if(nibo[j]=='*'){zhan3[t3-1]=zhan3[t3-1]*zhan3[t3];t3--;}else if(nibo[j]=='/'){zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];t3--;}else if(nibo[j]=='^'){zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]);t3--;}else if(nibo[j]=='#'){zhan3[t3]=sqrt(zhan3[t3]);}j++;}return zhan3[t3];}void main()//{for(;;){char x,a[50];double jieguo;int i=0;a[0]='$';printf("#表示开方,^表示乘方(支持负数)\n");printf("请输入表达式无需输入= 号直接回车可输出答案退出请输入q \n\n");scanf("%c",&x);if(x=='q') break;while(x!='\n'){a[++i]=x;scanf("%c",&x);}a[i+1]='\0';jieguo=jisuan(a);printf("\n");printf("结果为:%lf",jieguo);printf("\n\n\n");printf("退出请输入q 继续请直接输入\n\n"); }}}五、调试分析六、调试说明以及分析:1、当输入为正确的格式时,能算出正确的结果,其中包括:小数、整数以及个位以上的数字,且运算符包括:加、减、乘、除运算,还有就是可以加括号等。

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数组中。

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

y =2*height+height/2; /*设置 y 的坐标值*/ 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; strcpy(str2,""); /*设置 str2 为空串*/ while((v=specialkey())!=45) /*当压下 Alt+x 键结束程序,否则执行下面的循环*/ { 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++; } /*否则,右移到下一个字符位置*/
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 arrow(); /*设置箭头光标函数*/ /*主函数*/ int main() { initialize();/* 设置系统进入图形模式 */ computer(); /*运行计算器 */ closegraph();/*系统关闭图形模式返回文本模式*/ return(0); /*结束程序*/ } /* 设置系统进入图形模式 */ void initialize(void)
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=str1[n*5+m]; /*将字符保存到变量 c 中*/ if(isdigit(c)||c=='.') /*判断是否是数字或小数点*/ { if(flag==-1) /*如果标志为-1,表明为负数*/ { strcpy(str2,"-"); /*将负号连接到字符串中*/ flag=1; } /*将标志值恢复为 1*/ sprintf(temp,"%c",c); /*将字符保存到字符串变量 temp 中*/
/*改变文本样式函数*/
{ 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 = width /2; /*设置 x 的坐标值*/ y = height/2; /*设置 y 的坐标值*/ 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); /*设置颜色为红色*/ outtextxy(x+3*width,y+height/2,"0."); /*输出字符串"0."*/ x =2*width-width/2; /*设置 x 的坐标值*/
strcat(str2,temp); /*将 temp 中的字符串连接到 str2 中*/ 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); /*将第一个操作数转换为浮点数*/ strcpy(str2,""); /*将 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=='-') { if(strcmp(str2,"")==0) /*如果 str2 为空,说明是负号,而不是减号*/ flag=-1; /*设置负数标志*/ else { num1=atof(str2); /*将第二个操作数转换为浮点数*/ strcpy(str2,""); /*将 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);
相关文档
最新文档