『壹』 如何用c語言開發,應用軟體
1 首先要確定C語言的開發平台,比如windows、linux還是嵌入式,不同的平台使用的編譯器與開發環境是不一樣的。
2 確定開發平台後選擇相應的開發工具,比如windows使用VC6.0及以上版本,linux使用slick edit、嵌入式使用keil等等在這舉個例子
3 在相應的開發工具里可以創建相應的c語言項目,比如windows的平台 可以創建 dll、命令行應用程序、圖形界面應用程序、驅動程序等。嵌入式一般開發出來的是bin二進制文件。
『貳』 c語言程序設計實例 選題二:學生成績管理系統設計 學生成績信息包括:學號,姓名,三門課程成績(數學、英
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int INDEX[32];
//結構體變數
struct STUDENT{
int id;
int age;
int chinese,math,english;
char name[21];
}students[32];
void page_title(char *menu_item){
printf(">>> 學 生 管 理 系 統 <<<\n\n- %s -\n\n",menu_item);
}
void return_confirm(void){
printf("\n按任意鍵返回……\n");
getch();
}
void student_new(void){
int n;
page_title("錄入學生基本信息");
for(n=0;n<32;n++)
if(students[n].id==0) break;
printf("學號:");
scanf("%d",&students[n].id);
printf("姓名:");
scanf("%s",&students[n].name);
printf("年齡:");
scanf("%d",&students[n].age);
return_confirm();
}
int search_id(void){
int n,i;
printf("請輸入學生學號:");
scanf("%d",&i);
for(n=0;n<32;n++)
{
if(students[n].id==i&&students[n].id!=0)
{
printf("學號:%d\n",students[n].id);
printf("姓名:%s\n",students[n].name);
printf("年齡:%d\n",students[n].age);
return n;
}
}
printf("\n輸入錯誤或學號不存在.\n");
return -1;
}
void student_del(void){
int n;
page_title("注銷學生基本信息");
if((n=search_id())!=-1) students[n].id=0;
printf("\n!該學生已注銷.\n");
return_confirm();
}
void student_edit(void){
int n;
page_title("編輯學生基本信息");
if((n=search_id())!=-1)
{
printf("\n請重新輸入新信息:\n學號:");
scanf("%d",&students[n].id);
printf("姓名:");
scanf("%s",&students[n].name);
printf("年齡:");
scanf("%d",&students[n].age);
}
return_confirm();
}
void score_input(void){
int s,n,t;
page_title("錄入成績");
printf("\n請用數字鍵選擇科目\n1-語文 2-數學 3-英語\n");
scanf("%d",&s);
for(n=0;n<32;n++)
{
if(students[n].id!=0)
{
printf("學號:%d 姓名:%s 成績:",students[n].id,students[n].name);
scanf("%d",&t);
switch(s)
{
case 1 : students[n].chinese=t;break;
case 2 : students[n].math=t;break;
case 3 : students[n].english=t;break;
}
}
}
return_confirm();
}
void score_edit(void){
int n;
page_title("修改成績");
if((n=search_id())!=-1)
{
printf("語文:%d 數學:%d 英語:%d\n",students[n].chinese,students[n].math,students[n].english);
printf("\n請重新輸入成績:\n語文:");
scanf("%d",&students[n].chinese);
printf("數學:");
scanf("%s",&students[n].math);
printf("英語:");
scanf("%d",&students[n].english);
}
return_confirm();
}
void sort_it(char nn){
int n,m,p,x,t[32];
for(n=0;n<32;n++)
{
switch(nn)
{
case '1' : t[n]=students[n].id;break;
case '2' : t[n]=students[n].chinese;break;
case '3' : t[n]=students[n].math;break;
case '4' : t[n]=students[n].english;break;
case '5' : t[n]=students[n].chinese+students[n].math+students[n].english;break;
}
}
for(n=0;n<32;n++)
{
x=0;
p=-1;
for(m=0;m<32;m++)
{
if(t[m]>x)
{
x=t[m];
p=m;
}
}
t[p]=-1;
INDEX[n]=p;
}
}
void browser(void){
int n,x;
char k;
sort_it('1');
while(1)
{
page_title("瀏覽");
printf("按數字鍵選擇排序方式或按 0 返回\n");
printf("學號-1\t姓名\t年齡\t語文-2\t數學-3\t英語-4\t總分-5\n");
for(n=0;n<32;n++)
{
if(INDEX[n]!=-1)
{
x=INDEX[n];
printf("%d\t%s\t",students[x].id,students[x].name);
printf("%d\t%d\t",students[x].age,students[x].chinese);
printf("%d\t%d\t",students[x].math,students[x].english);
printf("%d\n",students[x].chinese+students[x].math+students[x].english);
}
}
k=getch();
if(k<'6'&&k>'0') sort_it(k);
else if(k=='0') break;
else continue;
}
}
void main(void){
menu: page_title("操作選單");
printf("請用數字鍵選擇操作\n\n");
printf("1 錄入學生基本信息\n2 修改學生基本信息\n");
printf("3 注銷學生基本信息\n\n4 錄入成績\n5 修改成績\n\n");
printf("6 瀏覽...\n \n0 退出\n");
switch(getch())
{
case '1' : student_new();break;
case '2' : student_edit();break;
case '3' : student_del();break;
case '4' : score_input();break;
case '5' : score_edit();break;
case '6' : browser();break;
case '0' : exit(0);
}
goto menu;
}
看看符合不符合?C++版的要嗎?
『叄』 國內的C語言都用來做什麼類型的項目啊
C語言是一門早期計算機編程語言,它可以說是現在大部分編程語言的母語了。學習C語言可以很方便的讓你掌握其它的編程語言。
C語言對操作系統和系統使用程序以及需要對硬體進行操作的場合,用C語言明顯優於其它高級語言,許多大型應用軟體都是用C語言編寫的,在嵌入式開發上,C語言也應用的非常的廣泛。
C言具有繪圖能力強,可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫它是數值計算的高級語言。
如果真想從事計算機方面,在跟著老師學的同時。自己最好去網上找相關的視頻教程好好學習吧。
『肆』 c++開發項目
你現在所學習的知識是一切的基礎。。。。
等你意識到了聯系你就會後悔現在的愚蠢了。。。。。。。。。
別去做那些開發項目
千萬別。。。
等你數據結構學完了會有一個畢業設計的。
如果你一定那麼心急現在就想學的話。
我就給你隨便出幾個問題:
1:Jpeg壓縮演算法中的熵編碼部分。這是你數據結構中要學習到得哈夫曼樹結構。
2:Josephus環的求解: 循環鏈表。
這些都是基礎,是任何面試所必需的。
如果你覺得我說的這個不是什麼實際項目,那好:
1.播放器
我去年做過一個播放器,其重要用到對一個隨機內容的媒體文件的檢索,搜索出一些關鍵性字元。如果用你在C語言中的方法那麼根本不夠,簡單的使用Windows的內存映射也不足。
最後我還是用到了當年本科數據結構時候所學到的KMP演算法來解決。
2.
另一個項目實例是:一個資料庫內容的呈現和讀取:
我們要從資料庫讀取一些條目,系統是嵌入式Linux沒有自動排序工具,系統qsort函數功能表現不佳。於是我們的做法是自己改寫排序演算法。並且用鏈表存儲。等等等。。。。。。
諸如此類數不勝數。
現在誰給你推薦別的書都是害你。數據結構是一切的根本,一定要學好。
分值太少,只因為當年我也和你一樣,結果數據結構學得不好,後來自己工作了一年後又拿起數據結構學習。。。
所以看到了你的問題,我就多說了幾句。。。希望你別像我一樣。。
有意見可以短消息聯系。
『伍』 如何利用C語言實現動畫
基於擦除法的C語言動畫設計與實現
Movie design implement in C language base on erasure way
東華理工學院計算機與通信系姜林何月順江西南昌330013
摘要:
本文介紹了程序設計語言中動畫設計的原理,在C語言中的動畫設計常用方法,並提出了在C語言中新的動畫設計方法――擦除法。闡述擦除法動畫設計的原理,並通過一個具體的實例詳細介紹了這種方法的設計實現,文中末尾總結了擦除法動畫設計的優點及適用的范圍。
關鍵字:擦除法;C語言;TurboC2.0;動畫設計;原理;實現
中圖分類號:TP312
Summary:
Through the principium of movie design in program design language, the thesis present movie design general way in C language, and bring forward new movie design way――erasure . The thesis also expatiate the principium of erasure way, particular describe the design implement of erasure by a instance. The end summarize the excellence and range of erasure way.
Key words: erasure way; C language ; TurboC 2.0; movie design; principium; implement
0. 引言
動畫技術是計算機圖形學中的重要內容,它廣泛用於游戲娛樂,輔助教學,科學實驗模擬等計算機輔助設計。用於動畫設計的程序設計語言有多種,並且有多種方法。其中C語言程序設計又廣泛用於各種軟體開發項目中。因此,掌握C語言的動畫設計方法對於軟體開發很有必要。
1. 程序設計中動畫原理
程序設計中動畫設計的原理類似電影的方法,它利用人的視覺具有暫留的生理特點,即人眼對動態圖像的變化僅能分辨出時間間隔為25毫秒左右的變化,如果圖像變化太快,則人眼無法分辨。在程序設計中我們可以在屏幕上畫出一張圖像,而將這張圖像在不同時間出現,然後一張張快速(時間間隔小於25毫秒)呈現在屏幕上,從視覺效果上看這些畫面就如同電影在連續變化一樣,給人以動的視覺感覺。
2. C語言動畫設計常用方法C語言常用動畫設計方法[1]:
2.1利用動態開辟圖視口方法
在位置動態變化,但大小不變的圖視口中(用setviewpot()函數[2]),設置固定圖形,這樣呈現在觀察者面前的是當前圖視口位置在動態變化,因而在屏上看到的圖像就好像在動態變化一樣。
2.2 利用顯示頁和編輯頁交替變化
將當前顯示頁和編輯頁分開(用setvisualpage()和setactivepage()函數),在編輯頁上
畫好圖形後,立即令該頁變為顯示頁,然後在上次顯示頁上進行畫圖,畫好後,再交換,如此反復,在觀察者的視覺上,就出現了動畫的效果。
2.3 利用畫面存儲再重放的方法
如同製作幻燈片一樣,將整個動畫過程變成一個個片斷,然後存儲到顯示緩沖區內,當把它們按順序重放到屏幕上時,就出現了動畫效果。
2.4 直接對圖像動態存儲器進行操作
利用顯示適配器上控制圖像顯示的各種寄存器和圖像存儲器VRAM,對其進行直接操作和控制,從而可以高效快速的實現動畫效果。
上述4種方法均可以實現動畫效果,但其操作比較復雜,且在程序中要對圖像不斷進行存取操作,這需要耗費大量內存資源。下面的擦除法動畫設計可以解決上述問題。
3. 擦除法動畫設計原理
擦除法動畫設計方法在很多的動畫製作工具(如flash)中大量使用,但在程序設計中卻鮮有人用。它的設計原理是:利用同色原理,當圖形色與背景色相同時人眼不能感知。在動畫設計中,當在一個位置畫了一張圖像時,使圖像色與背景色相異,然後再到另一個位置畫一張圖像並使圖像色與背景色也相異,此時將先前畫的圖像在原位置再畫一張,並使圖像色與背景色相同,這樣人眼只能看到新畫的一張圖像而看不到先前畫的圖像,從而先前畫的圖像感覺被擦除了。這樣連續畫多張圖像並在每畫一張新的圖像,將原來的圖像擦除,從而在觀察者來看就實現了動畫的效果。
4. 擦除法的動畫設計實現
下面以一個上下翻滾的圓作為一個例子來講解在TurboC2.0開發環境下用C語言來實現動畫的設計過程,其中動畫設計的方法是擦除法。具體的實現步驟如下:
4.1 TC的圖形系統的初始化
TurboC2.0為用戶提供了一個功能強大的畫圖軟體庫,它包括圖形庫文件(graphics.lib),圖形頭文件(graphics.h)和許多圖形顯示器的驅動程序。在TurboC2.0開始進行圖形設計前必須對之進行初始化,使系統知道要用什麼類型的圖形顯示器的驅動程序,採用什麼模式的圖形方式,以及該適配器驅動程序的尋找路徑名。這個初始化的函數是initgraph()。在本程序中的初始化如下:
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");//圖形顯示器、顯示模式、路徑自動檢測
4.2 畫圖
setcolor(LIGHTRED);//設置圓的線條顏色為淡紅色
setlinestyle(0,0,1);//設置線條為形狀為實線,線寬為一點寬
setfillstyle(1, 10);//設置圓的填充式樣為以實填充,填充色為淡綠色
circle(300, 10+10*y,15);//畫一個圓心在坐標(300,10+10y),半徑為15的圓
這個地方我們需要畫一個圓(用draw()函數實現),並且設置圓的圓周線條的顏色(用setcolor()函數),設置線條類型(用setlinestyle()函數),設置圓的填充色和填充模式(用setfillstyle()函數),設置圓的填充色(用floodfill()),最後是畫圓(用circle()函數)。在本程序(draw()函數)中的代碼如下:
floodfill(300, 10+10*y, 12);//給圓填充如上stfillstyle中的淡綠色
為了實現擦除操作需在同一個位置再畫一個圓(用clear()函數實現),該操作只需將上面的畫圓函數(draw()函數)改動兩個設置即可,如下示:
setcolor(BLUE);//設置圓的線條顏色為藍色(與背景色相同)
setfillstyle(1, 10);//設置圓的填充式樣為以實填充,填充色為淡綠色
4.3 動畫實現
本部分是核心部分,先設置背景色為藍色(用setbkcolor()函數),再在屏幕上畫一個填充色為淡綠色的圓(draw()函數)。設置一個循環控制語句實現在屏幕上不同的位置畫圓,同時在每畫一個圓後作一個時間的延遲(用delay()函數),再在延遲後實現擦除操作,即調用clear()函數。其流程圖及代碼如下:
setbkcolor(BLUE);//設置背景色為藍色
for(j=20;j>0;j=j-4)//控制動畫實現的次數為20次
{ for(i=j;i<30;i++)//實現動畫從上向下閃爍
{ draw(i);//畫圓
delay(100000);//延遲0.1秒
clear(i);//擦除已畫的圓
}
for(i=30;i>j;i--)//實現動畫從下向上閃爍
{ draw(i);//畫圓
delay(100000);//延遲0.1秒
clear(i);//擦除已畫的圓
}
}
動畫實現後的最後效果圖如下示。
4.4 關閉圖形系統
當圖形實現結束後需要關閉圖形系統,利用函數closegraph()即可實現。
5. 總結
擦除法動畫設計原理易於理解,便於操作。並且它的程序運行所需內存空間也比上述四種常用方法要少得多,因為它在程序執行過程中不需將圖形存入內存再從內存調出,這節省了大量的內存空間。如果程序運行在內存緊張的環境中,如嵌入式系統中,這種方法尤其適用
『陸』 單片機c語言編程100個實例
51單片機C語言編程實例 基礎知識:51單片機編程基礎 單片機的外部結構: 1. DIP40雙列直插; 2. P0,P1,P2,P3四個8位準雙向I/O引腳;(作為I/O輸入時,要先輸出高電平) 3. 電源VCC(PIN40)和地線GND(PIN20); 4. 高電平復位RESET(PIN9);(10uF電容接VCC與RESET,即可實現上電復位) 5. 內置振盪電路,外部只要接晶體至X1(PIN18)和X0(PIN19);(頻率為主頻的12倍) 6. 程序配置EA(PIN31)接高電平VCC;(運行單片機內部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 單片機內部I/O部件:(所為學習單片機,實際上就是編程式控制制以下I/O部件,完成指定任務) 1. 四個8位通用I/O埠,對應引腳P0、P1、P2和P3; 2. 兩個16位定時計數器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一個串列通信介面;(SCON,SBUF) 4. 一個中斷控制器;(IE,IP) 針對AT89C52單片機,頭文件AT89x52.h給出了SFR特殊功能寄存器所有埠的定義。 C語言編程基礎: 1. 十六進製表示位元組0x5a:二進制為01011010B;0x6E為01101110。 2. 如果將一個16位二進數賦給一個8位的位元組變數,則自動截斷為低8位,而丟掉高8位。 3. ++var表示對變數var先增一;var—表示對變數後減一。 4. x |= 0x0f;表示為 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示給變數TMOD的低四位賦值0x5,而不改變TMOD的高四位。 6. While( 1 ); 表示無限執行該語句,即死循環。語句後的分號表示空循環體,也就是{;} 在某引腳輸出高電平的編程方法:(比如P1.3(PIN4)引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P1.3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_3 = 1; //給P1_3賦值1,引腳P1.3就能輸出高電平VCC 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 注意:P0的每個引腳要輸出高電平時,必須外接上拉電阻(如4K7)至VCC電源。 在某引腳輸出低電平的編程方法:(比如P2.7引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2.7 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P2_7 = 0; //給P2_7賦值0,引腳P2.7就能輸出低電平GND 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 在某引腳輸出方波編程方法:(比如P3.1引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P3.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 5. { 6. P3_1 = 1; //給P3_1賦值1,引腳P3.1就能輸出高電平VCC 7. P3_1 = 0; //給P3_1賦值0,引腳P3.1就能輸出低電平GND 8. } //由於一直為真,所以不斷輸出高、低、高、低……,從而形成方波 9. } 將某引腳的輸入電平取反後,從另一個引腳輸出:( 比如 P0.4 = NOT( P1.1) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P0.4和P1.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_1 = 1; //初始化。P1.1作為輸入,必須輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { 7. if( P1_1 == 1 ) //讀取P1.1,就是認為P1.1為輸入,如果P1.1輸入高電平VCC 8. { P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 2 51單片機C語言編程實例 9. else //否則P1.1輸入為低電平GND 10. //{ P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 11. { P0_4 = 1; } //給P0_4賦值1,引腳P0.4就能輸出高電平VCC 12. } //由於一直為真,所以不斷根據P1.1的輸入情況,改變P0.4的輸出電平 13. } 將某埠8個引腳輸入電平,低四位取反後,從另一個埠8個引腳輸出:( 比如 P2 = NOT( P3 ) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2和P3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P3 = 0xff; //初始化。P3作為輸入,必須輸出高電平,同時給P3口的8個引腳輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { //取反的方法是異或1,而不取反的方法則是異或0 7. P2 = P3^0x0f //讀取P3,就是認為P3為輸入,低四位異或者1,即取反,然後輸出 8. } //由於一直為真,所以不斷將P3取反輸出到P2 9. } 注意:一個位元組的8位D7、D6至D0,分別輸出到P3.7、P3.6至P3.0,比如P3=0x0f,則P3.7、P3.6、P3.5、P3.4四個引腳都輸出低電平,而P3.3、P3.2、P3.1、P3.0四個引腳都輸出高電平。同樣,輸入一個埠P2,即是將P2.7、P2.6至P2.0,讀入到一個位元組的8位D7、D6至D0。 第一節:單數碼管按鍵顯示 單片機最小系統的硬體原理接線圖: 1. 接電源:VCC(PIN40)、GND(PIN20)。加接退耦電容0.1uF 2. 接晶體:X1(PIN18)、X2(PIN19)。注意標出晶體頻率(選用12MHz),還有輔助電容30pF 3. 接復位:RES(PIN9)。接上電復位電路,以及手動復位電路,分析復位工作原理 4. 接配置:EA(PIN31)。說明原因。 發光二極的控制:單片機I/O輸出 將一發光二極體LED的正極(陽極)接P1.1,LED的負極(陰極)接地GND。只要P1.1輸出高電平VCC,LED就正向導通(導通時LED上的壓降大於1V),有電流流過LED,至發LED發亮。實際上由於P1.1高電平輸出電阻為10K,起到輸出限流的作用,所以流過LED的電流小於(5V-1V)/10K = 0.4mA。只要P1.1輸出低電平GND,實際小於0.3V,LED就不能導通,結果LED不亮。 開關雙鍵的輸入:輸入先輸出高 一個按鍵KEY_ON接在P1.6與GND之間,另一個按鍵KEY_OFF接P1.7與GND之間,按KEY_ON後LED亮,按KEY_OFF後LED滅。同時按下LED半亮,LED保持後松開鍵的狀態,即ON亮OFF滅。 代碼 1. #include <at89x52.h> 2. #define LED P1^1 //用符號LED代替P1_1 3. #define KEY_ON P1^6 //用符號KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符號KEY_OFF代替P1_7 5. void main( void ) //單片機復位後的執行入口,void表示空,無輸入參數,無返回值 6. { 7. KEY_ON = 1; //作為輸入,首先輸出高,接下KEY_ON,P1.6則接地為0,否則輸入為1 8. KEY_OFF = 1; //作為輸入,首先輸出高,接下KEY_OFF,P1.7則接地為0,否則輸入為1 9. While( 1 ) //永遠為真,所以永遠循環執行如下括弧內所有語句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1輸出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1輸出低,LED滅 13. } //松開鍵後,都不給LED賦值,所以LED保持最後按鍵狀態。 14. //同時按下時,LED不斷亮滅,各佔一半時間,交替頻率很快,由於人眼慣性,看上去為半亮態 15. } 數碼管的接法和驅動原理 一支七段數碼管實際由8個發光二極體構成,其中7個組形構成數字8的七段筆畫,所以稱為七段數碼管,而餘下的1個發光二極體作為小數點。作為習慣,分別給8個發光二極體標上記號:a,b,c,d,e,f,g,h。對應8的頂上一畫,按順時針方向排,中間一畫為g,小數點為h。 我們通常又將各二極與一個位元組的8位對應,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相應8個發光二極體正好與單片機一個埠Pn的8個引腳連接,這樣單片機就可以通過引腳輸出高低電平控制8個發光二極的亮與滅,從而顯示各種數字和符號;對應位元組,引腳接法為:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果將8個發光二極體的負極(陰極)內接在一起,作為數碼管的一個引腳,這種數碼管則被稱為共陰數碼管,共同的引腳則稱為共陰極,8個正極則為段極。否則,如果是將正極(陽極)內接在一起引出的,則稱為共陽數碼管,共同的引腳則稱為共陽極,8個負極則為段極。 以單支共陰數碼管為例,可將段極接到某埠Pn,共陰極接GND,則可編寫出對應十六進制碼的七段碼表位元組數據
『柒』 求C語言的大項目
朋友我這有幾個哈。你可以看看 一. 設計題目: 圖書管理系統 1. 新書入庫: 圖書信息包括書名, 書號, 庫存量, 現存量共4項. 首先輸入3本書的信息, 並將其存入文件 」book.dat」 中. 當有新書入庫時, 先判斷文件中是否有此書( 即比較書名 ), 若有則修改庫存量, 現存量的信息; 若無此書, 則將該書的信息添加到文件中. 2. 圖書查詢: 輸入一個書號, 在文件中查找此書, 若找到則輸出此書的全部信息; 若找不到則輸出查找失敗的信息. 3. 借閱管理 (1) 每個讀者的信息包括姓名, 編號, 1張借書卡( 限借一本書 ), 輸入3個讀者的信息存入文件 「reader . dat」 中. (2) 借書登記: 輸入讀者的姓名, 所借圖書的書號, 先判斷姓名是否在文件」reader.dat」 中, 若有則將書號存入一張借書卡上( 注: 初始時借書卡的信息都為零, 借書後借書卡的信息改為所借書的書號), 並修改文件」reader.dat」的相應內容, 同時修改文件」book.dat」中此書的現存量. 若」reader.dat」無此姓名, 則應提示錯誤 (3) 還書管理: 輸入讀者的姓名, 所還圖書的書號, 將借書卡的信息置為零, 並修改文件」reader.dat」的相應內容, 同時修改文件」book.dat」中此書的現存量. 4. 輸出全部圖書信息和全部讀者信息 5. 退出系統. 二. 設計題目: 航空訂票系統 1. 航線信息: 每條航線信息包括航班號, 飛機號, 目的地, 訂票數, 余票數共5項. 假設現在有3條航線, 目的地分別是北京, 上海, 廣州, 飛機上可乘坐100人( 即初始訂票數為0, 余票數為100) , 將這3條航線信息存入文件」airline.dat」 中. 2. 訂票業務 (1) 客戶信息包括姓名, 航班號, 座位號(初始為0), 假設已有3個客戶信息存入文件」customer.dat」中. (2) 有新客戶訂票時, 先輸入客戶的姓名和他提出的航班號, 查詢該航線的訂票情況, 若有餘票, 則為客戶辦理訂票手續, 分配給客戶一個座位號, 然後將新客戶的信息添加到文件」customer.dat」中, 並修改文件」airline.dat」中該航線的訂票數和余票數. 若無余票, 則輸出客滿信息. 3. 退票業務: 根據客戶提出的航班號, 辦理退票, 從文件」customer.dat」中刪除該客戶的信息, 並修改文件」airline.dat」中相應航線的訂票數和余票數. 4. 輸出全部航線信息和全部客戶信息. 5. 退出系統. 三. 設計題目: 銷售管理系統 1. 銷售員信息: 每個銷售員包括姓名, 編號, 產品1銷售額, 產品2銷售額, 總銷售額共5項信息. 首先輸入3個銷售員的信息存入文件」sailer.dat」中. 2. 排序: 按產品1的銷售額進行排序, 將排序後的信息存入文件 」sailer1.dat」中, 按產品2的銷售額進行排序, 將排序後的信息存入文件」sailer2.dat」中, 按總銷售額進行排序, 將排序後的信息存入文件 」sailer3.dat」 中 3. 統計: 分別統計產品1的總銷售額和產品2的總銷售額並進行輸出 4. 銷售員的增加: 增加一個銷售員的信息, 先將其添加到文件」sailer.dat」中, 然後按其總銷售額進行插入排序, 排序後的信息仍存入文件」sailer3.dat」中. 5. 銷售員的減少: 輸入一個銷售員的姓名, 從文件」sailer.dat」中將其刪除. 6. 輸出全部銷售員的信息 7. 退出系統 四. 設計題目: 停車場管理 1.有一個兩層的停車場, 每層有6個車位, 當第一層車停滿後才允許使用第二層. ( 停車場可用一個二維數組實現, 每個數組元素存放一個車牌號 ) 每輛車的信息包括車牌號, 層號, 車位號, 停車時間共4項. 其中停車時間按分鍾計算 2. 假設停車場初始狀態為第一層已經停有4輛車, 其車位號依次為1—4 , 停車時間依次為20, 15, 10 , 5 . 即先將這四輛車的信息存入文件」car.dat」中( 數組的對應元素也要進行賦值 ) 3. 停車操作: 當一輛車進入停車場時, 先輸入其車牌號, 再為它分配一個層號和一個車位號(分配前先查詢車位的使用情況, 如果第一層有空則必須停在第一層), 停車時間設為5 , 最後將新停入的汽車的信息添加文件」car.dat」中, 並將在此之前的所有車的停車時間加5. 4. 收費管理(取車): 當有車離開時, 輸入其車牌號, 先按其停車時間計算費用, 每5分鍾0.2元. (停車費用可設置一個變數進行保存), 同時從文件」car.dat」中刪除該車的信息, 並將該車對應的車位設置為可使用狀態(即二維數組對應元素清零). 按用戶的選擇來判斷是否要輸出停車收費的總計. 5. 輸出停車場中全部車輛的信息. 6. 退出系統. 五. 為小型會議設計一個參會人員管理程序。 要求: (1)登錄參會人員的下列信息: ·姓名(name); ·性別(sex); ·年齡(age); ·單位(department) ·房間號(room-num)(設每個房間只住一人,房間號為101#—120#,…..,501#—520#)。 (2)主菜單應至少包括以下幾個菜單項: 人員登錄、顯示報到人員信息、查詢、統計、修改、刪除 (3)程序應分別用幾個個函數實現以上功能: ·隨時對報到人員進行登錄(login),來客登記的房間是根據客人要求分配的;如果客人申請的房間已有人登記了,可以讓客人重新申請;如果所有的房間都已經住滿,則拒絕再進行人員登錄; ·隨時按所住房間號(由小到大)輸出(print)已報到人員信息; ·能夠根據姓名實現對人員信息的查詢; ·能夠根據單位對與會人員進行分類統計,並輸出統計結果; ·能夠修改與會人員的信息; ·能夠刪除某個參會人員,並清空其所住房間; (4)程序中的變數要使用題中給定的英文名詞。 六、 設計題目:建通訊錄,並對它進行增加、查詢、修改、刪除、顯示記錄等操作。 第一個模塊——主函數main()的功能是:根據選單的選項調用各函數,並完成相應的功能。 第二個模塊——Menu()的功能是:顯示英文提示選單。 第三個模塊——Quit()的功能是:退出選單。 第四個模塊——Create()的功能是:創建新的通訊錄。 第五個模塊——Add()的功能是:在通訊錄的末尾,寫入新的信息,並返回選單。 第六個模塊——Find()的功能是:查詢某人的信息,如果找到了,則顯示該人的信息,如果未找到,則提示通訊錄中沒有此人的信息,並返回選單。 第七個模塊——Alter()的功能是:修改某人的信息,如果未找到要修改的人,則提示通訊錄中沒有此人的信息,並返回選單。 第八個模塊——Delete()的功能是:刪除某人的信息,如果未找到要刪除的人,則提示通訊錄中沒有此人的信息,並返回選單。 第九個模塊——List()的功能是:顯示通訊錄中的所有記錄。 七、設計題目:動態演示漢諾塔問題的解決過程。(或用C語言設計一個動畫程序) 要求:在圖形模式下,能將每一次盤子的移動用動畫演示出來。 八、設計題目:迷宮問題。 要求: (1) 用戶可以自己建立一個大小隨意的迷宮。 (2) 從入口出發,找出所有出路。(最好用圖形化的方式演示) 九、題目:設計一個摸擬時鍾轉動的程序。 (一)、基本要求:設計的時鍾要美觀大方,既能摸擬機械鍾錶行走(有時針、分針和秒針),還要准確地利用數字顯示日期和時間。 (三)、創新要求:在基本要求達到後,進行創新設計,如增加整點報時功能,定時功能等。 (四)、設計方法 基本原理:在圖形模式下繪出時鍾的外表,利用dos.h中的gettime和getdate得到系統的時間和日期,然後利用繪圖函數顯示在屏幕上。 十、設計題目:編寫一個文本編輯器(記事本)。 要求:要有文本編輯器的基本功能,如打開、編輯、保存、修改等。 十一、設計題目:俄羅斯方塊游戲實現。 用戶的鍵盤控制如下: 左右箭頭(「<」和「>」:控制方塊的左右運動。 向下方的箭頭:控制方塊的加速運動,可以使方塊迅速下落到底部。 空格鍵:控制方塊的旋轉變換。 Esc鍵:退出遊戲。 設計總要求: 1. 有些題目要製作字元形式的菜單. 2. 不同的功能使用不同的函數實現. 3. 對程序進行必要的注釋. 4. 按下列要求書寫課程設計報告(必須要有) (1) 給出相關數據結構及說明; (2) 給出程序的結構流程; (3) 調試過程中出現的問題和解決方法; (4) 編程體會。 (5) 要有磁碟稿。
『捌』 用C語言都可以編寫什麼項目
用C什麼都可以做!!! 見過的如:操作系統,游戲,應用軟體... C是萬能的!
可能要問,那還要C++等其它語言來做什麼啊,答:C++支持面向對像的編程思想,對於大型的項目來說,面向對像的編程思想更易於管理和維護
實例源代碼網上一找一大堆
『玖』 C語言的經典編程例子
程序員》推薦C++ 圖書三人談
主持人:熊節(透明),《程序員》雜志編輯,C-View成員
嘉 賓:孟岩(夢魘),聯想公司掌上設備事業部應用開發處任職,C-View成員。與侯捷先生合譯《C++ Standard Library》一書
金尹(惡魔),上海天宇公司CTO,在《程序員》連載有「自由與繁榮的國度」系列文章
透明:「學C++用哪本書入門」,這是被問得最多的一個問題。但是哪一本書是最好的入門書?似乎很難找到答案。《C++ Primer》太厚,《Effective C++》對讀者要求比較高,《Essential C++》又常常被批評為「太淺」。
其實說穿了:no silver bullet。想從一本書學會C++,那是不可能的。有朋友問我如何學C++,我會建議他先去找本數據結構書,把裡面的習題全部用C++做一遍,然後再去看《Effective C++》。myan經常說「要在學習初期養成好習慣」,我對此頗不以為然。
個人認為,《Essential C++》適合作教材,《C++ Primer》適合作參考書,《Effective C++》適合作課外讀物。
惡魔:很後悔當初買了《C++ Primer》。因為從我個人角度來看,它的功能效用基本是和《The C++ Programming Language》重合。當然對於入門來說,它還是很不錯的。但是《C++ Primer》太厚,一來導致看書極其不方便,二來系統學習需要花比較長的時間。對於目前這個越來越快餐化的時代來說,的確有很多不適合的地方,不過可以作為初學者的參考書。現在我以一塊K3 CPU的代價把它借給了別人,希望我那位同事能夠從中得到一些益處。
如果已經具備了C基礎,我建議看國內的書,例如錢能的《 C++大學教程(第二版) 》。(如果沒有C的基礎還是看譚浩強的C語言)。這本書對C講得還算比較清晰,有很多習題值得一做,特別是最後的struct和union兩個部分。其中的一些演算法比較拖沓和繁瑣(比如樹和鏈表的遍歷演算法),讀者可以嘗試修改這些例子,作為最後對C語言的一些總結測試。
夢魘:這個問題讓我想起四五年前的情形。今天對於C++有一點認識的人,多半是從那幾年就開始學C++了。那時根本沒有品牌觀念。從書店裡找一本C++書,如果看著還算明白,就買下來。我記得那時候宛延闓、張國鋒、麥中凡教授的書都受到很高的贊譽。我個人最早的一本C++書是Greg Perry的一本書,今天想起來,其實是一本打著C++旗號的C語言教程。對我作用最大的一本書是國防科技出版社出版的一本書,書名記不得了,作者叫斯蒂芬·布萊哈。
透明:還記得以前曾批評過一本C++書,是北航出的,整本書就沒有出現過class關鍵字。那本書,說穿了其實只是介紹了C語言和iostream庫的用法,根本不能算C++。而當時我常常推薦的一本書是電子科技大學張松梅老師的C++教程。那本書,直到今天來看也沒有太大的問題,唯一的缺憾就是由於年代久遠,許多東西已經過時了。而對於一本技術書籍來說,「過時」是最不可接受的。
總體來說,那時使用C++的人真是在「盲人摸象」。不過這也有好處,就是對C++的很多細節能搞清楚,以後看到經典好書時比較容易理解;當然壞處就是概念不清,甚至都不知道C++和Visual C++、Borland C++到底有什麼不一樣。
夢魘:整個90年代,其實大部分人對於C++的認識都似是而非。一開始是等同於Borland C++,後來是等同於Visual C++和MFC。所以一般來說,打著BC和VC旗號的書賣得很好,人們覺得這就是C++。而我比較幸運,布萊哈的那本書雖然從現在的眼光來看談不上高超,但基本路子是對的。可能是因為原書是給UNIX程序員的培訓教材,所以沒有讓我一開始就形成「C++ == VC++」的認識。
其實一直到1996年,我們那裡搞計算機的都是唯Borland C++馬首是瞻的,到了VC 4.0出來,一下子格局全變了。1997年VC5推出之後,書店裡MFC書鋪天蓋地,學MFC的人,頭抬得都比別人高一些。不過現在看來,那時候大部分的MFC書都是三流貨色。我曾經有一段時間認為,那一批程序員中間有不少被誤導了。根本原因就是相對的封閉。
透明:我覺得一本書的價值有兩方面:第一,教給你實用的技術;第二,促使你去思考。對於一本介紹VC(或者說MFC)使用方法的書,我根本不希望它能促使我有什麼思考,所以我就一定要求它在技術上精益求精完美無瑕。我剛開始用VC的時候,買的第一本書就是潘愛民老師翻譯的《VC技術內幕》(第四版),沒有受到那些「三流貨色」的誤導,應該說是很幸運的。
夢魘:1999年機械工業出版社開始出版「計算機科學叢書」,其中的《Thinking in C++》第一版受到了廣泛的歡迎。其實我一直不認為這本書很出色,雖然拿過一次大獎。然而我們都得承認,這本書在C++書籍領域里第一次建立了品牌觀念,很多初學者開始知道,不是隨便買哪一本都一樣的。再往後就是2000年的《 深入淺出MFC(第二版) 》第二版,以及侯先生在《程序員》上發表的那一篇《C++/OOP大系》,加上整個大環境的變化,品牌觀念深入人心,C++書籍市場終於開始逐漸與世界同步。
回想往事,我的感覺是,那個需要戰戰兢兢選擇入門書的時代已經過去,今天的C++初學者,大可以放心地買口碑好、自己讀起來思路順暢的書,入門不再是太大的問題。還有一些程序員已經學了幾年C++,但看到今天出版的一些新書,感覺比較陌生,這也不是什麼問題。侯先生經常說「凡走過必留下足跡」,所謂「走彎路」,未必不是一件好事。
至於具體的推薦表,就不好一概而論了。總之在我的印象里,《Essential C++》、《C++ Primer》、錢能教授的C++教程,都不錯。甚至有人一上來就看Bjarne Stroustrup的《The C++ Programming Language》,只要他喜歡,也沒什麼不可以。
透明:我同意你的觀點。不管怎麼說,編程是門實踐性非常強的學問。要想對C++對象模型有深入的了解,最好的辦法就是寫一串程序去看結果;要想學會OOP,也只能從項目中學。對於初學者,最好的學習方法就是不停地寫程序,寫真正有用的程序,寫到有問題的時候就去查書,於是自然就會知道哪本書好哪本書不好。不過我們的教育制度能不能讓大學里的學生們有這樣的學習機會,我表示懷疑。
以我的經驗,學C++有兩個門檻:入門和使用。完全看不懂C++,這是一個門檻,但是只要有一本合適的入門書,很快就能跨過。要想真正用上C++,卻不是件很容易的事情。尤其對於學生來說,接觸到的東西多是「玩具」,很難有實戰的機會。所以經常看見有人問「C++到底能做什麼」,這是C++學習中一個比較麻煩的問題。我們都是做了相當長時間的C++程序之後才看到一些真正經典的書,也正是因為走了相當長的彎路之後才知道這些書的經典之所在。所謂彎路,我想也是一種必須的積累。就算一開始就看《Essential C++》和《C++ Primer》,沒有兩三年的時間恐怕還是難有所得。
惡魔:有兩句十分有道理的話,一是我大學的C語言老師說的「寫程序不如說是抄程序」,另一句是一網友說的「好的設計來自借鑒,天才的設計來自剽竊」。對於我這個理性批判主義者來說,這兩句話的確不太適合。但是無論從哪個角度來講,對於初學者來說,剽竊大師的作品是通向成功的最快捷徑。
我個人認為,對於C++的初學者來說,首先要確定自己專業領域內主要使用的特性的方向。因為C++的特性如此眾多,初學者想貪多基本是不可能成功的。C++的編程範式基本可以分為ADT+PP、GP和OO三個方向。對於ADT+PP範式來說,初學者的主要問題不是學習C++,而是學習C的使用。對於這樣的初學者,國內的幾本書還是寫得比較清楚,符合中國人的習慣,比如譚浩強的《C語言教程》、錢能的《C++語言大學教程》。這兩本書我首推第一本,因為這一本我潛心研究了一年,這本書當中很多程序是可以剽竊的,而且可以對這些程序進行加工和提升。比如結構這一章中,它所給出的用struct來實現鏈表、二叉樹的演算法是相當蹩腳的。學習ADT+PP的初學者將這本書揣摩透以後可以嘗試修改這兩個程序。另外這本書的第二版稍微涉及了一些關於「類」的內容。學習ADT+PP的初學者,可以不被OO中的一些專有特性擾亂自己的思路,對於類層次扁平、無繼承、無多態的程序編寫是有很大好處的。
透明:你好象比較推崇國內教授寫的書。現在社會上有種不好的風氣:一捧就捧上天,一貶就貶下地。就好象對待譚教授的書,前幾年是奉為經典,這幾年又有很多人使勁批評。學C++更是有點「崇洋媚外」,總是覺得初學就應該看《Essential C++》。我看這種觀點也是片面的。
惡魔:當然《Essential C++》也值得看看。但是我個人覺得這本書沒有譚浩強的《C語言教程》來得好。主要原因是:第一,C++的所有特性都點到了,但是不深,看了以後會三心二意沒有方向;第二,可以抄襲借鑒的例子太少。《C語言教程》中有很多有趣的問題,比如猴子吃桃、漢諾塔等等,這些例子對於剛剛涉及C/C++語言編程的人來說是學習編程很好的例子。《Essential C++》只能是前兩本書看透以後,作為學習C++特性的一個過渡性的書籍。讓讀者真正領略到什麼是C++的編程、和C編程的不同點在哪裡。
透明:我發現一個很有趣的現象:初學者往往喜歡問「哪本書比較好」,這讓我很是不解。這有點像一個剛學打籃球的人問「王治郅和科比誰比較厲害」。當然科比更厲害一些。但如果你是想學打籃球,這兩個人都非常非常有資格教你,你跟誰學都能學得很強——關鍵不是在於你選哪個老師,而是在於你自己用多少功夫去學。
透明:回到原來話題。學會了C++的語法,能看懂C++代碼之後,必須有些書來指導進階(或者叫指點迷津)。我覺得《設計模式》很好,能夠讓讀者看到一些精妙的用法。不過正如我經常說的,模式帶來的麻煩和好處一樣多,甚至麻煩還要更多。而且,C++本身的問題使得在C++中使用GoF模式愈加麻煩。
夢魘:《Design Patterns》這本書絕對是不可以沒有的,而且中英文版都不可少。最初我看中文版,說實話看不懂,但是也不覺得人家翻譯得不好,所以就想,大概是原文就很難懂,加上自己水平有限。於是總是想著再找幾本patterns的書來看。後來找到幾本書,口碑還不錯,不過水平高下,一比就出來了,還是那本《Design Patterns》最經典,最耐看。英文版出來之後,兩個版本對照看,明白多了。現在覺得,其實就設計模式來講,把這本看明白了就很不錯了,不用再花費很多心思找其他的書。我現在的包里始終夾著這本書,隨身攜帶,有備無患。
至於說設計模式的副作用,和可能帶來的弊端,我的體會也挺多。不過是這樣,我們想一想,究竟什麼情況下設計模式可以用得很好呢?一種是有經驗豐富的人引導,比如要是Robert Martin帶隊,你在某個地方用錯了設計模式,他就會指出來,說這里不對,將來會產生什麼樣的弊端。對於他來說,豐富的實踐經驗足以支持他進行「預測型」設計。但是大部分人沒這個能力,因此我們只好走第二條路和第三條路,就是「試探型」設計和「重構型」設計。遇到一個問題,你覺得用某種模式挺合適的,就大膽地用了,成功是積累經驗,發現不好,出了問題了,只好改回來,那也是積累教訓。這叫做「試探型」。至於重構,應該算是最有組織、成功率最高的工程化方法。先把問題「quick and dirty」地解決了,所有的暗礁都暴露出來,然後再根據實際情況採用合適的模式優化設計。現在XP和UP都高度重視refactory,UP在Elaboration和Construction階段都鼓勵抽出專門的iterations進行重構。所以說如果組織快速的軟體開發,當然比較傾向於這條路——打成功率嘛。
透明:講到重構,我順便說說《Refactoring》這本書的影響。從工程本身的角度來說,你所謂的「重構型設計」是沒有什麼問題的。但中國的開發者(也包括我在內)往往比較沖動,比較容易相信銀彈的存在。曾經有那麼一段時間,我在Java中嘗試過了重構的方法之後,又拿到C++中去嘗試。結果發現,在Java中速度非常快的重構過程,到C++中就被減慢了。究其原因,就是因為C++和Java的約束條件不同。拿著Java中成功的案例直接套C++,不失敗才怪。
所以,我必須說:《Refactoring》這本書很有價值。但對於C++程序員來說,它的價值是讓你思考,思考這種方法的可行性。如果一個C++程序員沒有打算遷移到Java,那麼我必須告訴他:《Refactoring》這本書不是讓你照著它用的,甚至不是讓你去相信它的。對於C++程序員,《Refactoring》全書可以放心相信的只有第13章,其他的部分,都必須非常謹慎地對待。
夢魘:我還要就「試探型」的方法多說兩句,我覺得對於個人發展來講,「試探」也是必不可少的,撞牆不可怕,高水平的人不都是撞出來的嗎?你失敗了一次,就知道這個模式有什麼潛在的問題,下次再用,就會多看幾步,像下棋似的。撞的多了,路數就出來了。
我不知道你們是否有這個感覺:用錯了模式,吃了虧,再回過頭去翻翻《Design Patterns》,看到人家早就指出來這個問題,不過就是那麼幾句話,原來看上去乾巴巴的,現在覺得句句都講到心坎上,GoF的形象馬上就高大起來,還帶著光環,感覺是既興奮又懊悔。
透明:現在回頭來看,我更欣賞myan推薦給我的《Designing Object-Oriented C++ Applications Using Booch Method》。這本書能夠幫助C++程序員理清思路培養習慣,可惜國內沒有引進。相比後來商業味濃厚的UML系列書籍,我覺得這本書對於面向對象的闡釋精闢獨到,至今未有能出其右者。
夢魘:剛才我們兩人都說到Robert Martin,他可是我的榜樣。那本1995年的《Designing Object Oriented C++ Application》,我覺得是每一個C++軟體工程師都應該反復研讀的書。可惜不僅國內沒有引進,在國外的名氣也不大。如果你覺得面向對象的那些道理你好像都明白,可就是一遇到實際問題就使不上勁,那這本書就是你的最佳導師。
提到理清思路,還有一本書不得不提,就是Andrew Koenig的《Ruminations On C++》。每個人都應該問自己,我學了這么多年的C++,究竟什麼是C++最基本的設計理念?遇到問題我第一個直覺是什麼?第一個試探型的解決方案應該具有那些特點?如果你不能給出明確的答案,就應該認真地去讀這本書,讀完了你就有了「主心骨」。
透明:插一句話,談談「推薦書」的問題。入門書基本上是放之四海而皆準的,所以推薦的意義也不大。而入門後的發展方向,每個人不同,這個時候就需要「高人」的指點。舉個例子:我學C++的時候,myan還不認識我,所以也沒有給我推薦書,我還是學過來了,所以即使你當時向我推薦了《Essential C++》或者《C++ Primer》,我也不會太感謝你;但在我認真研究OO的時候,你推薦Robert Martin那本書給我,對我幫助就特別大,而且我從別的地方也很難找到類似的推薦,所以我就很感謝你。
一個程序員,必須有framework的意識,要學會用framework,還要主動去分析framework(在這方面,《Design Patterns》能有一定的幫助)。但是,真正高質量、成氣候的framework的書恐怕也就只有針對MFC的。從這個角度來說,MFC縱有千般不是,C++程序員都非常有必要先去用它、熟悉它、研究它,甚至藉助《深入淺出MFC》這樣的書來剖析它。不然,很難有framework的意識和感覺。
當然,另一個framework也很好,那就是STL。不管用不用MFC、STL,對這兩個東西的掌握和理解都是極有幫助的。最近我又在看《深入淺出MFC》,雖然已經不用MFC編程了,但幫助是一定有的。
夢魘:MFC和STL方面,我還是比較推崇侯先生的兩本書《深入淺出MFC》和《STL源碼解析》。
《深入淺出MFC》這本書,名氣自然是大得不得了,不過也有不少人批評。其實書也沒有十全十美的,批評當然是少不了的,不過有的時候我看到有人評論這本書,把它跟Inside VC相比,真的是牛頭不對馬嘴。
你剛才其實說得很對,程序員應該有一點framework意識。而這本《深入淺出MFC》與其說是在講MFC編程,不如說通篇是在拿MFC為例分析Application Framework的架構和脈絡。所以無論你對於MFC本身是什麼態度,這本書對每一個C++程序員都有很大的益處。
透明:是的。《VC技術內幕》會告訴你「DYNAMIC_CREATE這個宏怎麼用」,《深入淺出MFC》則告訴你「DYNAMIC_CREATE這個宏是怎麼實現的」。所以,如果你只需要在VC下寫一些小應用程序,《深入淺出MFC》的價值並不太大;但是,如果你需要設計一個稍微大一點的東西(不一定是framework),MFC的設計思想就會有所幫助。
夢魘:另外,我覺得對於MFC也應該有一個公允的評價。過去是吹捧得天上有地下無,書店裡鋪天蓋地都是MFC的書,搞得大家只知有MFC,不知有C++,甚至直到現在還有人問:「我是學MFC呢,還是學C++?VC++是不是比C++更高級的語言?」MFC成了一尊神像,阻礙了人們的視線。所以得把它從神壇上拉下來。這就是過去一兩年有很多人,包括我在內批評MFC的一個目的。可是現在大家視野開闊了,.NET也出來了,MFC不再是神像了,少數人就開始以貶損MFC為樂了。我覺得這種態度是不對的。
什麼叫好的框架?我覺得在十幾年的時間能夠象MFC這樣保持穩定並且不斷進步的框架就是好的框架。可能我們在一些具體的設計問題上有不同看法,覺得「這個地方這么設計不是更漂亮嗎?」很多時候是的,但是這不重要,重要的是MFC成熟穩定、有十幾年的成功經驗,這是最了不起的東西。
另外一點,MFC中間包括著學習Win32 API編程的最佳資料。這是除了其framework方面之外的另一個亮點。我現在使用Win32 API開發,但是經常參考MFC的源代碼,收獲很大。
透明:STL方面,我對於剖析它的源代碼興趣並不大,畢竟裡面源代碼多是演算法問題。所以,《STL源碼剖析》我也只是隨便翻翻就束之高閣了。我覺得這本書用來做計算機系的數據結構和演算法教材不錯,不知道有沒有老師樂意這樣做。
對於STL,我的態度一向都是「應用至上」。不過,我一直認為SGI STL本身就是一本精彩的書,一本數據結構和演算法的經典參考書,同時也是泛型技術的參考書。想知道一個演算法是如何實現的,看看STL源代碼就行;想知道如何使用type traits,STL源代碼裡面也有例子。看別人寫的書,總覺得隔著一層紗,有點撓不到癢處的感覺。SGI STL的代碼寫得非常漂亮,一個C++程序員如果不看看這本書,實在是可惜。
夢魘:至於STL,除了《STL源碼解析》之外,我舉賢不避親,強烈推薦侯先生與我合譯的那本《The C++ Standard Library》。這本書質量之高是無需懷疑的。我現在手邊常備此書,隨時查閱,對我幫助很大。
透明:C++和Java相比,最大的優勢就是它沒有一個專門的公司來管它,最大的弱點也是它沒有一個專門的公司來管它。Java程序員在學會簡單的語法之後,立刻進入SUN提供的framework,一邊用這個現成的framework做實際開發,一邊在開發過程中繼續學習Java一些幽深的特性。而這個時候,C++程序員恐怕還在問「VC和BCB哪個好」呢。這無疑是浪費時間。
夢魘:剛才你說Java和C++的優劣,這個話題已經成了我們這個年代永不消失的聲波了。我也不想再談這個。不過有一點我得說清楚:現在我們很多用C++的人吃了不少苦頭,探過脖子去看看Java,覺得它真是太可愛了,這種印象是不準確的。另外,Java也不簡單,而且會越來越龐大復雜。在很多場合,Java還不具有競爭力。至於將來如何,我看有些Java愛好者也過分樂觀了,似乎計算機科學界幾十年解決不了的問題都可以借著Java的東風解決掉,恐怕沒那麼容易。
透明:那當然。我再次強調:No Silver Bullet。讀書很重要,但古人說「行萬里路,讀萬卷書」,還是把「行路」放在「讀書」前面。尤其對於技術書籍,如果它不能幫我解決問題、不能給我帶來非常實際的利益,那麼我是不會去讀它的。惡魔說得對,我們這個社會很快餐,我們這個行業尤其很快餐,我們也只能努力適應它。
『拾』 TMS320F2812原理及其C語言程序開發的二、內容簡介
《TMS320F2812原理及其C語言程序開發》共分12章。第1章為處理器的功能以及開發環境CCS的介紹,用簡單易懂的實例引領讀者入門。第2章為結合工程開發的C語言基礎介紹,重點是培養讀者C語言開發的基本能力。第3章為TMS320F2812外設的C語言程序開發,重點介紹外設的C語言構成,使讀者對TMS320F2812的外設編程有一個清楚的認識。第4~10章為TMS320F2812的外設介紹,重點介紹外設工作原理、寄存器位信息及功能,並且根據不同的外設提供詳細的C語言程序開發,可以使讀者對外設充分理解。第12章為以TMS320F2812為處理器的電氣平台開發介紹,重點介紹以處理器為核心的各模塊硬體設計、軟體開發,更好地提升讀者的開發能力。附錄中還介紹μC/OS-Ⅱ操作系統在TMS320F2812上移植及實時多任務管理。
《TMS320F2812原理及其C語言程序開發》適合學習DSP TMS320F2812的初級、中級用戶及有一定基礎的DSP設計開發人員,是DSP方面軟體和硬體工程師必備的工具書,也可以作為TMS320F2812 DSP愛好者的自學教材。此外,《TMS320F2812原理及其C語言程序開發》還可以作為高等院校相關專業的參考教材。
-------------------------------------------------------------------------------- 以F2812為核心的電氣平台的開發與設計
豐富的C語言程序開發實例
C語言的編程基礎和編程規范
詳細介紹F2812的外設原理和編程技巧
F2812的Boot ROM相關內容及多種啟動方式介紹
ADC外部校正原理
嵌入式項目流程管理知識介紹
μC/OS-Ⅱ系統在F2812上的移植,以及實時多任務管理 第1章 晶元功能概述、軟體介紹、項目流程管理研究
1.1 TMS320F2812性能概述
1.2 TMS320F2812結構概述
1.2.1 引腳分布
1.2.2 TMS320F2812引腳信號捕述
1.3 TMS320F2812功能概覽
1.3.1 存儲空間示意圖
1.3.2 簡要描述
1.4 DSP集成環境CCS介紹
1.4.1 CCS安裝
1.4.2 CCS配置軟體設置
1.4.3 CCS軟體慨述
1.4.4 File(文件)菜單介紹
1.4.5 Edit(編輯)菜單介紹
1.4.6 View(視圖)菜單介紹
1.4.7 Project(工程)菜單介紹
1.4.8 Debug(調試)菜單介紹
1.5 CCS工程管理
1.5.1 創建新的工程文件
1.5.2 編譯並運行程序
1.6 一個簡單的例子程序介紹
1.6.1 基本的程序代碼生成
1.6.2 具體的程序開發介紹
1.7 嵌入式項目開發流程管理
1.7.1 概述
1.7.2 項目啟動
1.7,3 項目計劃
1.7.4 項目研發
1.7.5 項目結束
第2章 C語言程序設計基礎
2.1 C語言數據結構及語法
2.1.1 C語言數據結構
2.1.2 C語言運算符與表達式
2.2 程序控制結構
2.2.1 if語句
2.2.2 switch語句
2.2.3 while語句
2.2.4 for語句
2.2.5 程序控制中的特殊運算符
2.3 數組
2.4 指引
2.5 函數
2.6 C語言編程規范
2.6.1 環境
2.6.2 語言規范
2.6.3 字元類
2.6.4 變情類型
2.6.5 函數聲明和定義
2.6.6 變數初始化
2.6.7 演算法類型轉換
2.6.8 編程風格
第3章 TMS320F2812外設的C語言程序設計
3.1 導言
3.2 傳統的#define方法
3.3 位定義和寄存器結構體定義方式
3.3.1 定義寄存器結構體
3.3.2 使用DATA_SECTION將寄存器結構體映射到地址空間
3.3.3 添加位定義
3.3.4 共同體定義
3.4 位操作和寄存器結構體定義方式的優點
3.5 對位或寄存器整體進行操作
3.6 一個特殊的例子(eCAN控制寄存器)
第4章 TMS320F2812系統控制及中斷
4.1 存儲空間
4.1.1 Flash存儲器
4.1.2 OTP存儲器
4.1.3 Flash和()TP寄存器
4.2 時鍾及系統控制
4.2.1 時鍾及系統控制概述
4.2.2 外設時鍾控制寄存器(PCLKCR)
4.2.3 系統控制和狀態寄存器(SCSR)
4.2.4 高/低速外設時鍾預定標寄存器(HISPCP/L()SPCP)
4.3 振盪器及鎖相環模塊
4.4 低功耗模式
4.5 F2812外設結構
4.5.1 外設結構寄存器
4.5.2 受EALLOW保護的寄存器
4.6 F2812外設中斷擴展模塊
4.6.1 PIE控制器概述
4.6.2 中斷操作步驟
4.6.3 向量表的映射
4.6.4 中斷源
4.6.5 復用中斷操作過程
4.6.6 使能/禁止復用外設中斷的程序步驟
4.6.7 外設向CPU發出的復州中斷請求流程
4.6.8 PIE向量表
4.6.9 P1E配置寄存器
4.6.10 中斷程序設計
4.7 看門狗模塊
4.7.1 看門狗模塊介紹
4.7.2 看門狗計數寄存器(WDCNTR)
4.7.3 看門狗復位寄存器(WDKEY)
4.7.4 看門狗控制寄存器(WDCR)
4.7.5 看門狗模塊程序設計
4.8 32位CPU定時器
4.8.1 TIMERxTIM寄存器
4.8.2 TIMERxPRD寄存器
4.8.3 TIMERxTCR寄存器
4.8.4 TIMERxTPR寄存器
4.8.5 定時器程序設計
4.9 通用輸入輸出口(GPI())
4.9.1 GPI()介紹
4.9.2 輸入限制
4.9.3 GPxMUX寄存器(功能選擇寄存器)
4.9.4 GPxDIR寄存器(方向控制寄存器)
4.9.5 GPxDAT衡存器(數據寄存器)
4.9.6 GPxSET寄存器(置位寄存器)
4.9.7 GPxCLEAR寄存器(清除寄存器)
4.9.8 GPxTOGGLE寄存器(取反觸發寄器)
4.9.9 寄存器位I/O引腳的映射
4.9.10 GPIO程序設計
第5章 TMS320F2812外部介面(XINTF)
5.1 外部接U功能概述
5.2 X1NTF配褂概述
5.2.1 政變XINTF配置和時序寄器的程序
5.2.2 XINTF時鍾
5.2.3 寫緩沖器
5.2.4 XINTF每個區域訪問的引導、激活、跟蹤的時序
5.2.5 XREADY信號采樣
5.2.6 區域切換
5.2.7 XMP/MC信號對XINTF的影響
5.3 引導、激活、跟蹤等待狀態的配置
5.4 XINTF寄存器
5.4.1 XINTF時序寄存器(XTIMINGx)
5.4.2 XINTF配性寄仔器(XINCNFx)
5.4.3 XBANK寄存器
5.5 信號描述
5.6 XINTF操作時序圖
5.7 XINTF應用開發及C語言程序設計
5.7.1 XINTF應用開發概述
5.7.2 XINTF模塊的C語言程序設計
第6章 TMS320F2812串列通信介面(SCI)
第7章 TMS3211F2812的串列外圍設備介面(SPI)
第8章 TMS320F2812增強型區域控制網路(eCAN)模塊
第9章 TMS320F2812模/數轉換(ADC)模 塊
第10章 TMS320F2812事件管理器(EV)模塊
第11章 Boot ROM介紹和F2812程序模擬與下載
第12章 基於TMS320F2812的電氣平台開發設計
附錄 μC/OS-Ⅱ操作系統在F2812上移植及實時多任務管理
參考文獻
……