Ⅰ c語言 棧的操作
#include
#include
#define Max 100
typedef char T;
typedef struct MyStack
{
T aa[Max];
unsigned int p;
} stack;
//創建空棧
stack* createEmptyStack()
{
stack* st = (stack *)malloc(sizeof(stack));
int i=0;
for(i=0;i<Max;i++)
st->aa[i]=0;
st->p=0;
return st;
};
//棧判空
int isEmpty(const stack* st)
{
if(st->p==0) return 1;
else return 0;
};
//求棧的大小
unsigned int size(const stack* st)
{
return st->p;
};
//push操作
void push(stack* st,const T a)
{
st->p=st->p+1;
if(st->p==Max)
{
printf("棧滿\n");
st->p--;
return;
}
st->aa[st->p]=a;
};
//pop操作
T pop(stack* st)
{
if(isEmpty(st))
{
printf("棧空");
return NULL;
}
char t=st->aa[st->p];
st->p=st->p-1;
printf("%c ",t);
return t;
};
//棧銷毀
void destroy(stack* st)
{
free(st);
};
int main()
{
stack* st = createEmptyStack();
if(isEmpty(st)) printf("MyStack is empty\n");
else printf("MyStack is not empty\n");
push(st,'a');
push(st,'b');
push(st,'c');
push(st,'d');
push(st,'e');
printf("%d\n",size(st));
while(!isEmpty(st)) pop(st);
destroy(st);
system("pause");
return 0;
}
Ⅱ 學習C語言的要領和技巧
從最基本的流程學起,從最基本的語句學起。
在學習的過程中,特別注意每個函數的作用,多想想這個函數能怎樣用,用在哪裡,能起到什麼另外的效果!要學會活用!
程序,對數學,特別是邏輯的要求把比較高。
寫好程序,首先對整個程序的流程有縝密的思考,要求周到,准確,先思考,不要急著寫程序!!這一點請注意!也就是說先演算法,先研究程序的結構,是用什麼來實現的,循環?分支?等等。然後再用語言來實現!語言只是編寫程序的工具。所以學語言,先學會程序化的思想。在將演算法翻譯成語言的時候,再結合實際情況,逐步求精,有目的的修改,達到最優化。
我們學院的C語言,很有特色,英文版,考試也是。我想說的就是,外文版的這本書,它在引領一個不懂編程的人,逐步養成程序、流程、邏輯的思想,是非常優秀的一本書。如果能字字句句閱讀,將會很清楚領會到程序的思想。然而,書太厚,生詞太多,時間太短。我的建議是,看某一本中文版的書,一本不夠,看兩本。先盡快學會程序的思想,也就是用程序來想問題,這樣,就會編程了。然後,考試前幾周,背一背生詞、關鍵詞,就可以考試了。如果你堅持要讀外文版,可以,但要跳讀!
然後,還要看你是想只是應付期末考試,還是想學好編程。應付期末考,需要注意書中的重點,也就是考點,這樣就夠了。比如說字元型變數加指針,這樣就夠了,不需要更高級的指針的知識。
而你如果想真正學好程序(我不說C語言是因為我說過C語言只是編寫程序的工具之一),肯定是要打好基礎的!任何一個細節,都是不能放過的!而且,這樣的人往往會很郁悶~因為我們程序真正要求的,考試一般不會涉及到,因為比較難!(不會指針的人,永遠不要說他會C語言!)而考試的內容,恰恰是最無聊的東西,比如格式化輸出printf函數的第一個參數,太繁了,記都記不住。如果學的深的話,只需要知道有這么一個函數,有這么一個功能。而要用的時候,查書就行。可是對考試來說,顯然不行。所以要看看你是哪一種~
Ⅲ C語言程序 如何把當前程序的內存狀態保存下來(到硬碟),下次運行時接著上次保存的內存狀態運行
有稻草
當懷疑係統重新啟動之前針對計算機所進行的更改可能導致故障,可以在啟動系統時按F8鍵,選擇「最後一次正確的配置」來恢復對系統所做的更改。
2.自動登陸
單擊開始→運行,輸入「rundll32 netplwiz.dll,UsersRunDll」(不帶引號),然後在User Accounts中取消「Users must enter a user name and password to use this computer」,單擊「OK」,接著在彈出的對話框中輸入你想自己登陸的用戶名和密碼即可。
3.快速關機或重啟的快捷鍵(可定時)
在桌面點擊滑鼠右鍵,選擇新建(快捷方式,在彈出的向導中輸入位置為:C:/WINDOWS/system32/shutdown.exe -s -t 10(其中的-s可以改為-r,也就是重新啟動,而-t 10表示延遲10秒,你可以根據自己的需要更改這個數字)。製作完這個快捷鍵後,按照上面的方法為它指定一個圖標。這個快速關機或重啟的技巧會顯示一個比較漂亮的對話框提示關機(重啟),而且你可以在後面加上「-c "我要關機啦!"」,這樣這句話會顯示在對話框中,當然文字你可以隨意寫,但要注意不能超過127個字元。
4.關機、重啟只要1秒鍾
如果你想讓Windows XP瞬間關機,那麼可以按下CTRL+ALT+DEL,接著在彈出的任務管理器中點擊「關機」→「關機」,與此同時按住CTRL,不到1秒鍾你會發現系統已經關閉啦,簡直就在眨眼之間。同樣道理,如果在「關機」菜單中選擇「重啟」,即可快速重啟。
5. 尋找丟失的快速啟動欄
把滑鼠移到任務欄的空白區域,單擊右鍵從彈出的菜單中選擇「屬性」,在彈出的窗口中選擇「任務欄」選項卡,再從「任務欄外觀」框中把「顯示快速啟動」的復選框選中,「確定」就行了。
6. 快速鎖定計算機
在桌面上單擊滑鼠右鍵,在隨後出現的快捷菜單上選擇新建「快捷方式」,接著系統便會啟動創建快捷方式向導,在文本框中輸「rundll32.exe user32.dll,LockWorkStation」,點擊「下一步」,在彈出的窗口中輸入快捷方式的名稱,點擊「完成」即可。當然最簡單的鎖定計算機的方法是直接按WinKey + L。
7.恢復「開始」菜單
Windows XP新的「開始」菜單還是挺方便的,對系統資源的影響也不大。如果你喜歡過去的經典菜單的話,用滑鼠右鍵單擊任務欄空白處,選擇「屬性」菜單,進入「任務欄和開始菜單屬性」的設置窗口,選擇「[開始]菜單」選項卡,選擇「經典[開始]菜單」即可恢復到從前的模樣了。
8.優化視覺效果
Windows XP的操用界面的確是很好看,好看的背後是以消耗大量內存作為代價的,相對於速度和美觀而言,我們還是寧願選擇前者,右鍵單擊「我的電腦」,點擊「屬性/ 高級」,在「性能」一欄中,點擊「設置/視覺效果」,在這里可以看到外觀的所有設置,可以手工去掉一些不需要的功能。在這里把所有特殊的外觀設置諸如淡入淡出、平滑滾動、滑動打開等所有視覺效果都關閉掉,我們就可以省下「一大筆」內存
9.禁用多餘的服務組件
Windows XP和Windows 2000一樣可以作為諸如Http伺服器、郵件伺服器、FTP伺服器,所以每當Windows XP啟動時,隨之也啟動了許多服務,有很多服務對於我們這些普通用戶來說是完全沒用的,所以關掉它們是一個很好的選擇。操作的方法是:右鍵單擊「我的電腦」,依次選擇「管理/服務和應用程序/服務」,將不需要的服務組件禁用。
注意:有些服務是Windows XP必需的,關閉後會造系統崩潰。查看詳細說明確認後再禁止。
10.減少啟動時載入項目
許多應用程序在安裝時都會自作主張添加至系統啟動組,每次啟動系統都會自動運行,這不僅延長了啟動時間,而且啟動完成後系統資源已經被吃掉不少!我們可以減少系統啟動時載入的程序,方法是:選擇「開始」菜單的「運行」,鍵入「msconfig」啟動「系統配置實用程序」,進入「啟動」標簽,在此窗口列出了系統啟動時載入的項目及來源,仔細查看你是否需要它自動載入,否則清除項目前的復選框,載入的項目愈少,啟動的速度自然愈快。此項需要重新啟動方能生效。
11.關閉系統還原功能
「系統還原」功能是Windows系列操作系統的一個重要特色,當Windows運行出現問題後,還原操作系統。「系統還原」雖然對經常犯錯誤的人有用,但是它會讓你的硬碟處於高度繁忙的狀態,你會發現你的硬碟總是忙個不停,因為Windows XP要記錄操作,以便日後還原。如果你對自己有信心,那麼就不要使用它,因為它可占不少內存。
關閉系統還原功能方法是:單擊「開始/所有程序/附件/系統工具/系統還原」,在系統還原界面,單擊「系統還原設置」進入「系統還原設置」窗口,清空「在所有驅動器上關閉系統還原」復選框,這樣Windows XP就會刪除備份的系統還原點,從而釋放它佔用的磁碟空間。
12.關閉自動更新
「自動更新」是Windows XP為了方便用戶升級系統而推出的一種新功能,這種功能可以在微軟推出系統升級補丁或系統安全補丁的時候,自動提醒用戶升級自己的系統,不過這種功能有一個要求,就是用戶必須時時在線,但是對於我們這些缺鐵少銀的「窮人」來說,這個要求未免苛刻,所以我們把「自動升級」功能關閉掉,改為「手動升級」。
關閉自動更新具體操作為:右鍵單擊「我的電腦/屬性/自動更新」,在「通知設置」一欄選擇「關閉自動更新。我將手動更新計算機」一項。
13.關閉遠程桌面
這個功能的一個特點就是可以讓別人在另一台機器上訪問你的桌面。在區域網中,這個功能很有用。比如你有問題了可以向同事求助,他可以不用到你的跟前,直接通過「遠程桌面」來訪問你的機器幫你解決問題。但是對於我們只有一台計算機的普通用戶來說這個功能就顯得多餘了,所以我們把它關掉,不讓它在那兒白白浪費內存。具體操作為:右鍵單擊「我的電腦」,選擇「屬性/遠程」,把「遠程桌面」里的「允許用戶遠程連接到這台計算機」勾去掉。
14.禁用消休眠功能
Windows XP的休眠可以把內存中當前的系統狀態完全保存到硬碟,當你下次開機的時候,系統就不需要經過載入、系統初始化等過程,而直接轉到你上次休眠時的狀態,因此啟動非常快。但它會佔用大量的硬碟空間(和你的內存大小一樣),可以到「控制面板/電源選項/休眠」中將其關閉,以釋放出硬碟空間,待到要需要使用時再打開即可。方法是:單擊「開始/控制面板/電源管理/休眠」,將「啟用休眠」前的勾去掉。
15.合理設置虛擬內存
對於虛擬內存文件,Windows XP為了安全默認值總是設的很大,浪費了不少的硬碟空間,其實我們完全可以將它的值設小一點。方法是:進入「控制面板/系統/高級/性能/設置/高級/虛擬內存/更改」,來到虛擬內存設置窗口,首先確定你的頁面文件在哪個驅動器盤符,然後將別的盤符驅動器的頁面文件全部禁用。建議你把它是設置到其他分區上,而不是默認的系統所在的分區,這樣可以提高頁面文件的讀寫速度,有利於系統的快速運行。根據微軟的建議,頁面文件應設為內存容量的1.5倍,但如果你的內存比較大,那它佔用的空間也是很可觀的,所以,建議如果內存容量在256MB以下,就設置為1.5倍,最大值和最小值一樣,如果在512MB以上,設置為內存容量的一半完全可行。
16.刪除多餘文檔
Windows XP中有許多文件平時我們很少用到,放在硬碟中,白白浪費空間,降低系統性能。我們完全可以把這些用不到的文件刪除,需要刪除的文件有:
幫助文件:在C:/Windows/Help目錄下。
驅動備份:C:/Windows/driver cache/i386目錄下的Driver.cab文件。
系統文件備份: 一般用戶是不怎麼用的,利用命令sfc.exe /purgecache刪除。
備用的dll文件:在C:/Windows/system32/dllcache目錄下。
輸入法:在C:Windows/Ime文件夾下直接刪除chtime、imjp8_1、imkr6_1三個目錄即可,分別是繁體中文、日文、韓文輸入法。
17.禁止MSN隨Windows啟動
每次啟動Windows時,Messenger總是自動運行,即使你不想啟動它,可是它也自動運行,非常煩人,我們能不能禁止它,不讓它隨Windows啟動呢?回答是可以的。
第一種方法:
1.在「開始」菜單中單擊「運行」,在「打開」框中輸入「msconfig」,「確定」後打開「系統配置實用程序」窗口。
2.單擊「啟動」選項卡,在「啟動項目」列表中,清除「MSMSGS」前的復選框,單擊「確定」按鈕。
3.當系統提示「重新啟動計算機」時,請單擊「是」按鈕。
第二種方法:
1.打開「注冊表編輯器」窗口。
2.依次展開「KEY_CURRENT_」分支,然後在右窗格中右鍵單擊「MSMSGS」,再單擊快捷菜單中的「刪除」命令,當系統提示確認刪除時,請單擊「是」按鈕。
經過設置,MSN就再也不會隨Windows XP的啟動而啟動了。
18.刪除多餘字體
Windows XP中安裝的字體越多,就會佔用更多的內存的系統資源,減慢系統的運行速度,因此,對於不常用的字體,我們最好把它從系統中刪除。字體文件存放在C:/Windows/font目錄下,你完全可以根據需要選擇一些字體,對於更多不用的字體,一刪了之。
19.更改IE臨時文件夾
上網時產生的大量臨時文件都存放在IE臨時文件夾中,默認情況下,臨時文件夾是在系統分區上,大量的臨時文件會影響硬碟讀寫系統文件的性能。你可以更改臨時文件的位置來避免出現這種情況。方法是單擊「開始/控制面板/Internet選項」,在「常規」選項卡中單擊「設置」按鈕,在打開的窗口中單擊「移動文件夾」按鈕,指定一個非系統分區上的文件夾,單擊「確定」後,臨時文件就會移到指定的文件夾上。
20.加快「網上鄰居」共享的速度
不知道各位使用者用Windows XP開「網上鄰居」裡面的共享資源時,有沒有發現所花的時間相當的長,這是因為它會檢查其它計算機中的設定工作,有時甚至就在那邊停了將近一分鍾,相當討厭,大家可以通過下面的方法將其檢查的步驟取消:選擇「開始/運行」,輸入regedit,在彈出注冊表編輯器中尋找 [HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/RemoteComputer/NameSpace],按滑鼠右將在此位置的刪除之即可。
21.清除預讀文件
當Windows XP使用一段時間後,安裝目錄下的預讀文件夾(C:/Windows/prefetch)里的文件會變的很大,裡面會有死鏈接文件,這會減慢系統時間,建議你定期刪除這些文件。
22.設置預讀以提高速度
Windows XP使用預讀設置這一新技術,以提高系統速度。如果你的電腦配置不錯,擁有PIII 800, 512M內存以上,你可以進行以下修改:單擊「開始/運行」,輸入「regedit」,打開注冊表,找到 [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Memory Management/PrefetchParameters/EnablePrefetcher],設置數值0,1,2,3(0-Disable,1- 預讀應用程序,2-啟動預讀,3-前兩者皆預讀),推薦使用「3」,這樣可以減少啟動時間。
23.啟用DMA傳輸模式
所謂DMA,即直接存儲器存儲模式,指計算機周邊設備(主要指硬碟)可直接與內存交換數據,這樣可加快硬碟讀寫速度,提高速據傳輸速率。由於某些原因, Windows XP有時會在IDE通道上使用PIO並行輸入輸出傳輸模式,而不是DMA模式。如果有這種情況,用戶可以手動把IDE通道改為DMA模式,這樣可以減少該設備佔用的CPU周期。方法是:右鍵點擊「我的電腦」,選「屬性」,點選「硬體」選項卡,單擊「設備管理器」按鈕,打開「設備管理器」,然後點擊展開 「IDE ATA/ATAPI 控制器」分支,其中「IDE控制器」有兩項「主要IDE通道」及「次要IDE通」,分別選中,依次進入「屬性/高級設置」,該對話框會列出目前IDE介面所連接設備的傳輸模式,檢查「傳輸模式」下拉菜單,把它們全部設「DMA(若可用)」,點擊「確定」。
24.關閉計算機時自動結束任務
在關機的時候,有時會彈出討厭的對話框,提醒某個程序仍在運行,是否結束任務。其實完全可以通過一點點修改讓Windows自動結束這些仍在運行的程序。在注冊表中打開HKEY_CURRENT_USER/Control Panel/Desktop 目錄,把裡面的AugoEndTasks鍵值改為1。
注意:可能會找不到AutoEndTasks鍵值,如果是這樣的話,自己建一個串值並把它改為這個名字,值設為1就可以了。
25.減少磁碟掃描等待時間
WindowsXP雖然號稱穩定,但是並不是永不死機,偶爾也會給你個藍臉,非法操作後系統會自動掃描,出現大段大段的E文,告訴你剛才系統非正常結束,現在需要檢查一下是否出錯,可是還要等待一段時間才開始,所以我們可以在dos下,鍵入「chkntfs/t:0」,表示等待時間為0秒。
26.設置共享文件夾的許可權
Windows 2000操作系統中用戶在設置文件夾的共享屬性時操作非常簡便,只需用滑鼠右擊該文件夾並選擇屬性,就可以找到共享設置標簽,來設置文件夾的訪問許可權,只允許特定用戶訪問,可在Windows XP中卻找不到這個功能了。難道在Windows XP中不能使用這個功能嗎?其實不然,你可以這樣操作:打開「我的電腦」中的「工具」,選擇「文件夾屬性」,調出「查看」標簽,在「文件和文件夾」部分將 「使用簡單文件共享(推薦)」項前面的選擇取消,這樣修改後用戶就可以象使用Windows 2000一樣對文件夾屬性進行方便修改了。
27.徹底隱藏文件
每個人的機器上都或多或少有一點不願意別人看見的東西,怎麼辦,直接隱藏起來嗎?一打開顯示隱藏文件就什麼都看見了,其實你只要HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/explorer/Advanced/Folder/Hidden/SHOWALL下, DWORD值Checkedvalue設為0(如果沒有這一項可新建一個),這樣當有非法用戶開啟顯示隱藏文件功能後,你的文件也不會被顯示出來。
28.快速鎖定計算機
如果你因為有急事而需要離開,但又不希望電腦進行系統注銷。這時你可以選擇「新建/快捷方式」,接著系統便會啟動創建快捷方式向導,在文本框中輸入 "rundll32.exe user32.dll,LockWorkStation",單擊「下一步」,在彈出的窗口中輸入快捷方式的名稱。比如我們可將它命名為「鎖定計算機」或選用你所喜歡的任何名稱,單擊「完成」。以後,我們就可以簡單地點擊這個快捷方式,鎖定計算機。
29.禁止隱藏不活動的圖標
在使用一段時間後,Windows XP會自動檢測並隱藏不活動的圖標,我們可以通過下面的方法來禁止它:在任務欄的空白處單擊滑鼠右鍵,在彈出的快捷菜單中選擇「屬性」,在「任務欄」標簽中將「隱藏不活動的圖標」取消即可,如果你不想完全禁止這項功能,可以單擊「自定義」按鈕,自行設置有關項目的隱藏和顯示。
30.讓歡迎窗口更清晰
Windows XP系統的顯示效果得到了較大提高,這主要是基於它使用了名「ClearType」的清晰化技術,該技術特別讓使用筆記本電腦及液晶顯示器的用戶在運行 Windows XP操作系統時感受到與以往系統不同的效果。但由於該清晰效果只有當Windows啟動完畢後才能調用,因此在系統啟動過程中的歡迎窗口仍然無法實現這一效果。為了使歡迎窗口更加清晰,用戶可以使用注冊表編輯器進行修改,尋找到這兩個主鍵:
HKEY_USERS/.Default/Control Panel/Desktop/FontSmoothing
HKEY_USERS/.Default/Control Panel/Desktop/FontSmoothingType
將鍵值修改為「2」,這樣便可以實現清晰顯示效果了。
31.隱藏桌面圖標
在Windows XP中增加了隱藏桌面圖標的功能,你只需用滑鼠單擊桌面空白處,在彈出的右鍵菜單中選定「排列圖標」命令,然後在其下一級級聯菜單中取消對「顯示桌面圖標」命令的選定,系統就會自動將所有桌面圖標隱藏。
32.縮短等待時間
HKEY_CURRENT_USER\Control Panel\Desktop 鍵,將右邊窗口的 WaitToKillAppTimeout 改為 4000(原設定值:20000),即關閉程序時僅等待1秒。將 HungAppTimeout 值改為:2000(原設定值:5000),表示程序出錯時等待0.5秒。
33.優化「啟動和故障恢復」設置:
右鍵單擊「我的電腦」,點擊屬性,點擊「高級」,在「啟動和故障恢復」
一欄中,點擊「設置」,其中的「系統失敗」一欄中,只選擇「自動重新啟動」,寫入調試信息選擇「無」。
34.定製特殊的啟動提示注冊表:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Winlogon中的"LegaNoticeCaption"是登陸提示語言,「LegalNoticeText」是歡迎詞。
35.windowsXP的內存優化!!!!!!!!!!!!(警告!!!!!以下設置需要有256M以上的內存才能有好的效果!!!)
注冊表:
HKEK_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SessionManager/Memory Management
中的:禁用內存頁面調度: DisablePagingExecutive 值改為「1」
提升系統緩存: LargeSystemCache 值改為「1」
36.卸載無用的動態鏈接
資源管理器經常在內存中留下無用的動態鏈接,為了消除這種現象,你可以打開注冊表編輯器,設置鍵值:HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Windows\CurrentVersion\Explorer/AlwaysUnloadDLL(字元串值)將其設為1
37.在關機時清空頁面文件
打開「控制面板」,點擊「性能和維護」-「管理工具」→「本地安全策略」→「本地策略」→「安全選項」,雙擊其中「關機:清理虛擬內存頁面文件」
一項,點擊彈出選單中的「已啟用」選項,單擊「確定」即可
38.Windows XP 安裝好後,如何把FAT 32轉化為NTFS
使用convert命令,在命令行模式下用convert.exe這個命令隨時轉化的。例如:convert c: /fs:ntfs把c盤轉化為NTFS
39.上網時在地址欄內輸入網址,系統會記錄下來,雖然方便以後不用再重復,不過如果是公用的機子,又不想讓別人知道自己到過哪些地方,可以用「CTRL+ O(字母O,不是0)」,這時對彈出一個「打開」對話框,在其中的地址欄內 輸入網址,就不會被記錄下來了.
電腦死機原因大全
由硬體原因引起的死機
顯示器、電源和CPU在工作中發熱量非常大,因此保持良好的通風狀況非常重要,如果顯示器過熱將會導致色彩、圖象失真甚至縮短顯示器壽命。工作時間太長也會導致電源或顯示器散熱不暢而造成電腦死機。CPU的散熱是關繫到電腦運行的穩定性的重要問題,也是散熱故障發生的「重災區」。
在電腦移動過程中受到很大振動常常會使機器內部器件松動,從而導致接觸不良,引起電腦死機,所以移動電腦時應當避免劇烈振動。
機器內灰塵過多也會引起死機故障。如軟碟機磁頭或光碟機激光頭沾染過多灰塵後,會導致讀寫錯誤,嚴重的會引起電腦死機。
如主板主頻和CPU主頻不匹配,老主板超頻時將外頻定得太高,可能就不能保證運行的穩定性,因而導致頻繁死機。
三維軟體和一些特殊軟體,可能在有的微機上就不能正常啟動甚至安裝,其中可能就有軟硬體兼容方面的問題。
主要是內存條松動、虛焊或內存晶元本身質量所致。應根據具體情況排除內存條接觸故障,如果是內存條質量存在問題,則需更換內存才能解決問題。
主要是硬碟老化或由於使用不當造成壞道、壞扇區。這樣機器在運行時就很容易發生死機。可以用專用工具軟體來進行排障處理,如損壞嚴重則只能更換硬碟了。另外對於在不支持UDMA 66/100的主板,應注意CMOS中硬碟運行方式的設定。
超頻提高了CPU的工作頻率,同時,也可能使其性能變得不穩定。究其原因,CPU在內存中存取數據的速度本來就快於內存與硬碟交換數據的速度,超頻使這種矛盾更加突出,加劇了在內存或虛擬內存中找不到所需數據的情況,這樣就會出現「異常錯誤」。解決辦法當然也比較簡單,就是讓CPU回到正常的頻率上。
是由於音效卡或顯示卡的設置沖突,引起異常錯誤。此外,其它設備的中斷、DMA或埠出現沖突的話,可能導致少數驅動程序產生異常,以致死機。解決的辦法是以「安全模式」啟動,在「控制面板」→「系統」→「設備管理」中進行適當調整。對於在驅動程序中產生異常錯誤的情況,可以修改注冊表。選擇「運行」,鍵入「REGEDIT」,進入注冊表編輯器,通過選單下的「查找」功能,找到並刪除與驅動程序前綴字元串相關的所有「主鍵」和「鍵值」,重新啟動。
內存容量越大越好,應不小於硬碟容量的0.5~1%,如出現這方面的問題,就應該換上容量盡可能大的內存條。
少數不法商人在給顧客組裝兼容機時,使用質量低劣的板卡、內存,有的甚至出售冒牌主板和Remark過的CPU、內存,這樣的機器在運行時很不穩定,發生死機在所難免。因此,用戶購機時應該警惕,並可以用一些較新的工具軟體測試電腦,長時間連續考機(如72小時),以及爭取盡量長的保修時間等。
由軟體原因引起的死機
病毒可以使計算機工作效率急劇下降,造成頻繁死機。這時,我們需用殺毒軟體如KV3000、金山毒霸、瑞星等來進行全面查毒、殺毒,並做到定時升級殺毒軟體。
該故障現象很普遍,如硬碟參數設置、模式設置、內存參數設置不當從而導致計算機無法啟動。如將無ECC功能的內存設置為具有ECC功能,這樣就會因內存錯誤而造成死機。
由於Windows 9x啟動需要有Command.com、Io.sys、Msdos.sys等文件,如果這些文件遭破壞或被誤刪除,即使在CMOS中各種硬體設置正確無誤也無濟於事。解決方法:使用同版本操作系統的啟動盤啟動計算機,然後鍵入「SYS C:」,重新傳送系統文件即可。
由於Windows 9x啟動需要讀取System.ini、Win.ini和注冊表文件,如果存在Config.sys、Autoexec.bat文件,這兩個文件也會被讀取。只要這些文件中存在錯誤信息都可能出現死機,特別是System.ini、Win.ini、User.dat、System.dat這四個文件尤為重要。
在Windows操作系統中還有一類文件也相當重要,這就是擴展名為DLL的動態鏈接庫文件,這些文件從性質上來講是屬於共享類文件,也就是說,一個DLL文件可能會有多個軟體在運行時需要調用它。如果我們在刪除一個應用軟體的時候,該軟體的反安裝程序會記錄它曾經安裝過的文件並准備將其逐一刪去,這時候就容易出現被刪掉的動態鏈接庫文件同時還會被其它軟體用到的情形,如果丟失的鏈接庫文件是比較重要的核心鏈接文件的話,那麼系統就會死機,甚至崩潰。我們可用工具軟體如「超級兔仔」對無用的DLL文件進行刪除,這樣會避免誤刪除。
如果硬碟的剩餘空間太少,由於一些應用程序運行需要大量的內存、這樣就需要虛擬內存,而虛擬內存則是由硬碟提供的,因此硬碟要有足夠的剩餘空間以滿足虛擬內存的需求。同時用戶還要養成定期整理硬碟、清除硬碟中垃圾文件的良好習慣。
應備份BIOS以防不測,但如果你的系統需要對BIOS進行升級的話,那麼在升級之前最好確定你所使用BIOS版本是否與你的PC相符合。如果BIOS升級不正確或者在升級的過程中出現意外斷電,那麼你的系統可能無法啟動。所以在升級BIOS前千萬要搞清楚BIOS的型號。如果你所使用的BIOS升級工具可以對當前BIOS進行備份,那麼請把以前的BIOS在磁碟中拷貝一份。同時看系統是否支持BIOS恢復並且還要懂得如何恢復。
大多數人可能認為軟體升級是不會有問題的,事實上,在升級過程中都會對其中共享的一些組件也進行升級,但是其它程序可能不支持升級後的組件從而導致各種問題。
最好少用軟體的測試版,因為測試軟體通常帶有一些BUG或者在某方面不夠穩定,使用後會出現數據丟失的程序錯誤、死機或者是系統無法啟動。
不要把軟體安裝所在的目錄直接刪掉,如果直接刪掉的話,注冊表以及Windows目錄中會有很多垃圾存在,久而久之,系統也會變不穩定而引起死機。
因為這些軟體可能隱藏著病毒,一旦執行,會自動修改你的系統,使系統在運行中出現死機。
這種情況是常見的,如在Win 98中運行那些在DOS或Windows 3.1中運行良好的16位應用軟體。Win 98是32位的,盡管它號稱兼容,但是有許多地方是無法與16位應用程序協調的。還有一些情況,如在Win 95下正常使用的外設驅動程序,當操作系統升級後,可能會出現問題,使系統死機或不能正常啟動。遇到這種情況應該找到外設的新版驅動。
這使系統資源消耗殆盡,使個別程序需要的數據在內存或虛擬內存中找不到,也會出現異常錯誤。
用非法格式或參數非法打開或釋放有關程序,也會導致電腦死機。請注意要牢記正確格式和相關參數,不隨意打開和釋放不熟悉的程序。
Ⅳ C語言中有哪些實用的編程技巧
這篇文章主要介紹了C語言高效編程的幾招小技巧,本文講解了以空間換時間、用數學方法解決問題以及使用位操作等編輯技巧,並給出若干方法和代碼實例,需要的朋友可以參考下
引言:
編寫高效簡潔的C語言代碼,是許多軟體工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。
第1招:以空間換時間
計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招——以空間換時間。
例如:字元串的賦值。
方法A,通常的辦法:
代碼如下:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,「This is a example!!」);
方法B:
代碼如下:
const char string2[LEN] =「This is a example!」;
char * cp;
cp = string2 ;
(使用的時候可以直接用指針來操作。)
從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調用兩個字元函數才能完成。B的缺點在於靈 活性沒有A好。在需要頻繁更改一個字元串內容的時候,A具有更好的靈活性;如果採用方法B,則需要預存許多字元串,雖然佔用了大量的內存,但是獲得了程序 執行的高效率。
如果系統的實時性要求很高,內存還有一些,那我推薦你使用該招數。
該招數的變招——使用宏函數而不是函數。舉例如下:
方法C:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
#define SET_BITS(__dst, __bf, __val) /
((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函數和宏函數的區別就在於,宏函數佔用了大量的空間,而函數佔用了時間。大家要知道的是,函數調用是要使用系統的棧來保存數據的,如果編譯器里有棧檢查 選項,一般在函數的頭會嵌入一些匯編語句對當前棧進行檢查;同時,CPU也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操作,所以,函數調用需要 一些CPU時間。而宏函數不存在這個問題。宏函數僅僅作為預先寫好的代碼嵌入到當前程序,不會產生函數調用,所以僅僅是佔用了空間,在頻繁調用同一個宏函 數的時候,該現象尤其突出。
D方法是我看到的最好的置位操作函數,是ARM公司源碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。
第2招:數學方法解決問題
現在我們演繹高效C語言編寫的第二招——採用數學方法來解決問題。
數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,所以在編寫程序的時候,採用一些數學方法會對程序的執行效率有數量級的提高。
舉例如下,求 1~100的和。
方法E
代碼如下:
int I , j;
for (I = 1 ;I<=100; I ++){
j += I;
}
方法F
代碼如下:
int I;
I = (100 * (1+100)) / 2
這個例子是我印象最深的一個數學用例,是我的計算機啟蒙老師考我的。當時我只有小學三年級,可惜我當時不知道用公式 N×(N+1)/ 2 來解決這個問題。方法E循環了100次才解決問題,也就是說最少用了100個賦值,100個判斷,200個加法(I和j);而方法F僅僅用了1個加法,1 次乘法,1次除法。效果自然不言而喻。所以,現在我在編程序的時候,更多的是動腦筋找規律,最大限度地發揮數學的威力來提高程序運行的效率。
第3招:使用位操作
實現高效的C語言編寫的第三招——使用位操作,減少除法和取模的運算。
在計算機程序中,數據的位是可以操作的最小數據單位,理論上可以用「位運算」來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做數據變換使用,但是,靈活的位操作可以有效地提高程序運行的效率。舉例如下:
方法G
代碼如下:
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
在字面上好像H比G麻煩了好多,但是,仔細查看產生的匯編代碼就會明白,方法G調用了基本的取模函數和除法函數,既有函數調用,還有很多匯編代碼和寄存 器參與運算;而方法H則僅僅是幾句相關的匯編,代碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 來看,效率的差距還是不小。相關匯編代碼就不在這里列舉了。
運用這招需要注意的是,因為CPU的不同而產生的問題。比如說,在PC上用這招編寫的程序,並在PC上調試通過,在移植到一個16位機平台上的時候,可能會產生代碼隱患。所以只有在一定技術進階的基礎下才可以使用這招。
第4招:匯編嵌入
高效C語言編程的必殺技,第四招——嵌入匯編。
「在熟悉匯編語言的人眼裡,C語言編寫的程序都是垃圾」。這種說法雖然偏激了一些,但是卻有它的道理。匯編語言是效率最高的計算機語言,但是,不可能靠著它來寫一個操作系統吧?所以,為了獲得程序的高效率,我們只好採用變通的方法 ——嵌入匯編,混合編程。
舉例如下,將數組一賦值給數組二,要求每一位元組都相符。
代碼如下:
char string1[1024],string2[1024];
方法I
代碼如下:
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
代碼如下:
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
方法I是最常見的方法,使用了1024次循環;方法J則根據平台不同做了區分,在ARM平台下,用嵌入匯編僅用128次循環就完成了同樣的操作。這里有 朋友會說,為什麼不用標準的內存拷貝函數呢?這是因為在源數據里可能含有數據為0的位元組,這樣的話,標准庫函數會提前結束而不會完成我們要求的操作。這個 常式典型應用於LCD數據的拷貝過程。根據不同的CPU,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。
雖然是必殺技,但是如果輕易使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。