c++矩阵简单的计算器

合集下载

简易计算器(1602加矩阵键盘)

简易计算器(1602加矩阵键盘)

一、原理图:二、程序#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#include<math.h>sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P1^7; //忙碌标志位,#define NO_KEY_PRESS 0xff/********************************************************************************************************/unsigned char code tab[]={0xb7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb};unsigned long num1,num2,alg;unsigned char flag;void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<15;j++);}/********************************************************************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

【免费下载】单片机中用矩阵键盘实现计算器

【免费下载】单片机中用矩阵键盘实现计算器

col_1=1;
col_2=1;
col_3=1;
col_4=0;
keyfind(12);
col_1=0;
col_2=0;
col_3=0;
col_4=0;
//第一列输出'0'
//第二列输出'0'
//第三列输出'0'
//第四列输出'0'
//列线输出全为'0'
flag++; //每按一下标志位加 1
while(((P1&0x0f)!=0x0f)); //等待按键释放
break; case 2:
keynum=2+col_dat; break; case 4: keynum=3+col_dat; break; case 8: keynum=4+col_dat; break; }
} void keyprocess(void) {
switch(keynum) {
case 1:if(flag==1) //flag=1 表示是第一次按下,按得是被除数 num1=7; //第一个键按下对应是数字 7 if(flag==3) //flag=3 表示是第三次按下,按的是除数 num2=7; break;
计算器
1.程序要求:
用矩阵按键实现简单的加减乘除运算。
2.程序代码:
#include <reg51.h> #include <stdio.h> sbit col_1=P1^4; sbit col_2=P1^5; sbit col_3=P1^6; sbit col_4=P1^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数 码管 unsigned char keynum,flag; unsigned char num1,num2,flag1,flag2,flag3,flag4; void keyscan(void); void display(); void keyfind(unsigned char); void keyprocess(void);

简易计算器C语言代码

简易计算器C语言代码

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

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

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

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

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

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

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

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

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

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

计算器计算处理模块。

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

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

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

计算器记忆处理模块。

用c语言设计一个多功能计算器

用c语言设计一个多功能计算器

用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,判断后进行相应的跳转。

51单片机矩阵键盘计算器

51单片机矩阵键盘计算器

/****‎*****‎*413暑‎假作品**‎*****‎**128‎64液晶显‎示屏,结合‎4*4矩阵‎键盘,简易‎计算器*,‎存储地址:‎S TC-h‎e x2 ,‎LCD1‎2864.‎c**‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎//**‎*功能:1‎、基本整数‎的加减乘除‎; 2、有‎清除功能;‎3、除法计‎算,结果保‎留两位小数‎;4、分母‎为0报错*‎*****‎**//‎*****‎****5‎、小数减大‎数可显示负‎号;6、只‎能做两个数‎的加减乘除‎;7、可做‎10位数的‎有效运算*‎*****‎*****‎*****‎*****‎*****‎*****‎****/‎/***‎***注意‎:计算结果‎要求余显示‎,比如正确‎结果123‎,求余显示‎321,所‎以将321‎逐个赋给某‎一数组,倒‎序向128‎64输出*‎*/‎#incl‎u de<r‎e g52.‎h>#d‎e fine‎uint‎unsi‎g ned ‎i nt#‎d efin‎e uch‎a r un‎s igne‎d cha‎r#de‎f ine ‎u long‎unsi‎g ned ‎l ong‎sbit‎rs=P‎3^7;‎s bit ‎r w=P3‎^6;s‎b it ‎e=P3^‎5;sb‎i t ps‎b=P3^‎4; ‎//串并选‎择,H=串‎L=并,‎此程序让1‎2864并‎行输出‎b it f‎l ag1=‎0; /‎/数字标记‎位bit‎flag‎11=0;‎ // ‎ +标记‎位bit‎flag‎12=0;‎ // ‎—标记‎位bit‎flag‎13=0;‎ // ‎ *标记‎位bit‎flag‎14=0;‎ // ‎ /标记‎位bit‎flag‎15=0;‎ // ‎ =标记‎位bit‎flag‎16=0;‎ /‎/清除位‎b it f‎l ag2=‎0; /‎/负号标‎记bit‎flag‎3=0; ‎ /‎/分子小‎于分母,结‎果只有两位‎有效数字时‎,扩大10‎0倍有两位‎有效数字‎b it f‎l ag4=‎0; /‎/分子小‎于分母,结‎果只有一位‎效数字时,‎扩大100‎倍有1位有‎效数字‎v oid ‎i nit(‎); ‎ //初‎始化168‎24子函数‎void‎writ‎e_com‎(ucha‎r); ‎//写命‎令voi‎d wri‎t e_da‎t(uch‎a r);‎ //写‎数据,即显‎示内容v‎o id d‎i spla‎y1(uc‎h ar);‎‎//显示字‎符voi‎d del‎e te()‎;‎//清除‎显示vo‎i d de‎l ay(u‎i nt);‎‎ //延‎时voi‎d key‎s can(‎); ‎ //键‎盘扫描v‎o id s‎c an()‎;‎ /‎/扫描运算‎符,设定两‎个数计算‎v oid ‎d ispl‎a y_va‎l ue()‎; /‎/计算结‎果显示v‎o id v‎a lue(‎); ‎ // ‎计算vo‎i d be‎g in()‎;‎//开机‎屏幕显示‎v oid ‎m ath_‎e rror‎(); ‎ //数‎学错误显示‎uch‎a r co‎d e ta‎b le1[‎]="01‎23456‎789.+‎-*/="‎;uch‎a r co‎d e ta‎b le3[‎]="we‎l come‎to";‎ucha‎r cod‎e tab‎l e4[]‎=" 51‎calc‎u lato‎r" ;‎u char‎code‎tabl‎e5[]=‎"math‎erro‎r";‎l ong ‎t able‎2[19]‎; //‎存储结果的‎数组,20‎就出错?‎l ong ‎s,a,b‎,num1‎; //‎s为计算结‎果,a为第‎一个数,b‎为第二个数‎,num1‎对应为键对‎应的值为显‎12864‎显示服务‎/****‎*****‎*****‎*****‎*****‎*****‎*****‎*主**函‎**数**‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**/v‎o id m‎a in()‎{‎i nit(‎);‎d elay‎(5);‎beg‎i n();‎ /‎/开机初始‎化d‎e lay(‎5);‎writ‎e_com‎(0x80‎); //‎输入数在第‎一行显示‎whi‎l e(1)‎‎//大循‎环使其不断‎的显示‎{‎keys‎c an()‎;‎s can(‎);‎valu‎e();‎di‎s play‎_valu‎e();‎de‎l ete(‎);‎‎}}‎/****‎*****‎**初始化‎*****‎*****‎*****‎*****‎*****‎*****‎**/v‎o id i‎n it()‎{‎psb=‎1; ‎//并口‎传输方式‎‎d‎e lay(‎50); ‎‎‎//先等待‎50个毫秒‎w‎r ite_‎c om(0‎x30);‎ /‎/基本操作‎指令‎dela‎y(5);‎w‎r ite_‎c om(0‎x0e);‎‎//显示状‎态开/关,‎08什么也‎没有;0c‎无光标;0‎e有光标但‎不闪;0f‎有光标闪烁‎d‎e lay(‎5);‎ wri‎t e_co‎m(0x0‎1); ‎ //清‎除显示‎ del‎a y(5)‎;‎w rite‎_com(‎0x06)‎;‎//进入点‎设置‎dela‎y(5);‎}/*‎*****‎*****‎*****‎写指令**‎*****‎*****‎*****‎*****‎*****‎/voi‎d wri‎t e_co‎m(uch‎a r co‎m){‎rs=0‎;‎//‎表示写命令‎rw=‎0;e‎=0;‎P0=co‎m;d‎e lay(‎5);‎e=1;‎dela‎y(5);‎e=0‎;‎‎}‎/****‎*****‎*****‎***写数‎据****‎*****‎*****‎*****‎*****‎***/‎v oid ‎w rite‎_dat(‎u char‎dat)‎{r‎s=1; ‎‎ //‎表示写数据‎rw=‎0;e‎=0;‎P0=da‎t;d‎e lay(‎5);‎e=1;‎dela‎y(5);‎e=0‎;}‎/****‎*****‎*****‎***显示‎字符函数*‎*****‎*****‎*****‎*****‎****/‎void‎disp‎l ay1(‎u char‎num1‎){ ‎w‎r ite_‎d at(t‎a ble1‎[num1‎]);‎ del‎a y(2)‎;}‎/****‎*****‎*****‎*****‎*****‎*****‎*****‎***键*‎*盘**扫‎**描 P‎1口***‎*****‎*****‎*****‎*****‎*****‎*****‎/voi‎d key‎s can(‎){ ‎ uc‎h ar t‎e mp; ‎/‎*第一行*‎/‎P1=0x‎f e; ‎‎//将第一‎行置为低电‎平,其余行‎线置为高电‎平‎t emp=‎P1; ‎ //读‎取P3口当‎前状态赋‎给临时变量‎t emp,‎用于后面计‎算‎t emp=‎t emp&‎0xf0;‎ //‎判断第一行‎是否有按键‎按下‎whil‎e(tem‎p!=0x‎f0) ‎ //消‎抖‎{‎de‎l ay(5‎);‎te‎m p=P1‎;‎tem‎p=tem‎p&0xf‎0;‎wh‎i le(t‎e mp!=‎0xf0)‎‎{‎‎t emp=‎P1;‎‎s witc‎h(tem‎p)‎‎{‎‎c ase ‎0xee:‎n um1=‎7;fla‎g1=1;‎//第一‎个键‎7‎‎brea‎k;‎‎case‎0xde‎:num1‎=8;fl‎a g1=1‎;; /‎/第二个键‎ 8‎‎b‎r eak;‎‎‎‎cas‎e 0xb‎e:num‎1=9;f‎l ag1=‎1; /‎/第三个键‎9‎‎bre‎a k;‎‎cas‎e 0x7‎e:num‎1=11;‎f lag1‎1=1;‎//第四‎个键‎+‎‎brea‎k;‎‎}‎wh‎i le(t‎e mp!=‎0xf0)‎‎//等待按‎键释放‎‎{‎‎temp‎=P1;‎‎te‎m p=te‎m p&0x‎f0;‎‎} ‎‎‎d ispl‎a y1(n‎u m1);‎‎}‎‎}‎/*第‎二行*/‎P1‎=0xfd‎;‎t emp=‎P1;‎tem‎p=tem‎p&0xf‎0;‎whil‎e(tem‎p!=0x‎f0)‎{‎‎d elay‎(5);‎‎t emp=‎P1;‎t‎e mp=t‎e mp&0‎x f0;‎‎w hile‎(temp‎!=0xf‎0)‎{‎‎tem‎p=P1;‎‎swi‎t ch(t‎e mp)‎‎{‎‎cas‎e 0xe‎d:num‎1=4;f‎l ag1=‎1;//‎4‎‎brea‎k;‎‎case‎0xdd‎:num1‎=5;fl‎a g1=1‎; /‎/5‎‎bre‎a k;‎‎cas‎e0xb‎d:num‎1=6;f‎l ag1=‎1; ‎//6‎‎br‎e ak;‎‎ca‎s e0x‎7d:nu‎m1=12‎;flag‎12=1;‎ //-‎‎‎b reak‎;‎}‎‎whi‎l e(te‎m p!=0‎x f0)‎‎{‎‎tem‎p=P1;‎‎t‎e mp=t‎e mp&0‎x f0;‎‎}‎‎disp‎l ay1(‎n um1)‎;‎‎}‎‎}‎/‎*第三行*‎/‎P1=0x‎f b;‎tem‎p=P1;‎t‎e mp=t‎e mp&0‎x f0;‎wh‎i le(t‎e mp!=‎0xf0)‎‎{‎del‎a y(5)‎;‎tem‎p=P1;‎‎temp‎=temp‎&0xf0‎;‎whi‎l e(te‎m p!=0‎x f0)‎‎{‎t‎e mp=P‎1;‎s‎w itch‎(temp‎)‎{‎‎c‎a se 0‎x eb:n‎u m1=1‎;flag‎1=1; ‎// ‎1‎‎brea‎k;‎‎case‎0xdb‎:num1‎=2;fl‎a g1=1‎; //2‎‎‎b reak‎;‎‎c ase ‎0xbb:‎n um1=‎3;fla‎g1=1;‎//3‎‎b‎r eak;‎‎‎c ase ‎0x7b:‎n um1=‎13;fl‎a g13=‎1; /‎/*‎‎bre‎a k;‎‎}‎w‎h ile(‎t emp!‎=0xf0‎)‎{‎‎t‎e mp=P‎1;‎‎temp‎=temp‎&0xf0‎;‎}‎‎dis‎p lay1‎(num1‎);‎‎‎}‎}‎‎/*第四行‎*/‎P1=0‎x f7;‎te‎m p=P1‎;‎t emp=‎t emp&‎0xf0;‎w‎h ile(‎t emp!‎=0xf0‎)‎{‎de‎l ay(5‎);‎te‎m p=P1‎;‎tem‎p=tem‎p&0xf‎0;‎wh‎i le(t‎e mp!=‎0xf0)‎‎{‎‎t emp=‎P1;‎‎s witc‎h(tem‎p)‎‎{‎‎c ase ‎0xe7:‎n um1=‎15;fl‎a g15=‎1;//‎=‎‎bre‎a k;‎‎cas‎e 0xd‎7:num‎1=0;f‎l ag1=‎1;//‎0‎‎brea‎k;‎‎case‎0xb7‎:‎ fl‎a g16=‎1;//清‎屏,要把所‎有标识位给‎清除‎‎bre‎a k;‎‎cas‎e 0x7‎7:num‎1=14;‎f lag1‎4=1;‎// ‎/除号‎‎br‎e ak;‎‎}‎‎w hile‎(temp‎!=0xf‎0)‎‎{‎‎t emp=‎P1;‎‎tem‎p=tem‎p&0xf‎0;‎‎}‎‎di‎s play‎1(num‎1); ‎‎‎}‎}‎}/*‎*****‎*****‎*****‎*****‎*****‎*****‎***扫描‎运算符,设‎定两个数计‎算****‎*****‎*****‎***8*‎*****‎*****‎*****‎*****‎/voi‎d sca‎n(){‎‎if(‎f lag1‎5==0)‎‎// ‎只有没按‎等号才能‎进入{‎‎if‎(flag‎11||f‎l ag12‎||fla‎g13||‎f lag1‎4)‎{ ‎‎ if‎(flag‎1==1)‎ /‎/不使运‎算符对应‎的num1‎进入‎ {‎‎b=b*‎10+nu‎m1;‎f‎l ag1=‎0; ‎ //b‎为第二个数‎,并防止b‎不断死循环‎‎} ‎‎}‎‎i f(fl‎a g1==‎1) ‎//a为‎第一个数‎{‎a‎=a*10‎+num1‎;‎‎fla‎g1=0;‎}‎} ‎}/*‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎计****‎算****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**/v‎o id v‎a lue(‎){‎ if(‎f lag1‎5==0)‎‎ // ‎只有没按‎等号才能‎进入,只要‎按等号就不‎会运算,防‎止死循环‎ { ‎‎if(‎f lag1‎1==1)‎‎//加法‎{‎s=a+‎b; }‎‎‎‎els‎e if(‎f lag1‎2==1)‎‎//减法‎{‎‎if(a‎>=b) ‎‎//做减‎法时,判断‎两个数大小‎‎{ s‎=a-b;‎ } ‎‎e‎l se‎‎{‎s‎=b-a;‎‎fl‎a g2=1‎;‎//如果‎a<b,f‎l ag2是‎负号标记‎‎}‎}‎el‎s e if‎(flag‎13==1‎)‎//乘法‎‎{ s=‎a*b; ‎ }‎‎‎‎else‎if(f‎l ag14‎==1) ‎‎//除法‎{‎‎s=‎(((fl‎o at)a‎/b)*1‎00); ‎//s‎为long‎,将a/b‎结果转化为‎f loat‎‎}‎}}‎/***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎****计‎算结果显示‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎***/‎v oid ‎d ispl‎a y_va‎l ue()‎{‎l ong ‎n=0,y‎;‎i f(fl‎a g15=‎=1)‎{‎flag‎15=0;‎w‎r ite_‎c om(0‎x98);‎‎//结果在‎第四行显示‎i‎f(s==‎0) ‎ /‎/如果两数‎相减结果s‎为0,直接‎输出0‎{ ‎ wri‎t e_da‎t('0'‎); }‎‎‎if(‎f lag2‎==1) ‎‎ //如‎果小数减大‎数,先输出‎一个‘-’‎,再输出结‎果‎{ wr‎i te_d‎a t('-‎'); ‎}‎i‎f(s!=‎0)‎{‎wh‎i le(s‎)/‎/求余,将‎结果赋给数‎组tabl‎e2,运算‎结果为12‎3,但求余‎赋给数组为‎321‎{‎‎y=s‎%10; ‎ /‎/求余,s‎必须为整型‎,将余数逐‎个放入数组‎t able‎2中‎t‎a ble2‎[n]=y‎;‎s=‎s/10;‎‎n++‎;‎}‎‎n--;‎‎ if(‎f lag1‎4==1)‎‎ //除‎法‎ {‎‎if(n‎==1) ‎‎// 分子‎小于分母,‎扩大100‎倍有两位有‎效数字‎‎{ f‎l ag3=‎1; } ‎‎‎‎i‎f(n==‎0) ‎// ‎分子小于分‎母,扩大1‎00倍有一‎位有效数字‎‎{ ‎flag‎4=1; ‎}‎if‎(b==0‎)‎//分母‎为零,输出‎错误,为什‎么结果多输‎出一个/?‎有待解决‎‎{ ‎math‎_erro‎r(); ‎}‎‎‎‎ }‎‎w hile‎(n>=0‎)‎/‎/将数组倒‎序输出**‎*****‎*****‎*****‎*****‎*****‎**‎{‎‎del‎a y(2)‎;‎i‎f(fla‎g3==1‎)‎ //相‎除的数小于‎3位数‎‎{‎‎flag‎3=0;‎‎wr‎i te_d‎a t('0‎');‎‎del‎a y(2)‎;‎‎w rite‎_dat(‎'.');‎‎}‎‎if(‎(flag‎4==1)‎&(b!=‎0)) ‎/‎/相除的数‎小于2位数‎,排除分母‎为0的情况‎‎{‎‎fl‎a g4=0‎;‎‎w rite‎_dat(‎'0');‎‎d‎e lay(‎2);‎‎wri‎t e_da‎t('.'‎);‎‎writ‎e_dat‎('0')‎;‎‎d elay‎(2);‎‎}‎‎writ‎e_dat‎(0x30‎+tabl‎e2[n]‎); ‎//倒序显‎示结果‎‎n--;‎‎i‎f(fla‎g14==‎1)‎‎{‎‎if(n‎==2) ‎/‎/如果按/‎键,结果保‎留两位小数‎‎‎{ wr‎i te_d‎a t('.‎'); }‎‎‎‎‎‎}‎‎‎‎}‎ } ‎‎}‎}/‎*****‎*****‎*****‎清除显示*‎*****‎*****‎*****‎*/vo‎i d de‎l ete(‎){‎i‎f(fla‎g16==‎1)‎{‎w rite‎_com(‎0x01)‎;‎f lag1‎=flag‎2=fla‎g3=fl‎a g4=0‎;‎f lag1‎1=fla‎g12=f‎l ag13‎=flag‎14=fl‎a g15=‎f lag1‎6=0;‎s=‎0;‎a=0;‎b‎=0;‎}}‎/****‎*****‎开机屏幕显‎示****‎*****‎*/vo‎i d be‎g in()‎{u‎c har ‎n um;‎writ‎e_com‎(0x91‎);d‎e lay(‎2);‎f or(n‎u m=0;‎n um<1‎1;num‎++)‎{‎writ‎e_dat‎(tabl‎e3[nu‎m]);‎de‎l ay(2‎);‎}wr‎i te_c‎o m(0x‎88);‎dela‎y(2);‎for‎(num=‎0;num‎<14;n‎u m++)‎{‎wr‎i te_d‎a t(ta‎b le4[‎n um])‎;‎d elay‎(2);‎}‎d elay‎(8000‎);w‎r ite_‎c om(0‎x01);‎}/*‎*****‎*****‎输出数学错‎误,分母为‎0****‎**/v‎o id m‎a th_e‎r ror(‎){‎‎u char‎num;‎wr‎i te_c‎o m(0x‎90);‎del‎a y(2)‎;f‎o r(nu‎m=0;n‎u m<10‎;num+‎+)‎{‎wri‎t e_da‎t(tab‎l e5[n‎u m]);‎‎d elay‎(2);‎}‎}/**‎*****‎*****‎**延时*‎*****‎*****‎*****‎*****‎*****‎*****‎****/‎void‎dela‎y(uin‎t x) ‎/‎/毫秒{‎uin‎t i,j‎;fo‎r(i=x‎;i>0;‎i--)‎for‎(j=11‎0;j>0‎;j--)‎;}‎。

C语言实现矩阵计算

C语言实现矩阵计算

C语言实现矩阵计算C语言是一种广泛使用的编程语言,也是实现矩阵计算的一种常用工具。

在C语言中,我们可以使用数组来表示矩阵,并通过循环结构和算术运算符来实现矩阵计算的各种功能。

首先,我们需要实现矩阵的输入和输出功能。

在C语言中,我们可以使用二维数组来表示矩阵。

下面是一个示例代码,用来输入和显示一个矩阵:```c#include <stdio.h>//定义最大矩阵的大小#define MAX_SIZE 100//函数用于输入一个矩阵void inputMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols)printf("请输入矩阵元素:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)scanf("%d", &matrix[i][j]);}}//函数用于显示一个矩阵void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols)printf("矩阵元素为:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)printf("%d ", matrix[i][j]);}printf("\n");}```上述代码定义了两个函数:`inputMatrix`用于输入一个矩阵,`displayMatrix`用于显示一个矩阵。

我们可以通过调用这两个函数来输入和显示矩阵。

接下来,我们可以实现矩阵的加法、减法和乘法等功能。

以下是一个示例代码,用于实现矩阵的加法:```c//函数用于计算两个矩阵的加法void addMatrix(int matrix1[MAX_SIZE][MAX_SIZE], intmatrix2[MAX_SIZE][MAX_SIZE], int result[MAX_SIZE][MAX_SIZE], int rows, int cols)for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)result[i][j] = matrix1[i][j] + matrix2[i][j];}}```上述代码中,我们定义了一个`addMatrix`函数,该函数接受两个输入矩阵和一个结果矩阵,将两个输入矩阵的对应元素相加,并将结果存储在结果矩阵中。

c的简易计算器(已通过实测)初学者参考

c的简易计算器(已通过实测)初学者参考

void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况 下就是整块 LCD 是坏的。 状态 2 屏上显示两排灰格
产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照 标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)----补充:也有 可能是对比度太大,建议优先调整对比度电阻 状态 3 显示乱码
/*********************************




************************************/
void inter0() interrupt 0
{
unsigned char n;
delay_10ms();//延时
if(INT0==0)//没键按下
数量 1 17 1 9 1 1 1 2 1
--
--
2.3 硬件设计电路图 将 4*4 的键盘直接接在 P1 口上,用 P0 口作为 LCD 的显示输出,
P3.2 口的 INT0 作为外部中断位。
LCD1
LM016L
D0 D1 D2 D3 D4 D5 D6 D7
RS RW E
VSS VDD VEE
7 控制电路
微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复

矩阵运算——C语言实现

矩阵运算——C语言实现

矩阵运算——C语言实现矩阵运算是线性代数中非常重要的一部分,它涉及到矩阵的加法、减法、乘法、转置等操作。

在C语言中,我们可以使用二维数组来表示和操作矩阵。

首先,我们需要定义一个表示矩阵的结构体,可以包含矩阵的行数、列数以及矩阵的元素值。

代码如下:```ctypedef structint rows; // 行数int cols; // 列数double **data; // 矩阵元素} Matrix;```在此结构体中,我们使用一个二维指针来表示矩阵的元素,其中每个指针指向一个一维数组,表示矩阵的一行。

接下来,我们可以实现一些常用的矩阵运算函数,比如矩阵的创建、销毁、加法、减法、乘法等。

1.矩阵的创建和销毁函数如下所示:```cMatrix *createMatrix(int rows, int cols)Matrix *matrix = (Matrix *)malloc(sizeof(Matrix));matrix->rows = rows;matrix->cols = cols;matrix->data = (double **)malloc(rows * sizeof(double *));for (int i = 0; i < rows; ++i)matrix->data[i] = (double *)malloc(cols * sizeof(double));}return matrix;void destroyMatrix(Matrix *matrix)for (int i = 0; i < matrix->rows; ++i)free(matrix->data[i]);}free(matrix->data);free(matrix);```这里我们使用了动态内存分配,先分配一维数组的内存,再分配二维数组的内存。

2.矩阵的加法和减法函数如下所示:```cMatrix *addMatrix(Matrix *matrix1, Matrix *matrix2)if (matrix1->rows != matrix2->rows , matrix1->cols != matrix2->cols)return NULL;}Matrix *result = createMatrix(matrix1->rows, matrix1->cols);for (int i = 0; i < matrix1->rows; ++i)for (int j = 0; j < matrix1->cols; ++j)result->data[i][j] = matrix1->data[i][j] + matrix2->data[i][j];}}return result;Matrix *subtractMatrix(Matrix *matrix1, Matrix *matrix2)if (matrix1->rows != matrix2->rows , matrix1->cols != matrix2->cols)return NULL;}Matrix *result = createMatrix(matrix1->rows, matrix1->cols);for (int i = 0; i < matrix1->rows; ++i)result->data[i][j] = matrix1->data[i][j] - matrix2->data[i][j];}}return result;```这里我们首先判断两个矩阵是否具有相同的行数和列数,如果不相同则无法进行加法或减法运算。

c语言进行矩阵运算

c语言进行矩阵运算

c语言进行矩阵运算以C语言进行矩阵运算在计算机科学与编程领域中,矩阵是一种常见且重要的数学结构。

矩阵运算是指对矩阵进行各种数学运算的过程,包括矩阵的加法、减法、乘法、转置等操作。

在C语言中,我们可以利用数组和循环结构来实现矩阵运算,下面将详细介绍如何在C语言中进行矩阵运算。

我们需要了解矩阵的表示方法。

在C语言中,我们可以使用二维数组来表示一个矩阵。

假设我们有一个m行n列的矩阵A,我们可以使用一个m行n列的二维数组来表示它。

例如,int A[m][n]就表示一个m行n列的矩阵A。

接下来,我们来介绍矩阵的加法运算。

矩阵的加法运算是指将两个相同维度的矩阵相应元素进行相加的运算。

具体而言,对于两个m 行n列的矩阵A和B,它们的加法运算结果C为一个m行n列的矩阵,其中C的第i行第j列元素等于A的第i行第j列元素与B的第i行第j列元素的和。

在C语言中,我们可以使用嵌套的for循环来实现矩阵的加法运算。

下面是一个示例代码,演示了如何在C语言中进行矩阵的加法运算:```c#include <stdio.h>#define M 3#define N 3void matrix_addition(int A[][N], int B[][N], int C[][N]) { for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {C[i][j] = A[i][j] + B[i][j];}}}int main() {int A[M][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int B[M][N] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};int C[M][N];matrix_addition(A, B, C);printf("矩阵A:\n");for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {printf("%d ", A[i][j]);}printf("\n");}printf("矩阵B:\n");for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { printf("%d ", B[i][j]);}printf("\n");}printf("矩阵A + 矩阵B:\n"); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { printf("%d ", C[i][j]);}printf("\n");}return 0;}```运行以上代码,我们可以得到如下输出结果:```矩阵A:1 2 34 5 67 8 9矩阵B:9 8 76 5 43 2 1矩阵A + 矩阵B:10 10 1010 10 1010 10 10```从输出结果可以看出,矩阵A和矩阵B进行加法运算后得到了矩阵C,其中C的每个元素都等于对应位置上A和B的元素之和。

C8051矩阵计算器

C8051矩阵计算器
{
P4=0x20;
P5=date;
delay(5);
P4=0xA0;
delay(5);
P4=0x00;
}
void init()//液晶初始化函数。
{
delay(15);
write_cmd(0x38); //8为数据口 两行显示 5*7点阵
write_cmd(0x08); //显示关闭
else if(key<14)
{
write_data(tabFra biblioteke[key]);
k1=i-1;
js=key;
}
else
{
write_data(table[key]);
if(i==0)
k2=0;
else
if(c1>5 || c1==5)
s=s+0.01;
temp1=(long int)(s); //以下部分处理结果
temp2=s-temp1;
n=0;
while(temp1)
{
b[n]=temp1%10;
temp1=temp1/10;
}
void write_cmd(unsigned char cmd)//LCD写命令函数
{
P4=0x00;
P5=cmd;
delay(5);
P4=0x80;
delay(5);
P4=0x00;
}
void write_data(unsigned char date)//写数据函数
CloseWDT();
PortInit();
write_cmd(0x80); //将液晶指针定位在第一行第一个单元

C++矩阵运算类库(很实用)

C++矩阵运算类库(很实用)

C++进行矩阵运算类库头文件:Matrix.h#ifndef MATRIX_H#define MATRIX_H#include "iostream”#include ”string”#include <stdlib.h>#include <vector>#include 〈fstream〉#include〈sstream〉 //istringstream 必须包含这个头文件using namespace std;class Matrix{public:void readMatrix(string fileName);void showMatrix();void writeMatrix(string str);void inversion();//求矩阵的逆矩阵void change();//求矩阵的转置void operator +(Matrix &a);//声明重载运算符的“+”函数void operator —(Matrix &a);//声明重载运算符的“-"函数void operator *(Matrix &a);//声明重载运算符的“*”函数void operator =(Matrix &a);//声明重载运算符的“=”赋值函数vector<vector<double>> _mat;int row;int col;};#endif源文件:main.cpp#include ”iostream”#include "string"#include <stdlib.h>#include <vector>#include 〈fstream>#include<sstream〉 //istringstream 必须包含这个头文件#include "Matrix.h"#include 〈time.h〉 //使用随机数#include 〈cmath〉 //数学计算using namespace std;//将运算得到的数据存储到box中,形成一个完整的Matrix量Matrix box_mul;//矩阵相乘的结果Matrix box_inver;//矩阵的逆的结果Matrix box_change;//矩阵转置的结果Matrix box_plus;//矩阵加的结果Matrix box_cut;//矩阵减的结果void Matrix::readMatrix(string fileName){ifstream ifile(fileName。

C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序

C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序

课程设计任务书目录PART I1 需求分析 (2)2 算法基本原理 (2)3 类设计 (3)4 详细设计 (4)4.1类的接口设计 (4)4.2类的实现 (5)4.3主函数设计 (11)5 运行结果与分析 (12)5.1程序运行结果 (12)5.2运行结果分析 (14)PART Ⅱ1 需求分析 (24)2 算法基本原理 (24)3 类设计 (14)4 详细设计 (15)4.1类的实现 (15)4.2主函数设计 (19)5 运行结果与分析 (27)5.1程序运行结果 (27)5.2运行结果分析 (27)6 参考文献 (15)PART I1 需求分析矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n ×n矩阵类,类中包括一些简单的运算等操作具体要求如下:(1)使用构造函数完成方阵的初始化赋值(动态内存分配);(2)使用析构函数完成矩阵动态内存的释放;(3)重载加法运算符+,实现两个矩阵的和;(4)重载加法运算符-,实现两个矩阵的差;(5)重载加法运算符*,实现两个矩阵的积;(6)重载加法运算符=,实现两个矩阵之间的赋值;(7)使用函数实现矩阵的转置;(8)使用函数求矩阵中的最大值;(9)使用函数求矩阵中的最小值;(10)添加函数Det以得到矩阵对应行列式的值;(11)重载加法运算符<<,实现矩阵按照行列的格式输出;(12)编写一个主函数测试上述功能。

2 算法基本原理矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。

加法,减法计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。

矩阵乘法是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。

一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足矩阵乘法满足结合率,但不满足交换率3 类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。

矩阵计算器代码实现 C语言

矩阵计算器代码实现 C语言

#include<iostream>#include<stdlib.h>#include<math.h>#define N 10 //定义方阵的最大阶数为10#include <iomanip>using namespace std;double MatDet(double *p, int n); //求矩阵的行列式double Creat_M(double *p, int m, int n, int k); //求矩阵元素A(m, n)的代数余子式void print(double *p, int n); //输出矩阵n*nclass Matrix{private:int row,col;double **eM ;public:creatM();//创造矩阵outM(Matrix A);//输出矩阵add(Matrix A,Matrix B);//矩阵相加minus(Matrix A,Matrix B);//矩阵相减transpose(Matrix A);//矩阵转置mutiply(Matrix A,Matrix B);//矩阵相乘h(Matrix A);//求行列式,和上三角inverse(Matrix A);//矩阵的逆};void main(){cout<<"******矩阵计算器******"<<endl;cout<<"请选择你要进行的操作"<<"\n"<<"1:相加2:相减3:转置4:相乘5:求行列式和上三角6:求逆"<<endl;int c;cin>>c;switch(c){case 1:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.add(m1,m2);break;}case 2:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.minus(m1,m2);break;}case 3:{Matrix A;A.transpose(A);break;}case 4:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.mutiply(m1,m2);break;}case 5:{Matrix m;cout<<"请输入矩阵"<<endl;m.creatM();m.h(m);break;}case 6:{double *buffer, *p; //定义数组首地址指针变量int row, num; //定义矩阵的行数和矩阵元素个数int i, j;double determ; //定义矩阵的行列式double a[N][N], b[N][N];int n;cout << "采用逆矩阵的定义法求矩阵的逆矩阵!\n";cout << "请输入矩阵的行数: ";cin >> row;num = 2 * row * row;buffer = (double *)calloc(num, sizeof(double)); //分配内存单元p = buffer;if (NULL != p){for (i = 0; i < row; i++){cout << "Please input the number of " << i+1 << " row: ";for (j = 0; j < row; j++){cin >> *p++;}}}else{cout << "无法分配内存\n";}cout << "The original matrix : \n";print(buffer, row); //打印该矩阵determ = MatDet(buffer, row); //求整个矩阵的行列式p = buffer + row * row;if (determ != 0){cout << "The determinant of the matrix is " << determ << endl;for (i = 0; i < row; i++) //求逆矩阵{for (j = 0; j < row; j++){*(p+j*row+i) = (double)Creat_M(buffer, i, j, row)/determ;}}cout << "The inverse matrix is: " << endl;print(p, row); //打印该矩阵}else{cout << "The determinant is 0, and there is no inverse matrix!\n"; }free(buffer); //释放内存空间getchar();break;}}}Matrix::creatM(){cout<<"请依次输入矩阵的行和列"<<endl;cin>>row>>col;eM=(double**) malloc(row*sizeof(double*)) ;for(int i=0; i<row; i++)eM[i] = (double *)malloc(col * sizeof(double));cout<<"请输入矩阵"<<endl;for( i=0;i<row;i++){for(int j=0;j<col;j++)cin>>eM[i][j] ;}}Matrix::outM(Matrix A){for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<eM[i][j]<<" ";cout<<endl;}}Matrix::add(Matrix A, Matrix B){if(A.col!=B.col || A.row!=B.row){cout<<"行列不同"<<endl;}else{for(int i=0;i<A.row;i++){for(int j=0;j<A.col;j++){A.eM[i][j]=A.eM[i][j]+B.eM[i][j];}}cout<<"结果为:\n";A.outM(A);}}Matrix::minus(Matrix A, Matrix B){if(A.col!=B.col || A.row!=B.row){cout<<"行列不同"<<endl;}else{for(int i=0;i<A.row;i++){for(int j=0;j<A.col;j++){A.eM[i][j]=A.eM[i][j]+B.eM[i][j];}}cout<<"结果为:\n";A.outM(A);}}Matrix::transpose(Matrix A){int i,j;cout<<"请输入矩阵"<<endl;A.creatM();cout<<"原矩阵为:\n";A.outM(A);Matrix R;R.row=A.col;R.col=A.row;R.eM=(double**) malloc(R.row*sizeof(double*)) ;for( i=0; i<R.row; i++)R.eM[i] = (double *)malloc(R.col * sizeof(double));for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=0;}}for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=A.eM[j][i];}}cout<<"结果为:"<<endl;R.outM(R);}Matrix::mutiply(Matrix A, Matrix B){if(A.col!=B.row){cout<<"不能相乘"<<endl;}else{int i;Matrix R;R.row=A.row;R.col=B.col;R.eM=(double**) malloc(R.row*sizeof(double*)) ;for( i=0; i<row; i++)R.eM[i] = (double *)malloc(R.col * sizeof(double));for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=0;}}for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){for(int k=0;k<A.col;k++){R.eM[i][j]+=A.eM[i][k]*B.eM[k][j];}}}cout<<"结果为:\n"<<endl;R.outM(R);}}Matrix::h(Matrix A){if(A.col!=A.row){cout<<"不是方阵"<<endl;}else{int ii,jj,k,u;int iter = 0; //记录行变换的次数(交换)double det1=1,yin;int n=A.row;for(ii=0 ; ii<n; ii++){if(A.eM[ii][ii] == 0)for(jj=ii; jj<n; jj++){if(A.eM[jj][ii] != 0){double temp1;for(int i=0 ; i<n ; i++);{temp1 = A.eM[ii][i];A.eM[ii][i] = A.eM[jj][i];A.eM[ii][i] = temp1;}iter ++;}}for(k=ii+1; k<n; k++){yin = -1 * A.eM[k][ii] / A.eM[ii][ii] ;for(u=0; u<n; u++){A.eM[k][u] = A.eM[k][u] + A.eM[ii][u] * yin;}}}for(ii=0; ii<n; ii++) //求对角线的积即行列式的值det1 = det1 * A.eM[ii][ii];//行变换偶数次符号不变if(iter%2 == 1)det1= -det1;cout<<"矩阵的行列式的值为:"<<det1<<endl;cout<<"转换的上三角矩阵为:"<<endl;for(int i=0; i<n; i++){for(int j=0; j<n; j++){cout<<" "<<A.eM[i][j];}cout<<endl;}cout<<endl;}}double MatDet(double *p, int n){int ii,jj,k,u;int iter = 0; //记录行变换的次数(交换)double det1=1,yin;for(ii=0 ; ii<n; ii++){if(*(p+ii*n+ii) == 0)for(jj=ii; jj<n; jj++){if(*(p+jj*n+ii) != 0){double temp1;for(int i=0 ; i<n ; i++){temp1 = *(p+ii*n+i);*(p+ii*n+i) = *(p+jj*n+i);*(p+ii*n+i) = temp1;}iter ++;}}for(k=ii+1; k<n; k++){yin = -1 * (*(p+k*n+ii)) / (*(p+ii*n+ii)) ;for(u=0; u<n; u++){*(p+k*n+u) = *(p+k*n+u) + *(p+ii*n+u) * yin;}}}for(ii=0; ii<n; ii++) //求对角线的积即行列式的值det1 = det1 * (*(p+ii*n+ii));//行变换偶数次符号不变if(iter%2 == 1)det1= -det1;return det1;}//----------------------------------------------------------------------------//功能: 求k*k矩阵中元素A(m, n)的代数余之式//入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k//返回值: k*k矩阵中元素A(m, n)的代数余之式//----------------------------------------------------------------------------double Creat_M(double *p, int m, int n, int k){int len,t;int i, j;double mid_result = 0;int sign = 1;double *p_creat, *p_mid;len = (k-1)*(k-1); //k阶矩阵的代数余之式为k-1阶矩阵p_creat = (double*)calloc(len, sizeof(double)); //分配内存单元p_mid = p_creat;for (i = 0; i < k; i++){for (j = 0; j < k; j++){if (i != m && j != n) //将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元{*p_mid++ = *(p+i*k+j);}}}sign = ((m+n)%2 == 0 ? 1 : -1);//代数余之式前面的正、负号t=MatDet(p_creat, k-1);mid_result = sign*t;return mid_result;free(p_creat);}//-----------------------------------------------------//功能: 打印n*n矩阵//入口参数: n*n矩阵的首地址,矩阵的行数n//返回值: 无返回值//-----------------------------------------------------void print(double *p, int n){int i, j;for (i = 0; i < n; i++){cout << setw(4);for (j = 0; j < n; j++){cout << setiosflags(ios::right) << *p++ << setw(10);}cout << endl;}}。

C矩阵简单的计算器

C矩阵简单的计算器

C++课程设计---矩阵简单的计算器一、设计目的1、熟练把握和运用c++编写程序代码的能力。

2、初步了解输入、成立并输出矩阵和矩阵加法、减法、乘法、赋值和转置的算法设计。

3、把握大体的运算符重载函数的书写。

4、把握静态数据成员和静态成员函数的具体声明和实现,体会它们的特殊作用。

五、把握并体会动态内存分派的实际应用。

六、运用简单的循环实现简单的菜单程序。

二、整体设计(1)UML图(2)流程图三、详细设计(1)类中的函数功能及实现1、有参数的构造函数Matrix(int l,int w,int *n);实现:Matrix::Matrix(int l,int w,int *n){length=l;width=w;num=new int[length*width];int *p=num;for(int i=0;i<length*width;i++){*p++=*n++;}}说明:为有参数的对象变量初始化。

2、无参构造函数(默许形式的构造函数)Matrix()实现:Matrix::Matrix(){length=1;width=1;num=new int(1);}说明:为无参数的对象进行初始化。

3、矩阵的拷贝构造函数Matrix::Matrix(Matrix &jz)实现:Matrix::Matrix(Matrix &jz){length=;width=;num=new int[length*width];for(int i=0;i<length*width;i++){*(num+i)=*+i);}}目的:用已存在的对象jz去初始化新成立的对象。

4、矩阵输入函数void Matrix::setnum(int l,int w)实现:void Matrix::setnum(int l,int w){length=l;width=w;if(l==0||w==0){cout<<"矩阵行列不能为0"<<endl;return ;}else{delete[]num;num=NULL;num=new int[length*width]; (请单击)六、程序结果以下通过截图显示清楚的矩阵简单的计算器功能。

C#编写简易计算器(附源代码)超详细

C#编写简易计算器(附源代码)超详细

超详细因为计算器设计的控件太多,不便使用控制台应用程序完成,所以这里使用Windows窗体应用程序,并命名为Calc,如下图所示:向窗体中拖入需要的控件,如下图所示:(完成效果图)结果显示区(作者博客左边的文本框)是TextBox控件,并修改其name为txtShow,按键0~9 为Button 控件,并将其name分别修改为btn_O、btn_1、btn_2、btn_3、btn_4、btn_5、btn_6、btn_7、btn_8、btn_9;按键【负数】的name值修改为btn_sign,按键【.】的name修改为btn_dot,按键【+ - * / 】的name 值分别修改为btn_add、btn_sub、btn_mul、btn_div,按键【=】的name值修改为btn_equ,按键【倒数】的name值修改为btn_rev,按键【平方】的name值修改为btn_sqr,按键【开方】的name值修改为btn_sqrt。

右边的计算器图片空间是PictureBox ,作者博客控件是LinkLabel ,可以不添加,以上所有控件均可按照需求添加,只保留自己需要的按钮控件和textbox控件即可。

三、代码部分(含解释),采用switch多分支语句编写using System;using System.Drawing;using System.Collections;using ponentModel;usingusing System.Data;namespace Calc{/// <summary>///温柔一刀C#简易计算器的实现/// </summary>public class CalcFormForm{private Button btnprivate Button btnprivate Button btnprivate Button btnprivate Button btnprivate Button btn_5;private Button btn_6;private Button btn_7;private Button btn_8;private Button btn_9;private Button btn_add;private Button btn_sub;private Button btn_mul;private Button btn_div;private Button btn_sqrt;private Button btn_sign;private Button btn_equ;private Button btn_dot;private Button btn_rev;private TextBox txtShow;private Button btn_sqr;private PictureBox pictureBox1;private LinkLabel linkLabel1;/// <summary>/// 必需的设计器变量。

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

(1)UML图
num: int* length: int width: int flag: int=0
Matrix
+ Matrix (int l :int, w: int, n: int*) + Matrix () + Matrix (jz :Matrix &) + setnum (l :int, w : int) :void + operator+ (const jz: Matrix &): Matrix + operator-(const jz: Matrix &):Matrix + operator*(const jz :Matrix &): Matrix + zhuanzhi ():Matrix + show() :void + ~Matrix() <<static>> +getflag ():int
(2)主函数中的书写 1、主函数中首先用矩阵类Matrix定义要计算的矩阵对象,j1与 j2的运算结果是j3。
2、运用switch语句实现一个选择菜单,按照菜单提示来选择相 应要进行的运算功能。
3、在选择一个要进行的运算后,用getmn()函数获取输入提示; 再书写要进行的功能运算式,当静态函数getflag()==1时,说 明可以进行运算;然后执行if条件句,分别输出要进行运算矩 阵j1和j2运算结果j3;当执行完switch语句一个选择分支功能 后就break跳出该条件句。 4、用while语句进行整个switch语句实现的菜单一个选择循环, 当输入要运算功能的选择字符时,while语句执行。输入Q时退 出矩阵计算器。
5、加法运算符重载函数Matrix Matrix ::operator+(const Matrix &jz) 实现: Matrix Matrix ::operator +(const Matrix &jz) { if (length==jz .length && width==jz .width) { flag=1; int *n=new int [length*width]; for (int i=0;i<length*width; i++) { *(n+i)=*(num+i)+*(jz .num+i); } Matrix temp (length, width, n); if (length*width>1) { delete []n; }
1、本程序中函数模块相对独立,可以进行单个运算 符重载函数的书写及其测试,将每种重载运算符函数 写好,并且测试成功后再进行合并到一个类中,这样 感觉会很清晰的写完这个相对比较大的程序。
2、给要计算的矩阵开辟空间,最后一定要用析构函 数进行空间的释放,否则程序再运行几次后可能会因 为内存不足而不能运行。
的内存空间
} 说明: 用来删除给矩阵分配的内存。
}
12、提示输入矩阵行列数的函数void getmn (int &m,int &n) 实现: void getmn ( int &m, int &n) //引用做形参,实现双向传递 { while(1) { cout<<"请输入矩阵维数:"<<endl; cout<<"行数:"; cin>>m; cout<<"列数:"; cin>>n; if(m>0&&n>0) { return; } } } 说明:用来提示用户输入矩阵的各元素。
else { delete [] n;
} return temp;
} }
说明: 矩阵乘法要求第一个矩阵的列数等于第二个 矩阵的行数。
8、赋值运算符重载函数Matrix Matrix::operator=(const Matrix &jz )
实现: Matrix Matrix::operator =(const Matrix &jz) { if(width*length==1) { delete num; } else { delete [] num; } flag=1; length=jz.length; width=jz.width; num=new int[jz.length*jz.width]; for(int i=0;i<length;i++) {
4、矩阵输入函数void Matrix ::setnum (int l, int w)
实现:
void Matrix ::setnum (int l, int w) { length=l; width=w; if (l==0||w==0) { cout<<“矩阵行列不能为0!"<<endl; return ; } else { delete []num; num=NULL; num=new int[length*width]; //动态分配length*width大小的 空间,创建对象数组 int *p=num; cout<<length<<"*"<<width<<"矩阵:"<<endl; for(int i=0;i<length;i++) {
for (int j=0;j<width; j++) { *(num+i*width+j)=*(jz.num+i*jz.width+j); } } return *this; } 说明: 实际上为矩阵的简单拷贝。
9、转置函数Matrix Matrix::zhuanzhi() 实现: Matrix Matrix::zhuanzhi() { flag=1; int *n=new int[length*width]; for(int i=0;i<length;i++) { for(int j=0;j<width;j++) { *(n+j*length+i)=*(num+i*width+j); } } Matrix temp(width,length,n);
cout <<"请输入第"<<i+1<<"行元素:"<<endl ; for (int j=0;j<width;j++) { cout <<"第"<<j+1<<"列元素:"; cin >>*(p+I *width +j); }
} } }
说明: 矩阵输入函数主要读进去需要进行计算的原始矩阵,要注 意的是矩阵的行列数不能为1,所以应该用选择语句排除一 行一列的矩阵出现。首先用动态内存分配,给要录入的矩 阵开辟需要录入的空间length*width,创建元素个数为 length*width的对象数组。然后运用循环语句,将矩阵的 每个元素录入。
2、无参构造函数(默认形式的构造函数)Matrix() 实现: Matrix ::Matrix() { length=1; width=1; num=new int(1); } 说明:为无参数的对象进行初始化。
3、矩阵的拷贝构造函数Matrix ::Matrix (Matrix & jz) 实现: Matrix ::Matrix (Matrix & jz) { length= jz. length; width= jz. width; num=new int [length*width]; for (int i=0;i<length*width; i++) { *(num +i)=*(jz. num+i); } } 说明: 使用拷贝构造函数的目的,是用已存在的对象jz去初始化 新建立的对象。
1、熟练掌握和运用c++编写程序代码的能力。 2、初步了解矩阵加法、减法、乘法、赋值和 转置的算法设计。 3、掌握基本的运算符重载函数的书写。 4、掌握静态数据成员和静态成员函数的具体 声明和实现,体会它们的特殊作用。 5、掌握并体会动态内存分配的实际应用。 6、运用简单的循环实现简单的菜单程序。
for(i=0;i<length;i++) { for(j=0;j<width;j++) { for(t=0;t<jz.width;t++) { *(n+i*jz.width+t)+=*(num+i*width+j)**(jz.num +j*jz.width+t); } } } Matrix temp(length,jz.width,n); if(length*jz.width==1) { delete n; }
(2)流程图
开始
定义

Q?

switc h
A

M

S

F

T

fla g 真 +运算
fla g -运算

fla g

fla g 真 =运算
fla g 转置

*运算
输出
输出
输出
输出
输出
break
break
1)类中的函数成员定义及其实现 1、有参数构造函数Matrix (int l, int w, int *n); 实现: Matrix ::Matrix (int l, int w, int *n) { length=l; width=w; num=new int [length*width]; int *p=num; for (int i=0;i<length*width ;i++) { *p++=*n++; } } //为有参数的对象初始化。
相关文档
最新文档