⑴ c语言表达式运算问题
a = a--+3;
a--整个表达式运算完了之后再--;
++a是先++再进行整个表达式的运算
所以先进行a+3的运算,a 这个时候是8,然后进行自减,
最后a 为7
有兴趣的可以试试 a = a-- + 3 ++a;
答案是14
⑵ 关于C语言表达式值的判断
常见的笔记本故障大全笔记本电脑由于其结构的特殊性,决定了其维修的复杂性。但笔记本电脑终究是电脑的一种,它的维修原理与普通台式机是基本相同的。如果你是一位笔记本电脑用户,而且对它的维修方面的知识感兴趣,那么你可以参看本文,这里列举了一些解决笔记本电脑故障的分析处理过程,也许会使你得到一些帮助。
笔记本常见故障-开机不亮-硬件判断
---笔记本电脑主板BIOS出现故障会引起开机不亮
---笔记本电脑CPU出现故障笔记本液晶屏无反应,也是开机不亮的原因。
--笔记本电脑信号输出端口出现故障会引起开机不亮
---笔记本电脑主板显卡控制芯片出现故障会引起开机不亮
---笔记本电脑显卡出现故障会引起开机不亮
---笔记本电脑内存出现故障会引起开机不亮
笔记本电池充不进电-硬件故障判断
---笔记本电脑电源适配器出现故障会引起电池充不进电
---笔记本电脑电池出现故障会引起电池充不进电。
---笔记本电脑主板电源控制芯片出现故障会引起电池充不进电
---笔记本电脑主板其它线路出现故障会引起电池充不进电
笔记本不认外设-硬件故障判断
---笔记本电脑相关外设硬件出现故障会引起笔记本不认外设
---笔记本电脑BIOS出现故障设置出错会引起笔记本不认外设。
---笔记本电脑主板外设相关接口出现故障会引起笔记本不认外设
---笔记本电脑主板出现故障也会引起笔记本不认外设没同时笔记本电脑不开机。
笔记本主板出现故障会引发如下现象特征
---笔记本电脑开机后不认笔记本硬盘。
---笔记本电脑开机后不认笔记本光驱。
---笔记本电脑电池不充电。
---笔记本电脑定时或不定时关机。
---笔记本电脑键盘不灵。
---笔记本电脑开机时有时会掉电。
---笔记本电脑定时死机
以上这些故障现象都与笔记本主板相关
笔记本电源适配器引起的故障现象
--笔记本电脑开机不亮。
---笔记本电脑间断性死机。
--笔记本电源适配器发热。
--笔记本电脑光驱读DVD或容易死机或掉电。
--笔记本电脑运行大行程序容易死机或掉电。
以上这些故障现象都与记本电源适配器相关
笔记本光驱介绍
笔记本光驱──机械驱动部分。
笔记本光驱──激光头组件。
笔记本光驱故障主要来自这两个部位(笔记本光驱)。
一、驱动机械部分主要由3个小电机为中心组成:盘片加载机构由控制进、出盒仓(加载)的电机组成,主要完成光盘进盒(加载)和出盒(卸载);激光头进给机构由进给电机驱动,完成激光头沿光盘的半径方向由内向外或由外向内平滑移动,以快速读取光盘数据;主轴旋转机构主要由主轴电机驱动完成光盘旋转,一般采用DD控制方式,即光盘的转轴就是主轴电机的转轴。
二、激光头组件各种光驱最重要也是最脆弱的部件,主要种类有单光束激光头、三(多)光束激光头、全息激光头等几类。它实际是一个整体,普通单光束激光头主要由半导体激光器、半透棱镜/准直透镜、光敏检测器和促动器等零部件构成
笔记本光驱常见故障解析
笔记本光驱最常见的故障是机械故障,其次才是电路方面故障,而且电路故障中由用户调整不当引起的故障要比元器件损坏的故障多得多,所以在拆解或维护光驱设备时不要随便调整笔记本光驱内部各种电位器
笔记本光驱常见故障主要有三类:操作故障、偶然性故障和必然性故障。
1、操作故障例如驱动出错或安装不正确造成在Windows或DOS中找不到笔记本光驱;笔记本光驱连接线或跳线错误使笔记本光驱不能使用;CD线没连接好无法听CD;笔记本光驱未正确放置在拖盘上造成光驱不读盘;光盘变形或脏污造成画面不清晰或停顿或马赛克现象严重;拆卸不当造成光驱内部各种连线断裂或松脱而引起故障等。
2、偶然性故障笔记本光驱随机发生的故障,如机内集成电路,电容,电阻,晶体管等元器件早期失效或突然性损坏,或一些运动频繁的机械零部件突然损坏,这类故障虽不多见,但必须经过维修及更换才能将故障排除,所以偶然性故障又被称为"真"故障。
3、必然性故障笔记本光驱在使用一段时间后必然发生的故障,主要有:激光二极管老化,读碟时间变长甚至不能读碟;激光头组件中光学镜头脏污/性能变差等,造成音频/视频失真或死机;机械传动机构因磨损、变形、松脱而引起故障。
需要说明的是必然性故障的维修率不仅取决于产品的质量,而且还取决于用户的人为操作和保养及使用频率与环境。
常见故障的判断
1、开机检测不到光驱先检查一下光驱跳线跳正确与否;然后检查光驱IDE接口是否插接不良,如没有,可将其重新插好、插紧;最后,有可能是数据线损坏
2、进出盒故障表现为不能进出盒或进出盒不顺畅,可能原因及排除方法是,进出盒仓电机插针接触不良或电机烧毁--可重插或更换;进出盒机械结构中的传动带(橡皮圈)松动打滑
3、激光头故障故障现象表现为挑盘(有的盘能读,有的盘不能读)或者读盘能力差。光驱使用时间长或常用它看VCD或听CD,激光头物镜变脏或老化。
★敬告大家千万不要使用市面上销售的一些低价劣质光头清洁盘,因为这些盘的刷毛太硬,反而会刮花物镜,并且还有可能引起静电危害,缩短光驱使用寿命。
4、激光信号通路故障指的是激光头与电路板之间的连接线,是激光头与其他电路信息交换的通道。此处产生故障较多。。
5、主轴信号通路故障一般情况下,主轴电机与其驱动电路是合二为一的,称为主轴信号通路,此电路也由一条与激光信号通路连线一样的连接线连接,只不过股数不一样罢了。由于它与激光头信息通路都是由伺服电路进行信息沟通的。因而,在故障现象上有许多相似的地方,但由于激光头信息通路在进出盒时,其连接线易被拉折而损坏,所以在遇到相同故障现象时应先考虑激光头信息通路故障,再考虑主轴信号通路故障。
笔记本键盘如果出现故障引起的故障现象
笔记本电脑使用的故障主要有开不了机。
笔记本在使用过程中时而出现死机。
笔记本键盘的某个键出现使用不灵。
硬件故障现象
一、不加电 (电源指示灯不亮)
1. 检查外接适配器是否与笔记本正确连接,外接适配器是否工作正常。
2. 如果只用电池为电源,检查电池型号是否为原配电池;电池是否充满电;电池安装的是否正确。
3. 检查DC板是否正常;
4. 检查、维修主板
二、电源指示灯亮但系统不运行,LCD也无显示
1. 按住电源开关并持续四秒钟来关闭电源,再重新启动检查是否启动正常。
2. 外接CRT显示器是否正常显示。
3. 检查内存是否插接牢靠。
4. 清除CMOS信息。
5. 尝试更换内存、CPU、充电板。
6. 维修主板
三、显示的图像不清晰
1. 检测调节显示亮度后是否正常。
2. 检查显示驱动安装是否正确;分辨率是否适合当前的LCD尺寸和型号。
3. 检查LCD连线与主板连接是否正确; 检查LCD连线与LCD连接是否正确。
4. 检查背光控制板工作是否正常。
5. 检查主板上的北桥芯片是否存在冷焊和虚焊现象。
6. 尝试更换主板。
四、无显示
1. 通过状态指示灯检查系统是否处于休眠状态,如果是休眠状态,按电源开关键唤醒。
2. 检查连接了外接显示器是否正常。
3. 检查是否加入电源。
4. 检查LCD连线两端连接正常。
5. 更换背光控制板或LCD。
6. 更换主板。
五、电池电量在Win98 / Win Me中识别不正常
1. 确认电源管理功能在操作系统中启动并且设置正确。
2. 将电池充电三小时后再使用。
3. 在Windows 98 或Windows Me中将电池充放电两次。
4. 更换电池。
六、触控板不工作
1. 检查是否有外置鼠标接入并用MOUSE测试程序检测是否正常。
2. 检查触控板连线是否连接正确。
3. 更换触控板
4. 检查键盘控制芯片是否存在冷焊和虚焊现象
5. 更换主板
七、串口设备不工作
1. 在BIOS设置中检查串口是否设置为“ENABLED”
2. 用SIO测试程序检测是否正常。
3. 检查串口设备是否连接正确。
4. 如果是串口鼠标,在BIOS设置检查是否关闭内置触控板;在Windows 98 或Me的设备管理器中检查是否识别到串口鼠标;检查串口鼠标驱动安装是否正确。
5. 更换串口设备。
6. 检查主板上的南桥芯片是否存在冷焊和虚焊现象。
7. 更换主板。
八、并口设备不工作
1. 在BIOS设置中检查并口是否设置为“ENABLED”。
2. 用PIO测试程序检测是否正常。
3. 检查所有的连接是否正确。
4. 检查外接设备是否开机。
5. 检查打印机模式设置是否正确。
6. 检查主板上的南桥芯片是否存在冷焊和虚焊现象。
7. 更换主板。
九、USB口不工作
1. 在BIOS设置中检查USB口是否设置为“ENABLED”。
2. 重新插拔USB设备, 检查连接是否正常。
3. 检查USB端口驱动和USB设备的驱动程序安装是否正确。
4. 更换USB设备或联系USB设备制造商获得技术支持。“ENABLED”
5. 更换主板。
十、声卡工作不正常
1. 用AUDIO检测程序检测是否正常。
2. 检查音量调节是否正确。
3. 检查声源(CD、磁带等)是否正常。
4. 检查声卡驱动是否安装。
5. 检查喇叭及麦克风连线是否正常。
6. 更换声卡板
7. 更换主板。
十一、风扇问题
1. 用FAN 测试程序检测是否正常,开机时风扇是否正常
2. FAN线是否插好?
3. FAN是否良好?
4. M/B部分的CONNECTER是否焊好?
5. 主板不良
十二、KB问题
1. 用KB测试程序测试判断
2. 键盘线是否插好?
3. M/B部分的CONNECTER是否有针歪或其它不良
4. 主板不良
软件故障的分类
十三、驱动程序类
1. 显示不正常;
2. 声卡不工作;
3. Modem,LAN不能工作
4. QSB不能使用
5. 某些硬件因没有加载驱动或驱动程序加载不正确而不能正常使用
十四、操作系统类
1. 操作系统速度变慢
2. 有时死机
3. 机型不支持某操作系统
4. 不能正常关机
5. 休眠死机
十五、应用程序类
1. 应用程序冲突导致系统死机
2. 应用程序导致不系统不能正常关机
3. 应用程序冲突导致不能正常使用
一.电池使用问题
1、新电池需要像手机一样充电12小时么?
虽然笔记本电脑的电路设计要比手机完善许多,但是为了让新电池能够以更好的状态投入工作,电池的激活和校准工作还是需要进行的,厂商通用的做法是新笔记本在第一次开机时电池应带有3%的电量,此时,应该先不使用外接电源,而是把电池里的余电用尽,直至关机,然后再用外接电源充电。然后还要把电池的电量用尽后再充,充电时间一定要超过12小时,反复做三次,以便激活电池。
2、为什么电池没用使用电量也减少了?
由于环境湿度和非绝对绝缘环境的影响,电池都存在自然消耗的现象,视电池的新旧程度和品质,3-4天会下降1%左右,所以只要不是大幅度的下降都属于正常现象。
3、使用电源需要把电池取下么?
一般笔记本电脑的充电设计都是在电量低于95%才会充电的,而且由于自然损耗的存在,所以对于电池的损耗,取下与不取下基本都是相同的,因此是否取下视习惯而定,如果取下建议将电池包裹在保鲜膜内并放置于干燥阴凉处,且记得1个月左右至少使用一次电池并充电,以避免电池失去活性。
4、电池没有完全用完就充电是否会减少寿命?
电池的寿命一般按照完全充电次数计算,Li电池一般为300-400次。当然你不必担心接通电源对电池进行一次充电,哪怕只有一点就会被计算一次,电池的充电次数一般只有当电量累计充至80-90%才会增加一次,所以不用担心。在此还要说下,笔记本电池通常用的是锂电池,所以要避免在高温环境下使用锂电池,专家研究,高温状态下会加速锂电池的老化过程,并且同样的不要在极端的低温环境下使用。低温环境会降低锂电池的活性,降低笔记本电池的寿命。定期为锂电池进行激活处理,就是完全充电和放电,让锂电池恢复最大容量。做法就是,关闭所有电源管理,让笔记本慢慢的放电直至完全没电,然后在完全充电,重复两到三次即可。炎热的天气里,尽可能的维护好自己的自己的笔记本电池,才能让笔记本电脑更好的发挥自身的作用。
二.笔记本散热问题
目前笔记本散热一般都采用的散热管散热、键盘对流散热、温控风扇三级散热方式。个人认为技术比较先进的还是IBM和东芝,虽然东芝的本本不被很多人看好。
1、为什么风扇在开机的时候转一下就再也不转了?
由于笔记本电脑的温控设计,所以开机风扇自检后就会停止旋转,只有当机内达到一定温度时才会加速旋转,这也是为什么当你进行高负荷工作,诸如播放高解码率视频,3D游戏等时风扇高速旋转的原因。
2. 使用笔记本应注意周围环境吗?
使用笔记本的时候,要注意周围环境的整洁,通常笔记本最理想的工作温度是在10℃~35℃,且湿度不要太大。尤其在炎热的夏季,要保持周围环境的通风良好, 尽量在空调间里使用笔记本。电脑外壳上的凹槽和开口是用来通风的。为了确保电脑能可靠的工作并防止过热,请勿阻塞或遮盖这些开口。请勿将电脑摆放在腿上、床上或者沙发上,这些都是不可取的,柔软的东西都将笔记本底部的散热孔堵住,使得笔记本的热量无法顺利导出从而出现故障。可以在机器的底部从后端垫些书本之类的东西(偶用的是红茶的瓶子盖),让笔记本的底面与桌面保持一些空间,笔记本的底部就不会紧贴在桌面上。这样会有更多的热量从底部散发出去,或者你也可以加一个散热的底座来加大笔记本底部风流速度。市场上还出现了一些散热的外置装备,类似于U盘之类的或者内置的散热模块,不过偶还没有用过。
3. 关闭笔记本:
当你完成了工作,关闭笔记本,尽量让你的笔记本好好休息。
不要让你的笔记本开着的时候放在包包里
。经常清洁通风口,笔记本内置的风扇都有一个通风口。过了一段时间,通风口就会积聚着灰尘,这些灰尘会堵塞通风口。
同时必要的时候你可以用诊断工具测试笔记本的风扇是否工作正常。如果有专门的工具,你也可以打开风扇的地方,清除灰尘。
4. 升级笔记本的BIOS:
有时候,发热意味着计算机风扇的控制器需要BIOS升级。新版本的BIOS可以使得笔记本风扇工作得更有效率。如果你觉得你的笔记本变得越来越热,你不妨到网站上查看是否有新的BIOS提供。
笔记本的散热至今还没有很完美的,随着功能的强大,产热量会越大,这样的也给散热系统带来了压力,一般的笔记本问题用专业软件检测,像现在的这个天气(室温在30度左右)CPU和硬盘的温度大约在60度以上也属于正常。
三.屏幕问题
1.亮点和坏点
所谓坏点,是指LCD液晶显示器屏幕上无法控制的恒亮或恒暗的点。坏点的造成是LCD面板生产时因各种因素造成的瑕疵,如可能是某些细小微粒落在面板里面,也可能是静电伤害破坏面板,还有可能是制程控制不良等等。
坏点分为两种:亮点与暗点。亮点就是在任何画面下恒亮的点,切换到黑色画面就可以发现;暗点就是在任何画面下恒暗的点,切换到白色画面就可以发现。一般刚买回来的笔记本或者在买的时候,用软件检测下屏幕的亮点或者坏点,一般根据品牌不同,对这个的标准不同德,一般不能多于三个。检测软件用MonitorTest就可以了。同时,平时要减少屏幕在日光下暴晒的可能,白天使用,尽量拉上窗帘,以防屏幕受日照后,温度过高会加快老化
2.如何擦屏幕
如果仅仅是灰尘,那么可以先用气吹将灰尘尽量吹去,然后再用湿润的软布擦拭,软布要拧干,否则水可能会顺着屏幕表面流入高压包中造成屏幕损坏。如果是油污或者较难去除的污渍可以购买液晶屏幕专用清洁剂清除,切记不要使用没有质量保障的清洁剂,否则其中的醇类等腐蚀性化学成分会对屏幕造成损伤。中关村一般卖笔记本带的是亮洁的清洁套装,用这个就可以。切忌:勿用手或者硬东西擦拭屏幕。
3是否要贴膜?
本人不建议贴膜,虽说屏幕膜会对它起一个保护作用,但是这个位置一般是伤不到的,贴膜本身的成分会对屏幕有一定得伤害,还会影响散热。
4.有时候使用电池的时候屏幕会发出吱吱的声音
一般最新的笔记本没有这个问题了,老些的电脑或者质量部好的会有这个问题,就这个问题需要从两方面来解释:其一,在电池供电的时候,由于笔记本电脑节能特性的作用,整个笔记本电路的电压是在不断的变化的,这时通过屏幕高压包中的通电线圈的电流是处在不断的变化中的,而这个时候高压线圈发出的变频声也是中学物理知识所涉及的。如果笔记本电脑的电磁屏蔽较差,这种声音就会被用户听到,因此我们说这种现象在一些技术功底较弱的品牌的笔记本电脑中较为常见,实际很多朋友反应电源适配器会发生声音也是这个原因造成的。其二,这种声音也可能是高频噪音,这种声音和其一所述的声音最大的不同是高频噪音是一种会令人抓狂的声音,相信听过这种声音的朋友都会有所体会。一般这种声音属于主板设计缺陷,如果情况比较普遍,厂商都会发布解决此问题的BIOS更新文件,比如近期的IBM T40、HP NC6000都不同程度存在这个问题,厂商也已经发布了新的BIOS以供解决。
2012-7-22 18:14:02z股
⑶ C语言的表达式问题
不用中间变量时,加减法是可以的,但是乘除却最好不要用,因为在有一个变量是0的情况下,乘除法就会出错,除了加减法之外,再提供一种位运算法:
int
a=9,b=10;
a=a^b;
b=a^b;
a=a^b;
⑷ c语言 关于都好表达式的。不理解。需要解释
我觉得要这样理解,逗号运算符的优先级高于赋值表达式,所以要先算算术表达式然后把值赋给a,比如,第一道题,3*5为15然后赋给a,然后还没完,逗号表达式整体的值是最后一个表达式的值,就是a+5的值,所以值是20,第二道题,也是如此得到值是15。
还有第二题,你的main前面少个返回值类型
⑸ C语言计算器表达式测试程序
参考:网页链接
⑹ C语言的一些表达式
关于二十四点游戏的编程思路与基本算法
漫长的假期对于我来说总是枯燥无味的,闲来无聊便和同学玩起童年时经常玩的二十四点牌游戏来。此游戏说来简单,就是利用加减乘除以及括号将给出的四张牌组成一个值为24的表达式。但是其中却不乏一些有趣的题目,这不,我们刚玩了一会儿,便遇到了一个难题——3、6、6、10(其实后来想想,这也不算是个太难的题,只是当时我们的脑筋都没有转弯而已,呵呵)。
问题既然出现了,我们当然要解决。冥思苦想之际,我的脑中掠过一丝念头——何不编个程序来解决这个问题呢?文曲星中不就有这样的程序吗?所以这个想法应该是可行。想到这里我立刻开始思索这个程序的算法,最先想到的自然是穷举法(后来发现我再也想不到更好的方法了,悲哀呀,呵呵),因为在这学期我曾经写过一个小程序——计算有括号的简单表达式。只要我能编程实现四个数加上运算符号所构成的表达式的穷举,不就可以利用这个计算程序来完成这个计算二十四点的程序吗?确定了这个思路之后,我开始想这个问题的细节。
首先穷举的可行性问题。我把表达式如下分成三类——
1、 无括号的简单表达式。
2、 有一个括号的简单表达式。
3、 有两个括号的较复4、 杂表达式。
穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列,算法如下:
/* ans[] 用来存放各种排列组合的数组 */
/* c[] 存放四张牌的数组 */
/* k[] c[]种四张牌的代号,其中k[I]=I+1。
用它来代替c[]做处理,考虑到c[]中有可能出现相同数的情况 */
/* kans[] 暂存生成的排列组合 */
/* j 嵌套循环的次数 */
int fans(c,k,ans,kans,j)
int j,k[],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4];
for(p=0,q=0;p<4;p++)
{ for(r=0,flag=0;r if(k[p]!=kans[r]) flag++;
if(flag==j) t[j][q++]=k[p];
}
for(s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j>;
if(j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1]; /* 调整生成的排列组合在最终的表
达式中的位置 */
for(h=0;h<3;h++)
symbol(ans,h); /* 在表达式中添加运算符号 */
}
else { j++;
fans(c,k,ans,kans,j);
j--;
}
}
}
正如上面函数中提到的,在完成四张牌的排列之后,在表达式中添加运算符号。由于只有四张牌,所以只要添加三个运算符号就可以了。由于每一个运算符号可重复,所以计算出其可能的种数为4*4*4=64种。仍然利用嵌套函数实现添加运算符号的穷举,算法如下:
/* ans[],j同上。sy[]存放四个运算符号。h为表达式形式。*/
int sans(ans,sy,j,h)
char ans[],sy[];int j,h;
{ int i,p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j>; /* 刚才的四个数分别存放在0、2、4、6位
这里的三个运算符号分别存放在1、3、5位*/
if(j==2)
{ ans[5]=sy[k[j>;
/* 此处根据不同的表达式形式再进行相应的处理 */
}
else
}
}
好了,接下来我再考虑不同表达式的处理。刚才我已经将表达式分为三类,是因为添加三个括号对于四张牌来说肯定是重复的。对于第一种,无括号自然不用另行处理;而第二种情况由以下代码可以得出其可能性有六种,其中还有一种是多余的。
for(m=0;m<=4;m+=2)
for(n=m+4;n<=8;n+=2)
这个for循环给出了添加一个括号的可能性的种数,其中m、n分别为添加在表达式中的左右括号的位置。我所说的多余的是指m=0,n=8,也就是放在表达式的两端。这真是多此一举,呵呵!最后一种情况是添加两个括号,我分析了一下,发现只可能是这种形式才不会是重复的——(a b)(c d)。为什么不会出现嵌套括号的情况呢?因为如果是嵌套括号,那么外面的括号肯定是包含三个数字的(四个没有必要),也就是说这个括号里面包含了两个运算符号,而这两个运算符号是被另外一个括号隔开的。那么如果这两个运算符号是同一优先级的,则肯定可以通过一些转换去掉括号(你不妨举一些例子来试试),也就是说这一个括号没有必要;如果这两个运算符号不是同一优先级,也必然是这种形式((a+-b)*/c)。而*和/在这几个运算符号中优先级最高,自然就没有必要在它的外面添加括号了。
综上所述,所有可能的表达式的种数为24*64*(1+6+1)=12288种。哈哈,只有一万多种可能性(这其中还有重复),这对于电脑来说可是小case哟!所以,对于穷举的可行性分析和实现也就完成了。
接下来的问题就是如何对有符号的简单表达式进行处理。这是栈的一个着名应用,那么什么是栈呢?栈的概念是从日常生活中货物在货栈种的存取过程抽象出来的,即最后存放入栈的货物(堆在靠出口处)先被提取出去,符合“先进后出,后进先出”的原则。这种结构犹如子弹夹。
在栈中,元素的插入称为压入(push)或入栈,元素的删除称为弹出(pop)或退栈。
栈的基本运算有三种,其中包括入栈运算、退栈运算以及读栈顶元素,这些请参考相关数据结构资料。根据这些基本运算就可以用数组模拟出栈来。
那么作为栈的着名应用,表达式的计算可以有两种方法。
第一种方法——
首先建立两个栈,操作数栈OVS和运算符栈OPS。其中,操作数栈用来记忆表达式中的操作数,其栈顶指针为topv,初始时为空,即topv=0;运算符栈用来记忆表达式中的运算符,其栈顶指针为topp,初始时,栈中只有一个表达式结束符,即topp=1,且OPS(1)=‘;’。此处的‘;’即表达式结束符。
然后自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W做如下不同的处理:
1、 若W为操作数
2、 则将W压入操作数栈OVS
3、 且继续扫描下一个字符
4、 若W为运算符
5、 则根据运算符的性质做相应的处理:
(1)、若运算符为左括号或者运算符的优先级大于运算符栈栈顶的运算符(即OPS(top)),则将运算符W压入运算符栈OPS,并继续扫描下一个字符。
(2)、若运算符W为表达式结束符‘;’且运算符栈栈顶的运算符也为表达式结束符(即OPS(topp)=’;’),则处理过程结束,此时,操作数栈栈顶元素(即OVS(topv))即为表达式的值。
(3)、若运算符W为右括号且运算符栈栈顶的运算符为左括号(即OPS(topp)=’(‘),则将左括号从运算符栈谈出,且继续扫描下一个符号。
(4)、若运算符的右不大于运算符栈栈顶的运算符(即OPS(topp)),则从操作数栈OVS中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈OPS中弹出一个运算符,设为+,然后作运算a+b,并将运算结果压入操作数栈OVS。本次的运算符下次将重新考虑。
第二种方法——
首先对表达式进行线性化,然后将线性表达式转换成机器指令序列以便进行求值。
那么什么是表达式的线性化呢?人们所习惯的表达式的表达方法称为中缀表示。中缀表示的特点是运算符位于运算对象的中间。但这种表示方式,有时必须借助括号才能将运算顺序表达清楚,而且处理也比较复杂。
1929年,波兰逻辑学家Lukasiewicz提出一种不用括号的逻辑符号体系,后来人们称之为波兰表示法(Polish notation)。波兰表达式的特点是运算符位于运算对象的后面,因此称为后缀表示。在对波兰表达式进行运算,严格按照自左至右的顺序进行。下面给出一些表达式及其相应的波兰表达式。
表达式 波兰表达式
A-B AB-
(A-B)*C+D AB-C*D+
A*(B+C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/
OK,所谓表达式的线性化是指将中缀表达的表达式转化为波兰表达式。对于每一个表达式,利用栈可以把表达式变换成波兰表达式,也可以利用栈来计算波兰表达式的值。
至于转换和计算的过程和第一种方法大同小异,这里就不再赘述了。
下面给出转换和计算的具体实现程序——
/* first函数给出各个运算符的优先级,其中=为表达式结束符 */
int first(char c)
{ int p;
switch(c)
{ case '*': p=2; break;
case '/': p=2; break;
case '+': p=1; break;
case '-': p=1; break;
case '(': p=0; break;
case '=': p=-1; break;
}
return(p);
}
/* 此函数实现中缀到后缀的转换 */
/* M的值宏定义为20 */
/* sp[]为表达式数组 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]='='; top=0;
while(c!='\0')
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case '+':
case '-':
case '*':
case '/': while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case '(': sm[++top]=c; break;
case ')': while(sm[top]!='(')
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]='\0'; return(0);
}
/* 由后缀表达式来计算表达式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!='\0')
{ if(islower(c)) sm[++top]=ver[c-'a'];/*在转换过程中用abcd等来代替数,
这样才可以更方便的处理非一位数,
ver数组中存放着这些字母所代替的数*/
else switch(c)
{ case '+': tr=sm[top--]; sm[top]+=tr; break;
case '-': tr=sm[top--]; sm[top]-=tr; break;
case '*': tr=sm[top--]; sm[top]*=tr; break;
case '/': tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else
}
这样这个程序基本上就算解决了,回过头来拿这个程序来算一算文章开始的那个问题。哈哈,算出来了,原来如此简单——(6-3)*10-6=24。
最后我总结了一下这其中容易出错的地方——
1、 排列的时候由于一个数只能出现一次, 所以必然有一个判断语句。但是用什么来判断,用大小显然不行,因为有可能这四个数中有两个或者以上的数是相同的。我的方法是给每一个数设置一个代号,在排列结束时,通过这个代号找到这个数。
2、在应用嵌套函数时,需仔细分析程序的执行过程,并对个别变量进行适当的调整(如j的值),程序才能正确的执行。
3、在分析括号问题的时候要认真仔细,不要错过任何一个可能的机会,也要尽量使程序变得简单一些。不过我的分析可能也有问题,还请高手指点。
4、在用函数对一个数组进行处理的时候,一定要注意如果这个数组还需要再应用,就必须将它先保存起来,否则会出错,而且是很严重的错误。
5、在处理用户输入的表达式时,由于一个十位数或者更高位数是被分解成各位数存放在数组中,所以需对它们进行处理,将它们转化成实际的整型变量。另外,在转化过程中,用一个字母来代替这个数,并将这个数存在一个数组中,且它在数组中的位置和代替它的这个字母有一定的联系,这样才能取回这个数。
6、由于在穷举过程难免会出现计算过程中有除以0的计算,所以我们必须对calc函数种对于除的运算加以处理,否则程序会因为出错而退出(Divide by 0)。
7、最后一个问题,本程序尚未解决。对于一些比较着名的题目,本程序无法解答。比如说5、5、5、1或者8、8、3、3。这是由于这些题目在计算的过程用到了小数,而本程序并没有考虑到小数。
⑺ C语言中for循环少了被测表达式会发生什么
for循环
少了被测表达式会发生
“无条件”的循环。需要使用break、return等语句来结束循环。
⑻ 急!c语言编计算器表达式测试系统
C表达式中的操作符按优先级顺序结合,本表达式中运算符的优先级顺序从高到低为:()、%、==、!=、&&、||。
所以表达式计算分解为:
temp1=year%4;
temp2=year%100;
temp3=year%400;
temp4=(temp1==0);
temp5=(temp2!=0);
temp6=(temp3==0);
temp7=(temp5&&temp6);
expr=(temp7||temp6);
所以操作符"!="的操作数为temp2和0,即(year%100)和0两个表达式;
希望对你有帮助
⑼ c语言 表达式判断 希望大神提供思路
需求不明,下面的问题需要明确:
1.M表达式的格式:各表达式是如何分割的?
从你样例中看不出来,a+b==c d+21==be 还是d+21==b ?
1c21a+db?becb 中的问号表示什么?
2.从你样例中,3表示M,4表示N对吧?但和M表达式并没有换行,和你描述不一致;
3.所有的N表达式成立的条件都是根据M表达式来判断的吗?
4.小写字母替换的原则:
是不是每个字母在所有M,N表达式中都相同?例如,如果a表示0,就始终表示0;
小写字母表示的值有大小关系吗?例如,如果a表示0,b就表示1,c就表示2,依次类推
5.如果这些都澄清了,其实问题就简单了,你将M和N表达式都分别搜索出来,把里面的小写字母用0-9循环替代,当所有M表达式都成立时,判断N表达式
⑽ 关于c语言的表达式
C等于1时
(A)在或的条件下,不符合条件。整体为假
(B)(c>=2&&c<=6)为假。但是后跟或条件“(c!=3)||(c!=5)”所以此部分为真。
“或”只要有一个为真,那么都就为真。所以选B
(C)!(c%2)计算1%2取余数为1,1在“非”一下为0 或左右都为0,整体为假
(D)(c>=2&&c<=6)&&(c%2!=1)。左右相“与”,“与”左右两个条件都为真时,整体才为真。右条件c%2结果为1,“!=”为不等于。那么1不等于1为假,整体为假
答案选B