c語言程序設計12篇
c語言程序設計(1)
吉林工程技術師范學院
《C語言程序》課程設計報告書
設計題目: 貪吃蛇
專業: 計算機科學與技術 班級: 1042
學生姓名: 王薇 學號: 06
指導教師: 郭天嬌
2011年7月
信息工程學院
目錄
摘 要………………………………………………………………………….2
第一章 緒 論 3
第二章 問題定義 4
第三章 總體設計與詳細設計 5
1.程序的功能介紹
2.程序整體設計說明
3.設計思路
4.數據結構設計及用法說明
5.各模塊的功能及程序說明
6.程序結果
第四章 編碼實現 13
第五章 調試與測試 17
第六章 結論 20
附 錄 22
附錄一:源代碼 ...22
附錄二:參考文獻 29
摘 要
隨著社會的發展,人們生活的步調日益加快,越來越多的人加入了全球化的世界.人們不在拘泥于一小塊天地.加班,出差成了現代人不可避免的公務.而此時一款可以隨時隨地娛樂的游戲成了必需品.在手機和電腦成為人們日用品的社會,一款能在其上能便捷運行的游戲成為買家的參考點.現在我們所要介紹的這一款游戲----貪吃蛇,就是滿足以上要求而設計出來的,希望能給玩家帶來娛樂.貪吃蛇這一游戲簡單易行,操作方便,娛樂性較強,吸引了不少人.這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻起樂無窮,在人們不斷追求更多的欲望下,該游戲給人們帶來了追逐的快感,以及成功后的滿足感,對于一直處于高壓下的現代人是很好的放松工具.關鍵詞: 循環,分支,子函數的調用,鏈表,接口,子函數調用
第一章 緒論
貪吃蛇游戲是目前比較流行的游戲之一,很多操作系統或者流行軟件都會帶有這種游戲。它既能鍛煉思維的嚴密性,又有很多樂趣。我個人也比較喜歡玩這個游戲,因此,我就借這個機會將這個貪吃蛇游戲用C語言實現了出來,當然,我也借鑒了前人的一些技巧經驗。由于時間倉促和本人水平有限,此游戲的制作顯得有些粗糙,希望老師能夠諒解,我以后將會再接再厲。
貪吃蛇游戲是一款很有趣味的游戲,其開發過程有一定的技巧和方法,其中涉及到二維數組、鍵盤操作以及圖形化函數等方面的知識。本游戲的開發者需要基本掌握顯示器中斷寄存器的設置。二維數組及結構體的定義、鍵盤上鍵值的獲取、圖形方式下光標的顯示各定位,以及部分圖形函數的使用。
第二章 問題定義
貪吃蛇游戲是一個經典小游戲,一條蛇在封閉圍墻里,圍墻里隨機出現一個食物,通過按鍵盤四個光標鍵控制蛇向上下左右四個方向移動,蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記10分,接著又出現食物,等待蛇來吃,如果蛇在移動中撞到墻或身體交叉蛇頭撞倒自己身體游戲結束。
第三章 總體設計與詳細設計
1程序功能介紹貪吃蛇游戲是一個經典小游戲,一條蛇在封閉圍墻里,圍墻里隨機出現一個食物,通過按鍵盤四個光標鍵控制蛇向上下左右四個方向移動,蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記10分,接著又出現食物,等待蛇來吃,如果蛇在移動中撞到墻或身體交叉蛇頭撞倒自己身體游戲結束。
2程序整體設計說明一個游戲要有開始部分,運行部分,結束部分(實際上開始部分與運行部分是一體的)。
3設計思路
這個程序的關鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示。移動時必須從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當前方向上前移,當游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇,這時由于沒有慶平的原因,原來蛇的位置和新蛇的位置差一個單位,所以看起來社會多一節身體,所以將蛇的最后一節用背景色覆蓋。食物的出現和消失也是畫矩形塊和覆蓋矩形塊
4數據結構設計及用法說明
開始部分:
游戲是運行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設置了一個游戲的標題畫面,除了游戲標題畫面我還設置了一個歡迎畫面。標題畫面以后,還要為游戲的運行部分作初始化,包括繪制游戲運行時的背景,對游戲某些重 要變量的初始化。
運行部分:
作為游戲的核心部分,這里包括的函數比較多,也就是模塊比較多,首先讓我模擬一下貪吃蛇的游戲模式:某個世界上突然出現一條蛇,它很短,它的運動神經異常,它沒法停止自己的多動癥在它的世界里就只有食物,它很餓,也很貪吃;同樣在不明原因的情況下,食物從天而降,可惜的是沒有落到嘴邊;饑餓的主人公,不管它有沒有毒,也不問食物的來歷,徑直向食物爬去;它吃到食物啦,它超出想象的同化能力讓食物很快的成為自己身體的一部分,它的身子變長啦。當它吃到第一顆食物時,上帝有給它第二顆,于是它吃了第二顆,于是又變長了,于是又有第三顆……它的身子是一直的加長,它不管自己過長身體的麻煩——轉身不便,繼續吃下去,現在它是直接把巴張大,好讓食物有個綠色通道。但是在某天的下午,它咬到了自己,它才想起自己是一條毒蛇,于是暈死過去(不是毒死);又或者它往食物沖鋒的時候,它失去控制,撞到了墻上。
第一輪循環:第一步,出現食物;第二步,蛇不停運動;第三步,檢查蛇是撞到自己或墻壁;由第四步起游戲有兩條支線(A、B):
A :第四步,蛇沒有碰到自己或墻壁,蛇繼續前進,繪制蛇的動作;第五步,判斷蛇是否吃到食物,如果蛇吃到食物,身子變長,原來的食物消失;第六步,讓玩家輸入控制指令,讓蛇在下一輪循環的第二步改變運動方向;第七步,第二輪循環的第一步,重復第一輪的步驟;
B:第四步,蛇碰到自己或墻壁,終止游戲。
結束部分:
游戲結束時,顯示“GAME OVER”,已經是約定俗成的規律了,我的游戲也不例外。除了游戲結束畫面外,我還設置了一個游戲退出畫面,“善始善終”嘛。
有了上述的大致劃分,我把整個程序劃分成(13+2)個模塊(其實就是函數)程序結構(流程圖)
依據所需要處理的任務要求,規劃輸入數據和輸出結果,決定存放數據的數據結構。
C語言中數據結構集中體現在數據類型上,因此在進行C語言程序設計時,應統籌規劃程序中所使用的變量,數組,指針等,以及它們的類型等。這點是很重要的,如果在此期間選擇不合適的變量或者數組,將來修改就十分困難。
現在分析一下貪吃蛇游戲中的元素,繼而得出與它們對應的在程序中的描述:
蛇:
基本描述:長度,顏色,位置。
對應數據與數據類型:長度—雖然可以用坐標表示,但是這樣的話,運算量將很大,所以換算成較大的單位—節數,以固定長度的每節描述;坐標--整型;顏色--整型; 位置--X,Y坐標。
增加的描述:蛇運動的方向,蛇的生命。
對應數據與數據類型:這些描述是為了與程序的按鍵的輸入部分與判斷游戲結束部分相聯系而設的。方向只有四個方向:上下左右。可以設置與之對應的四個整型數:3、4、2、1。生命就只有兩種情況:死或生,對應0或1。
食物:
基本描述:顏色,位置。
對應數據與數據類型:由于顏色設成固定的,所以不再討論。位置—X、Y坐標。
增加的描述:食物的存在。
對應數據與數據類型:這是為了避免重復出現食物而設置的,與繪制食物的函數有聯系。只有兩個值:0或1(沒有食物或有食物)
其他的元素:墻,由于它在顯示上是作為背景而存在的,所以并沒有什么說明實際的墻壁就是四條直線組成的邊框,由坐標描述。
還需要的變量:鍵盤鍵入的鍵值(作為全局變量,整型);經常要使用的循環變量;自定義的填充圖案;說明文字的字符數組;游戲的記分;游戲的速度(蛇的速度)。
蛇的不停運動的關鍵算法的流程圖
5各模塊的功能及程序說明
主要模塊的實現思路和算法的流程圖說明:
關鍵所在——蛇不停移動的Snakemove():
蛇的不停移動,就是蛇的下一節取代前一節的位置,在計算機中就是蛇下一節的位置坐標變成前一節的位置坐標。在上文中,已定義蛇的位置坐標為數組類型,一組坐標對應一節的位置,假設有i+1節,由0到i節,第i節的坐標取第i-1節的坐標,第i-1節的坐標取第i-2節的坐標……直到第1節取第0節的坐標。而第0節的坐標,即蛇頭的坐標要往某個方向變化,變化量為蛇每節的長度。蛇的這種坐標輪換需要循環語句使其繼續下去。
6程序結果
運行程序得到如下初始界面圖:
程序結果圖
用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示:
程序結果圖
蛇沒有碰到自己或墻壁,蛇繼續前進:
程序結果圖
游戲結束時,顯示“GAME OVER”
第四章 編碼實現
1. 主函數main()
Main()函數主要實現了對整個程序的運行控制,以及相關功能模塊的調用。
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/
void main(void)
{
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}
2. 圖形驅動init()
Init()主要功能是初始化屏幕為圖形模式函數。
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
3. 開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/
for(i=50;i
c語言程序設計(2)
中南民族大學工商學院
計算機科學與技術系
項目名稱: 學生管理系統
學生姓名: 曾哲
學 號: 09081027
班 級: 09811
指導教師: 胡成松、劉瑩
2010年6月25日
1 實驗目的和意義
1.1 目的
本課程設計的目的就是要通過一次集中的強化訓練,使學生能及時鞏固已學的知識,補充未學的但又必要的內容。進行課程設計目的在于加深對程序設計基礎中基礎理論和基本知識的理解,促進理論與實踐的結合,進一步提高程序設計的能力。具體目的如下:
(1)使學生更深入地理解和掌握該課程中的有關基本概念,程序設計思想和方法;
(2)培養學生綜合運用所學知識獨立完成課題的能力;
(3)培養學生勇于探索、嚴謹推理、實事求是、有錯必改,用實踐來檢驗理論,全方位考慮問題等科學技術人員應具有的素質;
(4)提高學生對工作認真負責、一絲不茍,對同學團結友愛,協作攻關的基本素質;
(5)培養學生從資料文獻、科學實驗中獲得知識的能力,提高學生從別人經驗中找到解決問題的新途徑的悟性,初步培養工程意識和創新能力;
(6)對學生掌握知識的深度、運用理論去處理問題的能力、實驗能力、課程設計能力、書面及口頭表達能力進行考核;
(7) 復習鞏固C語言的基礎知識,進一步加深對C語言編程的理解和掌握;
(8) 利用所學知識,理論和實際結合,利用資源,采用模塊化的結構,使用模仿修改自主設計相結合的方法,鍛煉學生綜合分析解決實際問題的編程能力。
1.2 意義
(1)有利于基礎知識的理解
學生掌握了一些信息時代生存與發展必需的信息技術基礎知識和基本技能,具備了在日常生活與學習中應用信息技術解決問題的基本態度與基本能力。但是,學生對于程序、病毒的內涵,程序與文檔、數據的區別,計算機運行的機理等知識內容的理解比較膚淺。學生如果接觸了程度設計,就能真正理解,從而進一步打破計算機的神秘感。
(2)有利于邏輯思維的鍛煉
在許多常規學科的日常教學中,我們不難發現這樣一個現象,不少學生的思維常常處于混亂的狀態。寫起作文來前言不搭后語,解起數學題來步驟混亂,這些都是缺乏思維訓練的結果。程序設計是公認的、最能直接有效地訓練學生的創新思維,培養分析問題、解決問題能力的學科之一。即使一個簡單的程序,從任務分析、確定算法、界面布局、編寫代碼到調試運行,整個過程學生都需要有條理地構思,這中間有猜測設想、判斷推理的抽象思維訓練,也有分析問題、解決問題、預測目標等能力的培養。
(3)有利于與其他學科的整合
在程序設計中,我們可以解決其它學科有關問題,也利用其它課程的有關知識來解決信息技術中比較抽象很難理解的知識。在信息技術課中整合其它學科的知識,發揮信息技術的優勢。
(4)有利于治學態度的培養。
程序設計中,語句的語法和常量變量的定義都有嚴格的要求,有時輸了一個中文標點、打錯了一個字母,編譯就不通過,程序無法正常運行。因此,程序設計初學階段,學生經常會犯這樣的錯誤,可能要通過幾次乃至十多次的反復修改、調試,才能成功,但這種現象會隨著學習的深入而慢慢改觀。這當中就有一個嚴謹治學、一絲不茍的科學精神的培養,又有一個不怕失敗、百折不撓品格的鍛煉。
2 系統功能描述及設計
(1)系統以菜單的形式工作;
(2)學生信息的輸入,包括學生的姓名,性別,計算機的成績,數學成績,英語成績(其中學生的學號由系統自動生成);
(3)學生信息的瀏覽功能;
(4)學生信息的查找功能,包括學號的查找,姓名的查找;
(5)學生信息刪除功能(只提供學號刪除,避免姓名重復);
(6)學生成績的排序的功能,包括計算機成績、數學成績、英語成績的排序;
(7)學生信息的修改功能,包括學生信息的添加,修改(修改的功能的實現是通過學號來定位,然后找到該學生的信息修改用戶選擇的成績的選項);
(8)學生各科成績的統計功能,包括各個科目的最高分,最低分,及格率,各個分數段的學生人數以及該科目的平均分數。
圖2-1系統結構模塊圖
3 系統存儲結構設計與描述
3.1結構體數據定義
struct student //結構體數組定義
{
int id;
char name[15];
char sex[6];
float c,math,eng;
}stu[1000],stud;
定義了結構體數據,其中包括學生的學號、姓名、性別、計算機成績、數學成績和英語成績。成績定義為float形式,因為肯能會出現0.5分,因此不建議定義為整形變量。
3.2系統儲存函數
void save() //保存信息
{
FILE *fp;
fp=fopen("data.txt","wb");
if(fp==NULL)
{
printf("cannot open this file\n ");
return;
}
for(i=0;i
c語言程序設計(3)
中南大學
C語言程序設計實踐報告
題 目 學生信息管理系統
學生姓名
指導教師
學 院
專業班級
完成時間
目錄
一、系統功能介紹 3
二、系統功能模塊 4
2.1系統功能結構圖 4
2.2模塊功能介紹 4
三、數據結構設計 5
四、主要模塊算法說明 6
六、問題,解決方法及注意事項 12
七、課程設計總結 13
八、部分源程序代碼 14
一、系統功能介紹1.錄入學生信息:錄入學生的基本信息,如年齡,性別學號,班級;以及該學生選修課程的基本信息,如課程編號,學分。
2.數據查詢:按照姓名或者按照學號查詢,查詢學生基本信息,或者學生的成績信息。
3.輸出統計信息:按照平均成績由高到低的順序,輸出學生名單;輸出不及格的學生不及格的課程以及該門課程的平時、考試,綜合成績
4.刪除信息:刪除指定的學好的學生的所有信息。
5.修改數據:修改指定學號的學生信息,修改其基本信息或者課程信息。
6.插入數據:插入一個學生的完整信息到已有的學生信息庫中。
7.退出系統:退出系統,關閉程序。
二、系統功能模塊2.1系統功能結構圖2.2模塊功能介紹? 錄入數據模塊:錄入學生的基本信息,如年齡,性別學號,班級;以及該學生選修課程的基本信息,如課程編號,學分。同時可以自動計算每門課程的綜合成績,每個學生的平均成績。
? 查詢數據模塊:輸入一個學號,或者輸入一個姓名,輸出該學號的基本信息以及選修課程的各種信息。
? 統計信息模塊:輸出學生平均成績排名表,輸出不及格學生列表以及不及格學生的不及格課程的考試、平時及綜合成績。
? 刪除模塊:根據輸入的學號,將該學號的所有信息從學生信息庫中刪除。
? 修改模塊:修改輸入學號的學生的制定信息,其他信息不修改。
? 插入模塊:插入一個學生的信息到學生信息庫中。
? 排序模塊:對所有學生愛平均成績排序。
三、數據結構設計1. 變量類型
由于某個學生的各種信息是一個整體,不不能分別定義再引用,而且每個學生的選修課程含有編號、學分等信息,也屬于一個整體,因此我采用了學生信息結構體中嵌套課程信息結構體的方式定義數據。
struct course//定義課程結構體
{
int num;/*課程編號,定義為整型數據*/
float credit; /*課程學分,定義為浮點型數據*/
float usual;//以下為成績信息,均為浮點型數據
float exam;
float final;
};
struct student//定義學生結構體
{
int ID; /*學生編號,整形數據*/
char name[20];/*學生姓名,字符數組,大小20*/
int cla;/*班級信息,整型數據*/
char sex[2];/*性別信息,字符數組,大小2*/
int age;/*年齡,整型數據*/
struct course clanguage;//以下為三個struct course類型的課程
struct course math;
struct course pe;
float average;
}stu[30];/*定義學生結構體的大小*/
2.關于變量的作用域問題。
由于各個函數均要使用結構體數組中的所有成員或者部分成員,若采用參數傳遞方式對結構體成員進行調用,不簡潔而且返回值容易出錯,所以結構體變量及學生人數都定義為全局變量,便于使用。
四、主要模塊算法說明1. 主函數 void main()
先調用主界面函數,打印出主界面,在調用菜單函數。
2. 菜單函數 void menu()
先打印出各個功能以及對應的數字選項,然后利用scanf語句輸入選項,利用switch語句的多選擇性,設置不同的case,進入相應的分功能函數。
3. 輸入數據函數 void enter()
函數開始利用scanf語句確定輸入的人數p,接著使用循環控制語句,分別錄入學生的所有基本信息。對于學生課程信息,由于課程編號以及學分固定,因此采用直接賦值方式在循環體中初始化;每個學生的每個課程的綜合成績、每個學生的平均成績通過在循環體中調用calculate(int i)函數實現。最后調用sort函數,對所有學生按平均成績排序。
4. 查詢信息函數 void inquire ()
此模塊包含兩個小的模塊,一為inquire_ID()函數模塊,一為inquire_name()函數模塊。通過if語句,根據輸入的數字進入不同查詢函數。
查詢過程的具體實現:先輸入一個學號或者姓名,是這一個變量flag,初值為0。如果找到了該學號,flag的值變為1,同時將此時的i值賦給變量k,起到標記變量的作用。接著判斷flag的值,if(flag)輸出查找學生的信息,否則通過scanf語句輸入選項,執行返回主菜單或者重新輸入兩個語句之一。
5. 信息統計函數 void census_output()
通過輸入選項1、2,進入平均成績查詢或者不及格學生名單查詢。
輸出平均成績:利用循環語句,依次從高到低輸出各個學生的信息。
輸出不及格學生名單:利用循環語句,在循環語句中判斷每個學生每門課程的綜合成績是否小于60,小于60,則輸出學生該門課程的平時、考試、綜合成績。并且還設置了flag變量,在循環外賦值為0,開始循環以后,每找到一門不及格成績,flag++,循環結束以后,判斷flag的值,如果不為零,不運行任何指令,否則輸出“無成績不及格學生”的提示信息。
6. 刪除信息函數 void dele()
輸入一個學號,然后利用循環語句,找到刪除位置,與查詢類似,設置flag變量,初始值為0,找到學號后,flag的值變為1,利用變量k=i標記該位置。緊接著,判斷flag的值,if(flag),利用循環語句for(i=k;i
c語言程序設計(4)
1.
高級語言(C)課程設計
2012 年 7 月 4日·北京
一、 任務書*************************************2
二、 小組成員情況*******************************2
三、 總體設計***********************************2
四、 模塊劃分及功能*****************************3
五、 算法說明***********************************4
六、 框架圖*************************************6
七、 流程圖*************************************8
八、 源程序清單*********************************12
九、 程序測試***********************************26
一十、 結論、體會及建議***************************32
一十一、 附:參考文獻資料************************33
一、任務書
題目6:小型通訊錄設計
功能:實現簡單的通訊錄信息管理,基本信息包括編號、姓名、手機、郵編、地址、關系、性別、生日、QQ、e-mail.
基本要求:
1.設計簡單的菜單,能夠進行系統功能選擇。
2. 實現信息的錄入功能。
3. 在已有信息的基礎上添加新的記錄。
4. 刪除指定編號的記錄。
5. 復制指定編號的記錄
6. 實現信息的瀏覽功能
7. 按編號查詢功能
8. 按手機號排序功能
二.小組成員情況
組長:李海霞 學號:5120110752 負責:文件導出、刪除、排序、復制、輸出
組員:孫琳 學號:5120110723 負責:主菜單、添加、查詢、保存退出
另外:主函數,結構體定義,函數聲明,文件及實驗報告,雖有分工,但是大多數內容是有兩人討論后共同完成的。期間各自編寫函數的過程中遇到的問題均由兩人共同商討,以及詢問老師后,一起解決的。
三、總體設計
利用struct record定義數據結構,用void聲明函數,用開關語句switch, case分開事件進行程序,實現系統功能選擇,利用if,while語句判斷函數,for語句實現循環,利用printf和scanf進行輸出與輸入,用getch()輸入字符串,最終實現通訊錄功能。
通訊錄中的記錄項用結構體record表示,包含10個屬性:id、name、phone 、address、postcode、e-mail、relation、QQ、sex、birthday分別代表用戶的編號、姓名、電話、地址、郵編、e_mail、關系、QQ 、性別、生日。
1、結構體數組:
struct record //定義一個結構體數組
{
char id[10]; //編號
char name[20];//姓名
char phone[20];//電話
char adress[40]; //地址
char postcode[10]; //郵編
char e_mail[30]; //e_mail
char relation[20];//關系
char QQ[20];//QQ
char sex[10];//性別
char birthday[20];//生日
}student[500];
2、包括的函數:
void mainmenu();//主菜單
void readfromfile();//讀取文件
void newrecord();//新添紀錄
void showall();//輸出記錄
void searchmenu();//查詢菜單
void searchbyid();//按編號查詢
void searchbyname();//按姓名查詢
void searchbyphone();//按電話查詢
void deletemenu();//刪除菜單
void deleteall();//刪除所有
void deleteone();//刪除單個
void deletebyid();//按編號刪除
void deletebyname();//按姓名刪除
void listmenu();//排序菜單
void listbyid();//按編號排序
void listbyname();//按姓名排序
void copy();//復制菜單
void writetofile();//保存退出
四、模塊劃分及功能
主模塊:main()//主函數
其他模塊:
模塊一:void mainmenu(); //主菜單
模塊二:void readfromfile(); //讀取文件
模塊三:void newrecord(); //新添紀錄
模塊四:void showall(); //輸出記錄
模塊五:void searchmenu(); //查詢菜單
模塊六:void searchbyid(); //按編號查詢
模塊七:void searchbyname(); //按姓名查詢
模塊八:void searchbyphone(); //按電話查詢
模塊九:void deletemenu(); //刪除菜單
模塊十:void deleteall(); //刪除所有
模塊十一:void deleteone(); //刪除單個
模塊十二:void deletebyid(); //按編號刪除
模塊十三:void deletebyname(); //按姓名刪除
模塊十四:void listmenu(); //排序菜單
模塊十五:void listbyid(); //按編號排序
模塊十六:void listbyname(); //按姓名排序
模塊十七:void copy(); //復制菜單
模塊十八:void writetofile(); //保存退出
五、算法說明:
1.通訊錄中的記錄項用結構體record表示,包含10個屬性。
2.主菜單:利用switch語句進行選擇所需功能;輸入“1”會進入“新添記錄”的界面;輸入“2”進入“輸出記錄”的界面;輸入“3”會進入“查詢菜單”的界面;輸入“4”進入“刪除記錄”的界面;輸入“5”進入“記錄排序”的界面;輸入“7”進入“保存退出”的界面;輸入“8”進入“不保存退出”的界面。
3.添加記錄:利用printf()函數和scanf() 函數實現按要求輸入信息,再利用if()語句實現是否繼續添加記錄。
4.輸出記錄:利用for循環和if語句實現全部輸出;
5.查詢菜單:利用switch選擇查詢方式。在查詢菜單中輸入“1”進入“按編號查詢”界面;輸入“2”進入“按姓名查詢”界面;輸入“3”進入“按電話查詢”
界面;輸入“4”進入“主菜單”界面。
6.按編號查詢:利用for循環從第一條記錄到最后一條記錄進行查找,再利用if語句判斷要查找的記錄和待比較的編號是否相等,如找到相同的記錄,就輸出此人的全部信息,如果沒有找到就顯示“沒有此人的信息”。
7.按姓名查詢:利用for循環從第一條記錄到最后一條記錄進行查找,再利用if語句判斷要查找的記錄和待比較的姓名是否相等,如找到相同的記錄,就輸出此人的全部信息,再內嵌一個if語句進行查找相同名字的人的信息,再內嵌一個if語句繼續查找,若不繼續查找就輸出“沒有相同姓名的學生紀錄按任意鍵返回主菜單”,如果一開始沒有找到就顯示“沒有此人的信息”。
8.按電話號查詢:利用for循環從第一條記錄到最后一條記錄進行查找,再利用if語句判斷要查找的記錄和待比較的電話號碼是否相等,如找到相同的記錄,就輸出此人的全部信息,如果沒有找到就顯示“沒有此人的信”。
9.刪除菜單:利用switch語句進行選擇所需功能;輸入“1”會進入“刪除所有”的界面;輸入“2”進入“刪除單個”的界面;輸入“3”會進入“返回主菜單”的界面。
10.刪除所有:利用if 語句進行是否全部刪除。
11.刪除單個:利用switch語句選擇刪除方式,輸入“1”進入“按電話號碼刪除”
界面;輸入“2”進入“按姓名刪除”界面。
11.按電話號碼刪除:利用if語句進行判斷是否有記錄,再利用for循環進行查找信息,如果找到,就顯示所有要刪除的信息,再利用if語句進行是否刪除,內嵌for循環,把記錄前移,內嵌if 語句實現是否繼續刪除。
12.按姓名刪除:利用if語句進行判斷是否有記錄,再利用for循環進行查找信息,如果找到,就顯示所有要刪除的信息,再利用if語句進行是否刪除,內嵌for循環,把記錄前移,內嵌if 語句實現是否刪除相同姓名的同學信息
13.利用switch語句實現排序選擇,輸入“1”會進入“按電話排序的界面;輸入“2”進入“按姓名排序”的界面;輸入“3”會進入“返回主菜單”的界面。
14.按電話號碼排序:利用for循環和if語句以及do….while實現升序,再利用if語句實現是否顯示排序后的信息,調用顯示函數。
15.按姓名排序排序:利用for循環和if語句以及do….while實現升序,再利用if語句實現是否顯示排序后的信息,調用顯示函數。
六、框架圖:
七.流程圖:
八、源程序清單
#include
#include
#include //控制字符串
#include //控制臺輸入輸出
struct record //定義一個結構體數組
{
char id[10]; //編號
char name[20];//姓名
char phone[20];//電話
char adress[40]; //地址
char postcode[10]; //郵編
char e_mail[30]; //e_mail
char relation[20];//關系
char QQ[20];//QQ
char sex[10];//性別
char birthday[20];//生日
}student[500];
int num=0;//外部變量num為文件中的紀錄數
FILE *p; //定義一個指向文件的指針變量p
void mainmenu();//主菜單
void readfromfile();//讀取文件
void newrecord();//新添紀錄
void showall();//輸出記錄
void searchmenu();//查詢菜單
void searchbyid();//按編號查詢
void searchbyname();//按姓名查詢
void searchbyphone();//按電話查詢
void deletemenu();//刪除菜單
void deleteall();//刪除所有
void deleteone();//刪除單個
void deletebyphone();//按電話號碼刪除
void deletebyname();//按姓名刪除
void listmenu();//排序菜單
void listbyphone();//按電話號碼排序
void listbyname();//按姓名排序
void copy();//復制菜單
void writetofile();//保存退出
void main()
{
readfromfile();
while (1)
{
mainmenu();
}
}
void readfromfile()//從文件導出,判斷是否有通訊錄
{
if((p=fopen("student.txt","rb"))==NULL) //將fopen函數的返回值賦給指針變量P,打開輸入文件student.txt
{
printf("\n\t\t通訊錄文件不存在");
if ((p=fopen("student.txt","wb"))==NULL) //打開輸出文件student.txt
{
printf("\n\t\t建立失敗");
exit(0); //終止正在執行的程序
}
else
{
printf("\n\t\t通訊錄文件已建立");
printf("\n\t\t按任意鍵進入主菜單");
getch();
return;
}
exit(0);
}
fseek(p,0,2); //文件位置指針移動到文件末尾,fseek(文件類型指針,位移量,起始點)
if (ftell(p)>0) //ftell函數的目的是得到當前位置,用相對于文件開頭的位移量來表示,文件不為空
{
rewind(p); //文件位置指針移動到文件開始位置,此函數沒有返回值
for (num=0;!feof(p) && fread(&student[num],sizeof(struct record),1,p);num++);
/*fread(buffer,size,count,pt)(地址,讀寫的字節數,讀寫多少數據項,FILE類型指針),每次從P指向的文件中讀入結構體數組的一個元素;
feof檢查文件是否結束,遇見文件結束符,返回非零值*/
printf("\n\t\t文件導入成功");
printf("\n\t\t按任意鍵返回主菜單");
getch();
return;
}
printf("\n\t\t文件導入成功");
printf("\n\t\t通訊錄文件中無任何紀錄");
printf("\n\t\t按任意鍵返回主菜單");
getch();
return;
}
void mainmenu()//主菜單
{
char choice;
system("cls");//清屏
printf("\n\t\t******************** 主菜單 ********************");
printf("\n\t\t*********** 1-新添紀錄 2-輸出記錄 **************");
printf("\n\t\t*********** 3-查詢菜單 4-刪除菜單 **************");
printf("\n\t\t*********** 5-記錄排序 6-文件復制 **************");
printf("\n\t\t*********** 7-保存退出 8-不保存退出*************");
printf("\n\t\t************************************************");
printf("\n\t\t請選擇:");
choice=getch();
switch(choice)
{
case "1":newrecord();break;
case "2":showall();break;
case "3":searchmenu();break;
case "4":deletemenu();break;
case "5":listmenu();break;
case "6":copy();break;
case "7":writetofile();break;
case "8":exit(0); break;
default:mainmenu();
}
}
void newrecord()//添加記錄
{
printf("\n\t\t**************** 請輸入信息 ****************\n");
printf("\n\t\t輸入編號:");
scanf("%s",&student[num].id);
printf("\n\t\t輸入姓名:");
scanf("%s",&student[num].name);
printf("\n\t\t輸入電話號碼:");
scanf("%s",&student[num].phone);
printf("\n\t\t輸入地址:");
scanf("%s",&student[num].adress);
printf("\n\t\t輸入郵編:");
scanf("%s",&student[num].postcode);
printf("\n\t\t輸入e-mail:");
scanf("%s",&student[num].e_mail);
printf("\n\t\t輸入QQ:");
scanf("%s",&student[num].QQ);
printf("\n\t\t輸入性別:");
scanf("%s",&student[num].sex);
printf("\n\t\t輸入生日:");
scanf("%s",&student[num].birthday);
printf("\n\t\t輸入關系:");
scanf("%s",&student[num].relation);
num++;
printf("\n\t\t是否繼續添加?(Y/N):");
if (getch()=="y")
newrecord();
return;
}
void showall()//輸出記錄
{
int i;
system("cls");
if(num!=0)
{
printf("\n\t\t*************** 以下為通訊錄所有信息************");
for (i=0;i
c語言程序設計(5)
江南大學
物聯網工程學院
課程設計報告
課程名稱: C語言課程設計
設計題目: 學生成績管理系統
班 級: 自動化1003班
姓 名: 孫海洋 學 號: 0704100314
指導教師: 趙芝璞 評 分:
2011 年 11 月 20 日
目錄
1、設計題目及要求------------------------------------------------
2、總體設計(程序設計組成框圖、流程圖)-------------------------
3、詳細設計(模塊功能說明(如函數功能、入口及出口參數說明,函數調用關系描述等))-------------------------------------
4、調試與測試:調試方法,測試數據,測試結果的分析與討論,測試過程中遇到的主要問題及采取的解決措施----------
5、源程序清單和執行結果(可附上截屏圖片):清單中應有足夠的注釋--------------------------------------------------------------
1、設計題目及要求:
1、設計題目:
學生成績信息包括:學號,姓名,三門課程成績(數學、英語和計算機)等。
主要功能:
(1) 計算各個學生的總分及平均分,并按平均分排出名次。
(2) 統計全班學生平均分成績,輸出60分以下、60~79、80~89、90分以上各分數人數
(3) 能按學號、姓名查詢學生成績,并能輸出學生的成績單
(4) 輸出不及格科目及學生名單
(5) 選做:在屏幕打印優等生名單(學號,三門課程成績,平均成績,名次),優等生必須滿足下列條件:
1)平均成績大于90分;或平均分大于85分且至少有一門功課為100分;或者平均分大于85分且至少兩門課程成績為95分以上;
2) 名次在前三名;
3) 每門功課及格以上;
要求:使用文本文件方式存儲數據,系統以菜單方式工作
查詢和統計的結果均寫入單獨的文件中。
2、總體設計
1、程序設計組成框圖:
2、流程圖:
3、詳細設計
模塊功能說明:(未定義函數,所有的程序直接在main函數中進行)
1、輸入學生的信息函數功能:定義了一個結構體,通過scanf輸入函數直接輸入學生的姓名、學號、英語成績、數學成績、計算機成績。
2、計算機排序功能:mian函數中的第二個模塊直接輸出學生的總分及平均分,并按平均分排出名次。
3、輸出功能:第三模塊中,通過for循環功能,輸出不及格科目及學生名單。
4、查詢功能:通查詢信息,在第四模塊中,輸入學生的學號或姓名,找到輸入的結構體的姓名或是學號對應的學生的所有的信息,并輸出該學生信息。
5、退出程序
4、調試與測試
1、調試方法:逐條的對程序中的錯誤進行修改;修改程序中的變量、對各個模塊的函數功能進行修改調試,直至零錯誤、零警告。
2、調試數據:
姓名 學號 英語成績 數學成績 計算機成績
Qipengcheng 1 78 58 78
Luoxiuqing 2 78 87 90
Sunhaiyang 3 39 67 97
Wanghongcheng 4 80 69 49
Weipeng 5 69 99 87
Piaonanji 6 57 79 98
3、測試結果的分析與討論:
由測試數據分析輸出的結果可以得出輸出的成績排名、不及格人數及信息、按姓名和學號查詢學生的信息輸出均為正確的。
4、測試過程中遇到的問題:
①顯示結果時候出錯
問題描述:每一個功能在現實結果現實的信息部完整,部分信息部能現實或被覆蓋。
解決辦法:現實出錯也就是printf語句中的結構沒有排列好所導致的。檢查所有的Printf語句后發現所有的printf語句中少輸出了以個語文成績,且它們不能完全對齊。在增加了“語文”,修改了轉義字符以及空格后,問題解決了。
②在查詢信息的時候出錯
問題描述:在輸入不在文件中保存的姓名、學號時,沒有信息提示。
解決辦法:出現此問題說明if語句后少了一條else語句,加上該語句后,顯示的結果正確了。
5、原程序清單及執行結果
原程序清單:
#include
#include
struct student
{ int paiming;
int number;
char name[30];
double english,math,computer;
double sum;
double aver;
};
int main()
{
struct student b[100];
int t;
int i,j=0;
int s=0;
int n;
char name[30];
double english, math, computer;
double aver=0.0;
int a[4];
int p;
int m;
int y;
char xingming[30];
for(i=0; i
c語言程序設計(6)
《C程序設計語言》翻譯挑錯
《The C Programming Language》的中譯本《C程序設計語言》由機械工業出版社出版,徐寶文、李志翻譯,尤晉元審校,K&R甚至為它專門寫了個中文版序,可惜經典又被翻譯糟蹋了。我手頭的是2008年4月第二版第19次印刷,依然有著翻譯錯誤甚至印刷錯誤(不可原諒!),也許大名鼎鼎的尤晉元教授審校時忘記帶眼鏡了。
有錯誤不可怕,但缺乏錯機制就讓人惱火了。遍尋網絡也找不到官方勘誤表,甚至交流方式都沒有,只能說出版社和譯者沒把后續服務當回兒事。有些作譯者通過個人主頁、博客或郵件組同讀者進行交流,在此表示敬佩。但整體而言,IT圖書的出版以圖靈運做的最好,有和讀者交流的專門網站,圖書勘誤也在上面發放,這樣大大降低了雙方交流的成本,必須夸獎!
?
回到正題上來,我正在閱讀K&R的英文版(提高英語和C語言水平),但信心不足,輔以中文版一冊,發現許多錯誤,不爽,決定在這里記下來(果然IT技術書籍有原版就不要讀翻譯本,唉~~~),這篇blog會寫很長時間,因為我的英語水平一般般(現在,只是現在一般般)。2012.07.23
?
閱讀第一章,發現一些小錯誤讓人十分惱火,因為直接讀中文就能看得出來。說實話一邊讀原版一邊對比蹩腳的翻譯實在太不爽了。接下來我打算采用先英文,后中文的方式看剩下的內容,那么只有那些大的錯誤(類似引言1)或者火星中國人才能讀懂的句子才會發現。所以,為了自己好,一定要學好英語呵!K&R不適合初學者,如果你頭次接觸C語言,我推薦宋勁杉老師的《Linux C 編程一站式學習》,或者你英語好就直接讀英文的入門材料,比如《Learn C The Hard Way》這種;至于老手,看原版吧。我把其他人的錯誤總結記在后面,大家看一下。 2012.07.27
引言
?
1.pXIII第5段,“函數定義可以不是嵌套的,”
你妹啊,幸好我之前學過C,不然就被忽悠了!原文是"Function definitions may not be nested",may not在這里是“不可以”的意思啊老師!就算你英語不好,C語言總該用過吧,這也太坑爹了!
正確翻譯:“函數定義不可以嵌套”。
?
2. pXIII第10段,“這就意味著必須通過調用函數來比較兩個字符串嗎”
這句不算錯誤,只是作者在這里吐槽一下自己,很幽默的一句被翻譯得索然無味,原文是:
“You mean I have to call a function to compare two character strings?”
?
3. pXV第2段,“所采用的方式將比第1章更加形式化一些”
?原文是formlly,這里用”正式“更易懂些:
“所采用的方式將比第1章更加正式一些”
?
2012.07.23
第一章?導言
?
1. p25,練習 1-20,“......使空格充滿到下一個制表符終止位的地方”
原文next應該翻譯成“靠著,緊挨”的意思,不是下一個!
“......使空格充滿到挨著制表符終止位的地方”
2012.08.22
--------------------------------------------------------------------
?
第三章?控制流
?
1. p54,3.7節最后一段, “當循環的后面部分比較復雜......則可能需要把測試條件顛倒過來或者縮進另一層循環,這樣做會使程序的嵌套更深。”
這一整段我個人以為都錯了。
“The continue statement is often used when the part of the loop that follows is complicated, so that reversing a test and indenting another level would nest the program too deeply.”
當循環體很復雜,逆轉測試條件下再縮進一層執行會讓程序會嵌套得太深時,就需要continue語句出場表現了。
結合上上面的例子看,如果不用continue,就要寫成這個樣子:
for (i = 0; i < n; i++) {
if (a[i] >= 0) {
...
}
}
reversing a test?指?a[i] < 0?的條件變成 a[i] >= 0 , indenting another level?指 for 內的循環體嵌入又嵌入到 if?里去了。
(這一句的術語我有敲不準,大家還是結合例子看原文吧)
2012.08.21
以下內容來自豆瓣網友jtuki:
?
頁碼:第8頁 2011-01-30 22:34:47 引言部分(準確的說是 XIII 頁)一開始就出現了嚴重的翻譯錯誤,比較窘。「函數定義可以不是嵌套的」 - 翻譯錯誤。原文是 may not be nested 即「函數定義不可以嵌套」。但是,在 GNU C 實現中,這個來自 ANSI 的規則被打破,前者允許函數嵌套定義。
?
頁碼:第42頁 2011-01-30 22:37:42 條件表達式 expr1 ? expr2 : expr3 本質上就是一個表達式,其類型根據 expr2 和 expr3 的類型決定(此處書上說成是 expr1 和 expr3 屬于翻譯錯誤)。如果 expr2 和 expr3 類型不同,則根據轉換規則來決定,與 expr1 求值結果無關。
?
頁碼:第60頁 2011-01-30 22:38:34 對于 atof 的描述說「它占用了過多的空間」是翻譯錯誤,原話是「that would take more space than we care to use」,即更高質量的 input conversion 需要更多的 space 才行。
?
頁碼:第76頁 2011-01-30 22:38:57?「嚴格地說,這些內容沒必要單獨存放在文件中」翻譯錯誤,原文「Strictly speaking, these need not be files; the details of how headers are accessed are implementation dependent」。正確翻譯「嚴格來講,這些頭文件不一定非要是文件,具體如何訪問這些頭文件,同具體實現有關」。
?
頁碼:第89頁 2011-01-30 22:39:21 「我們在這里使用 size_t 作為函數 strlen 返回值類型」翻譯錯誤,正確翻譯應該是「如果我們夠 cautious ,那么我們就會采用 size_t 做為我們的返回值類型」。size_t 其實就是 unsigned int 或者 unsigned long 了(具體是 implementation defined 即由實現定義)。與 NULL 一樣都是定義在 stddef.h 文件中。
?
頁碼:第91頁 2011-01-30 22:39:59 對于如下的拷貝字符串操作。
void strcpy(char *s, char *t)
{
while (*s++ = *t++)
;
}
書上給出的描述翻譯有點問題。原文 - 「Although this may seem cryptic at first sight, the notational convenience is considerable, and the idiom should be mastered, because you will see it frequently in C programs.」即,「這種寫法初看起來寫的很隱晦,然而其所帶來的便利是可觀的,我們應該掌握這種寫法,因為這種寫法已經成了一種慣例,在 C 語言程序中,我們會經常碰到這樣的寫法」。另外,注意 unary 操作符 * 和 ++ 以及 -- 是從右往左的結合性。
?
頁碼:第121頁 2011-01-30 22:40:33 「雖然這可以不用通過在線性數組中 .... 時間過長」這句話翻譯錯誤。去掉「雖然」和「但」即可。
?
頁碼:第124頁 2011-01-30 22:40:56 「在結束該例子之前 ... 第二 ... 不同類型指針的問題?」這一段翻譯很混亂!而且第二句話的意思還翻譯錯了。原文,以及 jtuki 版本的翻譯,如下。 +_+Before leaving this example, it is also worth a brief digression on a problem related to storage allocators.結束這個例子之前,請允許我稍微跑個題,講一講存儲分配器(storage allocator)的問題。jtuki 注釋:所謂存儲分配器,就是給程序中某些對象分配存儲空間的東西。Clearly it" desirable that there be only one storage allocator in a program, even though it allocates different kinds of objects. But if one allocator is to process requests for, say, pointers to chars and pointers to struct tnodes, two questions arise. 很顯然,我們希望一個程序中,僅僅有一個存儲分配器(jtuki 注釋:畢竟少量的接口會更加簡潔和清晰),盡管在一個程序中,我們需要為很多不同類型的對象分配存儲空間。如果一個分配器既要為,比如說,char 型指針,以及結構體型指針,分配存儲空間,那么就會存在如下兩個問題。First, how does it meet the requirement of most real machines that objects of certain types must satisfy alignment restrictions (for example, integers often must be located at even addresses)?第一,它怎么滿足大部分機器對于 object 的對齊(alignment)限制(比如,整型通常必須被分配在偶數開頭的地址序列上)?Second, what declarations can cope with the fact that an allocator must necessarily return different kinds of pointers?第二,我們采取什么樣的聲明方式,才能夠讓分配器返回不同類型的指針?翻譯結束。我似乎翻譯的也不太好。離「信達雅」的標準估計還很遠。 =_=講完這兩點后,作者就很自然的引出了標準庫 malloc 函數和 void * 型指針。一般盡管 void * 型指針可以自動類型轉換,變成任意具體對象的指針,但是一般我們習慣強制轉換。
--------------------------------------------------------------------
?
c語言程序設計(7)
一、選擇題(每題1分,共20分)
1.C語言程序從main()函數開始執行,所以這個函數要寫在( D )。
A.程序文件的開始 B.程序文件的最后
C.它所調用的函數的前面 D.程序文件的任何位置
2.下列方法中錯誤的是( D )。
A.主函數可以分為兩個部分:主函數說明部分和主函數體。
B.主函數可以調用任何非主函數的其它函數。
C.任何非主函數可以調用其它任何非主函數。
D.程序可以從任何非主函數開始執行。
3.下列正確的標識符是( C )。
A.-a1 B.a[i] C.a2_i D.int t
4.C語言中的簡單數據類型包括( D )。
A.整型、實型、邏輯型 B.整型、實型、邏輯型、字符型
C.整型、字符型、邏輯型 D.整型、實型、字符型
5.下列可以正確表示字符型常量的是( A )。
A.’\t’ B.”a” C.”\n” D.297
6.在C語言中,字符型數據所占的內存空間是( C )。
A.2個字節 B.4字節 C.1字節 D.由用戶自定義
7.若int類型數據占2個字節,則unsigned int類型數據的取值范圍是( B )。
A.0~255 B.0~65535 C.-32768~32767 D.-256~255
8.若有以下類型說明語句:char a;int b; float c; double d; 則表達式a*b+d-c的結果類型為( D )。
A.float B.char C.int D.double
9.下列正確的預編譯命令是( D )。
A.define PI 3.14159
B.#define P(a,b)=strcpy(a,b)
C.#define stdio.h
D.#define PI 3.14159
10.為表示邏輯表達式79
c語言程序設計(8)
C語言程序設計試題
一、單項選擇題(本題共25小題,每小題2分,共50分)
在每小題列出的四個備選項中只有一個是符合題目要求的,請將其正確答案涂寫在答題卡上。錯選、多選或未選均無分。
1. 以下正確的C語言自定義標識符是______。
A. _1a B. 2a_
C. do D. a.12
2. 在C語言中,錯誤的常數表示是_______。
A. 0L B.-0x6aL
C. "6" D. 1.234E3.5
3. 設int a, x=2; 執行語句a=x>0?3*x:x=10;后,變量x的值是_______。
A. 1 B. 2
C. 6 D. 10
4.設有以下程序段:
int x=2,y=2,z=0,a;
a=++x||++y&&z++;
printf("%d,%d,%d\n",x,y,z);
執行后輸出的結果是_________。
A. 2, 2, 0 B. 3, 3,1
C. 3, 2, 0 D. 3, 2, 1
5. 在C語言中,字符串"\\TOP\t\65\""的長度是_______。
A. 5 B.7
C. 8 D. 12
6. 設float x,由鍵盤輸入:12.45, 能正確讀入數據的輸入語句是_________。
A. scanf("%5f",&x) B. scanf("%5d",&x);
C. scanf("%f",x); D. scanf("%s",&x);
7.逗號表達式a=2*6,a*3,a+5的值是_________。
A. 12 B. 17
C.36 D. 41
8. C語言程序中,整型常量的書寫形式不包括_________。
A. 二進制 B. 八進制
C. 十進制 D. 十六進制
9. 在C語言中,下列運算符中結合性屬于自右向左的是_________。
A. && B. -
C.0?-x:x B. x>0?x:-x
C. xb);
A. 1,3 B. 1,4
C. 2,3 D. 2,4
14. 在C語言中,下列錯誤的說法是_______。
A. 函數可以遞歸調用
B. 不允許在函數中再定義函數
C. 遞歸程序不可能用非遞歸算法實現
D. 對于continue語句,可以通過改變程序的結構而不使用它
15.int a[2][3]={{1},{2,3}};,則a[1][0]的值是_________。
A.0 B. 1
C. 2 D. 3
16. 以下對二維數組a的正確說明是_________。.
A. int a[3][]; B. float a[][4];
C. double a[3][4]; D. float a(3)(4);
17.設char s[10]= "abcd",t[]="12345";,則s和t在內存中分配的字節數分別是_______。
A.6和5 B. 6和6
C. 10和5 D. 10和6
18. switch(表達式)語句中的“表達式”,允許的類型是_________。
A.float, int B.float, int, char
C. int, char D. char, double
19. 在C語言中,形參的隱含存儲類別是_________。
A. auto B. static
C. extern D. register
20. 下列屬于文件包含的命令是_________。
A. #define N 25 B. #endif
C. #include "stdio.h" D. #else
21. 設int i,j;
for(i=5;i;i--)
for(j=0;jb; ++b) i++;
while(a>++c) j++;
do k++; while(a>d++);
35.設int a[3][4]={{1,2,5,3},{2,4,7,9},{3,6,5,8}};則表達式a[1][2]+a[2][3]的值是________。
三、程序分析題(本題共5小題,每小題2分,共10分)
36.寫出下面程序的運行結果。
#include
void main()
{
int x=15;
while(x0;i--) printf("%d", b[i-1]);
}
39. 寫出下面程序的運行結果。
#include
void main()
{
int a,b,i;
a=b=0;
for(i=0;i
c語言程序設計(9)
一、選擇題(每題1分,共20分)
1、C語言程序從main()函數開始執行,所以這個函數要寫在( D )。
A.程序文件的開始 B.程序文件的最后
C.它所調用的函數的前面 D.程序文件的任何位置
2、下列方法中錯誤的就是( D )。
A.主函數可以分為兩個部分:主函數說明部分與主函數體。
B.主函數可以調用任何非主函數的其它函數。
C.任何非主函數可以調用其它任何非主函數。
D.程序可以從任何非主函數開始執行。
3、下列正確的標識符就是( C )。
A.-a1 B.a[i] C.a2_i D.int t
4、C語言中的簡單數據類型包括( D )。
A.整型、實型、邏輯型 B.整型、實型、邏輯型、字符型
C.整型、字符型、邏輯型 D.整型、實型、字符型
5、下列可以正確表示字符型常量的就是( A )。
A.’\t’ B.”a” C.”\n” D.297
6、在C語言中,字符型數據所占的內存空間就是( C )。
A.2個字節 B.4字節 C.1字節 D.由用戶自定義
7、若int類型數據占2個字節,則unsigned int類型數據的取值范圍就是( B )。
A.0~255 B.0~65535 C.-32768~32767 D.-256~255
8、若有以下類型說明語句:char a;int b; float c; double d; 則表達式a*b+d-c的結果類型為( D )。
A.float B.char C.int D.double
9、下列正確的預編譯命令就是( D )。
A.define PI 3、14159
B.#define P(a,b)=strcpy(a,b)
C.#define stdio、h
D.#define PI 3、14159
10、為表示邏輯表達式79
c語言程序設計(10)
C語言程序設計筆記
1. 合法的標識符由字母(大、小寫均可)、數字和下劃線組成,并且必須以字母或下劃線
開頭。
2. 整型常量:用不帶小數點的數字表示。
實型常量:用帶小數點的數字表示。
字符型常量:用帶有單引號的字符表示。
3. #define是一條預處理命令,又被稱為宏定義命令,其功能是把命令格式中的標識符定義為其后的常量值。例如#define PI 3.14
一經定義,以后在程序中所有出現該標識符的地方均以該常量值代之。
習慣上符號常量的標識符用大寫字母表示,變量標識符用小寫字母表示,以示區別。
用#define進行定義時,必須用“#”號作為一行的開頭,在#define命令行的最后不得加分號結束
4.字符常量就是用一對單引號括起來的單個字符。
5.注意switch語句中的default,代表所有case以外的情況,在不能找到符合的case并且存在default時就會執行default后的語句。
6.在switch結構中,如果沒有break出現,當遇到符合的case時 將會自動執行其后的所有case和default中的語句。可見break在switch結構中的重要性。有了break的switch語句才起到真正的分支作用。
7.語句標號和goto語句的使用。Goto語句為無條件轉向語句,必須與語句標號配合使用。語句標號必須是標識符。
8. 真值表。或門中,即“||”,有真就真,全假才假。與門中,即&&,有假就假,全真才真。
9. C語言中,不只是1表示邏輯真,而是所有非零都表示邏輯上的真值。
10.要時刻注意if語句與其后的表達式的關系,是包含還是無關。注意花括號。
11.要記住C語言中的運算符的優先級。
12. switch結構中,case于表達式之間一定要有空格,例如case 10,而不是case10.
13. 必要的時候case后面的語句可以省略不寫,意為與后面的case合并選擇。
14. switch和case后的括號中的用于匹配的表達式的類型必須相同。各個case后的值應該不同。
15 .關于牛頓迭代法解方程:
若是解隱函數方程,如x=cosx,可以讓x1=0,應該令x2=cosx1。注意分析,滿足方程的根無非就是要x和cosx相等,想辦法構造循環讓x自己運算自己就可以。
如果未達到精度要求,再將x2給x1,然后計算出一個新的x2,這樣一輪一輪的來,總會找到符合要求的解,跳出循環,此時x1和x2都可以作為方程的解。
若是解一般方程,x2有公式,x2=x1-f(x1)/f`(x1)
一輪一輪的,新值變舊值。
16. for(int i;0;i++)語句所指的循環一次也不會執行。由于第二個語句是0。C語言中對于是否執行的判斷最終是通過看表達式的零和非零來實現的。
17. 尋找判斷素數的思路。若在一定范圍內尋找素數,需要有一個標記如c,先假定每個數字都是素數,然后再通過循環來排除。兩層,外層用于每個數的遍歷,內層則用于判斷該數字是不是素數,即用該數字i與2到i-1之間的數字取余數,若出現了可以整除的情況,則改善數字i不是素數,這時應該給它一個標簽。如果出現了不是得情況跳出內層循環,然換下一個數字i+1繼續實驗。當內層循環自然結束的時候,代表該數字是素數,此時應該比對之前的標簽c來判斷書否應該輸出它。然后再通過外層循環自然切換到下一個檢索對象i+1。
右邊的代碼還可以改進,因為除了2的偶數必然不是素數,所以可以將外層循環改成for(i=3;i=是大于等于。
23. 輸出對稱矩陣:
分成兩部分輸出,輸出下半部分的時候注意i的取值和范圍,最好到這取值,不然j和k就會有問題。
24. 關于字符:
一個字符常量代表ASCII字符集中的一個字符,所以C語言中字符在內存中只占一個字節,存放的是字符的ASCII代碼值。
字符常量只能包含一個字符,所以‘abc’是非法的。
字符常量只能用單引號括起來,而不能用雙引號。例如”a”是一個字符串常量,而不是字符常量。
大小寫字符間相差32,從A到Z,到a到z遞增,A65,a97.
轉義字符常量中,’\n’’\101’’141’只代表一個字符。反斜線后可以跟一個八進制數來表示一個ASCII字符,其后的八進制數可以不用0開頭。也可以在反斜線后跟一個十六進制數,反斜線后的十六進制數只可以由小寫x開頭,不能用大寫X,也不可以用0x開頭。
字符串常量和字符常量的區別就是,字符串常量包含了一個`\0`,因此‘a’的長度會比”a”的長度少一位。
字符量可以作為整型量參與任何整數運算,作為ASCII碼。注意字符9和整數9是有區別的。
在用scanf混合輸入字符和數字時,要注意數據的輸入方式。10a 20c之類的。在int中,可以用空格來做數據的分隔;但是在char中,tab和空格鍵和回車鍵都會被作為字符錄入,并且按下回車鍵才開始讀入數據。
scanf(“%4c”)
調用對字符和字符串進行處理的庫函數時,應該包含頭文件ctype.h。include
再循環輸入字符的時候,要求以什么什么結束輸入的時候常用while((ch=getchar())!=’@’);while((ch=getchar())!=‘\n’);
while((ch=getchar())!=’\0’);for(cn=0;getchar()!=’@’;cn++)之類的句子來控制循環條件。
25. 關于函數:
函數名必須是唯一的!!不能與自己定義的任何變量重名。
函數定義的時候,形參的類型名不能省略。返回值的類型名函數名(類型名 形參1,類型名 形參2).
不能在函數內部定義函數,main函數也是,定義函數應該在main函數外部。
若省略函數返回值的類型,則系統默認為int類。
void類函數無返回值。只用于完成操作。
在同一個函數內,可以出現多個return,無論函數體里有多少個return,return語句只能執行一次。Return語句中也可以不含表達式,這時函數必須為void類。函數體內也可以不含return,此時也為void類。
函數必須先定義再調用(返回值類型為int和char時除外),或者先聲明在調用在定義。
關于函數聲明,先定義后調用的函數不用聲明。最好在main函數外部聲明,這樣持久有效。聲明格式類型名 函數名(參數類型1 參數名1,參數類型2 參數名2……)其中的參數名只是擺設,可以是任意的,也可以省略。
在調用函數時,實參把值傳遞給形參進行函數運算,結束以后返回函數值。但是這不會改變實參的值。在使用時要注意。如果想改變實參的值,可以利用傳地址的方法。
26. 強制類型轉換(int) 3.33114
27. 關于指針:
注意指針的基類型,在用&給指針變量賦地址值的時候,如int k=1,*p;p=&k;
&右邊的對象的類型必須和指針變量的基類型相同。
當有q=&k時,scanf(“”,&k)和scanf(“”,q)等價。
c語言程序設計(11)
最長公共子序列
時間限制:3000 ms | 內存限制:65535 KB
難度:3
描述
咱們就不拐彎抹角了,如題,需要你做的就是寫一個程序,得出最長公共子序列。
tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。
輸入
第一行給出一個整數N(0
c語言程序設計(12)
機 密★啟用前
大連理工大學網絡教育學院
2018年春《C/C++語言程序設計》
期末考試復習題
☆ 注意事項:本復習題滿分共:400分。
一、單選題
1、已知int x=2,y=8;執行 x*=y+2;后x的值是( )。
A.20
B.18
C.16
D.12
2、下列while循環的執行次數是( )。while(int i=0) i++;
A.0
B.1
C.5
D.無限
3、以下不屬于C語言關鍵字的是( )。
A.short
B.int
C.case
D.DIM
4、當一個類對象離開它的作用域時,系統將自動調用該類的( )。
A.構造函數
B.拷貝構造函數
C.析構函數
D.默認構造函數
5、下列哪個函數不是類的成員函數。( )
A.析構函數
B.構造函數
C.拷貝構造函數
D.友元函數
6、在執行int a[][3]={1,2,3,4,5,6};語句后,a[0][0]的值是( )。
A.4
B.1
C.2
D.5
7、C++中用3個保留字實現異常處理,除了throw和catch外,還有( )。
A.if
B.class
C.try
D.return
8、當類的繼承方式為( )時,基類中的公有成員和保護成員都以私有成員身份出現在派生類中,而基類的私有成員在派生類中不可直接訪問。
A.私有繼承
B.公有繼承
C.保護繼承
D.以上都不是
9、作用域分辨符可以用來限定要訪問的成員所在的類的名稱,它的符號表示為( )。
A.::
B.?:
C.;
D.\
10、下列哪個函數的作用是字符串比較( )。
A.strlen( )
B.strcmp( )
C.strcat( )
D.strcpy( )
11、指出下面合法的標識符是( )。
A.3ab
B.int
C._stu2
D.$abc
12、設有數組定義char array [ ]="Public";則數組array所占的空間為( )。
A.4個字節
B.5個字節
C.6個字節
D.7個字節
13、下面表達式中錯誤的是( )。
A.b=a++
B.a/=2
C.a+b=5
D.a=5,b=6,c=7
14、在定義int a[5];之后,對a的引用正確的是( )。
A.a[5]
B.a[4.3]
C.a(5)
D.a[0]
15、執行下面的程序段后,輸出結果是( )。main(){char a[]="english";printf("%c",a[0]);}
A.engli
B.e
C.english
D.sh
16、當類的繼承方式為( )時,基類的公有和保護成員的訪問屬性在派生類中不變,而基類的私有成員不可直接訪問。
A.私有繼承
B.公有繼承
C.保護繼承
D.以上都不是
17、類中將關鍵字( )寫在函數體之前函數頭之后,說明該函數是一個常成員函數(或const成員函數),可以防止函數改變數據成員的值。
A.const
B.static
C.friend
D.void
18、設int n=10,i=3;則賦值運算n%=i+1執行后,n的值是( )。
A.0
B.3
C.2
D.1
19、下列選項中正確的語句是( )。
A.x++
B.int(x+5)
C.y+5=6;
D.x=y+5;
20、綁定工作在編譯連接階段完成的情況稱為( )。
A.靜態綁定
B.動態綁定
C.重載 D.繼承
21、在下面的一維數組定義中,哪一個有語法錯誤( )。
A.int a[]={1,2,3};
B.int a[10]={0};
C.int a[];
D.int a[5];
22、假定AB為一個類,則該類的拷貝構造函數的聲明語句為( )。
A.AB&(AB x);
B.AB(AB x);
C.AB(AB&);
D.AB(AB* x)
23、( )是給對象取一個別名,它引入了對象的同義詞。
A.指針
B.引用
C.枚舉
D.結構
24、下列運算符中,( )運算符在C++中不能重載。
A.?:
B.+
C.-
D.




