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型数字的结果。

  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);
相关文档
最新文档