當前位置:首頁 » 編程語言 » c語言1000字論文
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言1000字論文

發布時間: 2023-08-14 07:00:17

Ⅰ 求c語言的貪吃蛇畢業論文

#include<stdio.h>#include<graphics.h>#include<stdlib.h>#include<dos.h>/*引用的庫函數*/#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000#defineUP0x4800#defineESC0x011b/*宏定義鍵名*/#defineN200inti,key;intlevel;/*游戲等級*/intscore=0;/*得分*/intgamespeed;/*游戲速度*/structFood{intx;/*食物的橫坐標*/inty;/*食物的縱坐標*/intyes;/*判斷是否要出現食物的變數*/}food;/*食物的結構體*/structSnake{intx[N];inty[N];intnode;/*蛇的節數*/intdirection;/*蛇移動方向*/intlife;/*蛇的生命,0活著,1死亡*/}snake;/*蛇的結構體*/voidChoicelevle(void);/*選擇游戲等級*/voidInit(void);/*圖形驅動*/voidClose(void);/*圖形結束*/voidDRAW(void);/*游戲區域*/voidGameOver(void);/*結束游戲*/voidGamePlay(void);/*玩游戲具體過程*/voidPrScore(void);/*輸出成績*//*主函數*/voidmain(void){Init();/*圖形驅動*/Choicelevle();/*選擇游戲等級*/DRAW();/*游戲區域*/GamePlay();/*玩游戲具體過程*/Close();/*圖形結束*/}/*圖形驅動*/voidInit(void){intgd=DETECT,gm;initgraph(&gd,&gm,"\turboc2");/*初始化圖形系統*/cleardevice();/*清除圖形界面*/}/*選擇游戲等級*/voidChoicelevle(void){charname[20];setcolor(YELLOW);settextstyle(0,0,6);outtextxy(150,150,"Snake");setcolor(GREEN);settextstyle(0,0,1);outtextxy(200,250,"pleaseputinyourEnglishname:");outtextxy(200,270,"Choicelevlefrom1-9.");outtextxy(300,320,"name:yangzilong");/*製作人姓名*/outtextxy(300,350,"number:0902060226");/*製作人學號*/outtextxy(300,380,"class:computerscience0602");/*製作人班級*/getch();printf("pleaseputinyourname:");gets(name);printf("pleasechoicelevle:");scanf("%d",&level);gamespeed=100000-400*level-300*level*level;if(level>9||level<1){cleardevice();/*清除圖形界面*/setcolor(YELLOW);/*設置字體顏色*/settextstyle(0,0,2);/*設置字體類型*/outtextxy(150,200,"levelinputerror");/*顯示文本*/getch();level=1;}}voidDRAW(void){cleardevice();/*清屏*/setcolor(2);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/rectangle(45,45,465,325);}/*玩游戲具體過程*/voidGamePlay(void){setcolor(5);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/randomize();/*隨機數發生器*/food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/snake.life=0;/*活著*/snake.direction=1;/*方嚮往右*/snake.x[0]=320;snake.y[0]=240;/*蛇頭*/snake.x[1]=330;snake.y[1]=240;/*蛇的第二節位置*/snake.node=3;/*節數*/PrScore();/*輸出得分*/while(1)/*可以重復玩游戲,壓ESC鍵結束*/{while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/{if(food.yes==1)/*需要出現新食物*/{food.x=rand()%360+70;food.y=rand()%250+60;while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*畫面上有食物了*/}if(food.yes==0)/*畫面上有食物了就要顯示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);}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){case1:snake.x[0]+=10;break;case2:snake.x[0]-=10;break;case3:snake.y[0]-=10;break;case4:snake.y[0]+=10;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]<50){snake.x[0]=450;/*如果蛇頭越過左邊界,則從右邊界進入*/snake.y[0]=snake.y[0];/*縱坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];/*蛇的其他節數向前推進*/}{setfillstyle(SOLID_FILL,0);/*設置填充模式和顏色,0表示黑色*/bar(50,55,455,315);/*bar是表示填充的范圍的函數*/}}elseif(snake.x[0]>450){snake.x[0]=50;/*如果蛇頭越過右邊界,則蛇頭從左邊界進入*/snake.y[0]=snake.y[0];/*縱坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];/*蛇的其他節數向前推進*/}{setfillstyle(SOLID_FILL,0);/*設置填充模式和顏色,0表示黑色*/bar(50,55,455,315);/*bar是表示填充的范圍的函數*/}}elseif(snake.y[0]<60){snake.y[0]=320;/*如果蛇頭越過上邊界,則從下邊界進入*/snake.x[0]=snake.x[0];/*橫坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];/*蛇的其他節數向前推進*/}{setfillstyle(SOLID_FILL,0);/*設置填充模式和顏色,0表示黑色*/bar(50,55,455,315);/*bar是表示填充的范圍的函數*/}}elseif(snake.y[0]>320){snake.y[0]=60;/*如果蛇頭越過下邊界,則從上邊界進入*/snake.x[0]=snake.x[0];/*橫坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];/*蛇的其他節數向前推進*/}{setfillstyle(SOLID_FILL,0);/*設置填充模式和顏色,0表示黑色*/bar(50,55,455,315);/*bar是表示填充的范圍的函數*/}}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+10,food.y-10);/*用當前線型和顏色畫一矩形*/snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/snake.node++;/*蛇的身體長一節*/food.yes=1;/*畫面上需要出現新的食物*/score+=10;/*每吃掉一食物,得分累加10分*/if(score%100==0){level++;gamespeed=100000-400*level-300*level*level;/*每吃掉10食物提升一級,速度加快*/PrScore();/*輸出新得分*/setcolor(YELLOW);/*設置字體顏色*/settextstyle(0,0,4);/*設置字體類型*/outtextxy(150,200,"LEVELUP");/*顯示文本*/if(level==10){level=1,gamespeed=100000-400*level-300*level*level;}delay(6000000);delay(6000000);delay(6000000);delay(6000000);delay(6000000);delay(6000000);delay(6000000);bar(50,55,455,315);/*bar是表示填充的范圍的函數*/}PrScore();/*輸出新得分*/}setcolor(4);/*畫出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);/*控制游戲速度*/setcolor(0);rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);}/*endwhile(!kbhit)*//*用黑色去除蛇的的最後一節*/if(snake.life==1)/*如果蛇死就跳出循環*/break;key=bioskey(0);/*接收按鍵*/if(key==ESC)/*按ESC鍵退出*/break;elseif(key==UP&&snake.direction!=4)/*判斷是否往相反的方向移動*/snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*游戲結束*/voidGameOver(void){cleardevice();/*清屏*/PrScore();setcolor(RED);/*設置字體顏色*/settextstyle(0,0,4);/*設置字體類型*/outtextxy(200,200,"GAMEOVER");/*顯示文本*/getch();}/*輸出成績及游戲等級*/voidPrScore(void){charstr1[20];/*設置字元型數組*/setfillstyle(SOLID_FILL,0);bar(50,15,390,35);/*填充矩形框*/setcolor(6);/*設置文本顏色*/settextstyle(0,0,2);/*設置數組顯示位置*/sprintf(str1,"score%dlevel%d",score,level);/*顯示數組內容*/outtextxy(55,20,str1);setcolor(YELLOW);/*設置字體顏色*/settextstyle(0,0,2);/*設置字體類型*/outtextxy(250,400,"EXIT=ESC");/*顯示文本*/}voidClose(void){closegraph();}

Ⅱ 球一份關於單片機或c語言的論文!2000字左右的

一·基於MSP430 單片機的電源監控管理系統(單片機論文)

引言
大功率直流開關電源由PFC 和DC-DC 變換器組成,為了提高可靠性,並能夠對其進行離線或遠程監控管理,在開關電源模塊內設置監控管理系統。該系統對電源故障類進行監控,對電源輸出的電壓電流進行自動設定和調節,通過串列通信介面,與遠程中心監控站進行遠程監控和管理,這一功能在通信系統基站供電系統中尤為重要。本文提出了一種基於MSP430單片機的電源監控管理系統的設計和實現。

1 系統結構和硬體電路設計
系統的整體設計結構如圖1所示。本系統採用的核心晶元為TI公司推出16位系列單片機MSP430。MSP430具有集成度高,外圍設備豐富,超低功耗等優點。單片集成了多通道12bit的A/D轉換、片內精密比較器、多個具有PWM功能的定時器、片內USART、看門狗定時器、片內數控振盪器(DCO)、大量的I/O埠以及大容量的片內存儲器,採用串列在線編程方法,單片可以滿足絕大多數的應用需要。 MSP430的這種高集成度使應用人員不必在介面、外接I/O及存儲器上花太多的精力,而可以方便的設計真正意義上的單片系統,在許多領域得到了廣泛的應用。下面介紹該系統可以實現的功能和基於MSP430F149的電控系統的設計。

1.1 系統功能:
a.開機控制。上電後,單片機開始工作,按下電源鍵,點亮指示燈後,將電網220V接入PFC,開關電源啟動工作,然後接於負載。
b.電壓設定和調節。用單片機A/D口採集開關電源的輸出電壓值,並顯示於液晶屏上,通過單片機控制數字電位計調節輸出電壓值,實現自動調節;或者通過鍵盤的左右鍵選出電壓調節頁面,用上下鍵進行手動調節;也可以通過通信介面實現遠程調節。

c.電流調節。多台開關電源並聯使用時,要求各台電源的負載電壓相等。單片機A/D口採集轉換成電壓值的負載電流值,通過通信口得到各台電流值,取電流平均值,控制數字電位計調節輸出電壓,使輸出負載電流達到平均值;或者通過鍵盤的左右鍵選出電流調節頁面,用上下鍵進行手動調節。

d.故障報警。單片機通過光電耦合器檢測到各項輸入輸出故障時,揚聲器產生蜂鳴,相應的報警燈閃爍,並在液晶屏上顯示故障類型及處理方法。

e.監測。單片機A/D口對電網電壓,輸出電壓,輸出電流進行採集測量,當出現超限時進行報警。

f.通信。包括單片機與各台開關電源間的通信和單片機與中心監控站的通信。

1.2 電壓調節電路
電壓調節電路由單片機、數字電位計X9313和可調分流基準晶元TL431組成,其電路原理圖如圖2所示。Xicor9313是固態非易失性電位器,可用作數字控制的微調電位器。TL431是TI生產的一個有良好的熱穩定性能的三端可調分流基準源,它的輸出電壓用兩個電阻就可以任意地設置到從VREF(2.5V)到36V范圍內的任何值。工作時,單片機的一個IO控制INC計數輸入腳,為其提供計數脈沖,此輸入端為下降沿觸發。另一個IO控制U/D升降輸入端,當U/D為高電平時,X9313內部計數器進行加法計數,VW端的輸出電壓上升,由於VW接地,使VH端電壓降低,而TL431的REF輸出端電壓為恆定的2.5V,從而使Vcc處輸出電壓升高;同理當U/D為低電平時,Vcc處輸出電壓降低,這樣就實現了電壓輸出調節。

1.3 模擬數據採集
MSP430F149內嵌入一個高精度的,具有采樣與保持功能的12位ADC轉換模塊,內部提供各種采樣與保持時鍾源。MSP430有8個外部輸入通道可選, 最高采樣速度可達200KHZ,並且還內置溫度感測器,可以測量晶元內的溫度,如果測量溫度高於或低於預設的溫度是,可以通過外接部件顯示告警信息,同時具有6種可編程選擇的內部參考電壓。該轉換模塊為一些需要模擬量採集的場合提供了便利。我們選擇的參考電壓是0~2.5V,這樣MSP430F149的AD解析度就是2.5/4096 = 0.61V左右。由於輸入的模擬電壓量較高,不能直接與單片機的ADC采樣埠相連,因此用串聯一個滑動變阻器的方法進行了降壓處理,成功解決了上述問題。

1.4 人機對話設計
系統的人機操作界面由液晶顯示屏、指示燈和鍵盤組成。液晶選用的是基於T6963C 的液晶模塊YM12864。鍵盤採用的是3×3 的陣列接法,系統採用了圖形用戶界面,操作簡單易行,顯示實用美觀。工作時,液晶屏可以實時顯示採集到的電網電壓、輸出電壓、輸出電流及各種報警信息,操作相應鍵盤可以進行顯示頁面的切換,對輸出電壓,輸出電流進行自動、手動及遠程式控制制調節。當有報警信息產生時,相應得指示燈會閃爍警示,同時與單片機連接的揚聲器會產生報警蜂鳴聲,以提醒操作人員做出相應的處理。

2 系統軟體設計
430 支持匯編語言和C 語言兩種語言編程,因此可以在一個工程文件中同時用兩種語言,使用匯編語言,便於在調試時尋找邏輯和指令的聯系及地址的定位正確與否。使用C 語言進行編程大大減少了工作量,編好後的程序可讀性好,易於修改和維護。開發工具使用IARSystems 公司的IAR Embedded Workbench,它集成了編輯、編譯、鏈接、下載與在線調試(Debug)等多種功能,使用方便,並具備高效的C 語言編譯能力。

考慮到軟體開發效率及可維護性,系統軟體設計遵循模塊化的編程思想,將系統功能劃分為幾個相對獨立的功能模塊。它們包括:液晶顯示模塊、AD 轉換模塊、按鍵監測響應模塊、報警監測響應模塊、電壓電流調節模塊、數據處理模塊、通信模塊。每個模塊都要進行獨立的測試,最後結合到一起。整個系統的軟體流程圖如圖3 所示。

按鍵監測模塊是其中的重要組成部分,它控制著AD轉換的啟動,顯示頁面的切換,及電壓電流的自動調節,手動調節,遠程調節的啟動和切換。報警監測模塊對開關電源的保護起著至關重要的作用,它實時的監測著開關電源是否出現故障,當發生輸入電壓過壓,輸入電壓欠壓,PFC故障時應切斷總電源,當發生輸出電壓過壓,輸出電壓欠壓,模塊過熱,及IPM保護故障時應關斷DC-DC變換器。
在對各模塊進行整合時,要注意各中斷之間的沖突。由於在MSP430 的中斷優先順序中,ADC12 采樣轉換中斷優先順序高於TIMERA 中斷,因此當在響應TIMERA 中斷的過程中會執行ADC12 采樣轉換中斷,或者TIMERA 的中斷響應被迫延遲,這樣就會影響在TIMERA中斷中執行的報警監測響應程序,不能達到對開關電源故障類的實時檢測。在本系統中,利用按鍵控制ADC12 采樣轉換中斷的啟動和關閉,從而解決中斷沖突。

3 結論
本文在基於MSP430F149電源監控管理系統的設計和實現的基礎上對MSP430的系統設計做了討論,提出並解決了在設計中出現的問題。本文作者的創新點:利用MSP430的系統結構簡單,外圍電路少,效率高的特點,設計實現了簡潔直觀、使用方便、操作全程漢字提示、監控能力強、運行穩定、安全可靠的電源監控管理系統,大大降低了成本,取得了相當可觀的經濟效益,滿足實際需求。

二·C語言論文:

嵌入式以門檻高,入門難的方式攔截了無數的學者。然而單片機作為嵌入式的入門課,如何以一種正確的方法學習單片機將關繫到是否能學習好嵌入式。
縱所周知,學習嵌入式先玩ptotel,再做單片機。Protel簡單的來說就是一個做PCB板的純英文的軟體。學習ptotel前必需具備一定的電路基礎和英語能力,電路基礎我想大部分同學都是有的,而英語這一塊卻是許多人所頭疼的。這對英語基礎差的同學是一種打擊,再者如果毅力不強,我想你是自學不下去的。毅力是學任何東西所必需的一種能力、素質,是一種遇挫折而不言敗的決心。
不管學的是protel還是單片機,首先要找一個能夠指導你的人。何謂指導,指導並不是說他要一步一步地教你去做,而是一個在關鍵時刻能夠為你指出一條道路的人。
我認為學習嵌入式方法最重要,在學protel和單片機之前應該想辦法了解關於學習它們的方法。比如說protel吧,許多人理科的學生都是以一種純理解的角度去學的,畫一個導線、元件問一下為什麼要這樣畫,生成網路表也追根溯源地問個網路表的由來。其實許多東西只是懂用就行,理論的東西懂得再多不懂用也是枉然的。
所以學習protel有地方不懂你就問你的指導員,有許多的東西是規定死了的,不是你想半天一夜就可以為你而改變的。這不同於軟體設計,軟體設計在你的苦思之下也許可以找到另一種更好的方法。

單片機嘛,不得不承認中國沒一本單片機好書。我學習單片機的時候看過的單片機書有七本,大多數都是不盡人意的。在這里我冒昧地說:中國人寫書確實缺乏一點「讀者至上」的原則。我所看過的單片機書我想有很多都是以他的角度去寫的,沒有幾個人是站穩在讀者的角度上寫的。書上的章節注釋極不清楚,許多重要的地方都是沒有說明的,說句不好聽的話,作者似乎以為讀者的水平也像他一樣高。而外國人的書呢,同樣的書,同樣的知識點,有同樣的中國人的書的兩三倍那麼厚,這是為什麼。這是因為外國人的書點點滴滴都是面向著讀者的。注釋、說明、總結應有盡有。所以,我在這里發表一個也許同胞會扔雞蛋到我身上的觀點,那就是:不管學什麼,優先選擇外文翻譯書,或是純英文書。得到一本好書對我們的影響極為巨大。這一部分我用一句話來總結就是:中國人的書適合教學,而外國人的書不僅適合教學還適合自學。

中國人的單片機書往往都是先介紹單片機的內部結構、中斷,定時器,然後再到I/O口。一開始就讓我們學習單片機內部結構,中斷、定時器的內部結構和原理,把我們弄得一塌糊塗的時候再和我們講例子,怎樣去操作實驗板。如果自學的話我想許多同學是學不下去的,幹嘛要把非得把單片機的內部結構像解剖學一樣弄個徹底才實踐去應用它呢?即使你把單片機全解剖清楚了還是不會用你手中的這塊實驗板的。我覺得如果在學單片機之前沒有學過匯編語言就直接用C語言學的話,即使學完了單片機,對單片機的內部結構和單片機的工作原理也是不清楚的。學了匯編之後再學單片機的話效果將會好得多,所以不要心急,有些東西是急不來的。
所以我認為學習單片機要在實踐中學習,先實踐再去了解它的結構和原理,如果你實在不能了解它的結構和原理那也無所謂的,只要你懂得用就可以了!(沒學過匯編的只能這么說了)
我們可以先從 I/O口學習,看一些例子燒錄些程序,再看一下現象,之後再嘗試了解一下所要用到的單片機的內部結構,最後在這個現象的知識基礎上,編一個自己想要的程序、現象出來。這樣學習的話既不無聊,成就感也有了。為什麼有些人可以把學習當一種快樂,而許多人在唉聲嘆氣,我想有一部分是出自這個原因。
不同的實驗板有不同的PCB圖,所以I/O的操作也是有所不同的。不過操作的原理都是一樣的,有些同學可能會抱怨教程里的實驗板和自己手中的實驗板不同,這是大可不必多慮的。I/O這一步在調試中看現象的理念很重要,比如改變一個語句會產生何種現象,為什麼會產生,這些都是要在調試中掌握的。
中斷的學習方法也是類似的,先實踐發現有陌生的地方就去查看相應的寄存器,等實現了自己想要的現實再慢慢地解剖一下單片機的寄存器,這樣學起來會更有意義,記得更牢。中斷也沒復雜的東西的,只不過學幾個中斷函數,優先順序之類的。有一定C語言基礎的同學在優先順序這一塊可以聯系C語言中運算符的優先順序,我相信有了C語言基礎定義一兩個中斷函數也不是什麼問題了的。
我學過的單片機的內容在我文檔的實例之中,實例的數量不多,但這些都是直接點擊單片機知識點的。隨著我的學習漸漸地深入後我再把我實現過的東西寫入實例之中吧。

希望對你有所幫助,祝成功!

Ⅲ 嵌入式c語言論文

嵌入式C語言位操作的移植與優化
單片機的應用越來越廣泛,種類也越來越多。由於嵌入式C語言可讀性強、移植性好,與匯編語言相比大大減輕了軟體工程師的勞動強度,因而越來越多的單片機工程師開始使用C語言編程。但C語言的可移植性僅限於與硬體無關的子程序,而與具體硬體有關的子程序則無法移植。在單片機應用中,位操作(特別是對引腳的位操作)非常普遍,如EEPROM數據和IC卡數據的讀寫、欄位式LCD顯示等,很多帶串口的集成電路都需要單片機用軟體來做I/O口讀寫程序。如何讓這些子程序既有很好的通用性,生成代碼的效率又高,是很多軟體工程師都在考慮的問題。這里介紹兩種C語言位操作的移植方法。
1 用邏輯運算實現位操作
請看下面這個子程序:
INT8U Card102RdByte(void) {
INT8U Temp8U, n = 8;
do{ Temp8U <<= 1;
if( PIN_CARD_SDA_RD() ) Temp8U |= 0x01;
PIN_CARD_CLK_H();PIN_CARD_CLK_L();
}while(--n);
return Temp8U;
}
這是通過單片機引腳從88SC102卡中讀一個位元組的子程序。程序採用μC/OSII中的書寫風格,即變數和函數採用「駝峰」寫法,由define定義的常量和內聯函數採用全部大寫加下劃線的寫法。
此程序驅動一個引腳輸出CARD_CLK高低信號,從另一個引腳一位一位讀取CARD_SDA數據。
1.1 用於MSP430系列單片機
此程序應用到MSP430單片機上(本文用的是MSP430F413單片機),頭文件中要有如下定義:
typedefunsigned charINT8U;
#include<msp430x41x.h>
#definePIN_CARD_SDA_RD()(P6IN & 0x01)
#definePIN_CARD_CLK_H()P6OUT |=0x04
#definePIN_CARD_CLK_L()P6OUT &= ~0x04
匯編結果如下:
In segment CODE, align 2, keep�with�next
__code unsigned char Card102RdByte(void)
Card102RdByte:
0000007E42MOV.B#0x8, R14
??Card102RdByte_0:
0000024C5CRLA.BR12
000004D2B33400BIT.B#0x1, &0x34
0000080128JNC??Card102RdByte_1
00000A5CD3BIS.B#0x1, R12
??Card102RdByte_1:
00000CE2D23500BIS.B#0x4, &0x35
000010E2C23500BIC.B#0x4, &0x35
0000147E53ADD.B#0xff, R14
0000164E93CMP.B#0x0, R14
000018F423 JNE??Card102RdByte_0
00001A3041RET
這與手工匯編編程的結果幾乎一樣,代碼效率很高。
1.2 用於51系列單片機
在51系列單片機中應用此程序,頭文件要加入以下定義:
#include"Reg932.h"//Philips LPC932單片機
sbitCradClk=P0^1;
sbitCardSDA=P0^0;
#definePIN_CARD_SDA_RD()CardSDA
#definePIN_CARD_CLK_H()CradClk=1
#definePIN_CARD_CLK_L()CradClk=0
原來的程序不作任何改動,匯編結果如下:
; FUNCTION Card102RdByte (BEGIN)
;-- Variable 'Temp8U' assigned to Register 'R7' --
;-- Variable 'n' assigned to Register 'R6' --
00007E08MOVR6,#08H
0002?C0007:
0002EFMOVA,R7
000325E0ADDA,ACC
0005FFMOVR7,A
0006308003JNBCardSDA,?C0008
0009430701ORLAR7,#01H
000C?C0008:
000CD281SETBCradClk
000EC281CLRCradClk
0010DEF0DJNZR6,?C0007
0012?C0009:
001222RET
; FUNCTION Card102RdByte (END)
由匯編結果可知,對位的直接清零和置位已達到最簡,只是讀位值不夠理想。
1.3 用於196/296系列單片機
在80C196MC、80C296SA等單片機中,片上I/O口是可以窗口映射到低端地址的。採用這種方式,I/O口可以直接定址,因而程序代碼最短,執行速度也最快,但這樣做C程序就無法移植了。若不用窗口技術,則片上I/O口是內存地址映射的,與普通內存地址一樣操作。頭文件中加入如下定義,即可利用原來的程序:
INT8UPOUT,PIN;
#pragmalocate(POUT=0x880)
#pragmalocate(PIN=0x881)//外擴I/O口地址定位
#definePIN_CARD_SDA_RD()(PIN & 0x01)
#definePIN_CARD_CLK_H()POUT |=0x04
#definePIN_CARD_CLK_L()POUT &= ~0x04
匯編後的代碼是56位元組,代碼效率也很高。
採用邏輯運算實現位操作,C程序簡單明了,移植性好,可讀性更好。但96系列單片機無法利用JBC和JBS位操作指令,51系列單片機也無法利用JB和JNB等其特有的位操作指令來提高代碼效率。用位段結構實現位操作可以彌補這個不足。
2 用位段結構實現位操作
把原來的程序改寫如下:
INT8U Card102RdByte(void)①
{②
INT8U n = 8;③
#ifndef C51_ASM④
bdata ACCImg;⑤
#endif⑥
do{ ACC <<= 1;⑦
GET_CARD_SDA();⑧
PIN_CARD_CLK_H() ; PIN_CARD_CLK_L() ;⑨
}while(--n) ;⑩
return ACC ;
}
2.1 在51系列單片機中的應用
在C51中使用ACC是不必在每個子程序中定義的,所以要在文件的開頭加上 #define C51_ASM。這樣,第④、⑤、⑥句會被忽略。在頭文件中加上以下定義:
sbitACC_0=ACC^0 ;
#defineGET_CARD_SDA()ACC_0 = CardSDA
其餘定義如本文第一部分所述。結果第⑧句匯編變為「MOV C,CardSDA」和「MOV ACC_0,C」兩句。句,函數要通過R7返回參數,程序已達到最簡。
; FUNCTION Card102RdByte (BEGIN)
;-- Variable 'n' assigned to Register 'R7'--
00007F08MOVR7,#08H
0002?C0007:
000225E0ADDA,ACC
0004A281MOVC,CardSDA
000692E0MOVACC_0,C
0008D280SETBCardClk
000AC280CLRCardClk
000CDFF4DJNZR7,?C0007
000EFFMOVR7,A
000F?C0008:
000F22RET
; FUNCTION Card102RdByte (END)
還可以像196/296那樣定義一個位段結構,使用JB指令,有興趣的讀者可以自己試一下。
2.2 在196/296系列單片機中的應用
在196/296中應用這段程序,要增加一個局部變數ACCImg的定義,就是前面程序中的第④、⑤、⑥三句。再在頭文件中增加一個如下的位段結構定義:
typedef struct {unsigned Bit0:1;
unsigned Bit1:1;
unsigned Bit2:1;
unsigned Bit3:1;
unsigned Bit4:1;
unsigned Bit5:1;
unsigned Bit6:1;
unsigned Bit7:1;
}Divide_to_bit;
typedef union {INT8U Byte;
Divide_to_bit DivBit;
}bdata;
埠地址變數要定義成以下數據類型:
bdata PIN;
同時,在頭文件中加上宏定義:
#defineACC ACCImg.Byte
#defineACC_0 ACCImg.DivBit.Bit0
#defineGET_CARD_SDA() if(PIN.DivBit.Bit0) ACC |=0x01;
這樣ACCImg就定義成了一個低端寄存器,ACC是它的位元組訪問形式。源程序中的第⑧句讀引腳,匯編的結果使用了JBC指令,整個程序比不用位段減少了位元組,達到了優化代碼的目的。
cseg
0000Card102RdByte:
; Statement3
0000B10800Rldbn,#8
; Statement7
0003 @ 0004 :
0003740101RaddbACCImg,ACCImg
; Statement8
0006B30181081CldbTmp0,PIN
000B 331C03jbcTmp0,3,@0005
000E 910101 RorbACCImg,#1
0011 @ 0005 :
; Statement9
0011 B30180081CldbTmp0,POUT
0016 91041CorbTmp0,#4
0019 C70180081CstbTmp0,POUT
001E 71FB1C andbTmp0,#0FBH
0021 C70180081C stbTmp0,POUT
; Statement10
00261500Rdecbn
0028980000RcmpbR0,n
002BD7D6bne @ 0004
; Statement11
002DB0011C RldbTmp0,ACCImg
00302000 br @ 0001
; Statement12
0032 @ 0001 :
0032F0ret
2.3 在MSP430系列單片機中的應用
MSP430系列單片機沒有位操作指令,所以不必定義位段結構,直接把ACC定義成一個無符號8位數即可。頭文件中是這樣定義的:
#ifndef C51_ASM//此句使頭文件也可以與C51的共用
typedef INT8U bdata ;
#define ACC ACCImg
#define GET_CARD_SDA() if(P6IN & 0x01) ACC |=0x01;
#endif
匯編的結果與用邏輯運算的方法進行位操作竟完全一樣。
結語
對引腳的位操作有3種: 直接置位或清零,從埠輸入數據和從埠輸出數據。前兩種上文已介紹過了。從埠輸出數據的C程序如下:
do{
OUT_SIO_DA();
CLK_H();
ACC <<= 1;//移位可擴展時鍾脈沖寬度
CLK_L();
}while
其中: 第一句OUT_SIO_DA(),51系列可定義成位操作SIO_SDA = ACC_7;196/296和430系列可如上文定義成一個if語句。
位段操作程序中採用了ACC這個名字作為一個局部變數。在C51中這剛好是主累加器,對於2401、IC卡等半雙工器件的程序很實用,但當SPI匯流排輸入/輸出同時操作時,就沒這么方便了。
用邏輯運算實現位操作不存在任何移植的障礙。μC/OS-II中的位操作就是全用邏輯運算實現的。位段定義可能存在不同編譯器分配順序不同的問題,但考慮到32位高速CPU不會用軟體模擬這種串口的操作,這樣的程序只會用在51、196/296、MSP430等無片內Cache的中低速單片機中,所以用位段操作引腳的方法仍有意義。具體是使用邏輯運算還是使用位段進行位操作,完全看個人喜好。本文程序採用的編譯器是Keil C51 V7.03、IAR C430 V2.10A和 Tasking C96 V5.0。

Ⅳ c語言論文

用C語言實現按鈕新技術
文章類型:計算機理論 文章加入時間:2004年12月14日17:1

一、按鈕顯示原理
按鈕一般有按下和彈起兩種狀態,在3D studio中按鈕也有這兩種狀態,Windows中雖然看到按鈕雖是彈起的,但細心的用戶不難發現,當選中按鈕時,它有短暫的按下狀態。實際上,它的原理很簡單,其實是利用改變按鈕邊框的顏色引起人視覺上的錯覺而達到立體效果,讓人們感到屏幕上真有凸起和凹下的按鈕一樣,如下圖:
@@T5S11500.GIF;圖1@@
圖1和圖2給出了按鈕兩種狀態和圖示,圖1為按鈕彈起時的狀態圖,其右邊及下邊的邊框色為黑色(0X00),而左邊及上邊的邊框顏色置為亮白(0x0f),而圖2則恰恰相反,右邊及下邊的邊框色為亮白,左邊及上邊為黑色,它反映了按鈕被按下的狀態。
在程序應用中,設置某一按鈕時,顯示圖1的狀態,再選中這個按鈕時,則顯示出圖2的狀態,經過短暫的延時後,恢復到圖1的狀態,給用戶的感覺是按鈕被按下後又彈起。在Windows中的按鈕就是這樣的,3D studio中的部分按鈕當被選中時,只顯示圖2,這時用戶可以很清晰地看到凹下的按鈕。
二、程序實現
主要包括按鈕結構的意義和與它有關的幾個函數。
1.結構定義typedef struet Button Def{
short X1;
short Y1;
short X2;
short Y1;
} button
(X1,Y1)和(X2,Y2)分別為按鈕左上角和右下角的位置坐標,用於確定按鈕的位置和大小。
為了程序需要,須定義幾個常用的量。
#define START-X bt→X1
#define START-Y bt→Y1
#define END-X bt→X2
#define END-Y bt→Y2
#define Grap 1(Grap為按鈕邊框的寬度)
#define Button White 0x0f
#define Button Black 0x00
2.函數定義
(1)void Button Define(button *bt,Short X1,Short Y,short X2,short Y2)該函數用於定義一個名為bt的按鈕的大小和位置,其左上角及右下角坐標為(X1,Y1),(X2,Y2)。
START-X=X1;
START-Y=Y1;
END-X=X2;
END-Y=Y2;
(2)Void Release Button(button *bt)
該函數顯示按鈕彈起時的狀態。
(3)Put Down Button(button *bt)該函數顯示按鈕按下時的狀態。
下面列出了以上函數用於定義按鈕,顯示按鈕彈起,按下狀態的程序,這個程序在屏幕上顯示7個按鈕,按下1~7個數字後就彈起某個按鈕,非常方便,需要彈起某個數字就按哪個數字,特別需要指出的是,當Gsap大一些時,每個按鈕,就如同鍵盤上的鍵一樣,立體感很強,有興趣的讀者可以實踐操作一下,並把這種簡明易懂的技術用之於工作,以提高工作效率。
button.c
#i nclude<graphics.h>
#i nclude<conio.h>
#i nclude<alloc.h>
#i nclude<stdio.h>
#i nclude<process.h>
#i nclude"button.h"
#define START-X bt->x1
#define START-Y bt->y1
#define END-X bt->x2
#define END-Y bt->y2
#define Grap 1
#defile ScreenBkColor 2
#define release-color 7
#define put-color 3
#define ButtonWhite 0x0f
#define ButtonBlack 0x00
#define delay 50000
#define dis 10
void ButtonDefine (button *bt.shout.short.short.short);
void ReleaseButton(button *bt);
void PutDownButton(button *bt);
void delay-time(long int);
main()
{
int gdriver=DETECT.gmode=VGAHI:
button *but,*but1.*but2. *bt,*but3,*but4,*but5,*but6,*but7;
int ch;
initgraph(&gdriver,&gmode,"d:\tc");
setcolor(ScreenBkColor);
setbkcolor(2);
clrscr();
ButtonDefine(but,50,50,600,400);
putDownButton(but);
ButtonDefine(but1,150,200,200,250);
ButtonDefine(but2,200+dis,200,250+dis,250);
ButtonDefine(but3,250+2*dis,200,300+2*dis,250);
ButtonDefine(but4,300+3*dis,200,350+3*dis,250);
ButtonDefine(but5,350+4*dis,200,400+4*dis,250);
ButtonDefine(but6,400+5*dis,200,450+5*dis,250);
ButtonDefine(but7,450+6*dis,200,500+6*dis,250);
while(ch!=27)
{
switch(ch) }
case'1':
ReleaseButton(but1);break;
case'2':
ReleaseButton(but2);break;
case'3':
ReleaseButton(but3);break;
case'4':
ReleaseButton(but4);break;
case'5':
ReleaseButton(but5);break;
case'6':
ReleaseButton(but6);break;
case'7':
ReleaseButton(but7);break;
}
ch=getch();
if(ch==27)
break;
switch(ch)
{
case'1':
PutDownButton(but1);break;
case'2':
PutDownButton(but2);break;
case'3':
PutDownButton(but3);break;
case'4':
PutDownButton(but4);break;
case'5':
PutDownButton(but5);break;
case'6':
PutDownButton(but6);break;
case'7':
PutDownButton(but7);break;
}
delay-time(delay);
}
closegraph():
return 0;
}
void ButtonDefine(button *bt.short x1,short y1,short x2,short y2)
{
START-X=x1;
START-Y=y1;
END-X=x2;
END-Y=y2;
}
void ReleaseButton(button *bt)
{
int i,j;
setcolor(7);
setfillstyle(1,7);
bar(START-X,START-Y,END-X,END-Y);
setcolor(Button White);
setfillstyle(1,7);
bar(START-X+Grap,START-Y+Grap,END-X-Grap,END-Y-Grap);
setcolor(15);
for(j=0;j<=Grap;j++)
{
line(START-X,j+START-Y,END-X-j,j+STAT-Y);
}
for(i=0,i<=Grap;j++)
{
line(START-X+i,START-Y+Grap,START-X+i,END-Y-i);
}
setcolor(ButtonBlack);
for(j=0;j<Grap;j++)
}
line(END-X,j+END-Y-Grap,START-X+Grap-j,j+END-Y-Grap);
}
for(i=0,i<Grap;i++)
{
line(i+END-X+Grap,END-Y-Grap,i+END+X-Grap,START-Y+Grap-i);
}
return;
}
void PutDownButton(button *bt)
}
int i,j;
setcolor(put-color);
setfillstyle(1,put-color);
bar(START-X+Grap,START-Y+Grap,END-X-Grap,END-Y-Grap);
setcolor(ButtonBlack);
for(j=0;j<=Grap;j++)
{
line(START-X,j+START-Y,END-X-j,j+START-Y);
;}
for (i=0;i<Garp;i++)
{
line (START-X+i,START-Y+Grap,START-X+i,END-Y-i);
setcolor(15);
for(j=0,j<=Grap;j++)
{
line(END-X,j+END-Y-Grap,START-X+Grap-j,j+END-Y-Grap);
}
for(i=0;i<=Grap;i++)
{
line(i+END-X-Grap,END-Y-Grap,i+END-X-Grap,START-Y+Grap-i);
}
}
void delay-time(long int i)
{
i=0;
while(i<=delay)
i++;
}
button.h
typedef struct ButtonDef
{ short x1;
short y1;
short x2;
short y2;
}button

Ⅳ 求一篇1000字左右c語言之猜數游戲論文~!!!急用。。希望大家幫幫

我們現在來做一個<猜數字>游戲...
游戲規則參照文曲星里的猜數字:

輸入四入不重復的數字(中間用空格隔開)按<回車>後結果顯示在後邊,
形式為 " ? A ? B", 四個數中位置和數字都正確為 A,數字相同位置不同為 B,
當 4 A 0 B 時為猜對,每一局有8次機會.

如:原四個數為1234,則
1234 4 A 0 B
5678 0 A 0 B 沒有一個對.
1243 2 A 2 B 3,4雖對但位置錯.

明白了規則後,下手就容易了,也許你還沒頭緒,沒關系,一步一步來.

1.首先明白自己的游戲要做什麼?
由玩家輸入四個數字,驗證這四個數和正確答案的關系,提供一個" X A X B"的
提示給玩家,再輸入...直至玩家猜對或到達八次.

2.游戲需要什麼資源?
這個游戲並不需要什麼特別的,只要一個printf,和scanf獲得輸入.

所以程序開頭:

#include <stdio.h>
加入標准輸入輸出,沒有它Turbo C不知道printf和scanf在哪來.

好,程序設計開始...

main(){
}

先把這個函數寫下來,這個叫主函數,一個程序就只有一個,也稱為程序入口函數,
你的程序就是從這里開始執行的.(是不是有點廢話?)

(以下操作都在main()中)
設定四個變數儲存正確答案:(也可以結個初值)
int a1,a2,a3,a4;
再設定四個變數諸存玩家的輸入:
int b1,b2,b3,b4;
設定一個變數諸存猜的次數並賦初值:
int n = 0;
設定兩個變數諸存結果A,B的個數:
int cA,cB;

准備工作完成,設定正確答案:
a1 = 3;
a2 = 5;
a3 = 9;
a4 = 7;
(當然你會抱怨正確答案是固定的,不要緊,下面會告訴你怎麼產生隨機的效果,慢慢來.)

仔細想一想整個游戲流程...
大概是這樣的:

循環執行:
輸入;
對比正確答案;
輸出提示;
判斷是否猜對;
是:顯示勝利並退出循環,否:不理會;
次數加1;
判斷次數是否超出;
是:顯示失敗並退出循環;
循環結束;

那麼,為了更容易理解,我們使用死循環,但要注意一點:裡面必須有使循環結束的語句!
break;就是這個語句.

那麼:

while(1){
...
break;
...
}

就寫下吧.while(XX){YYYY}是這樣工作的:
XX是不是0 (真)
不是:
執行 YYYY
是:退出循環
再檢查XX是不是不為0
...
不過你必須明確:break;會強制退出循環.

好,就這樣:

printf("\n\t Guess Numbers!\n\n"); /*列印一點提示信息*/
while(1){ /*開始用戶的輸入和程序輸出*/
printf("%d: ",n+1); /*列印當前是第幾次輸入*/
scanf("%d %d %d %d",&b1,&b2,&b3,&b3);
/*先不要知道為什麼要在b1,b2這前加&,先認為,scanf就要這樣*/
cA=0;
cB=0; /*對比就要開始,先把結果置0*/

/*對比開始,我們用一堆if來為我們做事*/
/*雖然這有點累贅,但誰叫我們是初學者呢?不過告訴你,這種表達效率是最高的*/
if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++; /*逐個檢查增加A的數量*/

if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;
/*窮舉檢查得到B的數量*/
/*當然,你必須保證玩家輸入的都不一樣,不然就會鬧出笑話*/
/*檢查對比結束*/

/*列印提示*/
printf("\t\t%d A %d B\n",cA,cB);
/*判斷是否勝利*/
if(cA == 4){
printf("\n\tWell Done!\n");
getch(); /*getch()的功能是輸入一個字元,不需要回車,也不會顯示到屏幕*/
/*通常用來暫停程序*/
break; /*退出循環*/
}
/*次數加一*/
n++;
/*判斷次數*/

Ⅵ 計算機專業C與C++程序設計研究論文

計算機專業C與C++程序設計研究論文

摘要 :首先介紹了目前高校計算機學院C族語言相關程序設計課程的建設狀況。然後從C族語言的相互衍生關系出發,提出了在高校計算機課程體系中去除C語言的基礎課程,將其綜合成一門C++程序設計課程來供學生學習,並對課程內容、參考教材和課時安排上給出了自己的建議。

關鍵詞 :C語言;C++語言;程序設計

高校的C族語言教學總是按照先學C語言,再學C++的順序進行,這種學習順序隨著C++標準的不斷升級改革後變得越來越不適用。早期的C++屬於多面性語言,即可以像C一樣進行模塊化的面向過程的編程設計,也可以像Java一樣進行抽象的面向對象程序設計。那時的教學者考慮的是學生應當從較為便於理解的面向過程的編程思路入門學習C語言編程,然後在熟練了面向過程的編程方式後再從C語言延伸到C++,轉而學習面向對象的程序設計。可是隨著面向對象的程序設計在應用市場上佔領了絕對的主導地位後,再讓學生從面向過程著手就等於是浪費學習時間。加上C++和C兩門語言的初級語法思想是完全一致的,開設兩門課程浪費了學時,也耽誤後續更重要的核心課程的學習。

1程序設計語言C與C++的比較

1.1C與C++的共性。一般簡要的介紹是把C++當作C的加強版,這種認知當然是錯誤的,C++語言的設計者在設計之初為了保障自家語言會受到開發者的關注,所以兼容了的C的語法,這就自然使得C++可以使用C的編程方式進行程序設計,所以也導致了很多人對這兩種語言的關系產生了錯誤的認知。同時由於C語言本身設定上的優越性,所以C++在進行自我定義的時候也沿用了C語言很多優良的性質。基礎數據結構一致,C與C++的基礎數據類型都是以變數和常量作為基本屬性劃分,類型上有字元型、整型、長整型、單精度浮點型和雙精度浮點型,不過C++額外增設了布爾型。復合型數據結構上也都同時具有數組、多維數組、結構體、枚舉類型和共同體,但是C++增設了字元串類型以替代C語言中的字元數組,功能上更加強大,也更加便捷。在語法方面,聲明、賦值、循環、選擇的結構和實現都是一致的,並且C++雖然提倡使用類和對象的概念去設計程序結構,可也同樣支持函數體結構的程序設計結構。並且C語言中函數的賦值都是間接調用,在使用C語言函數時總是會在指針上出現各種紕漏,但是C++的函數體可以使用引用參數,這就使得C++的函數體比之C的更加好用。總的說來就是,C++標准下用戶可以完全使用C語法進行編程而不會出現任何BUG,同時C++自身的優越設定和標准使得其設計能力比C要強大數倍,是目前市場上大型程序開發的首選語言。

1.2C與C++的不同。上一節介紹了C++和C的.基礎語法上的區別,這些區別都是C++的作者在C的基礎之上修訂而來的結果,是為了讓C++標准下得面向過程的程序設計比之單純的C更加便捷方便。但是C++的誕生伊始,就是一門向上使用面對對象的程序設計思想的高級編程語言。它的封裝性、繼承性、多態性和對象唯一性才是C++成為強大高級語言的重要原因,這些特性都是C語言不可能擁有的。所以C能夠實現的程序,C++能夠實現並且實現的更為方便,C不能實現的程序,C++同樣可以實現。

1.3C++的特色。承接上一節,C++和C之間最大的不同,也是C++自身最值得誇耀的特性,就是面向對象程序設計思想。這種思想使得C++語言設計出來的程序,變成了類和對象的有機結合,這種結合的代碼比之面向過程的函數體架構的代碼更加易讀,共同開發起來容易上手,後續的維護者也不用費更多的腦筋去理解前人的代碼含義。而類和對象的設計思路,使得開發者合作時相互之間的工作變的更為獨立,雙方之間只需要知道對方所寫的類實現的功能和包含的數據就行。這種特性我們稱之為良好的封裝性,開發者之間不需要去知道對方的代碼是如何實現,甚至在此之上還可以保證良好的代碼健壯性。因為類的引入,更先進的作用域機制也被引入進來,類的書寫者往往會將自己類中的數據進行嚴格的作用域限定,防止其他合作者擅自去修改和使用自己類中的數據。合作者想要知道類中的數據或者使用類中的數據,只能通過類的書寫者定義的帶有檢查機制的方法才行。這樣會使得很多人合作開發的大型項目的穩定性和安全性比之用C語言開發時再上一個台階。同時類的概念中還有一個先進的設定就是繼承性,並且由這個繼承性還延伸出了介面的概念。有了可以繼承的介面和類,那麼開發者在對程序進行迭代的瀑布開發流程時,就可以很好的使用自己曾經開發的源代碼,或者借用其他項目的源代碼,因為只要學會科學的使用繼承機制,就不僅僅是節約程序員的代碼時間,也減少了程序員在回顧曾經代碼時發生的錯誤和歧義。而與繼承機制配合使用的是多態性,曾經C語言中定義的函數,其靈活度非常差,特定的函數只能滿足特定程序定義的需求,想要重用曾經的源代碼是幾乎不可能的事情。我們剛才提到的繼承機制使得C++開發者復用源代碼成為了一種習慣,但是復用時不可避免的修改問題又擺到了檯面上,多態機制順應而生了。多態機制使得類不僅可以繼承其他類,將父類的數據和方法都在本類體中自如的使用,同時還可以用本類中新的定義和代碼去覆蓋父類中的數據定義和方法。這就讓程序員變的更加自由,想用父類的數據和方法時就去繼承,但是不想全部使用時就加上多態機制去覆蓋。這樣代碼之間的重復利用率變得十分客觀,節約了大量的開發時間和開發成本。

2程序設計語言C與C++開設建議

C++課程的內容應當如下安排:第一部分,教授C++的基礎語法,讓學生可以編寫出在DOS命令行下輸入輸出的程序,了解編程的基本概念和思想。並且這時應當同時進行C和C++的雙向語法教學,為日後學生進入高年級後的方向選擇打下基礎。此部分使用半個學期最為適宜,並且此時並不灌輸學生何為面向對象何為面向過程,而主在讓學生使用基礎語法進行最基本的編程探索。第二部分,在學生有了基礎編程知識後,將數據結構的內容放入課程中去,用半學期的時間教授學生用C++實現的各類常見數據結構。並且結合實際開發項目中的代碼作為閱讀補充,讓學生明白數據結構的知識對程序開發的意義,然後將簡化後的小項目作為課堂的主要內容,用實際的代碼讓學生去理解那些枯燥的數學定理和概念。而且在實現數據結構的過程中,必然會面對一些更為高級的C++語法和概念。總的來說,用大一上的一個學期讓學生對於基礎編程有了良好的認知和深入,是十分值得和有效的。第三部分,在學生有了數據結構的基礎和C++的基本語法掌握後,應當面對一些實際的開發項目和問題。當然實際的問題還是需要老師進行簡化,其主要目的是讓學生掌握C++的高級特性和實際軟體開發的過程與思路,並且想學生傳授基礎的演算法。這一部分較為困難,應當使用一個學期讓學生慢慢的掌握和熟悉。第四部分,在學生算是對C++語言和數據結構與演算法都有了基礎的入門後,再進行課堂教學意義就不大了,應當再大二上學期開設一門課程設計實驗課,讓學生完成幾個難度從小到大的項目,循序漸進的掌握基本的實際開發技巧和思維。

參考文獻

[1]羅莉.計算機程序設計的多應用型開發與實現[J].產業與科技論壇,2015(14):54-55.

[2]鄧薇,何錇,錢俊彥,等.深度優先的多基因表達式程序設計[J].模式識別與人工智慧,2013(9):819-828.

[3]宛西原,汪霞.非計算機本科專業計算機程序設計課程的改革思考[J].計算機工程與科學,2014(z1):56-59.

;

Ⅶ c語言課程設計論文

談及C語言,我想凡是學過它的朋友都有這樣一種感覺,那就是「讓我歡喜讓我憂。」歡喜的是,C語言功能非常強大、應用廣泛,一旦掌握了後,你就可以理直氣壯地對他人說「我是電腦高手!」,而且以後若是再自學其他語言就顯得輕而易舉了。憂慮的是,C語言猶如「少林武功」一般博大精深,太難學了。其實就筆者認為C語言並非是「difficult(困難)」的,只要你能理清思路,掌握它的精髓,那麼自學C語言是一件非常容易且又其樂無窮的事。今天本人就與大家一起談談如何學習C語言或者說學習C語言應從哪幾方面著手。

了解一些基本知識

一.C語言的背景

就個人感觸,無論學習哪門語言首先應該了解一下自己所學語言的背景,也可以說它的發展史。

C語言屬於高級程序語言的一種,它的前身是「ALGOL」。其創始人是布朗·W·卡尼漢和丹尼斯·M·利奇。C語言問世時是帶有很大的局限性,因為它只能用於UNIX系統上。然而隨著科學技術的進步,計算機工業的發展,C語言逐漸脫離UNIX。1987年美國標准化協會制定了C語言的國際標准,簡稱「ANSI C」,從此以後它便成為一種廣泛使用的程序語言。C語言的優點很多,主要的有如下四點:

1.兼備高級語言與低級語言的優點,屬於一種中間語言。

2.它是一種結構化程序設計語言,非常適合結構化程序設計。

3.有較豐富的數據類型、運算符以及函數供以選用。

4.直接與內存打交道,使修改、編輯其他程序與文檔變得輕松,簡單。

二.二大語系二種不同的學習方法

其實高級程序語言分為兩大語系。例如:C,C++(C語言的擴展),QBASIC,VB(BASIC的可視化),JAVAs cript,Js cript ,VBs cript,JAVA,ASP,FOXPRO,PERL等等。一路是以C為主的程序語言,例如:JAVAs cript,JAVA等,這類語言在函數的調用,程序語句的書寫,循環的控制都極為相似。另一路是以BASIC為首的程序語言,例如:FOXPRO,VBs cript等,此類語言同樣具有相似的函數調用,程序語句書寫以及循環控制,但與C語系是不同的。因此若是您以前是從QBASIC起家的,那麼在學習C語言前最好是先洗洗腦,千萬不要把學習BASIC的方法以及思路用在C身上。

講到這里,我想大家對C語言一定有了感性認識吧!下面讓我們再升華一下,全方位親密接觸它。學習C語言必須從以下四點入手,也就是說,只要你能掌握這四點的內容,那麼基本上就大功告成了。
親密接觸C語言

一.輸入輸出

C語言的輸入輸出是非常嚴格的,或許在其他程序語言中我們可以不關心這個問題,但在C語言中,我們必須要徹底了解它。由於篇幅有限,因此筆者不能詳談,有興趣的朋友可以參考由著名程序語言教授譚浩強先生主編,由清華大學出版社出版的《C程序設計第二版》。不過這里筆者還是有幾點要簡單的談一下。

1.二維浮點數數組的輸入

二維浮點數數組的輸入(即:通過鍵盤給二維浮點數數組賦值)在很多專業書中都沒有詳細講過這個問題。在給二維浮點數數組賦值時一定要先聲明一個變數,接著把數值賦予這個變數,最後把變數數值賦予二維浮點數數組賦值。
2.注意輸出格式中「%」後的字元

C語言的輸出說復雜不復雜,因為常用的都很簡單。可說不復雜也未必,記得曾在一次等級考前輔導我們C語言的教授講道:「如果C語言要考得很難的話,根本不用考什麼指針,只要專考輸出格式,我想百分之九十九的學生都不及格。」當時我們無不認同。從這則事例中可以看出C語言的輸出格式之復雜程度。因此大家在學習它時千萬要學會辨別輸出格式中「%」後的字元,每個字元都有其意義,也都有其作用。
二.優先順序

說道優先順序,有很多朋友都不是很了解或說很模糊。為此筆者想先通過一個例子讓各位有個概念。什麼叫優先順序?比方說,我們在公交車終點站排座隊時總會遇到70歲以上的老人不需要排隊就能上車的情景,這就是優先順序的涵義。C程序在運行時也象排隊坐車一樣,首先照顧那些優先順序高的運算符,若是優先順序相同,那麼就象遇到兩位(或兩位以上)70歲以上的老人那樣,讓他們依次上車。但是C語言中的優先順序的運算並不是千篇一律的,只能說是在大多數情況下,有些運算符的優先順序有其自己的特點,因此這點大家要注意。例如條件表達式:條件?結果1:結果2,這種表達式很多朋友都知道,它的作用與IF…ELSE…條件判斷語句很雷同,它運算時的優先順序就不是按照C語言的規則來完成的。所以說對於優先順序各位編程愛好者一定靈活掌握,不要死記硬背。

三.指針

就個人認為,C語言中的指針是最有特色的,當然也是最難學的。指針說穿了,其實是變數的一種表現形式,只不過這種變數記載的不是數值而是地址。就象一個人可以用姓名來表示自己,也可以用身份證號碼來表示自己一樣。筆者涉足編程已經有三年多了,在這期間曾經收到過很多網友的電子郵件詢問學習指針的方法。就本人感觸,學習指針最好是先學些計算機硬體工作的原理,例如:直接定址,間接定址等,只有了解了這些內容以後,你再學指針就比較容易理會,畢竟C語言是一門介於機器語言與高級語言中間的語言,沒有一些硬體工作知識是很難領悟它的真諦的。然而事事並非絕對,如果你沒有這些知識也不要緊,只要清楚知道以下筆者總結的二點再加上多練習便可:

1.指針是地址變數:它的值有兩種:其一是地址,其二是內容。不同的表達方式可以取不同的值,這有點象一個家庭地址在不同的場合標識的人物也不同。例如:父母親在他們的單位所登記的家庭地址就代表他們自己,而你在學校中登記的同樣的家庭地址就代表你自己。

2.指針是可以運算的,它的運演算法則與變數是一致的。

另外,在編寫一個程序時,除非萬不得已,一般不要使用指針變數。因為指針是比較復雜的,用不好就「當機」。所以筆者建議各位對於指針只要能看懂就行,當然如果你是准備參加考試的就另當別論了。

四.函數

雖說很多程序語言都有函數這一內容,但筆者覺得C語言的函數是最有魅力的。如果你能完全掌握C語言的函數,那麼學習C++就不成問題了(C++是一門建立在C語言上,但又不同於C語言的高級程序語言,它增添了很多函數。)。學習函數的方法是比較簡單的,只有兩個字「牢記」,即:牢記函數的功能,牢記函數的用途以及如何輸入輸出。有些朋友認為,程序語言中的函數沒有多大用處,其實這並不正確,函數從本質上講是一段通用程序,用它可以幫助我們節約很多編程的時間,一個聰明的編程者在編寫程序前往往總是先找自己所編寫的程序中有多少是可以用函數來代替的。筆者曾經作過一個比較字元串的實驗,用C語言中的strcmp()函數只要一句話,而自己編寫的話30句話都擺不平,可想而知函數是多麼實用呀!

Ⅷ C語言的用途,定位及特點(論文)

1.2 C 語言的特點
C 語言發展如此迅速, 而且成為最受歡迎的語言之一, 主要因為它具有強大的
功能。許多著名的系統軟體, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 語言編寫的。
用C 語言加上一些匯編語言子程序, 就更能顯示C 語言的優勢了, 象PC- DOS 、
WORDSTAR等就是用這種方法編寫的。歸納起來C 語言具有下列特點:
1. C是中級語言
它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以象
匯編語言一樣對位、位元組和地址進行操作, 而這三者是計算機最基本的工作單元。
2. C是結構式語言
結構式語言的顯著特點是代碼及數據的分隔化, 即程序的各個部分除了必要的
信息交流外彼此獨立。這種結構化方式可使程序層次清晰, 便於使用、維護以及調
試。C 語言是以函數形式提供給用戶的, 這些函數可方便的調用, 並具有多種循
環、條件語句控製程序流向, 從而使程序完全結構化。
3. C語言功能齊全
C 語言具有各種各樣的數據類型, 並引入了指針概念, 可使程序效率更高。另
外C 語言也具有強大的圖形功能, 支持多種顯示器和驅動器。而且計算功能、邏輯
判斷功能也比較強大, 可以實現決策目的。
4. C語言適用范圍大
C 語言還有一個突出的優點就是適合於多種操作系統, 如DOS、UNIX,也適用於
多種機型。