编程 - 天悬星河
欢迎光临:

单片机C程序优化

Post by 天悬星河 2010-7-25 18:41 Sunday

        转者按:本文转自网络,由于经过多方流传,原作者已不可考,如有涉及版权,请联系 http://www.candura.us 注明版权信息。另,转载也要进行很多诸如排版、改错之类的工作,请另外转载尊重原转载者劳动成果。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

        单片机C程序优化对程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。

一、程序结构的优化

1、程序的书写结构

        虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明...

阅读全文>>

标签: 编程 程序 C语言

0

美化并加密自己的CMD命令行(并使其支持少许Linux命令)

Post by 天悬星河 2010-2-27 1:56 Saturday

  今天闲来无事,不知怎么的心血来潮,想起来要美化一下自己的CMD命令行窗口。后来回忆起很久很久以前看杂志说过可以顺带给他加密、让CMD支持少许Linux下的命令行(因为是用doskey命令来映射的,所以只能支持少许)

  先来看看效果图吧:

点击查看原图

 

  虽说不是什么特别绚丽,至少让它更符合自己的使用习惯了。接下来就说说怎么美化它吧,其实这个很简单,只要写一个BAT文档放在特殊位置就可以了,不过这样用的时候,网上大部分技术文档建议使用“.cmd”后缀,不要紧了,其实就是bat的语法。

  在Windows的注册表中,有一个地方是管理CMD的,在“[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]”这个地方有一个名为“AutoRun”的的字符串值,里面的内容可以是一个批处理,这样的话每次进入“CMD”就会先运行那个批处理,所以做这些美化加密就从那个批处理入手吧。

  那个批处理原文:

@echo off
cls
echo   -----------------------------------------
echo   ☆ .·°∴° ★·°∴°∴°.☆°★°∴°
echo   °∴ 那怕星际无垠 ☆° .·★°∴°.°°
echo   ∴°.°★ .·°∴°.°∴°.★☆° .·
echo   °.☆° 我也要追到你.★· °.°°.★
echo   .·°∴★°.°∴°.☆° .·°∴°.°
echo   .·°∴°★.并永远爱你.°∴·°°∴☆°
echo   ☆ .·°∴° ☆..·°∴★°天悬星河∴·
echo   ∴°★.☆° .☆..·°★.° .·。∴°
echo   -----------------------------------------
echo   现在时间是:%date% %time% 
echo   -----------------------------------------
color 0a

rem===此处用于转换Linux常用命令===

prompt 天悬星河$B$P$G$S
doskey ls=dir
doskey pwd=chdir
doskey clear=cls
doskey mv=move
doskey rm=del

rem===============================

setlocal 
set pass=0 
set times=2 

echo    为安全起见,CMD命令已加密!                                        
:start 
set /p pass=  进入CMD请输入密码: 
if "%pass%" equ "123456"  goto ok    
echo                        密码错误,请重新输入! 
echo   你还有%times% 次机会 

if %times%==0 goto err 
echo                              状态:用户输入密码  验证失败 
set /A times=%times%-1 
goto start 

if "%pass%" neq "123456"  goto err 
:err 
echo  密 码 错 误 !! 
echo    未经授权擅自闯入者请自重。。。                                        
pause 
exit 
:ok 
echo  密 码 正 确 !! 
echo    欢迎使用CMD天悬星河美化版。。。                                        
title 天悬星河 http://www.candura.us
endlocal 

 

  这里面大部分命令都是大家熟悉的,就不多介绍了,只要把那两个if语句中间双引号里面的部分改成自己密码就行了。说说这里面几个特殊的命令吧。

  title 命令:这个命令是用来修改CMD的窗口标题的,使用方法和 echo 一样,在title命令后面加上你想让标题栏显示的内容即可,我这里让它显示“天悬星河 http://www.candura.us”。

  color 命令:这个是用来设置前景色和背景色的,在color后面通常加两个参数,第一个参数是背景色,第二个参数是文字的颜色。具体为: 0.黑色 1.蓝色 2.绿 3.湖蓝色 4.红 5.紫色 6.黄 7.白色 8.灰色 9.浅蓝色 A.浅绿色 B.浅水绿 C.浅红 D.浅紫色 E.浅黄色 F.亮白色。所以我这里面使用“color 0a”显示的效果就是黑色背景,绿色文字。

  doskey 命令:这个命令就是用来做映射的命令,我就是用它来实现让cmd支持少许Linux命令的。它的使用方法是:doskey 新命令=原命令。比如Linux下显示当前文件夹下内容是用“ls”命令,而在CMD下面是用“dir”,那么就设置成“doskey ls=dir”就行。用这个方法还可以自己设置自己喜欢的命令,只要不重复就行。

  prompt 命令:这个命令对于平常很少见,它是用来更改提示符显示的。CMD默认的命令提示符显示的是“路径+大于号”然后右边是用户输入的命令。用这个可以更改,像我这里就改成了“天悬星河+分隔符+路径+加大于号+空格”。详细使用方式及参数如下:

PROMPT [text]
   text    指定新的命令提示符。
提示符可以由普通字符及下列特定代码组成:
   $A    & (短 and 符号)
   $B    | (管道)
   $C    ( (左括弧)
   $D   当前日期
   $E    Escape 码(ASCII 码 27)
   $F    ) (右括弧)
   $G    > (大于符号)
   $H    Backspace (擦除前一个字符)
   $L    < (小于符号)
   $N   当前驱动器
   $P   当前驱动器及路径
   $Q    = (等号)
   $S      (空格)
   $T   当前时间
   $V    Windows 版本号
   $_   换行
   $$    $ (货币符号)
如果命令扩展被启用,PROMPT 命令会支持下列格式化字符:
   $+   根据 PUSHD 目录堆栈的深度,零个或零个以上加号(+)字符,一个推的层一个字符。
   $M   如果当前驱动器不是网络驱动器,显示跟当前驱动器号或空字符串有关联的远程名。

 

利用这个命令可以更加深入的模仿Linux下面命令行的提示符显示方式,在做美化的时候很有用。

  接下来写好自己的cmd文件之后就可以复制到系统文件夹去了,一般复制到 X:\Windows\ 或者 X:\windows\system32\ (其中X为系统所在盘符)就可以了。然后,进入注册表(开始→运行→输入“regedit”后回车),找到“[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]”这个位置,新建一个“AutoRun”的字符串值,里面填写那个文件的完整路径就行,注意文件夹常用的“\”在这里要写成“\\”,像我的就是“C:\\WINDOWS\\system32\\candura.cmd”。

  做好这些之后再运行CMD看看,是不是截然一新了呢!为了方便修改,我自己写了几个批处理和注册表文件,方便进行安装和卸载,在我的博客有下载,大家要修改只要修改 candura.cmd 里面的内容保存,再运行“安装.bat”就可以自动复制并且导入注册表了,卸载的时候运行“卸载.bat”就行了。

附件下载:
美化CMD.zip 118.62KB  下载次数:0

标签: Linux Windows 编程 程序

0

对大学电科学生的一些忠告

Post by 天悬星河 2010-2-24 16:04 Wednesday

 

  这篇文章是在一个同学的校友里面看到的,里面包含有原文链接,就去看了原文并转了过来。这篇文章原本是写给学自动化的学生的,但是看了它的导读,反倒是对电科最有用。算起来,我好久没更新什么东西,整个寒假就弄了个“挖掘SopCast源地址”的文章,技术含量也不怎么高。高数挂了,今天去医院做胃镜又溃疡,那边她又对我不满,壹号的论坛又被墙……唉,实在没心思写东西了,整个寒假一事无成,就转点文章来冲冲门面吧,另:转载来的文章排版好累的说。

  =-=-=-=-=我是Candura的分隔符=-=-=-=-=

    转载者:Candura(欢迎参观:http://www.candura.us)

    原文链接:http://www.zdh1909.com/html/renwuzhuanfang/539344874860.html

  =-=-=-=-=我是Candura的分隔符=-=-=-=-=

  敬请留意:本忠告对工科的电子类专业(如:电子科学与技术、电子信息科学与技术)、机电类专业(如:自动化、电气工程及其自动化)等专业同样适用。

一、计算机学习:

大一: 
  1、Visual Basic:最适合入门的计算机语言,可功能很强,而且用起来无比方便。对我们测控专业的学生来说也很实用,可以在以后的各种与计算机相连的项目中用来设计界面。但不宜过于深入,掌握基本的东西,能做基本的界面即可。还应注意其在数据库程序设计方面的用法。 
  2、C语言:这个基本不用介绍了,可以说它之于我们测控就如嗓子之于歌唱家。你说你能不好好学学吗?强烈建议精通! 
  3、业余适当学习一些业余软件,费时不多,受益多多,比如:Photoshop、Flash等等。这些东西对以后的工作和生活都有很大帮助,但请记住我们的方向,不要沉迷,不要过于深入。 
  大二: 
  1、MATLAB:理工科学生不可不知的软件,功能实在是无比强大,因此也就很难掌握。但需注意与自己专业相连,因此我们重点学习其在数值计算、信号处理、控制系统设计等方面的应用。(配套课程:《高等数学》、《线性代数》、《信号与系统》、《自动控制原理》等) 
  2、Multisim:主要用于电路仿真,当我们学习数电、模电时如果能用其模拟一下课本或作业中的电路,绝对会对我们的学习有不小的帮助。而且操作简单,结果直观,实乃精品。(配套课程:《电工学》、《数字电子技术基础》、《模拟电子技术基础》等) 
  3、LabVIEW:又一款测控专业所不可不知、不可不学的经典软件,很多电子工程师都在用它来帮助提高自己的工作效率。相信每一个用过该软件的人都能真正体会到软件编程的快乐。(配套课程:《数据采集》、《自动检测系统》等) 
  4、Protel:制作电路板的最经典和最为普及的软件。为了我们以后的发展,为了以后设计系统以及做各种项目的需要,此软件我们必不可少。(配套课程:《电路CAD》) 
  大三: 
  1、单片机:如果我们测控专业需要吃饭,那可以毫不夸张地说这就是我们的饭碗所在!测控专业的核心也正在此,如果你想找一份好工作,想幸福地生活,单片机你不能不精通。当然,此处我们默认是指课程中广泛学习的MCS-51系列单片机。(配套课程:《单片机基础》) 
  2、Keil C:学习单片机除了课本上的汇编语言以外,很明显,我们更重要的还要精通单片机开发的C语言,而学习用于单片机开发的C语言,我们当然离不开Keil C!(配套课程:《单片机基础》) 
  3、Proteus:我们学习单片机最需要的是什么?当然是开发板、编程器,然而这些东西价钱又不是那么便宜,对我们学生来说是一笔不小的负担。很多学生都会被学习单片机的昂贵的开销所吓怕。然而,当你拥有了这款软件,你就会很惊奇的发现那一切都将成为历史;你会发现你所要的、甚至你没有想到的,它都提供给了你。这么一款神奇的软件,我们能够拒绝吗?(配套课程:《单片机基础》) 
  4、AVR、PIC等:单片机种类繁多,而课本只给了我们一种,很显然这是不够的,我们需要了解更多的东西。那么这两类单片机绝对不能错过,它们都是极为经典的并且在工业中得到广泛应用的优秀单片机。 
  大四: 
  1、DSP:和单片机差不多的一类东西,但与单片机的应用方向不尽相同。为把自己打造成一个复合型人才,这些知识当然也就不可缺少了。 
  2、ARM:它占领了32位单片机几乎8成的份额,而且,你能容忍自己直到32位单片机广泛应用时才去学习它吗?我们当然要事先做好准备、迎接挑战! 
  3、SOC、CPLD、FPGA等:作为一个立志要有所作为的学生,这些当前电子应用中的前沿知识你能错过吗?那么还等什么呢,趁着这大学里的最后时光,猛学一段吧! 
  4、综合应用你所学的这些东西,务必要注意动手,可以适当开发一些东西(事实上大三就可以开始了)。当然,这个不是一时的冲动,你完全可以在从大三开始的各种电子设计竞赛中就一展身手了。而且,这当然会为你的工作和学习增加很重的筹码!


二、证书认证:
  大一: 
  全国计算机等级考试二级(鉴于C语言在本专业实际应用中的重要性,所以建议考C语言)。 
  大二: 
  CET4、CET6(我们学校大一不让考,所以你就要拖到大二考了,但要注意一次必过,不能耽误后面的宝贵时间)。 
  大三: 
  1、全国计算机等级考试三级PC技术(这个最好在你大三下期的四月考,因为此时你刚刚学习过微机原理与汇编语言,刚好可以顺手拿个证书)。 
  2、GRE(或者雅思、托福都行,如果你准备出国,或有类似想法,此时来考是最好不过的了)。 
  大四: 
  全国计算机技术与软件专业技术资格(水平)考试(如果你感兴趣,此时可以考这个,而且好像也比较流行和实用)。

 

三、参加竞赛:


  大一大二: 
  比较适合的竞赛好像还都没有,也没有实力去参加,在此只推荐一个:全国大学生英语竞赛(如果英语不错的话可以在大学期间多参加几次,是个不错的锻炼机会,而且如果获得了名次的话还会有一定的奖励,可谓名利双收)。 
  大三: 
  1、全国大学生数学建模竞赛:这个我觉得只要是理工科的学生都应该参加一下,那种经历非亲历所不能述也;既锻炼了解决问题的能力以及自学新知识的能力,还锻炼了你的团队精神(不过可要找个好同学做伙伴啊)。如果学校也举行校级数模竞赛的话,可千万也别错过,绝对物超所值。 
  2、学校里面自己举行的电子设计竞赛,当然你也要留心哦,可不能错过这等好事,这可都是以后学习或工作的资本哦。 
  3、另外,如果你对大学生英语竞赛继续感兴趣的话,推荐你可以继续参加(挣钱哦^_^)。 
  大四: 
  1、全国大学生电子设计竞赛:如果你幸运的话,应该会赶上,它在单年份举行(如2007年9月。不过我好遗憾,错过了这么好的东西,唉。)相信有了你大三的扎实基础以及校级电子设计竞赛的磨练,此时肯定信心十足了吧,羡慕ing。 
  2、全国大学生“挑战者”杯创业大赛:对我们专业的学生来说,当然主要就是用创造发明来进行创业或参加竞赛了。比如你可以充分发挥你的想像力搞个小发明,或者你可以充分利用你所学的知识搞个项目。 
  3、各大电子或半导体企业举行的电子设计竞赛:如Intel的嵌入式设计竞赛、ST-Embest的嵌入式电子设计大赛、ADI的ADI大学生创新设计竞赛等等。这些无不是我们练兵的极佳舞台,而且奖励丰厚,通过参加这样的竞赛,我们一方面能够了解前沿信息,另一方面还能够和前辈们站到一块,相互交流,从而提高我们的水平。你说何乐而不为呢! 

=-=-=-=-=原文至此,下面为个人感想=-=-=-=-=

其实,我觉得,对于我们来说。文章里面的关于大三的单片机学习还有Keil C的应用,完全可以尽早开始,而且结合起来一并学习。尽管在大三之前不一定会学习到汇编、ARM这些东西,但是对于单片机编程实验来说,一块51单片机的学习版成品和一个Keil C就足够了。完全可以尽早学习,顺便巩固C语言在单片机编程中的应用。里面的很多软件应用比如Protel这些,并不需要有很高深的专业技能才能学的,完全可以利用平常使用电脑的时间来入门。可能入门的时候你不会根据专业技能来布线、来设计,但是可以用来熟悉软件的功能应用,比起日后在学能更好的上手。

前两天翻家里电脑的硬盘,找到了好多以前参加比赛的时候写的机器人程序。只不过以前使用图形化的编程环境来写,现在重新直接查看C源码,其实也就是那么回事。说真的,学习编程语言不难,难就难在如何把这些东西应用出来。可以应用到电脑程序,可以应用到网页程序,也可以应用到单片机中。其实,学习这种应用性很强的东西,想象力和实践最重要!

(个人拙见,望指正。http://www.candura.us

标签: 游戏 编程 C语言

0

终于搞定网页设计作业了~

Post by 天悬星河 2010-1-13 16:01 Wednesday

 

  这个学期我选了一门“网页设计”的课,期末的作业是让设计一个网站,内容是介绍“中国传统节日”的。本来我想做一个PHP+MySQL的,但是我的笔记本用Ubuntu在学校的宽带环境下很难联网(需要用Vbox虚拟XP出来共享),不方便搭建服务器测试,XP下面用APMServ又不能很好虚拟出真实的LAMP环境,所以就干脆做静态的吧。

  话说我真正入门CSS还是在校会培训的时候毓展兄教的,所以这次就开始用CSS来做网页布局。本来我是想先用PS画个大的Web2.0风格的框架,然后切片出来的,但是一直配不好颜色,所以后来就直接借鉴了Rambling Soul设计的一种风格来做。本来想设计成两栏式的(就像About页面的一样),但是感觉这样用在各个节日的版块里面做链接太麻烦,而且显得侧边栏太空。所以后来在各个节日的版块页面里面就直接采用了单栏结构,中间用鼠标悬停切换的效果来实现文章切换。

  这次做网页除了页面设计上吸取了一些Web2.0风格之外,还主要用了两个特殊效果:一个是顶部导航栏部分的伸缩菜单,一个是中间页面部分的鼠标悬停切换,都是以前找素材的时候见到的。因为前段时间看很多特效都是用jQuery这个脚本来弄,所以特意在网上找了本jQuery脚本的使用手册来啃。话说那个鼠标悬停切换,我以前一直以为是CSS+JS实现的,后来仔细分析了代码,发现就是直接纯(x)Html+CSS来实现的。不过这样也导致了一个页面的内容过多,显示的时候很慢,特别是我上传到我的空间用手机访问时,那个烧流量啊。还好我150M的包月,勉强够用。

  最后整个站点做下来,还是浏览器显示问题比较大。我是用Dreamweaver CS3来做的整站,做的时候是一边做一边用Chrome看效果的(本人很少用IE内核的浏览器,毕竟Microsoft的浏览器不是很符合W3C标准)。做出来之后用IE内核的浏览器访问总是有问题,显示效果甚至还不如我在手机上用内置浏览器显示的效果好(这里不得不赞一下Nokia的内置浏览器,虽说我从来都是用UCWeb),不过我也不打算专门针对IE改了。╭(╯^╰)╮

  其实这个作业挺早就布置下来了,但是一直没有机会做。前几天我同学借我的电脑发作业我才突然想起来还有这么个事儿,所以就花了两天时间弄这个,做得不是特别好,不过通过做这个倒是让我对CSS的使用更熟悉了。最近其他的时间用来研究EMLOG的模板结构,希望通过这次的锻炼,能让我在寒假弄个自己的模板出来玩玩。

  附上参观地址:http://www.candura.us/tradfes

  再附上一个网页设计时的Readme文档(作业要求的)

使用方法:
1、在任何操作系统下解压缩后直接用该系统的浏览器访问。
2、上传到服务器解压缩,在用户电脑(或手机)上网访问。

运行条件:
本站为使用 (x)html+CSS+JavaScript 搭建而成的静态站点,
理论上可以直接运行于各种服务器及带浏览器的非服务器系统。
在Google Chrome、Mozilla Firefox以及Opera浏览器下均能正常浏览,
IE7浏览器对CSS解析存在问题,访问时有些页面显示不正常。
另:本站默认字体为微软雅黑,使用XP或者Ubuntu浏览要先安装相应字体,否则以其他字体代替显示会有显示不正常的现象。
详细浏览器测试:
Ubuntu+Firefox:正常显示。
Ubuntu+Chrome:文档页面内容错位。
Ubuntu+Opera:正常显示。
Ubuntu+WINE+IE4Linux:JavaScript动画效果无法显示,无CSS效果。
WinXP+Firefox:正常显示(需要允许JavaScript运行)。
WinXP+Chrome:正常显示。
WinXP+Opera:正常显示。
WinXP+IE(内核):各节日版块中的“诗词鉴赏”无法显示。
Symbian60+UCWeb:文字图片全显示,无CSS效果。
Symbian60+Opera Mini:文字图片全显示,无CSS效果。
Symbian60+内置浏览器:完美解析浏览,效果比IE还好!就是耗流量。

标签: 博客 网络 编程

0

被C语言杯具掉了!

Post by 天悬星河 2010-1-5 15:54 Tuesday

 

  今天上午我们C语言考试,本来呢,我们班大部分同学都是初次接触C语言编程。所以我以为不会考太难的题目,顶多是从书上的原题做些变化给我们抽来做。于是我复习的时候也就是把所有题目做了一遍,结果今天杯具掉了。。。

  考试的方式是,每个人从老师那里抽一道题,题目有难有易,一切看RP。结果!结果!我抽到这样一道题“以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中”,杯具啊!关键是我们考试不是编一个程序传上去,而是调试好之后把源代码抄到信笺上交上去,光抄就够抄一节课了。

我写出来的源代码,要抄写出来,足足抄了满满的五张纸。

  后来上网查了一下原题,是这样的:“函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中; 请编制函数StrOL( ), 其函数的功能是: 以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,同时去除标点符号,之后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到文件OUT6.DAT中。”题目是源自09年计算机三级网络技术上机题库《南开100题》上面的。

  我就郁闷啊,普通的考试而已,竟然用这种题目,太操蛋了。。。

标签: 编程 程序 C语言

0

从TC转移到VC的一些注意处

Post by 天悬星河 2009-11-6 18:04 Friday

  这些天上机基本上都是在写C程序,主要指琢磨怎么改进我前两天写的那个解一元二次方程程序。首先想到要改进的就是重复运行那部分,就是在计算结束之后,让使用者按某个键重新运行程序,按其他键退出。由于在学校很少有机会上网,没法借鉴其他人是怎么做这种程序的。

  我当时的写法是定义一个“tuichu”变量,在最后通过判断案件的赋值是否为需要重新运行的,需要的就用一个“goto”语句来跳转到前面,否则就退出。

========================

 printf("\n输入数字0重新计算,输入其他任意字符退出:");
 scanf("%d",&tuichu);
 if (tuichu==0)
 {
  goto open;
 }
========================

  但是跳转回开头的时候需要重新清屏一次,就是在处理这个环节的时候让我体会到了TC和VC的区别。在TC里面,清屏可以使用<conio.h>里面的“clrscr();”来做。但是在VC里面,VC所带的<conio.h>文件里面没有了这个函数。用手机上网查了一下,在VC要是在命令行下程序清屏的话,可以使用<stdlib.h>里面的系列系统函数,这里面有一个“system("cls");”语句来实现。

  提起这个系统系列的函数,想起了以前用Dev-C++编译器的时候,想让系统暂停,可是“getch();”没有用,覃老师告诉我可以用“system("pause");”来实现系统的暂停。那时是我第一次接触系统系列的函数,但是不记得在Dev-C++里面这个函数在哪个头文件里面,好像当时是没有另外调用其他头文件的。可是在VC里面要使用系统系列的函数的话必须调用<stdlib.h>这个头文件才能使用。

  另外一个在网上查到的VC和TC的区别就是,TC里面<dos.h>的函数在VC里面很有可能要从<windows.h>那个头文件里面调用,比如说这里面最常用的有延时的函数:TC里面是sleep(time);,time里面的单位是秒;而在VC里面是Sleep(time);,time的单位是毫秒,并且S必须大写。

  除此之外,TC和VC还有很多其他方面的区别,可以在网上查到。这里只是通过我的经历提醒大家,课本教学是TC环境的,而实验环境是VC的,所以大家使用的时候,记得提前了解两者的使用上的区别,加以注意。

标签: Windows 错误 手机 编程

0

高中时构思的一个程序

Post by 天悬星河 2009-11-5 4:48 Thursday

  昨天上C语言上机课的时候,做完了老师要求的几个题目之后,没什么事情了。突然我想起以前高中的时候构思的一个程序,程序很简单,就是一个解一元二次方程的程序。其实,用编程语言来写一个解一元二次方程是很简单的,我写这个主要是想达到一个能带根号输出的目的。

  以前也见过很多数学软件有解一元二次方程的功能,当然,如果有实数解的话没有什么问题,但是倘若判别式开方后是无理数的话,这些软件往往都是输出一长串的无理数。试想一下,这样一串数字能直接抄到作业本上么?高中那时就是想写个能在解为无理数时保留根号输出答案,好方便写在作业本上,编译到手机上去用就方便许多了。

  昨天就完成了这样一个程序,关键是从书上看到了一个可以解决以前思维被卡住的问题的语句。以前想,要是想保留根号输出,判断是否是无理数是一个大问题。现在想想,其实判断很简单的。对于方程 ax^2+bx+c=0 来说,我们输入的a,b,c都已经被要求为正整数,这样的话判别式开方后若为有理数必定是正整数,若为无理数必定是存在小数部分的。这样想就把是否无理数的判断转换成了是否小数部分为零的判断,这样一下子就方便了很多了。C语言里面是可以强制转换数据类型的,这时候只需要把原本开方的结果和开方后强制转换为整形的结果相比较,看看是否为零就知道此判别式开方是否为零了。

  我在程序中是这样判断的:if ((sqrt(d)-(int)sqrt(d))==0) /*说明可以直接输出*/,其中的d为判别式。之前定义了一个字符型变量“genhao”找一个特殊符号来代替根号,我是用的是14(ASCII)——一个音乐的符号(其实关键是打不出根号本身)。后面输出的时候就根据之前的判断输出无解、一个解、两个解(这其中包括有理数解和无理数解两种方式),至于计算的时候为了方便主函数语句的简短写了几个分函数。

=========================================

整体代码如下:

//可以直接写到作业本上的解一元二次方程器
//新增虚数输出
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "stdlib.h"

//求判别式
int dieta(int a1,int b1,int c1)
{
	int d1;
	d1=(b1*b1-4*a1*c1);
	return (d1);
}

//计算X1的值
double thexa(double a2,double b2,double c2,double d2)
{
	double xa;
	xa=((-b2)+d2)/(2*a2);
	return xa;
}

//计算X2的值
double thexb(double a3,double b3,double c3,double d3)
{
	double xb;
	xb=((-b3)-d3)/(2*a3);
	return xb;
}

int main(void)
{
	int a,b,c,d,q,p,tuichu;
	double x1,x2,sqd;
	char genhao=11;/*定义一个根号的符号*/
open:system("cls");
	tuichu=1;
	printf("设一元二次方程为:ax^2+bx+c=0。\n");
	puts("请输入方程中的a,b,c(请先化简为整数):");
	scanf("%d%d%d",&a,&b,&c);
	system("cls");
	if ((a==0)&&(b==0))
	{
		printf("输入错误!\n");
		goto end;
	}
	if (a==0) /*当a=0时表示一次函数*/
	{
		sqd=-((double)c/(double)b);
		printf("此为一次方程,您输入的算式为“%dx+%d=0”。\n",b,c);
		if (sqd-(int)sqd==0) /*直接输出答案*/
		{
			printf("此方程解为:%.0f。\n",sqd);
		}
		else
		{
			printf("               %d\n",-c);
			printf("此方程解为:X= ---\n");
			printf("                %d\n",b);
		}
		goto end;
	}
		printf("您输入的算式为“%dx^2+%dx+%d=0”。\n",a,b,c);
		d=dieta(a,b,c);
		if (d<0)
		{
			printf("此一元二次方程无实数解,其虚数解为:\n");
			printf("(注:答案中的“i”表示虚数单位,-1=i*i)\n");
			sqd=sqrt(-d);
//通过整形和双精度求根的比较判断是否为无理数
			if ((sqrt(-d)-(int)sqrt(-d))==0) /*说明可以直接输出*/
			{
				p=(-b);
				q=(int)sqrt(-d);
				printf("                %d+%di\n",p,q);
				printf("第一个解为:X1= --------\n");
				printf("                 %d\n",a*2);
				printf("                %d-%di\n",p,q);
				printf("第二个解为:X2= --------\n");
				printf("                 %d\n",a*2);
			}
			else
			{
				printf("(注:答案中的“%c”表示根号)\n",genhao);
				printf("                 %d+%c(%d)i\n",-b,genhao,-d);
				printf("第一个解为:X1= -----------\n");
				printf("                    %d\n",a*2);
				printf("                 %d-%c(%d)i\n",-b,genhao,-d);
				printf("第二个解为:X2= -----------\n");
				printf("                    %d\n",a*2);
			}
		}
		else
		{
			if (d==0)
			{
				x1=(double)(-b)/(double)(2*a);
				printf("此方程只有一个解,解为:%.f。\n",x1);
			}
			else
			{
				sqd=sqrt(d);
//通过整形和双精度求根的比较判断是否为无理数
				if ((sqd-(int)sqd)==0) /*说明可以直接输出*/
				{
					x1=thexa((double)a,(double)b,(double)c,sqd);
					x2=thexb((double)a,(double)b,(double)c,sqd);
					if ((x1-(int)x1==0)&&(x2-(int)x2==0))
					{
						printf("此方程解为 %.f和 %.f。\n",x1,x2);
					}
					else if ((x1-(int)x1!=0)&&(x2-(int)x2==0))
					{
						printf("           %d\n",-b+(int)sqd);
						printf("此方程解为 --- 和 %.f。\n",x2);
						printf("            %d\n",2*a);
					}
					else if ((x1-(int)x1==0)&&(x2-(int)x2!=0))
					{
						printf("                  %d\n",-b-(int)sqd);
						printf("此方程解为 %.f 和 ---。\n",x1);
						printf("                  %d\n",2*a);
					}
					else
					{
						printf("%14d%7d\n",-b+(int)sqd,-b-(int)sqd);
						printf("此方程解为 --- 和 ---。\n",x1);
						printf("%14d%7d\n",2*a,2*a);
					}
				}
				else  /*说明要带根号输出*/
				{
					printf("注:答案中的“%c”表示根号\n",genhao);
					printf("                 %d+%c(%d)\n",-b,genhao,d);
					printf("第一个解为:X1= -----------\n");
					printf("                    %d\n",a*2);
					printf("                 %d-%c(%d)\n",-b,genhao,d);
					printf("第二个解为:X2= -----------\n");
					printf("                    %d\n",a*2);
				}
			}
		}
end:printf("\n按c重新计算,输入其他任意字符退出\n");
	tuichu=getch();
	if (tuichu=='c')
	{
		goto open;
	}
	return 0;
}

========================================

  唉,现在才注意到强制转换的实用性,以前看书自学的时候都一直没有注意这个东西。如果早点想到这个的话,在以前高中的时候就写好,编译到手机上用,那就方便太多了(我承认之前想法有点邪恶)。。。

标签: 编程 程序

0