高級程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)指導(dǎo)書_第1頁
高級程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)指導(dǎo)書_第2頁
高級程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)指導(dǎo)書_第3頁
高級程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)指導(dǎo)書_第4頁
高級程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩100頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

高級語言程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)

指導(dǎo)書四川大學(xué)計(jì)算機(jī)學(xué)院計(jì)算機(jī)工程系C語言教學(xué)組編寫

洪枚審定高級程序設(shè)計(jì)I(C語言)實(shí)驗(yàn)指導(dǎo)書

目錄TOC\o"1-5"\h\z使用說明 4實(shí)驗(yàn)一 C語言程序初步 9實(shí)驗(yàn)二 數(shù)據(jù)類型 11實(shí)驗(yàn)三運(yùn)行符與表達(dá)式 12實(shí)驗(yàn)四 輸入與輸出 13實(shí)驗(yàn)五 選擇結(jié)構(gòu) 15實(shí)驗(yàn)六條件型循環(huán)結(jié)構(gòu) 17實(shí)驗(yàn)七計(jì)數(shù)型循環(huán)結(jié)構(gòu) 18實(shí)驗(yàn)八 函數(shù)的定義及調(diào)用 20實(shí)驗(yàn)九 數(shù)組 21實(shí)驗(yàn)十 指針(一) 24實(shí)驗(yàn)十二結(jié)構(gòu)體和共用體 29實(shí)驗(yàn)十三 位運(yùn)算 30實(shí)驗(yàn)十四 文件 31實(shí)驗(yàn)十五 綜合應(yīng)用舉例(一) 32實(shí)驗(yàn)十六 綜合應(yīng)用舉例(二) 37附錄一:TurboC程序設(shè)計(jì)上機(jī)指導(dǎo) 42Turbo C 程序設(shè)計(jì)初步 42Turbo C 常用的編輯命令 44Turbo C程序的調(diào)試 46Turbo C編譯、連接和運(yùn)行時的常見錯誤 48附錄二:C語言程序設(shè)計(jì)調(diào)試技術(shù) 51C語言程序設(shè)計(jì)調(diào)試技術(shù)(一)——運(yùn)行錯誤的判斷與調(diào)試 51C語言程序設(shè)計(jì)調(diào)試技術(shù)(二)——基本調(diào)試手段 51C語言調(diào)試技術(shù)(三)-TurboC集成環(huán)境的調(diào)試功能 52C語言調(diào)試技術(shù)(四)一圖形程序運(yùn)行的條件 53附錄三:《四川大學(xué)計(jì)算機(jī)學(xué)院C語言考試系統(tǒng)》樣題 55選擇題 55改錯題 58編程題 59附錄四:全國計(jì)算機(jī)等級考試試題選編 60\o"CurrentDocument"二級C語言上機(jī)試題(1999年秋季1,2,3)套 60第一?套 60第二套 62第三套 64—CiS (1,2,3) ..........................................................................66(第一套)1997年9月全國計(jì)算機(jī)等級考試筆試試卷 66(第二套)2001年4月二級C筆試試題 70(第三套)2001年9月二級C筆試試題 85附錄五:《C語言》課程教學(xué)大綱 99一、本課程的地位與任務(wù) 99二、本課程的基本要求與基本內(nèi)容 99三、本課程的教學(xué)要求: 100四、學(xué)時分配 101五、教材和參考書 101電地暖使用說明本實(shí)驗(yàn)指導(dǎo)書為開設(shè)《高級語言程序設(shè)計(jì)I(C語言)》課程的專業(yè)使用,各專業(yè)根據(jù)本專業(yè)的教學(xué)計(jì)劃和實(shí)驗(yàn)任務(wù)書,選做規(guī)定的實(shí)驗(yàn)項(xiàng)目。全院各專業(yè)所做的實(shí)驗(yàn)項(xiàng)目具體說明和要求如下:必須完成本指導(dǎo)書的實(shí)驗(yàn)一、二、三、五、六、八、九、十、十二、十四,共十個實(shí)驗(yàn)項(xiàng)目的內(nèi)容。(2005年級開紿執(zhí)行)計(jì)算機(jī)學(xué)院2006-7、VisualC++實(shí)驗(yàn)環(huán)境介紹1、VisualC++簡介VisualC++是Microsoft公司的VisualStudio開發(fā)工具箱中的一個C++程序開發(fā)包。VisualStudio提供了一整套開發(fā)Internet和Windows應(yīng)用程序的_1:具,包括VisualC++,VisualBasic,VisualFoxpro,VisualInterDev,VisualJ++以及其他輔助工具,如代碼管理工具VisualSourceSafe和聯(lián)機(jī)幫助系統(tǒng)MSDN。VisualC++包中除包括C++編譯器外,還包括所有的庫、例子和為創(chuàng)建Windows應(yīng)用程序所需要的文檔。從最早期的L0版本,發(fā)展到最新的6.0版本,VisualC++已經(jīng)有了很大的變化,在界面、功能、庫支持方面都有許多的增強(qiáng)。最新的6.0版本在編譯器、MFC類庫、編輯器以及聯(lián)機(jī)幫助系統(tǒng)等方面都比以前的版本做了較大改進(jìn)。VisualC++一般分為三個版本:學(xué)習(xí)版、專業(yè)版和企業(yè)版,不同的版本適合于不同類型的應(yīng)用開發(fā)。實(shí)驗(yàn)中可以使用這三個版本的任意一種。VisualC++集成開發(fā)環(huán)境(IDE)集成開發(fā)環(huán)境(IDE)是一個將程序編輯器、編譯器、調(diào)試工具和其他建立應(yīng)用程序的工具集成在?起的用于開發(fā)應(yīng)用程序的軟件系統(tǒng)。VisualC++軟件包中的DeveloperStudio就是?個集成開發(fā)環(huán)境,它集成了各種開發(fā)工具和VC編譯器。程序員可以在不離開該環(huán)境的情況下編輯、編譯、調(diào)試和運(yùn)行一個應(yīng)用程序。IDE中還提供大量在線幫助信息協(xié)助程序員做好開發(fā)工作。DeveloperStudio中除了程序編輯器、資源編輯器、編譯器、調(diào)試器外,還有各種工具和向?qū)?如AppWizard和ClassWizard),以及MFC類庫,這些都可以幫助程序員快速而正確地開發(fā)出應(yīng)用程序。向?qū)?Wizard)向?qū)且粋€通過一步步的幫助引導(dǎo)你工作的工具。DeveloperStudio中包含三個向?qū)?,用來幫助程序員開發(fā)簡單的Windows程序,它們是:AppWizard:用來創(chuàng)建一個Windows程序的基本框架結(jié)構(gòu)。AppWizard向?qū)徊讲较虺绦騿T提出問題,詢問他所創(chuàng)建的項(xiàng)目的特征,然后AppWizard會根據(jù)這些特征自動生成一個可以執(zhí)行的程序框架,程序員然后可以在這個框架下進(jìn)一步填充內(nèi)容。AppWizard支持三類程序:基于視圖/文檔結(jié)構(gòu)的單文檔應(yīng)用、基于視圖/文檔結(jié)構(gòu)的多文檔應(yīng)用程序和基于對話框的應(yīng)用程序。也可以利用AppWizard生成最簡單的控制臺應(yīng)用程序(類似于DOS下用字符輸入輸出的程序)。ClassWizard:用來定義AppWizard所創(chuàng)建的程序中的類??梢岳肅lassWizard在項(xiàng)目中增加類、為類增加處理消息的函數(shù)等。ClassWizard也可以管理包含在對話框中的控件,它可以將MFC對象或者類的成員變量與對話框中的控件聯(lián)系起來。ActiveXControlWizard:用于創(chuàng)建一個ActiveX控件的基本框架結(jié)構(gòu)。ActiveX控件是用戶自定義的控件,它支持一系列定義的接口,可以作為一個可再利用的組件。MFC庫庫(library)是可以重復(fù)使用的源代碼和目標(biāo)代碼的集合。MFC(MicrosoftFundamentalCasses)是VisualC++開發(fā)環(huán)境所帶的類庫,在該類庫中提供了大量的類,可以幫助開發(fā)人員快速建立應(yīng)用程序。這些類可以提供程序框架、進(jìn)行文件和數(shù)據(jù)庫操作、建立網(wǎng)絡(luò)連接、進(jìn)行繪圖和打印等各種通用的應(yīng)用程序操作。使用MFC庫開發(fā)應(yīng)用程序可以減少很多工作量。2、項(xiàng)目開發(fā)過程在一個集成的開發(fā)環(huán)境中開發(fā)項(xiàng)目非常容易。一個用C++開發(fā)的項(xiàng)目的通用開發(fā)過程可以用左圖表示。建立一個項(xiàng)□的第一步是利用編輯器建立程序代碼文件,包括頭文件、代碼文件、資源文件等.然后,啟動編譯程序,編譯程序首先調(diào)用預(yù)處理程序處理程序中的預(yù)處理命令(如#include,#define等),經(jīng)過預(yù)處理程序處理的代碼將作為編譯程序的輸入。編譯對用戶程序進(jìn)行詞法和語法分析,建立目標(biāo)文件,文件中包括機(jī)器代碼、連接指令、外部引用以及從該源文件中產(chǎn)生的函數(shù)和數(shù)據(jù)名。此后,連接程序?qū)⑺械哪繕?biāo)代碼和用到的靜態(tài)連接庫的代碼連接起來,為所有的外部變量和函數(shù)找到其提供地點(diǎn),最后產(chǎn)生一個可執(zhí)行文件。一般有一個makefile文件來協(xié)調(diào)各個部分產(chǎn)生可執(zhí)行文件。 可執(zhí)行文件分為兩種版本:Debug和Release。Debug版本用于程序的開發(fā)過程,該版本產(chǎn)生的可執(zhí)行程序帶有大量的調(diào)試信息,可以供調(diào)試程序使用,而Release版本作為最終的發(fā)行版本,沒有調(diào)試信息,并且?guī)в心撤N形式的優(yōu)化。學(xué)員在上機(jī)實(shí)習(xí)過程中可以采用Debug版本,這樣便于調(diào)試. 選擇是產(chǎn)生Debug版本還是Release版本的方法是:在DeveloperStudio中選擇菜單BuildlSetActiveConfiguration,在彈出的對話框中,選擇所要的類型,然后選擇OK關(guān)閉對話框。VisualC++集成開發(fā)環(huán)境中集成了編輯器、編譯器、連接器以及調(diào)試程序,覆蓋了的開發(fā)應(yīng)用程序的整個過程,程序員不需要脫離這個開發(fā)環(huán)境就可以開發(fā)出完整的應(yīng)用程序。helloexe helloexe3、集成開發(fā)環(huán)境進(jìn)入DeveloperStudio 如果你使用的是VisualC++6.0,則要進(jìn)入DeveloperStudio,需要單擊任務(wù)欄中“開始“后選擇“程序",找至ljMicrosoftVisualStudio6.0文件夾后,單擊其中的MicrosoftVisualC++6.0圖標(biāo),則可以啟動DeveloperStudio0 如果你使用的是VisualC++5.0,則要進(jìn)入DeveloperStudio,需要單擊任務(wù)欄中“開始“后選擇"程序",找至"MicrosoftVisualC++5.0文件夾后,單擊其中的MicrosoftVisualC++5.0圖標(biāo),則可以啟動DeveloperStudiooDeveloperStudio的界面DeveloperStudio用戶界面是一個由窗口、工具條、菜單、工具及其他部分組成的一個集成界面。通過這個界面,用戶可以在同一環(huán)境下創(chuàng)建、測試、調(diào)試應(yīng)用程序。VC5和VC6的DeveloperStudio的初始化界面有一些小的差異,VC5的界面如下:

'、狀態(tài)條'、狀態(tài)條工具條和菜單,用于提供用戶操作的命令接口。菜單以文字和層次化的方式提供命令接口,工具條由一系列按鈕組成。這些按鈕用?系列小的位圖標(biāo)志。工具條以圖標(biāo)方式提供快速的命令選擇。菜單和工具條在開發(fā)的不同進(jìn)程有不同顯示內(nèi)容。當(dāng)?shù)谝淮未蜷_DeveloperStudio時,標(biāo)準(zhǔn)的工具條和菜單就會顯示出來,隨著開發(fā)的不同步驟,不同的工具條就會自動顯示出來,菜單也會有所變化。工具條有很多種,你可以顯示任意多的工具條,只要屏幕空間允許。工具條可以任意移動,也可以放大縮小。工具條和菜單條功能基本相同,唯的區(qū)別是:菜單條總占據(jù)?行,并且般不能隱藏。 工作區(qū)窗口,這個窗口包含關(guān)于正在開發(fā)的這個項(xiàng)目的有關(guān)信息。在沒有開發(fā)任何項(xiàng)目時,該窗口顯示系統(tǒng)的幫助目錄。當(dāng)打開一個項(xiàng)目以后,工作區(qū)窗口將會顯示關(guān)于當(dāng)前項(xiàng)目的文件信息和類的信息。下圖是打開個項(xiàng)目hello以后的工作區(qū)窗U(假設(shè)該項(xiàng)目由兩個文件cppl.cpp,cpp2.cpp組成)。用Workspace'hello':1project(s)-@1hellofiles21cpp1.cpp/cpp2.cpp■:■:ClassView國FHeVlewI?InfoView文檔窗口區(qū),這個區(qū)域可以顯示各種類型的文檔,如源代碼文件、頭文件、資源文件等??梢酝瑫r打開多個文檔。輸出窗口,輸出窗口用來顯示幾種信息,可以通過選擇不同的標(biāo)簽顯示不同的信息。這些信息包括:編譯連接結(jié)果信息(Build標(biāo)簽)、調(diào)試信息(Debug標(biāo)簽)、杳找結(jié)果信息(FindinFiles標(biāo)簽)。其中查找結(jié)果信息有兩個標(biāo)簽,可以顯示兩次在文件中查找指定內(nèi)容的結(jié)果 VC6因?yàn)樵诼?lián)機(jī)幫助系統(tǒng)上比VC5做了很大改進(jìn),所以在工作區(qū)窗口中沒有VC5的InfoView,初始化界面的其他部分都與VC5相似。DeleveloperStudio使用MicrosoftDeveloperNetwork(MSDN)庫作為它的聯(lián)機(jī)幫助系統(tǒng)。其界面如下:總的來說,窗口和命令接口(包括工具條和菜單條)是構(gòu)成界面的最主要組成部分。通常有兩種窗口:文檔窗口和可附著(docking)窗口。文檔窗口顯示在文檔窗口區(qū),用于顯示和編輯文檔,其的大小和位置可以隨其所處的DeveloperStudio窗口的改變而改變,可以最大化和最小化??筛街翱诳梢愿街趹?yīng)用程序窗口的邊界,也可以浮在屏幕上的任何位置。可附著窗口有:工作區(qū)(workspace)窗口,輸出(output)窗口,調(diào)試窗口(包括variable,watch,local等窗口)等。 文檔窗口的位置、大小及是否可見和它所在的項(xiàng)目有關(guān),docking窗口的位置、大小及是否可見則與項(xiàng)目進(jìn)行的狀態(tài)以及各種編輯和調(diào)試的操作有關(guān)。各種窗口和各種工具條以及菜單構(gòu)成了界面的布局。一旦用戶決定了一種界面布局,系統(tǒng)就會為一直為用戶保持這種布局,直到用戶下一次改變該布局為止。 獲得幫助信息大多數(shù)時候,你可以通過按FI得到上下文幫助。如在編輯文件時按F1可以得到有關(guān)編輯的幫助,在編譯連接錯誤信息上按F1可以得到關(guān)于該錯誤的幫助信息。如果想系統(tǒng)地獲得幫助,在VC5中可以單擊工作區(qū)窗口的InfoView標(biāo)簽,從其中選擇要想了解的內(nèi)容。要想查找關(guān)于某個話題的幫助,可以選擇菜單HelplSearch,在查詢對話框中進(jìn)行查找。VC6中,可以通過選擇菜單HelplContents來啟動MSDN查閱器,MSDN查閱器是?個功能強(qiáng)大的程序,可以方便地瀏覽、查找信息,要想知道具體如何使用MSDN查閱器,可以在MSDN查閱器中選菜單Help下的命令。VisualC++的編輯器 DeveloperStudio包含,個功能強(qiáng)大的編輯器,可以編輯將被編譯成Windows程序的VisualC++源文件。這個編輯器有點(diǎn)象字處理器,但是沒有字處理器具備的復(fù)雜的排版、文本格式等功能,它注重的是如何幫助程序員快速高效地編制程序。它具有以下特點(diǎn): 自動語法。用高亮度和不同顏色的字來顯示不同的語法成分,如注釋、關(guān)鍵字和一般代碼用不同的顏色顯示自動縮進(jìn)。幫助你排列源代碼,使其可讀性更強(qiáng) 參數(shù)幫助。在編輯時用到預(yù)定義的windows函數(shù)時,可以自動為你顯示函數(shù)參數(shù) 集成的關(guān)鍵字幫助。能夠使你快速得到任何關(guān)鍵字、MFC類或Windows函數(shù)的幫助信息(按Fl即可) 拖放編輯。能夠用鼠標(biāo)選擇文本并自由拖動到任意位置 自動錯誤定位。能自動將光標(biāo)移動到有編譯錯誤的源代碼處。 當(dāng)你打開一個源代碼文件時,就可以利用編輯器對其進(jìn)行編輯。源代碼文件在文檔顯示區(qū)顯示,每個文件有獨(dú)立的顯示窗口。如果你選擇用其他編輯器編輯源文件,必須將它以純文本的方式保存。VC的編譯器不能處理其中有特別格式字符的文件。4、常用功能健及其意義為了使程序員能夠方便快捷地完成程序開發(fā),開發(fā)環(huán)境提供了大量快捷方式來簡化一些常用操作的步驟。

鍵盤操作直接、簡單,而且非常方便,因而程序員非常喜歡采用鍵盤命令來控制操作。下面是一些最常用的功能鍵,希望學(xué)員在實(shí)驗(yàn)中逐步掌握。操作類型功能鍵對應(yīng)菜單含義文件操作Ctrl+NFilelNew創(chuàng)建新的文件、項(xiàng)口等Ctrl+OFilelOpcn打開項(xiàng)目、文件等Ctrl+SFilelSave保存當(dāng)前文件編輯操作Ctrl+XEditICut剪切Ctrl+CEditICopy復(fù)制Ctrl+VEditIPaste粘貼Ctrl+ZEditlUndo撤消上??個操作Ctrl+YEditIRedo重復(fù)上一個操作Ctrl+AEditlSelectAll全選DelEditIDel刪除光標(biāo)后面的一個字符建立程序操作Ctrl+F7BuildlCompilercurrentfile編譯當(dāng)前源文件Ctrl+F5BuildlRunexe運(yùn)行當(dāng)前項(xiàng)目F7BuildlBuildexe建立可執(zhí)行程序F5BuildlStartDebugging啟動調(diào)試程序調(diào)試F5DebugIGo繼續(xù)運(yùn)行FHDebuglStcpinto進(jìn)入函數(shù)體內(nèi)部shift+FllDebuglStepout從函數(shù)體內(nèi)部運(yùn)行出來F10DebuglStepover執(zhí)行一行語句F9設(shè)置/清除斷點(diǎn)Ctrl+FlODebugIRuntocursor運(yùn)行到光標(biāo)所在位置shift+F9DcbugIQuickWatch快速查看變量或表達(dá)式的值Shift+F5DebuglStopdebugging停止調(diào)試實(shí)驗(yàn)一 C語言程序初步一、目的和要求1、熟悉c語言運(yùn)行環(huán)境。2、掌握C語言程序的書寫格式和C語言程序的結(jié)構(gòu)。3、掌握C語言上機(jī)步驟,了解運(yùn)行一個C程序的方法。4、本實(shí)驗(yàn)可在學(xué)習(xí)完教材第一章后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容1、C語言上機(jī)步驟:(A)、在四川大學(xué)計(jì)算機(jī)基礎(chǔ)教育實(shí)驗(yàn)中心上機(jī),啟動后請選擇進(jìn)入Windows2000系統(tǒng)。(B)、常用命令編輯切換(F6),編譯(F9),運(yùn)行(CTRL+F9),顯示結(jié)果(ALT+F5)其它常用命令見“附錄一"。2、有下面的C程序,目的是想計(jì)算由犍盤輸入的任意兩個整數(shù)的積。/********exl.c********/#include(stdio.h);main()scanf(k4%x,%yM,&x,%y)p=prodct(x,t)printf(44Theproductis:",p)intprodct(inta,intb)intcc=a*breturnc請調(diào)試上述程序。三、實(shí)驗(yàn)步驟1、靜態(tài)地檢查上述程序,改正程序中的錯誤。2、在編輯狀態(tài)下照原樣鍵入上述程序。3、編譯并運(yùn)行上述程序,記下所給出的出錯信息。4、按照事先靜態(tài)檢查后所改正的情況,進(jìn)行糾錯。5、再編譯執(zhí)行糾錯后的程序。如還有錯誤,再編輯改正,直到不出現(xiàn)語法錯誤為止。6、下面給出6組測試用例,你認(rèn)為哪幾組較好?為什么?(1)0, 0(2)0, 99(3)20,50(4)33000,20(5)—5,-2(6)-5,2要測試出上述程序中所有錯誤,你認(rèn)為應(yīng)當(dāng)用幾組測試用例?四、分析與討論1、記下在調(diào)試過程中所發(fā)現(xiàn)的錯誤、系統(tǒng)給出的出錯信息和對策。分析討論對策成功或失敗的原因。2、總結(jié)C程序的結(jié)構(gòu)和書寫規(guī)則。實(shí)驗(yàn)二數(shù)據(jù)類型一、目的和要求1、了解C語言中數(shù)據(jù)類型的意義。2、本實(shí)驗(yàn)可在學(xué)習(xí)了教材第2.3節(jié)后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容和步驟1、下面的程序試圖計(jì)算由鍵盤輸入的任意兩個整數(shù)的平均值:#include<stdio.h>main()(intx,y,a;scanf(44%x,%y,&x,&y);a=(x+y)/2;printf(**Theaverageis:"a);}調(diào)試無語法錯誤后,分別使用下列測試用例對上述程序進(jìn)行測試:(1)2,6(2)1,3(3)—2,—6(4)-1,-3(5)-2,6(6)—1,3TOC\o"1-5"\h\z(7) 1 , 0(8) 1 , 6(9) 3 2 8 0 0, 3 3 0 0 0(10 )- 3 2 8 0 0, 3 3 0001、分析上述哪幾組測試用例較好?通過測試,你發(fā)現(xiàn)程序有什么錯誤了嗎?若有錯誤,請指出錯誤原因。2、操作符sizeof用以測試一個數(shù)據(jù)或類型所占用的存儲空間的字節(jié)數(shù)。請編寫一個程序,測試各基本數(shù)據(jù)類型所占用的存儲空間大小。三、分析與討論如何正確地選用數(shù)據(jù)類型?(提示:給合前面做過的兩個實(shí)驗(yàn)及書本進(jìn)行討論總結(jié))實(shí)驗(yàn)三運(yùn)行符與表達(dá)式一、目的和要求1、理解常用運(yùn)行符的意義。2、掌握C語言表達(dá)式的運(yùn)行規(guī)則。3,本實(shí)驗(yàn)可在學(xué)習(xí)了教材第2.3節(jié)后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容和步驟1、編寫一個C語言程序,測試下列各表達(dá)式>Ji+l,j+1i++,j++++i,++ji+++++j++i+++++j++要求在各表達(dá)式中i和j都分別有相同的初值。在實(shí)驗(yàn)中注意下列問題:(1)哪些表達(dá)式是錯誤的?為什么?(2)理解+,++,++i,i++的意義和優(yōu)先級別。2、編寫一個程序,測試常用的十個運(yùn)算符的優(yōu)先順序。四、分析與討論分析總結(jié)運(yùn)算符的優(yōu)先級。實(shí)驗(yàn)四輸入與輸出一、目的和要求I、掌握C語言程序輸入、輸出的方法和格式。2、本實(shí)驗(yàn)可在學(xué)習(xí)教材第二章后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容與步驟1、輸入并編輯下面的程序main()(inta,b;floatc,d;longe,f;unsignedintu,v;charcl,c2;scanf(tt%d,%d,\a,b);scanf("%f,%F',c,d);scanf(ut%ld,%ld,\e,D;scanf(tt%o,%o,\u,v);scanf(i4%c,%c,,,cl,c2);printf("\n”);printf(t<a=%7d,b=%7d\n,,,&a,&b);printf(4<c=%10.2f,d=%10.2f\n,\&c,&d);printf("e=171d,f=%1printf(Mu=%o,d=%o\n,,,&u,&v);printfC4cl=%c,d=%c\n,,,&cI,&c2);這個程序有語法錯誤嗎?為什么?2、調(diào)試上述程序無語法錯誤后,用下面的測試數(shù)據(jù),對程序進(jìn)行測試:a=123,b=456,c=17.6,d=71837.65,e=70000,f=2174506,u=62000,v=58765,cl='a',c2='b'分析運(yùn)行結(jié)果。特別注意輸入cl,c2的值是什么?什么原因?3、將輸入e和f的語句改為:scanf("%d,%d”,&e,&f);再用上述測試數(shù)據(jù)測試并分析結(jié)果。4、將輸入u、v的語句改為:scanf("%d,%d'',&u,&v);再用上述測試數(shù)據(jù)測試并分析結(jié)果。5、將輸出e,f的語句改為:printf(4,e=%17d,f=%17d\n”,e,f);再用上述測試數(shù)據(jù)測試并分析結(jié)果。6、將輸出u、v的語句改為:printf("u=%u,v=%u\n”,u,v);或printf(44u=%d,v=%d\n,,,u,v);再用上述測試數(shù)據(jù)測試并分析結(jié)果。7、請讀者自己修改程序和改變數(shù)據(jù)輸入的形式,分析各種情況下的輸入與輸出。8、在scanf("%c,%c”,&cl,&c2);語句之前加一個語句:getchar();9、驗(yàn)證轉(zhuǎn)義字符\n與\r的意義有何不同。三、分析與討論1、總結(jié)在printf函數(shù)中可以使用的各種格式指定符,并給出樣例。2、總結(jié)在printf函數(shù)中可以使用的各轉(zhuǎn)義字符及其功能。實(shí)驗(yàn)五選擇結(jié)構(gòu)一、實(shí)驗(yàn)?zāi)康?、了解條件與程序流程的關(guān)系2、了解用不同的數(shù)據(jù)使程序的流程覆蓋不同的語句、分支和路徑。3、本實(shí)驗(yàn)應(yīng)在學(xué)習(xí)教材第3.2節(jié)后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容和步驟1、題目有如下程序段:if(a>l&&b==0)x=x/a;if(a==2llx>l)x=x+l;}為了更容易明白程序的邏輯結(jié)構(gòu),我們用圖5.1所示流程圖來加以描述。要求增加一些輸入語句和輸出語句,以便使上述程序能在不同的a,b和x值下運(yùn)行,并且能觀察程序流程經(jīng)過(覆蓋)了哪些語句、哪些分支及哪些路徑。2、實(shí)驗(yàn)步驟記下分別使用下列各組數(shù)據(jù)運(yùn)行時的操作流程。(1)a=l,b=l,x=i;(2)a=l,b=l,x=2;(3)a=3,b=0,x=l;(4)a=2,b=l,x=4;(5)a=2,b=l,x=l;(6)a=l,b=0,x=2;(7)a=2,b=l,x=l;(8)a=3,b=0,x=2o三、分析討論用哪一組數(shù)據(jù)就可使程序中的每個處理語句都執(zhí)行一次?為了找出程序中各條處理語句中的錯誤,應(yīng)該使用什么樣的數(shù)據(jù)對程序進(jìn)行測試?請上機(jī)驗(yàn)證自己的結(jié)論。用哪兩組數(shù)據(jù)就可以使程序段中的每個分支都運(yùn)行一次?這種情形與上面的討論有何不同?如果為了找出程序中積壓分支中的錯誤,應(yīng)該使用什么樣的數(shù)據(jù)對程序進(jìn)行測試?請上機(jī)驗(yàn)證自己的結(jié)論。用哪兩組數(shù)據(jù)就可以把判定框中的每個條件運(yùn)算都進(jìn)行一次?如果為了測試出判定條件中的錯誤,應(yīng)使用哪些數(shù)據(jù)對程序進(jìn)行測試?請上機(jī)驗(yàn)證自己的結(jié)論。用哪四組數(shù)據(jù)才可以把各種條件的組合都檢測一遍?如果為了測試各種條件的組合的情形,應(yīng)該使用什么樣的測試數(shù)據(jù)?請上機(jī)驗(yàn)證自己的結(jié)論。用哪四組數(shù)據(jù)才可以把起始到終止的各條路徑都覆蓋一次?如果為了測試出程序在不同路徑下的錯誤,應(yīng)該使用什么樣的測試數(shù)據(jù)?請上機(jī)驗(yàn)證自己的結(jié)論。四、進(jìn)一步的實(shí)驗(yàn).題目從鍵盤上輸入三個數(shù),讓它們代表三條線段的長度,請寫一個判斷這三條線段所組成的三角形屬于什么類型(不等邊,等腰,等邊或不構(gòu)成三角形)的C程序。.請分別設(shè)計(jì)下列數(shù)據(jù)對自己的程序進(jìn)行測試:找出各條語句中的錯誤。找出積壓分支中的錯誤。找出各條件中的錯誤。找出各種條件組合中的錯誤。找出各條路徑中的錯誤。實(shí)驗(yàn)六條件型循環(huán)結(jié)構(gòu)一、目的和要求1、掌握在程序設(shè)計(jì)條件型循環(huán)結(jié)構(gòu)時,如何正確地設(shè)定循環(huán)條件,以及如何控制循環(huán)的次數(shù)。2、了解條件型循環(huán)結(jié)構(gòu)的基本測試方法。3、本實(shí)驗(yàn)可在學(xué)習(xí)教材3.3節(jié)后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容與步驟1、下面是一個計(jì)算e的近似值(使誤差小于給定的6)的程序。main(){doublee=1.0,x=1.0,y,detax;inti=l;printf(44\npleaseinputenteraerror:");scanf(44%lf\&detax);y=i/x;while(y>=detax)(x=x*I;y=l/x;e=e+y;++i;|printfC%12.101f\e);}2、實(shí)驗(yàn)步驟(1)、閱讀上面的程序,寫出程序所依據(jù)的計(jì)算公式。(2)、當(dāng)輸入的detax各是什么值時,能分別使程序按下面的要求運(yùn)行:.不進(jìn)入循環(huán);.只循環(huán)一次;.只循環(huán)兩次;.進(jìn)入死循環(huán)(程序?qū)⒂肋h(yuǎn)循環(huán)下去)。為了能知道程序循環(huán)了多少次,應(yīng)該在程序中增加一條什么樣的語句?(3)、原程序中while語句中的y>=detax,分別換成y>detax,y=detax,y<detax,y<=detax,觀察程序運(yùn)行將會有什么變化。假如不知道機(jī)器內(nèi)的程序中的各語句實(shí)際上是什么,分別輸入什么樣的detax來測試出while語句的循環(huán)條件寫錯了。(4)、把原程序中while語句之前的y=l/x語句去掉,觀察程序的運(yùn)行將會發(fā)生什么樣的變化。假如不知道機(jī)器內(nèi)的程序?qū)嶋H上是怎么寫的,輸入什么樣的detax就能測試出少了上述這條語句。(5)、若把原程序中的++i換成i++,觀察程序的運(yùn)行發(fā)生了什么變化?假如不知道這條語句到底是怎么寫的,輸入什么樣的detax就能測試出這條語句寫錯了.(6)、把原程序中的while結(jié)構(gòu)改寫成do—while結(jié)構(gòu),再分別按上述的(2)、(3)兩步進(jìn)行實(shí)驗(yàn)。三、分析討論總結(jié)一下測試條件循環(huán)結(jié)構(gòu)的一般方法。實(shí)驗(yàn)七計(jì)數(shù)型循環(huán)結(jié)構(gòu)一、目的和要求1、掌握如何正確地控制計(jì)數(shù)型循環(huán)結(jié)構(gòu)的次數(shù)2、了解時計(jì)數(shù)型循環(huán)結(jié)構(gòu)進(jìn)行測試的基本方法3、了解在嵌套循環(huán)結(jié)構(gòu)中,提高程序效率的方法4,本實(shí)驗(yàn)應(yīng)在學(xué)習(xí)了教材第3.3.4進(jìn)行二、 實(shí)驗(yàn)內(nèi)容與步驟1、實(shí)驗(yàn)題目下面是一個用以計(jì)算 的C程序。main()(inti,j;longsum=0;for(i=1,i<=20,i++)for(j=l;j<=3;j++)sum=sum+(i+l)*(i+l)*(j+2)printf(4tsumis:%d\n”,sum);)2、實(shí)驗(yàn)步驟將上述程序中的和分別做什么樣修改,能使程序按如下要求運(yùn)行:.不循環(huán);.外循環(huán)1次,不進(jìn)入內(nèi)循環(huán);.外循環(huán),內(nèi)循環(huán)各1次;.外循環(huán)1次,內(nèi)循環(huán)2次;?外循環(huán)2次,內(nèi)循環(huán)1次;.外循環(huán)19次,內(nèi)循環(huán)3次;?外循環(huán)20次,內(nèi)循環(huán)2次;.外循環(huán)21次,內(nèi)循環(huán)3次。試修改程序,以便能知道控制表達(dá)式i=|;j<=20;i++和j=l;j<3;j+=各執(zhí)行了多少次?(3)內(nèi)循環(huán)與外循環(huán)的控制表達(dá)式進(jìn)行對換,觀察程序的執(zhí)行結(jié)果有無變化,并且觀察對換后的外循環(huán)與內(nèi)循環(huán)控制表達(dá)式執(zhí)行的總次數(shù)有無變化?(4)將(3)中程序?qū)憺閙ain()(inti,j,k;longsum=0;for(j=l.j<=3.j++)(k=j+2;for(i=l;i<=20;i++)sum=sum+(i+l)*(i+1)**k;1printf(**sumis:%d\n”,sum);}觀察程序的執(zhí)行結(jié)果有無變化?(5)將(3)中程序改寫為main()(intlongsum=0;for(j=l;j<=3;j++)(m=j+2;for(I=1;j<=20;I++){n=I+1;sum=sum+m*m*k;))printf(44sumis:%d\n'',sum);)觀察程序的執(zhí)行結(jié)果有無變化?(6)在(5)的程序中,若將外循環(huán)控制表達(dá)式分別做如下修改:.j=l;j<3;j++.j=l;j=3;j++.j=l;j>=3;j++.j=l;j>3;j++.j=l;j<=3;j-.j=l;j>3;j-.j=l;j<3;j++,j=O;j<=3;j+=.j=O;j<3;j++j=l;j<=3;j++j=l;j<3;++j觀察程序的執(zhí)行結(jié)果有無變化?三、分析討論如何測試計(jì)數(shù)型循環(huán)結(jié)構(gòu)的控制表達(dá)式中的錯誤?從實(shí)驗(yàn)中你得到了哪些提高嵌套循環(huán)程序效率的啟示?

實(shí)驗(yàn)八函數(shù)的定義及調(diào)用目的與要求掌握C語言函數(shù)定義及調(diào)用的規(guī)則。理解參數(shù)傳遞的過程。本實(shí)驗(yàn)可在學(xué)習(xí)了教材第4.1節(jié)后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容與步驟1、上機(jī)調(diào)試下面的程序,記錄系統(tǒng)給出的出錯信息,并指出出錯原因。main()int,y;printf("%d\n”,sum(x+y));intsum(a,b)inta,b;return(a+b);2、編寫并調(diào)試一個求(n為整數(shù))的遞歸函數(shù),希望能在程序運(yùn)行過程中動態(tài)地顯示遞歸函數(shù)被調(diào)用的軌跡。三、分析討論1、針對以上實(shí)驗(yàn)內(nèi)容寫出相應(yīng)的參數(shù)傳遞過程并分析結(jié)果。2,討論參數(shù)的傳遞的幾種形式。實(shí)驗(yàn)九數(shù)組一、目的和要求1、掌握數(shù)組定義的規(guī)則。2、掌握C語言數(shù)組的基本用法。3,本實(shí)驗(yàn)可在學(xué)習(xí)教材第5.2節(jié)后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容與步驟1、編寫程序,測試下列數(shù)組的定義方式是否正確main()(intn;scanf("%d”,&n);inta[n];main()(constintn=10;inta[n];#include<stdio.h>#defineM10main()(inta[M];main()(inta[2+2*4];#include<stdio.h>#defineM2#defineN8main(){inta[M+N];通過這一實(shí)驗(yàn),可以說明什么問題?2、運(yùn)行下面的C程序,根據(jù)運(yùn)行結(jié)果,可以說明什么?main(){intnum[5]={1,2,3,4,5};intii;for(i=0;i<=5;i++)printf("%d”,num[i]);)3、操作符&用以求一個變量的地址,這在函數(shù)scanf中已經(jīng)使用過了。現(xiàn)在要你設(shè)計(jì)一個程序,返回一個3*5的二維數(shù)組各元素的地址,并由此說明二維數(shù)組中各元素是按什么順序存諸的。4、為一個起泡排序程序設(shè)計(jì)測試用例,并測試之。5、1983年,在ACM圖林獎頒獎大會匕杰出的計(jì)算機(jī)科學(xué)家,UNIX的鼻祖,C語言的創(chuàng)始人之一,圖林大獎得主,KenThompson上臺的第一句話是:“我是一個程序員,在我的1040表上,我自豪地寫上了我的職業(yè)。作為一個程序員,我的工作就是寫程序,今天我將向大家提供一個我曾經(jīng)寫過的最精練的程序。”這個程序如下:chars[J={'\t','O','\n',,,An',An',7\,*,fAn',/*(213linesdeleted)*/0卜i*Thestringisarepresentationofthebodyofthisprogramfrom'O'totheend/main(){inti;printff<char\ts[]={V,};for(i=0;s[i];i++)printf(<<\t%d,\n,,,s[i]);printf(“%s”,s);)請上機(jī)運(yùn)行這個程序,指出它的功能和運(yùn)行結(jié)果。三、分析討論通過實(shí)驗(yàn),分析定義與引用數(shù)組的區(qū)別。實(shí)驗(yàn)十指針(一)一、目的和要求.熟悉指針的正確用法。.本實(shí)驗(yàn)可在學(xué)習(xí)了教材第6.3節(jié)之后運(yùn)行。二、實(shí)驗(yàn)內(nèi)容和步驟1、指出下面程序錯誤的原因。main()(intx=10,y=5,*px,*py;px=py;px=&x;py=&y;printf(<**px=%d,*py=%d,*px,*py);)2、下面的程序試圖有如下運(yùn)行結(jié)果:whichstyleyouwantto:Capital(c)oruncapital(a):cZCOMPUTERWhichsytleyouwantto:Capital(c)oruncapital(a):u/computer請調(diào)試下面的程序,使其有如上執(zhí)行結(jié)果。#include<stdio.h>main()(chars*;charc;printf(44whichstyleyouwantto:In");printf(44capital(c)oruncapital(a):");c=getchar();if(c='c')strcpy(s,"COMPUTER")elsestrcpy(s,"computer");put(s);}分析出錯原因。.下面的程序能獲得上述運(yùn)行結(jié)果嗎?main()(char*S="COMPUTER”;charc;printf(44whichstyleyouwantto\n");printfC^capital(c)oruncapital(u)f,);c=getchar();if(c=?c?)put(s);else{s=,,computef,;puts(s);)}分析出錯原因。.設(shè)計(jì)一個C程序,用以測試下列各表達(dá)式的運(yùn)算。y=*px++y=*++py⑶y=(*py)++y=—*ppx++三、分析討論數(shù)組與指針的聯(lián)系。實(shí)驗(yàn)十一指針(二)一、目的和要求了解指針參數(shù)的特殊性。掌握函數(shù)、指針、數(shù)組的用法。實(shí)驗(yàn)可在學(xué)習(xí)了教材第六章后進(jìn)行。二、實(shí)驗(yàn)內(nèi)容與步驟1、想使指針變量pU指向a和b中的大者,pt2指向小者,以下程序能否實(shí)現(xiàn)此目的?swap(int*pl,int*p2)(int*p;p=pl;pl=p2;p2=p;}main()(inta,b;scanf("%d,%d”,&a,&b);ptl=&a;pt2=&b;if(a<b)swap(ptl.pt2);printf("%d,%d\n”,*ptl,*pt2);)上機(jī)調(diào)試此程序。如果不能實(shí)現(xiàn)題目要求,指出原因,并修改之。2、下面的程序。注意其中的復(fù)雜聲明語句;int(*function[4])();和各標(biāo)記符的含義,并記錄執(zhí)行結(jié)果。main()(intfun1();intfun2();intfun3();intfun4();int(*function[4])();inta=10,b=5,i;function[0]=funl;function[l]=fun2;function[2]=fun3;function[3]=fun4;for(I=0;I<4;i++)printf(4tfunno.%d->%d\n,,,i+l,execute(a,b,function[i]));)execute(intx,inlyjnt*fun())retum(*fun)(x,y);)funl(intx,inty)(retum(x+y);}fun2(intx,inty)(retum(x-y);}fun3(intx,inty)(retum(x*y);}fun4(intx,inty)(retum(x/y);}3、程序main(intargc,char*argv[])(while(argc—>1)printf(4t%s\n,\*++argv);的文件名為echo.h,編譯后可執(zhí)行程序名為echo.exe(用DOS時),運(yùn)行時輸入下面命令行:echoBASICFORTRANCOBOLPASCL分析輸出結(jié)果。4.從1984年起,在每年舉行的USENIX大會匕都有一項(xiàng)AWARDFORBESTONE-LINER獎獲獎的情況程序都是極精巧的C語言程序,但有些精巧得過分,使人難以懂。如果你有興致,請先讀一下下面的C程序,它是1987年獲獎?wù)逴NLINECOMPOUTERSYSTEM公司的SEINCERHINES寫的,被公認(rèn)為是歷史上風(fēng)格最差的C語言程序,程序清單如下:#include<stdio.h>char*malloc();main(otgo.toog)inttogo;char*toog[J;(char*ogto;tgoop[80];FILE*ogot;intoogt=0;ootg,otog=79,ottg=1;if(togO==ottg)gotogogojgotogoog;ggot;if(fgets(tgoo,otog,ogot))gotogtgo;gotogott;gtot:exit();ogtg;++oogt;gotoogoo;togg:if(oogt>0)gotooggt;gotoggot;if(!ogot)gotogogo;gotoggto;gtto:printf(44%dgoto\s\nM,oogt);gotogtot;oggt:if(!memcmp(ogto,"goto",4))gotootgg;gotogooo;gogo:exit(ogtt);gtto:ootg=strlen(tgoo);gotogtog;oogo:-oogt;gototogg;goot-ogto;gotooogo;gott:fclose(ogot);gotgtto;otgg:ogto=ogto+3;gotoogtg;tgog:ootg-=4;gototogg;gtgo:ogto=tgoo;gototggo;ogoo:ootg-=3;gotogooo;goog:ogot=fopen(toog[ottg],,Y,);gotoogog;ggto;ggto:ogto=tgoo;gotoggto:}如果你上機(jī)還有時間,請運(yùn)行一下上面的程序,看你能否運(yùn)行出結(jié)果,并分析出程序的功能。實(shí)驗(yàn)十二結(jié)構(gòu)體和共用體一、目的和要求1、掌握結(jié)構(gòu)體類型方法以及結(jié)構(gòu)體變量的定義和引用。2、掌握指向結(jié)構(gòu)體變量的指針變量的應(yīng)用,特別是鏈表的應(yīng)用。3、掌握運(yùn)算符和的應(yīng)用。4、共用體的概念和應(yīng)用。二、實(shí)驗(yàn)內(nèi)容和步驟1、按習(xí)題7.7的要求編寫程序:有4名學(xué)生,每個學(xué)生的數(shù)據(jù)包括學(xué)號、姓名、成績,要求找出成績最高者的姓名和成績,上機(jī)運(yùn)行程序。2、按習(xí)題7.8的要求,建立--個鏈表每個結(jié)點(diǎn)包括的成員為:職工號、工資。用malloc打印出來。用一個creat來建立鏈表,用list來輸出數(shù)據(jù)。5個職工號為101,103,105,107,109o3、在上題基礎(chǔ)上,新增加一個職工的數(shù)據(jù),按職工號的順序插入鏈表,新插入的職工號為106。寫一函數(shù)insert來插入新結(jié)點(diǎn)。4、在上面的基礎(chǔ)上,寫一函數(shù)delete,用來刪除一個結(jié)點(diǎn)。要求刪除職工號為103的結(jié)點(diǎn)。打印出刪除后的鏈表.5、你有無辦法測試構(gòu)造鏈表時,內(nèi)存空間的動態(tài)分配情形?實(shí)驗(yàn)十三位運(yùn)算一、目的和要求.掌握位運(yùn)算的概念和方法。.掌握位運(yùn)算(&,I,人,?)的使用方法。.掌握有關(guān)位運(yùn)算的用法。二、實(shí)驗(yàn)內(nèi)容和步驟.按習(xí)題8.2的要求,編一個程序,將一個整數(shù)的高字節(jié)和低字節(jié)分別輸出(用位運(yùn)算方法)。上機(jī)運(yùn)行。.按習(xí)題8.6的要求,編一個程序,使一個整數(shù)的低4位翻轉(zhuǎn)。上機(jī)運(yùn)行,用十六進(jìn)制數(shù)輸入和輸出。.按習(xí)題8.10的要求,將一個整數(shù)i的各位循環(huán)左移4位,設(shè)i的值為十六進(jìn)制數(shù)fel3。.按習(xí)題8.13的要求,設(shè)計(jì)一個函數(shù),當(dāng)給定一個整數(shù)后,能得到該數(shù)的補(bǔ)碼(應(yīng)考慮該整數(shù)是正數(shù)或負(fù)數(shù))。實(shí)驗(yàn)十四文件目的和要求文件和文件指針的概念以及文件的定義方法。了解文件打開和關(guān)閉的概念及方法。掌握有關(guān)文件的函數(shù)。實(shí)驗(yàn)內(nèi)容和步驟習(xí)題9.3的要求,從鍵盤輸入一個字符串,然后將其以文件形式存到磁盤上。磁盤文件名為filel.dat。從磁盤文件filel.dat讀入一行字符,將其中所有小寫字母改為大寫字母,然后輸出到磁盤文件file2.dat中(習(xí)題9.4)。已有兩個文本文件,今要求編程序從這兩個文件中讀出各行字符,逐個比較這兩個文件中相應(yīng)的行和列上的字符,如果遇到互不相同的字符,輸出它是第幾行第幾列的字符(習(xí)題9.21)。按習(xí)題9.10的要求,統(tǒng)計(jì)一篇文章中大寫字母的個數(shù)和文章中的句子數(shù)(句子的結(jié)束標(biāo)志是句點(diǎn)后跟一個或多個空格)。實(shí)驗(yàn)十五綜合應(yīng)用舉例(一)一、目的與要求1、熟悉C語言的端口及硬件控制的方法與原理。2、了解用C語言實(shí)現(xiàn)發(fā)聲程序所要訪問的端口。二、實(shí)驗(yàn)內(nèi)容和步驟1、調(diào)試課本中例10.8程序,注意調(diào)出不同的效果。2、調(diào)試并總結(jié)程序中所用的知識點(diǎn),寫出樂譜文件播放的是什么樂譜?樂譜實(shí)例:6000h51h32h20.5h30.5hl4h21m72m60.5hl0.5m54m32m51.5m60.5hl1.5h20.5m60.5hl0.5m51h51.5hl0.5h60.5h50.5h30.5h50.5h24h21.5h30.5m71m61m51.5m60.5hl1h21m31hl1m60m50.5m60.5hl0.5m54h31.5h50.5m71h21m60.5hl0.5m53m30.m50.5m30.5m50.5m50.5m60.5m70.5h20.5m63m50.5m60.5hl1.5h20.5h51h31h21h30.5h20.5hl1m60.5m50.5m32hl2m60.5hl0.5m60.5m50.5m30.5m50.5m60.5hl0.5m53h30.5h50.5h20.5h30.5h20.5hl0.5m71m61h54##voidplay_music(char*filename)/*filename為音樂文件名格式見h*/(HLE*fp;intrate;charsound_high[3];floatsound_long;registerinti=0j;intsign=0;floatstr[1000][2];if((fp=fopen(filename,,,rM))=NULL){printf(nOpenfilemusic.docErrors!\nn);exit(l);)fscanf(fpj%d”,&rate);while(!feof(fp)&&!sign)(fscanf(fp,1,%s%f,,&sound_high,&sound_long);str[ij[lJ=rate*sound_long;switch(sound_high[0])(case'h':switch(sound_high[1]){caseT:str[i++][0]=1046.5;break;case2:str[i++][0]=l174.7;break;case31:str[i++][0]=1318.5;break;case4:str[i++][O]=1396.9;break;case'5':str[i++][0]=1568;break;str[i++][0]=1760;break;strli+4-][0]=1975.5;break;default:printf(n\nErrorMusic.doc\nH);break;break;case'm':switch(sound_high[l])caseT:str[i++][O]=523.3;break;strli++J[O]=587.3;break;str[i++JlO]=659.3;break;str[i++][0]=698.5;break;case'5':str[i++][0]=784.0;break;str[i++][O]=88O;break;strli++J[O]=987.8;break;default:printf(n\nErrormusic.doc.\nn);break;break;caseT:switch(sound_high[I])caseT:str[i++][0]=262;break;strli++][0]=296;break;str[i++][0]=329.6;break;str[i++][0]=349.2;break;case'5':str[i++][0]=392;break;str[i++][0]=440;break;str[i++][0]=493.9;break;default:printf("\nErrormusic.doc.\nH);break;}break;case**':switch(sound_high[1])(caseT:str[i++][O]=131;break;str[i++][0]=147;break;str[i++][O]=165;break;str[i++][0]=176;break;case'5':str[i++][0]=196;break;case6:str[i++][0]=220;break;case7,:str[i++][O]=247;break;default:printf(n\nErrormusic.doc\nH);break;)break;caseif(sound__high[l]==*#*)sign=I;break;case'x’:if(sound_high[l]=='0,)str[i++][0]=20;break;default:printf(n\nERRormusic.doc\nn);exit(l);for(j=0;j<=i-l;j++)(sound(str[j][0]);delay(str|j][l]);nosound();2、文件復(fù)制/*拷貝一個文件*/#include<stdio.h>main(argc,argv)intargc;char*argv[];(FILE*in,*out;if(argc!=3)(printf("Wrongfilestructure!\nK);exit(O);)if((in=fopen(argv[1];'rbM))=NULL) /*注意是(printf("Can'topeninfile.\nn);exit(O);)if((out=fopen(argv[2];'wbn))==NULL)/*注意是“wb"*/(printf("Can'topenoutfile.\n");exit(O);)while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);成批拷貝文件intCopyFile(char*sfile,char*dfile,intf2d,intbarlongjntheight,intx,inty){intCopyfile(char*sf,char*df);intMakeNdir(char*Dir);charfilename[200][13J,d[40],s[40],s1[40];structffblkffblk;intdone,ij,l,len;i=0;done=findfirst(sfile,&ffblk,0);if(!done)strcpy(filename[i],ffblk.ff_name);while(!done)(done=findnext(&tt'blk);if(!done)(i++;strcpy(filename[i],ffblk.flLname);if(f2d)(Copyfile(sfile,dfile);return1;strcpy(s,sfile);l=strlen(sfile);for(j=l-l;j>=0;j-)if(s[j]==N)(s[j+l]=O;break;實(shí)驗(yàn)十六綜合應(yīng)用舉例(二)一、目的與要求1、掌握用C語言進(jìn)行簡單的數(shù)據(jù)庫管理。2、了解C程序菜單設(shè)計(jì)的一般方法。3、理解鏈表的概念及應(yīng)用。二、實(shí)驗(yàn)內(nèi)容和步驟建立一個鏈表,每個結(jié)點(diǎn)包括學(xué)號、姓名、及三科成績、平均成績。除平均成績外,各項(xiàng)均由鍵盤輸入。要求:.計(jì)算平均成績。.要實(shí)現(xiàn)插入功能。.要有排序功能。,要有存取功能。參考程序:^include<stdio.h>structSStudent(unsignednumber;charname[11];intscorel,score2,score3;structSStudent*link;};structSStudent*CreateTableO;voidAppendToTable(structSStudent*stu);voidInsertToTable(structSStudent*stu);voidQueryTable(structSStudent*stu,unsignedage);voidSortTable(structSStudent*stu);voidPrintTable(structSStudent*stu);voidSave(structSStudent*stu);voidLoad(structSStudent*stu);voidHelpO;voidmain()(structSStudent*student;unsignednumber;charkeyValue;student=CreateTableO;clrscr();HelpO;printf(*\n=");while((keyValue=getcheO)!= &&keyValue!='Q'&&keyValue!=27)(puts(**);switch(keyValue)(case,I*:case'L*:PrintTable(student);break;case'd*:case'D':printf(*Pleaseinputthenumberyouwantdelete:");scanf(*%d*,&number);QueryTable(student,number);break;case'a:case'A':AppendToTable(student);break;case'i,:case'F:InsertToTable(student);break;case's':case'S’:SortTable(student);puts(*Sortcomplished!PleaseusecommandLtolist.");break;case'v,:case'V':Save(student);break;case'o':case’0,:Load(student);break;case'c':case'C':clrscr();break;case'h':case'H':HelpO;break;default:puts(*Errorcommand!*);}printfC\n=");})structSStudent*CreateTableO{structSStudent*stu;stu=(structSStudent*)malloc(sizeof(structSStudent));stu->number=0;stu->scorel=stu->score2=stu->score3=0;stu->name[0]='\0';stu->link=NULL;return(stu);}voidAppendToTable(structSStudent*stu){structSStudent*next,*last;intnumber;last=stu;while(last->link)last=last->link;printf(*Pleaseinputthenumber(0toquit):");scanf("%d”,&number);while(number)(next=(structSStudent*)malloc(sizeof(structSStudent));next->number=number;printf(*Pleaseinputname:");scanf(*%10s*,next->name);printf(*Pleaseinputthefirstscore:");scanf&next->scorel);printf(*Pleaseinputthesecondscore:");scanf&next->score2);printf("Pleaseinputthethirdscore:");scanf&next->score3);last->link=next;last=last->link;printf(*\nPleaseinputthenumber(0toquit):");scanf&number);}last->link=NULL;voidInsertToTable(structSStudent*stu)(structSStudent*next,*last;intnumber;printf(*Pleaseinputthenumber(0toquit):");scanfftnumber);while(number)(next=(structSStudent*)malloc(sizeof(structSStudent));next->number=number;printf(*Pleaseinputname:");scanf(*%10s*,next->name);printf("Pleaseinputthefirstscore:");scanf&next->scorel);printf(*Pleaseinputthesecondscore:");scanf&next->score2);printf(*Pleaseinputthethirdscore:");scanf(*%d*,&next->score3);last=stu;while(last->link)(if(last->link->number>next->number)(next->link=last->link;last->link=next;break;)elselast=last->link;}printf(*\nPleaseinputthenumber(0toquit):");scanf&number);})voidQueryTable(structSStudent*stu,unsignednumber)!structSStudent*temp,*next;next=stu;while(next->link){if(next->link->number=number)(temp=next->link;next->link=next->link->link;free(temp);)elsenext=next->link;voidPrintTable(structSStudent*stu)(stu=stu->link;if(!stu){puts(*ThetableisEMPTY!”);return;printf(*number\tname\t\tscoreI\tscore2\tscore3\n*);while(stu)printf(*%3d\t*,stu->number);printf(飛T0s\t”,stu->name);printf("%4d\t”,stu->scorel);printf(*%4d\t*,stu->score2);printf(*%4d\t\n*,stu->score3);stu=stu->link;voidSortTable(structSStudent*stu)(structSStudent*next,*last,*temp;intflag;last=stu;while(last->link)(next=stu;flag=1;while(next->link!=last->link)(if(next->1ink->number>last->link->number){temp=last->link;last->link=last->link->link;temp->link=next->link;next->link=temp;flag=0;break;)elsenext=next->link;)if(flag)last=last->link;voidSave(structSStudent*stu)(unsignedcharfilename[13];FILE*fileSave;printf(*Pleaseinputthefilenameyouwantsavein:");scanffilename);if((fi1eSave=fopen(filename,"wb"))=0){printf(*Cannotopenfile%s!\n”,filename);return;}puts(*Saveingstu=stu->link;while(stu)(fwrite(stu,sizeof(structSStudent),1,fi1eSave);stu=stu->link;}puts(*Saveingisfinished!*);)voidLoad(structSStudent*stu)unsignedcharfilename[13];FILE*fileLoad;structSStudent*temp;while(stu->link){temp=stu->link;stu->link=stu->link->link;free(temp);)temp=(structSStudent*)malloc(sizeof(structSStudent));printf(*Pleaseinputthefilenameyouwantloadfrom:");scanffilename);if((fi1eLoad=fopen(filename,"rb"))==0)(printf(*Cannotopenfile%s!\n”,filename);return;}putsC*Loading...*);while(fread(temp,sizeof(structSStudent),1,fi1eLoad))(stu->link=temp;stu=stu->link;temp=(structSStudent*)malloc(sizeof(structSStudent));}stu->link=NULL;puts("loadingisfinished!*);}voidHelpO{puts("*********************************************")puts("*StudentSystemCommandHelp**)puts("**********************************************)puts(**L=Listallrecords**)puts(*D=Deletearecordselecedbynumber*")puts("*A=Appendrecords*”)puts("*I=Insertrecords*")puts(**S=Sortrecords鏟)puts("*H=Showthishelpmessage心puts("*V=Saverecordstoafile心puts("*0=Loadrecordsfromafile鏟)puts(**c=Clearscreen*")putsC*Q=QuitSystem*”)puts("*********************************************")putsC*Copyright(C)1999.09.09ByKcliu*")puts("*********************************************z,)塊障塊障?1234主務(wù)務(wù)務(wù)務(wù)仔任任任附錄一:TurboC程序設(shè)計(jì)上機(jī)指導(dǎo)TurboC程序設(shè)計(jì)初步本節(jié)主要介紹TurboC程序設(shè)計(jì)的基本步驟及如何編譯、調(diào)試和運(yùn)行源程序。并給出TurboC的常用編輯命令。最后介紹TurboC編譯、連接和運(yùn)行時的常見錯誤。一、TurboC程序設(shè)計(jì)基本步驟程序設(shè)計(jì)方法包括三個基本步驟:第一步:分析問題。第二步:畫出程序的基本輪廓。第三步:實(shí)現(xiàn)該程序。.編寫程序.測試和調(diào)試程序.提供數(shù)據(jù)打印結(jié)果下面,我們來說明每一步的具體細(xì)節(jié)。第一步:分析問題在這一步,你必須:a.作為解決問題的一種方法,確定要產(chǎn)生的數(shù)據(jù)(輸出)。作為這一步的一部分,你應(yīng)定義表示輸出的變量。b.確定需產(chǎn)生輸出的數(shù)據(jù)(稱為輸入),作為這一步的一部分,你應(yīng)定義表示輸入的'狙i1 I輸入數(shù)據(jù) I1 I輸入數(shù)據(jù) I計(jì)算購房所需的金額I計(jì)算裝修所需的金額I計(jì)算總金額I輸出計(jì)算結(jié)果C.設(shè)計(jì)一種算法,從有限步的輸入中獲取輸出。這種算法定義為結(jié)構(gòu)化的順序操作,以便在有限步內(nèi)解決問題。就數(shù)字問題而言,這種算法包括獲取輸出的計(jì)算,但對非數(shù)字問題來說,這種算法包括許多文本和圖象處理操作。第二步:畫出程序的基本輪廓在這一步,你要用一些句子(偽代碼)來畫出程序的基本輪廓。每個句子對應(yīng)一個簡單的程序操作。對一個簡單的程序來說,通過列出程序順序執(zhí)行的動作,便可直接產(chǎn)生偽代碼。然而,對復(fù)雜一些的程序來說,則需要將大致過程有條理地進(jìn)行組織。對此,應(yīng)使用自上而下的設(shè)計(jì)方法。當(dāng)使用自上而下的設(shè)計(jì)方法時,你要把程序分割成幾段來完成。列出每段要實(shí)現(xiàn)的任務(wù),程序的輪廓也就有了,這稱之為主模塊。當(dāng)一項(xiàng)任務(wù)列在主模塊時,僅用其名加以標(biāo)識,并未指出該任務(wù)將如何完成。這方面的內(nèi)容留給程序設(shè)計(jì)的下一階段來討論。將程序分為幾項(xiàng)任務(wù)只是對程序的初步設(shè)計(jì)。整個程序設(shè)計(jì)歸結(jié)為下圖所示的流程圖1?I 主模塊I輸入數(shù)據(jù)II購房額..II裝修額.?II總額.?II輸出結(jié)果II II II II II I圖1.程序初步設(shè)計(jì) 圖2.第二級程序設(shè)計(jì)如果把主模塊的每項(xiàng)任務(wù)擴(kuò)展成一個模塊,并根據(jù)子任務(wù)進(jìn)行定義的話,那么,程序設(shè)計(jì)就更為詳細(xì)了(見圖2.)。這些模塊稱為主模塊的子模塊。程序中許多子模塊之間的關(guān)系可象圖2.中那樣歸結(jié)為一張圖。這種圖稱為結(jié)構(gòu)圖。要畫出模塊的輪廓,你可不考慮細(xì)節(jié)。如果這樣的話,你必須使用子模塊,將各個模塊求精,達(dá)到第三級設(shè)計(jì)。繼續(xù)這一過程,直至說明程序的全部細(xì)節(jié)。這一級一級的設(shè)計(jì)過程稱為逐步求精法。在編寫程序之前,對你的程序進(jìn)行逐步求精,對你來說,是很好的程序設(shè)計(jì)實(shí)踐,會使你養(yǎng)成良好的設(shè)計(jì)習(xí)慣。我們剛才描述了程序設(shè)計(jì)中自上而下的設(shè)計(jì)方法。實(shí)際上就是說,我們設(shè)計(jì)程序是從程序的"頂部"開始一直考慮到程序的"底部”。第三步:實(shí)現(xiàn)該程序程序設(shè)計(jì)的最后一步是編寫源程序。在這一步,把模塊的偽代碼翻譯成TurboC語句。對于源程序,你應(yīng)包含注釋方式的文件編制,以描述程序各個部分做何種工作。此外,源程序還應(yīng)包含調(diào)試程序段,以測試程序的運(yùn)行情況,并允許查找編程錯誤。一旦程序運(yùn)行情況良好,可去掉調(diào)試程序段,然而,文件編制應(yīng)做為源程序的固定部分保留下來,便于你或其他人維護(hù)和修改。二、源程序的輸入、編譯和運(yùn)行C語言是一種中級語言,用戶用C語言編寫的程序稱為源程序,存放用C語言所寫源程序文件名字最后的兩個字符一般必須為c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論