⑴ 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