??Ļ???Դ??
通过屏幕渲染机制我们了解到,Android的检测检测屏幕渲染是通过vsync实现的。软件层将数据计算好后,源码源码放入缓冲区,屏幕屏幕硬件层从缓冲区读取数据绘制到屏幕上,检测检测渲染周期是源码源码公众号项目源码ms,这让我们看到不断变化的屏幕屏幕画面。如果计算时间超过ms,检测检测就会出现卡顿现象,源码源码这通常发生在软件层,屏幕屏幕而不是检测检测硬件层。卡顿发生的源码源码原因在于软件层的计算时间需要小于ms,而计算的屏幕屏幕执行地点则在Handler中,具体来说是检测检测在UI的Handler中。Android进程间的源码源码交互通过Binder实现,线程间通信通过Handler。
软件层在收到硬件层的vsync信号后,会在Java层向UI的Handler中投递一个消息,进行view数据的计算。这涉及到测量、布局和绘制,通常在`ViewRootImpl`的`performTraversals()`函数中实现。因此,view数据计算在UI的Handler中执行,如果有其他操作在此执行且耗时过长,则可能导致卡顿,我们需要找到并优化这些操作。
要找到卡顿的原因,可以通过在消息处理前后记录时间,计算时间差,将这个差值与预设的卡顿阈值比较。如果大于阈值,表示发生了卡顿,此时可以dump主线程堆栈并显示给开发者。实现这一功能的关键在于在Looper中设置日志打印类。通过`Looper.loop()`函数中的cesium+源码调试日志打印,我们可以插入自定义的Printer,并在消息执行前后计算时间差。另一种方法是在日志中添加前缀和后缀,根据这些标志判断时间点。
BlockCanary是一个用于检测Android应用卡顿的工具,通过源码分析,我们可以了解到它的实现逻辑。要使用BlockCanary,首先需要定义一个继承`BlockCanaryContext`的类,并重写其中的关键方法。在应用的`onCreate()`方法中调用BlockCanary的安装方法即可。当卡顿发生时,BlockCanary会通知开发者,并在日志中显示卡顿信息。
BlockCanary的核心逻辑包括安装、事件监控、堆栈和CPU信息的采集等。在事件发生时,会创建LooperMonitor,同时启动堆栈采样和CPU采样。当消息将要执行时,开始记录开始时间,执行完毕后停止记录,并计算执行时间。如果时间差超过预设阈值,表示发生了卡顿,并通过回调传递卡顿信息给开发者。
堆栈和CPU信息的获取通过`AbstractSampler`类实现,它通过`post`一个`Runnable`来触发采样过程,循环调用`doSample()`函数。StackSampler和CpuSampler分别负责堆栈和CPU信息的采集,核心逻辑包括获取当前线程的堆栈信息和CPU速率,并将其保存。获取堆栈信息时,通过在`StackSampler`类中查找指定时间范围内的mq_send+源码堆栈信息;获取CPU信息时,从`CpuSampler`类中解析`/proc/stat`和`/proc/mpid/stat`文件的CPU数据,并保存。
总结而言,BlockCanary通过在消息处理前后记录时间差,检测卡顿情况,并通过堆栈和CPU信息提供详细的卡顿分析,帮助开发者定位和优化性能问题。
测试电脑屏幕软件(专业电脑屏幕测试软件)
1. 专业电脑屏幕测试软件
像市面上的IP-guard、第三只眼等软件都可以实现员工电脑的屏幕监控,对于员工电脑屏幕实时监控这一块,我推荐一下Ping和威眼软件,Ping对员工电脑的屏幕监控可以做到智能截屏、屏幕录像的功能,管理者还可以查看员工电脑的实时屏幕,时刻关注员工在电脑进行了哪些操作。当然市面上的监控软件大都可以实现这一功能,相比来说,我还是跟推荐使用Ping和威眼这两款软件。
2. 电脑测试屏幕的软件
两种方法1.用Teamviewer软件,手机电脑上都下一个,手机上面输入电脑上这个软件提示的ID号码,然后请求,电脑接受就可以了,但是这样的话手机是可以控制电脑的。
2.用QQ。手机电脑同时登陆两个不同的账号,电脑上打开现在你手机的用户的聊天对话框,注意上面一排各种各样的按钮,你试一试那些按钮,哪一个是屏幕共享,点一下,这时手机上点接受,就OK了!如果电脑那边有麦克风,不想播放麦克风录进去的年会屏幕抽奖源码声音,在电脑上找到小麦克风图表,点击一下,就麦克风静音了!希望能帮到你
3. 电脑屏幕测试软件哪个好
笔记本电脑显示屏坏了,还是排线坏了,可以根据以下方法判定:
1、一般电脑屏坏的特征一般表现为:不亮,亮了有斑或有亮线,严格来说,而排线坏大多为显示有问题,可能是因为排线没有插紧或是某部分,特征一般表现为:显示不稳定,有时候不显示,或者,有时显示图标变形或者显示画面跳动,也许黑屏。
2、交换检验法:用一块好的显示屏或一根好的线去交叉检测就可以知道是屏坏了还是线坏了。
3、外接显示器:将笔记本电脑外接显示器,如果正常就应该是屏的问题,如果不是就是排线问题。
4、屏幕旋转角度:如果屏幕旋转的角度不同,有的角度花,有的不花那就可能是排线的问题,屏坏的可能性不大。
4. 用什么软件测试电脑屏幕
查看自己屏幕的色域步骤如下:
1.首先测试显示器的色域需要专门的仪器,比如彩色分析仪;
2.一般用户自己检测的方式是:安装一个获取显示器信息的软件(显示器检测工具),查看参数;或者在官方网站搜索自己屏幕色与参数。
3.可以使用鲁大师查询本机屏幕型号。然后到屏库去查本机屏幕的型号。在详细规格里有色域。
4.需要借助一些软件可以更好的帮助查询屏幕的色域。
拓展:色域是指一台显示设备能够显示出的颜色的范围,也有几种不同的标准,如NTSC色域,工会网源码RGB色域等,通常是以红、绿、蓝三原色中的某一个点组成一个三角形,看该显示设备能够显示的颜色数可以达到这个三角形的百分之多少。
注意事项:最好是请专业人员查看才可以保证精准。
5. 新电脑屏幕测试软件
监控电脑的软就,可以使用超级眼电脑监控软件。
超级眼电脑屏幕监控软件防泄密版是目前行业内用户量最大的公司电脑监控软件之一。实时监控员工电脑屏幕,并可以电视墙形式同时多台员工电脑屏幕监控;QQ聊天记录、MSN聊天记录、收发电子邮件记录;使用这款企业监控软件,您再也不用为员工工作效率低下而忧虑了,对员工的工作状况评估更加客观,及时调整工作部署,更好的提高企业管理效率!
1、实时屏幕监控:实时监控员工电脑屏幕,员工的一举一动尽收眼底,可同时监控台员工电脑屏幕的电脑监控软件,防泄密版本新增摄像头监控,员工摄像头集中监控管理。
2、聊天记录监控:可监控员工使用聊天工具(如QQ、MSN、SKYPE、阿里旺旺等)聊天的内容,方便管理者对员工聊天行为进行管理,避免员工上班时间做与工作无关的事情。
3、邮件监控:能实时记录员工所有收发的邮件,并详细监控与记录到员工发送的全部邮件的全部内容,包括对WEB网页邮件、FOXMAIL,OUTLOOK,OUTLOOK 等进行邮件监控。
4、上网监控:能监控员工所上的网站、内容,以方便管理者对员工上网行为进行监控和管理。并具有网页过滤功能,可禁止员工上特定的网站。
5、文件监控、游戏监控、炒股监控、定时监控等。
6、软件程序禁用:本电脑监控软件可自行设定禁用员工电脑的指定的软件程序(如禁用QQ、游戏、炒股、视频、下载等软件程序),规范员工合理使用计算机。
7、网址过滤:可以允许员工只能上指定的网站,而屏蔽其他所有网站(或屏蔽某个网站)。
8、文件操作:可对员工计算机内所有文件进行远程管理,对员工文件可进行远程复制、剪切、删除、重命名等,可上传,下载,更提供了批量下载文件和文件夹的便利。
9、远程控制:可对员工计算机进行远程关机,远程重启,远程通知,可查看员工的窗口列表和进程列表,并可关闭任意窗口或进程。
、U盘管控:目前市场上首家实现只禁用USB存储设备的一款电脑监控软件,而不禁用USB鼠标、键盘等非存储设备的职能识别功能。
、硬件报警:可设置在插入移动存储设备(如U盘)或者拷贝文件带走时或者其他自定义禁止操作时,及时报警管理者。这样,员工做一些和工作无关的事情,或者危及到公司机密资料的安全时,管理者能够及时知晓,这在同类电脑监控软件中做的比较人性化的。
、多管理端管理:可授权其它管理人员安装部门经理电脑监控软件管理其下员工电脑,而总经理则可以监控全单位所有员工电脑,真正实现多管理端管理。
、远程文件管理:您可以在自己电脑里看到员工电脑的所有文件,也可以直接把文件拷贝到自己的电脑上查看或备份。掌握员工动态。
、文档防泄密:适合各类设计图纸、办公文档、源代码等。员工电脑文档正常打开,修改/保存自动加密,文件非法外发泄露,打开时乱码。
6. 电脑屏幕在线测试
电脑屏幕老是跳动有如下几种原因:
1、显示卡接触不良 解决办法:用干净的橡皮在金手指表面擦拭了几下,以清除金手指表面的氧化层,再插上就好了。
2、显示器老化 解决办法:有时由于使用的显示器年岁已高,也会出现抖动现象。为了检验显示器内部的电子元件是否老化,可将故障的显示器连接到别人的计算机上进行测试,如果故障仍然消失,说明显示器已坏,需要修理。
3、显示刷新率设置不正确 解决办法:一般刷新频率在或低于时就会出现这个情况,不妨把刷新率调高。如果还不行的话就要检查一下是否硬件出问题了,如显示器,显卡等, 如果这些没有问题,那么就要考虑一下在周围是否有干扰存在,如电机转动时会出现干扰等的一些情况。将新频率设置为“”以上,再点击确定返回桌面就可以了。
4、显卡驱动程序不正确 解决办法:将显卡驱动程序更新到最新版本,最后将计算机系统重新启动了一下
5、磁场干扰造成显示器抖动 解决办法:可将计算机搬到一张四周都空荡荡的桌子上,然后进行开机测试,如果屏幕抖动的现象消失,那么说明电脑原来的地方有强电场或强磁场干扰,请将可疑的东西(如音箱的低音炮、磁化杯子等)从电脑附近拿手。
6、其他原因 解决办法:可能你的主板体质差、试看两者的接线处是否有问题/线问题。 如果以上的方法都不能让屏幕恢复正常,可送去电脑维修的地方维修。
7. 专业电脑屏幕测试软件下载
1、点击打开鲁大师主面板,在导航上点击进入性能测试。
2、进入之后点击“硬件测试工具”。
3、“硬件测试工具”栏提供显示器质量测试和液晶屏坏点测试;
4、下面进行显示器的全屏测试,在四种颜色背景下,点击你能看清楚的最后一列文字:
5、测试完成后,将得到你的显示器测评结果。
8. 专业手机屏幕测试软件
Main问题原理:手机在开机时会自动运行系统程序和设定了开机自动运行的软件(后台线程),如果某个需要运行的文件损坏了或与系统不兼容,那手机就会提示Main程序已关闭,然后自动关闭该线程,而且大部分文件出了问题,一般都只是统一显示“Main程序已关闭”,而不会提示是哪个软件,这样就给我们追踪造成错误的源文件造成麻烦,所以我们就必须设法让系统显示出错的代码。
9. 专业电脑屏幕测试软件有哪些
EVEREST
可以检测所有的硬件。
EVEREST
Ultimate
Edition通过曾获得奖项的EVEREST技术为PC发烧友提供业内领先系统诊断以及系统基准测试解决方案。在系统优化和配置过程中本软件提供基本系统信息、超频信息、高级硬件监测以及诊断功能来帮助验证设定的选项。CPU、FPU、内容基准测试帮助你了解真实的系统性能并且可以与其它系统进行对比。此外加上全面的软件、操作系统、安全信息,EVEREST
Ultimate
Edition这个全面的系统诊断软件可以为你提供超过多页有关你PC信息。新版增加查看远程系统信息和管理,结果导出为HTML、XML功能。
会C语言的朋友帮个忙啊 帮我编个小程序
这些源码我都有啊,差不多吧。先贴2个吧,我是在网上下的,
贪食蛇
#define N
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b
#define RIGHT 0x4d
#define DOWN 0x
#define UP 0x
#define ESC 0xb
int i,key;
int score=0;/*得分*/
int gamespeed=;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(,),右下角坐标为(,)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor();
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=;i<=;i+=)/*画围墙*/
{
rectangle(i,,i+,); /*上边*/
rectangle(i,,i+,);/*下边*/
}
for(i=;i<=;i+=)
{
rectangle(,i,,i+); /*左边*/
rectangle(,i,,i+);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=;snake.y[0]=;/*蛇头*/
snake.x[1]=;snake.y[1]=;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%+;
food.y=rand()%+;
while(food.x%!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+,food.y-);
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=;break;
case 2: snake.x[0]-=;break;
case 3: snake.y[0]-=;break;
case 4: snake.y[0]+=;break;
}
for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0]<||snake.x[0]>||snake.y[0]<||
snake.y[0]>)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+,food.y-);
snake.x[snake.node]=-;snake.y[snake.node]=-;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+,
snake.y[i]-);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+,snake.y[snake.node-1]-);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(,,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[];
setfillstyle(SOLID_FILL,YELLOW);
bar(,,,);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(,,str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
}
计算器
#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 0x /*光标上移键*/
#define DOWN 0x /*光标下移键*/
#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[]={ ""},c,temp[]={ ""};
char str1[]=".+-*/Qc=^%";/* 定义字符串在按钮图形上显示的符号 */
mwindow( "Calculator" ); /* 显示主窗口 */
color = 7; /*设置灰颜色值*/
getviewsettings( &vp ); /* 读取当前窗口的大小*/
width=(vp.right+1)/; /* 设置按钮宽度 */
height=(vp.bottom-)/ ; /*设置按钮高度 */
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的坐标值*/
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())!=) /*当压下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++;
} /*否则,右移到下一个字符位置*/
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中*/
strcat(str2,temp); /*将temp中的字符串连接到str2中*/
setfillstyle(SOLID_FILL,color+3);
bar(2*width+width/2,height/2,*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,*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,*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,*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,*width/2,3*height/2);
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='^')
{
num1=atof(str2); /*将第二个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=5; /*做计算乘方标志值*/
setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/
bar(2*width+width/2,height/2,*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,*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,*width/2,3*height/2); /*覆盖结果区*/
sprintf(temp,"%f",result); /*将结果保存到temp中*/
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,*width/2,3*height/2); /*覆盖结果区*/
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='Q')exit(0); /*如果选择了q回车,结束计算程序*/
}
putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/
return; /*返回*/
}
/*窗口函数*/
void mwindow( char *header )
{
int height;
cleardevice(); /* 清除图形屏幕 */
setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*/
setviewport( , , 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( ,+height+4, MaxX/2+4, MaxY/2+, 1 ); /*设置视口大小*/
drawboder(); /*画边框*/
}
void drawboder(void) /*画边框*/
{
struct viewporttype vp; /*定义视口类型变量*/
setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */
setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/
getviewsettings( &vp );/*将当前视口信息装入vp所指的结构中*/
rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*画矩形边框*/
}
/*设计鼠标图形函数*/
int arrow()
{
int size;
int raw[]={ 4,4,4,8,6,8,,,,,8,6,8,4,4,4}; /*定义多边形坐标*/
setfillstyle(SOLID_FILL,2); /*设置填充模式*/
fillpoly(8,raw); /*画出一光标箭头*/
size=imagesize(4,4,,); /*测试图象大小*/
rar=malloc(size); /*分配内存区域*/
getimage(4,4,,,rar); /*存放光标箭头图象*/
putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/
return 0;
}
/*按键函数*/
int specialkey(void)
{
int key;
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0); /*键盘输入*/
key=key&0xff? key&0xff:key>>8; /*只取特殊键的扫描值,其余为0*/
return(key); /*返回键值*/
}
2024-12-29 00:18
2024-12-28 23:21
2024-12-28 22:47
2024-12-28 22:37
2024-12-28 22:05