版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序設(shè)計(jì)基礎(chǔ)(國(guó)家級(jí)精品課)張長(zhǎng)海 第1頁(yè),共158頁(yè)。程序設(shè)計(jì)基礎(chǔ)(國(guó)家級(jí)精品課)第十章 外部數(shù)據(jù)組織文件第十一章 程序開(kāi)發(fā)第十二章 動(dòng)態(tài)數(shù)據(jù)組織第2頁(yè),共158頁(yè)。第十章 外部數(shù)據(jù)組織文件重新考慮圖書(shū)卡管理問(wèn)題文件文件概述打開(kāi)、關(guān)閉文件程序參數(shù)字符讀寫(xiě)字符串讀寫(xiě)格式化讀寫(xiě)數(shù)據(jù)塊讀寫(xiě)文件定位本章小結(jié)作業(yè): 11.1 11.6 習(xí)題集:P11317 練習(xí): 11.2 11.3 11.4 11.5 11.7-11.14第3頁(yè),共158頁(yè)。10.1 重新考慮圖書(shū)卡管理問(wèn)題 回顧例8.1,圖書(shū)管理程序當(dāng)時(shí)把圖書(shū)卡片保存在數(shù)組中,僅保存100張卡片,而且每次執(zhí)行程序都要重新輸入所有卡片,這顯然不合理。
2、 應(yīng)該把所有圖書(shū)卡片保存在磁盤(pán)上,每次運(yùn)行程序時(shí)不必都重新輸入! 應(yīng)該可以管理大量的卡片,不能限制數(shù)量!因?yàn)槿魏螆D書(shū)館,其藏書(shū)數(shù)量都是極大的。 使用文件可以解決這個(gè)問(wèn)題。 第4頁(yè),共158頁(yè)。 【例11.1】使用文件保存圖書(shū)檢索卡數(shù)據(jù),重新編寫(xiě)例8.1程序的函數(shù)。 解:設(shè)全部卡片存放在文件card.dat中。檢索函數(shù)對(duì)欲檢索的書(shū)號(hào)采用順序檢索方式檢索;檢索到后輸出;最后輸出提示信息“search end!”。程序如下。 void out_answer( struct bookcard * );/ 輸出檢索結(jié)果函數(shù),略void searchbook( struct bookno );/ 檢索函數(shù)
3、原型void inputbookno(struct bookno * ); /輸入書(shū)號(hào)/ 書(shū)號(hào)結(jié)構(gòu)體、日期結(jié)構(gòu)體、檢索卡結(jié)構(gòu)體同例8.1第5頁(yè),共158頁(yè)。#include stdio.henum class_language Chinese,English,Japanese,Spaish,Russian ;/語(yǔ)種枚舉類(lèi)型struct date / 日期結(jié)構(gòu)體類(lèi)型 int year,month,day ; ;struct bookno / 書(shū)號(hào)結(jié)構(gòu)體類(lèi)型 char catalogue ; int order ; ;struct bookcard / 檢索卡結(jié)構(gòu)體類(lèi)型 char name32,a
4、uthor16;enum class_language languge ; struct date publishingdate ; struct bookno no ; char abstract256; card ;第6頁(yè),共158頁(yè)。FILE * cardpointer ; /* 文件指針 */* 主程序 */void main()struct bookno no1;cardpointer=fopen(card.dat,r ); /打開(kāi)了文件card.dat/輸入部分:不用輸入,數(shù)據(jù)在文件中 printf(nstart search:); /檢索部分inputbookno(&no1);
5、/輸入欲檢索的第一個(gè)書(shū)號(hào)while ( no1.catalogue !=#) searchbook(no1);inputbookno(&no1); /輸入欲檢索的下一個(gè)書(shū)號(hào)fclose(cardpointer);/關(guān)閉文件/ 主程序結(jié)束 第7頁(yè),共158頁(yè)。/* 檢索函數(shù) */void searchbook(struct cardno no2) struct bookcard card; rewind(cardpointer); while ( !feof(cardpointer) ) fread( &card , sizeof(struct bookcard),1, cardpointer)
6、; if ( ( card.no.catalogue = no2.catalogue ) & ( card.no.order = no2.order ) ) out_anser(&card) ; printf(“search end!n”);第8頁(yè),共158頁(yè)。/輸入一個(gè)書(shū)號(hào)函數(shù)void inputbookno(struct bookno * no) printf(nstart search:nplease input bookno.catalogue:);scanf(%c,&(no-catalogue);while(no-cataloguecatalogue);printf(nplease
7、input bookno.order:);scanf(%d,&(no-order);第9頁(yè),共158頁(yè)。/* 輸出檢索結(jié)果函數(shù) */void out_answer( struct bookcard *card0 ) printf( NAME:%sn, card0-name );printf( AUTHOR:%sn, card0-author);printf( LANGUGE:);switch (card0-languge )case Chinese:printf( Chinesen);break;case Japanese:printf( Japanesen);break;case Engli
8、sh:printf( Englishn);break;case Spaish:printf( Spaishn);break;case Russian:printf( Russiann);printf(Publish date:%d.%d.%dn,card0-publishingdate.year,card0-publishingdate.month,card0-publishingdate.day);printf( ABSTRACT: ) ; printf( %s,card0-abstract) ; printf(n);運(yùn)行結(jié)果演示第10頁(yè),共158頁(yè)。文件是為了某種目的系統(tǒng)的把數(shù)據(jù)組織起來(lái)而
9、構(gòu)成的數(shù)據(jù)集合體從實(shí)現(xiàn)角度看:文件往往與外部沒(méi)備、磁盤(pán)上的文件聯(lián)系在一起,也就是與計(jì)算機(jī)操作系統(tǒng)的文件聯(lián)系在一起人們往往需要加工處理各式各樣的數(shù)據(jù),連接各種各樣的外部設(shè)備。這些數(shù)據(jù)和設(shè)備是千差萬(wàn)別的。為了處理的統(tǒng)一與概念的簡(jiǎn)化,操作系統(tǒng)把這些外部數(shù)據(jù)、外部設(shè)備一律作為文件來(lái)管理。程序設(shè)計(jì)語(yǔ)言中管理的文件,就是計(jì)算機(jī)操作系統(tǒng)中的文件。第11頁(yè),共158頁(yè)。10.2 文件概述文件是程序設(shè)計(jì)中的一個(gè)重要概念,從不同的角度看文件可以分成不同的類(lèi)別。從操作角度看,文件分為:順序文件隨機(jī)文件;從用戶(hù)角度看,文件分為普通文件設(shè)備文件;從文件內(nèi)部編碼方式看,文件分為ASCII文件二進(jìn)制文件。第12頁(yè),共158
10、頁(yè)。文件名文件名是文件的唯一標(biāo)識(shí),它的一般結(jié)構(gòu)是主文件名.擴(kuò)展名其中的擴(kuò)展名可以省略,但通常都保留。 通過(guò)擴(kuò)展名,可以判斷文件類(lèi)型。例如.c C語(yǔ)言的源程序文件.txt 文本文件.doc word文檔文件第13頁(yè),共158頁(yè)。文件名分為絕對(duì)文件名從磁盤(pán)盤(pán)符開(kāi)始描述的文件名相對(duì)文件名從計(jì)算機(jī)操作系統(tǒng)中文件系統(tǒng)的某個(gè)節(jié)點(diǎn)開(kāi)始描述的文件名 例如: E:docprogramingtest.c 表示絕對(duì)文件名 test.c 表示相對(duì)于節(jié) E:docprograming的相對(duì)文件名第14頁(yè),共158頁(yè)。順序文件和隨機(jī)文件順序文件的特點(diǎn):文件分成兩種模式讀模式 寫(xiě)模式 在任意時(shí)刻,一個(gè)順序文件只能處于兩種模
11、式之一。當(dāng)一個(gè)順序文件處于讀模式時(shí),只能從該文件讀數(shù)據(jù)。 反之,當(dāng)一個(gè)順序文件處于寫(xiě)模式時(shí),只能向該文件寫(xiě)數(shù)據(jù)。從操作角度看,順序文件只能順序操作。 對(duì)于讀來(lái)講,順序文件只能從文件第一成分開(kāi)始順序的,一個(gè)成分接一個(gè)成分的讀數(shù)據(jù)。 對(duì)于寫(xiě)來(lái)講,順序文件只能在文件尾一個(gè)成分接一個(gè)成分的向文件里寫(xiě)數(shù)據(jù),每次寫(xiě)進(jìn)的成分都放在文件末尾第15頁(yè),共158頁(yè)。隨機(jī)文件的特點(diǎn)是:對(duì)文件的操作是隨機(jī) 在同一時(shí)刻,即可以向文件中寫(xiě),也可以從文件中讀(文件沒(méi)有讀寫(xiě)模式之分)。 讀寫(xiě)操作可以針對(duì)文件中任意成分進(jìn)行。例如第一次讀了第100個(gè)成分然后再讀第3個(gè)成分然后再用一個(gè)新的數(shù)據(jù)修改第50 成分將其寫(xiě)入第50個(gè)成分中
12、然后又讀第200個(gè)成分.,等等。這是允許的,并且是正確的。 第16頁(yè),共158頁(yè)。普通文件和設(shè)備文件普通文件是指駐留在磁盤(pán)或其它外部介質(zhì)上的一個(gè)有序數(shù)據(jù)集,可以是源程序文件、目標(biāo)程序文件、可執(zhí)行程序文件;也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。設(shè)備文件是指與主機(jī)相聯(lián)的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤(pán)等。 在操作系統(tǒng)中,把外部設(shè)備也作為文件來(lái)進(jìn)行管理,把它們的輸入、輸出等同于對(duì)磁盤(pán)文件的讀和寫(xiě)。通常顯示器定義為標(biāo)準(zhǔn)輸出文件,鍵盤(pán)是標(biāo)準(zhǔn)輸入文件 第17頁(yè),共158頁(yè)。ASCII文件和二進(jìn)制文件ASCII文件就是ASCII碼文件,也稱(chēng)為文本文件、TEXT文件。 這種文件每個(gè)字符對(duì)
13、應(yīng)一個(gè)字節(jié),用于存放相應(yīng)字符的ASCII碼,也就是存放字符的存儲(chǔ)形態(tài)的編碼。字符1、2、3、4的ASCII碼分別為49、50、51、52(十六進(jìn)制的31、32、33、34),字符串“1234”的存儲(chǔ)形式為:共占用4個(gè)字節(jié)。ASCII文件可以在屏幕上按字符顯示,例如源程序文件就是ASCII文件,用DOS命令TYPE可以顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。第18頁(yè),共158頁(yè)。二進(jìn)制文件就是二進(jìn)制碼文件,它把數(shù)據(jù)按二進(jìn)制編碼方式存放到文件中。例如,數(shù)1234的存儲(chǔ)形式為:0000010011010010只占二個(gè)字節(jié)。用TYPE命令顯示二進(jìn)制文件是無(wú)意義的,其內(nèi)容無(wú)法讀懂。第19頁(yè)
14、,共158頁(yè)。流式文件C系統(tǒng)的文件操作,不區(qū)分文件類(lèi)別。不論 順序文件還是隨機(jī)文件、 普通文件還是設(shè)備文件、 ASCII文件還是二進(jìn)制文件。C把文件一律都看成是“字節(jié)流”,以字節(jié)(每個(gè)字節(jié)可能是一個(gè)字符,也可能是一個(gè)二進(jìn)制代碼)為單位進(jìn)行操作處理。對(duì)字節(jié)流的操作;輸入輸出的開(kāi)始和結(jié)束都由程序控制,不受物理符號(hào)(如回車(chē)符)的影響。把這種文件操作方式稱(chēng)作“流式文件”。第20頁(yè),共158頁(yè)。文件指針C 系統(tǒng)為了處理文件,為每個(gè)文件在內(nèi)存中開(kāi)辟一個(gè)區(qū)域,用來(lái)存放文件的有關(guān)信息,如文件名、文件狀態(tài)以及文件當(dāng)前位置等。這個(gè)區(qū)域被作成一個(gè)稱(chēng)為 FILE 類(lèi)型的結(jié)構(gòu)體。FILE 的類(lèi)型由系統(tǒng)定義,保存在頭文件
15、 stdio.h 中,它的具體結(jié)構(gòu)我們暫時(shí)不用關(guān)心。C 程序中用指向 FILE 類(lèi)型變量的指針變量(簡(jiǎn)稱(chēng)“文件指針”)來(lái)標(biāo)識(shí)具體文件。變量聲明 FILE *fp ; 聲明了一個(gè)文件指針變量 fp ,以后 fp 可以用來(lái)標(biāo)識(shí)具體文件。 第21頁(yè),共158頁(yè)。標(biāo)記C文件是一個(gè)流式文件,在該字節(jié)流上有一個(gè)隱含的暗標(biāo)記,該標(biāo)記總是指向文件中正要操作的字節(jié),即下一個(gè)字節(jié),稱(chēng)該標(biāo)記為文件讀寫(xiě)位置指針。例如: 指向文件首,即指向第一個(gè)字節(jié) 指向第四個(gè)字節(jié); . 指向文件尾; 第22頁(yè),共158頁(yè)。幾個(gè)常量 C系統(tǒng)引進(jìn)幾個(gè)常量標(biāo)志文件處理狀態(tài)。最常用的是 EOF 和 NULL,它們是 stdio.h 中預(yù)定義
16、的常量。EOF:值為“-1”習(xí)慣上表示文件結(jié)束,或文件操作出錯(cuò);NULL:值為“0”習(xí)慣上表示打開(kāi)文件失敗等。第23頁(yè),共158頁(yè)。文件操作C沒(méi)有文件操作語(yǔ)句,C文件操作全部通過(guò)系統(tǒng)定義的庫(kù)函數(shù)來(lái)實(shí)現(xiàn)。“庫(kù)函數(shù)”是指系統(tǒng)已經(jīng)定義好的,存放在“函數(shù)庫(kù)”文件內(nèi)的,可以被用戶(hù)直接調(diào)用的函數(shù)。這些庫(kù)函數(shù)根據(jù)其功能的不同,存放在不同的函數(shù)庫(kù)中。 庫(kù)函數(shù)本身并不屬于語(yǔ)言,它是系統(tǒng)根據(jù)需要提供給用戶(hù)使用的函數(shù)。C 標(biāo)準(zhǔn)定義了常用的函數(shù)庫(kù)和每個(gè)函數(shù)庫(kù)中常用的庫(kù)函數(shù)。但是不同的編譯系統(tǒng)提供的函數(shù)庫(kù)不同,不同編譯系統(tǒng)在每個(gè)函數(shù)庫(kù)中提供的庫(kù)函數(shù)也不同。為了提高程序的可移植性,用戶(hù)應(yīng)該只使用 C 標(biāo)準(zhǔn)定義的函數(shù)庫(kù)和庫(kù)
17、函數(shù)。第24頁(yè),共158頁(yè)。對(duì)應(yīng)每個(gè)函數(shù)庫(kù),有一個(gè)頭文件,在頭文件中包含相應(yīng)函數(shù)庫(kù)中所有函數(shù)的函數(shù)原型。用戶(hù)使用庫(kù)函數(shù)時(shí),需要把相應(yīng)的頭文件用 #include 命令括入到自己的程序文件中。文件操作函數(shù)庫(kù)的頭文件是 “stdio.h”,在用戶(hù)程序中只要涉及文件操作,即只要涉及輸入輸出就應(yīng)該把該文件括入程序中,使用的程序行是:#include stdio.h這就是為什么前述各個(gè)章節(jié)的程序都含有這一行的原因。第25頁(yè),共158頁(yè)。任何高級(jí)語(yǔ)言,對(duì)文件操作都應(yīng)該遵循: 打開(kāi)文件 操作文件 關(guān)閉文件這樣的過(guò)程。下面就遵循這個(gè)規(guī)則對(duì)文件的操作進(jìn)行說(shuō)明 第26頁(yè),共158頁(yè)。10.3 打開(kāi)和關(guān)閉文件 例1
18、0.1主程序開(kāi)始的程序行cardpointer=fopen(card.dat,r ); 是打開(kāi)文件。稱(chēng)為以“讀”模式打開(kāi)文件card.dat,打開(kāi)后把card.dat的文件指針?biāo)腿宋募羔樧兞縞ardpointer中,在以后的程序運(yùn)行過(guò)程中以指針變量cardpointer標(biāo)識(shí)文件card.dat。 而主程序最后的程序行fclose(cardpointer); 是關(guān)閉文件。它關(guān)閉指針變量cardpointer所指的文件。第27頁(yè),共158頁(yè)。10.3 打開(kāi)和關(guān)閉文件打開(kāi)文件使用函數(shù)fopen 。fopen的調(diào)用方式是:fp = fopen( filename , mode );其中 filena
19、me 是一個(gè)字符串,具體給出要打開(kāi)的文件的文件名; mode 也是一個(gè)字符串,具體給出文件的打開(kāi)模式, 表10.1列出各種打開(kāi)模式; fp 是文件指針變量,它的類(lèi)型是FILE *在以后的程序中使用該指針變量fp標(biāo)識(shí)由文件名給出的文件。第28頁(yè),共158頁(yè)。fopen 根據(jù) mode 指定的模式,打開(kāi)由filename指定的文件。例如: fp = fopen( c:userfile.txt , r ) ;以“只讀”方式,打開(kāi) c 盤(pán) user 節(jié)點(diǎn)下的 file.txt 文件。如果成功則 fp 就是文件 file.txt 的文件指針變量,并且只允許對(duì)文件進(jìn)行讀操作;否則 fp 的值是 NULL
20、。第29頁(yè),共158頁(yè)。下表給出文件打開(kāi)模式 mode 及其含義。序號(hào)mode含義1“r”以只讀方式打開(kāi)一個(gè)ASCII文件2“w”以只寫(xiě)方式打開(kāi)或新建一個(gè)ASCII文件,原有文件內(nèi)容全部刪除3“a”同“w”,但是不刪除原有文件內(nèi)容4“r+”以可讀可寫(xiě)方式打開(kāi)一個(gè)ASCII文件5“w+”以可讀可寫(xiě)方式打開(kāi)或新建一個(gè)ASCII文件,原有文件內(nèi)容全部刪除6“a+”同“w+”,但是不刪除原有文件內(nèi)容第30頁(yè),共158頁(yè)。7“rb”以只讀方式打開(kāi)一個(gè)二進(jìn)制文件8“wb”以只寫(xiě)方式打開(kāi)或新建一個(gè)二進(jìn)制文件,原有文件內(nèi)容全部刪除9“ab”同“wb”,但是不刪除原有文件內(nèi)容10“rb+”以可讀可寫(xiě)方式打開(kāi)一個(gè)
21、二進(jìn)制文件11“wb+”以可讀可寫(xiě)方式打開(kāi)或新建一個(gè)二進(jìn)制文件,原有文件內(nèi)容全部刪除12“ab+”同“wb+”,但是不刪除原有文件內(nèi)容第31頁(yè),共158頁(yè)。 任何文件在操作結(jié)束之后,都應(yīng)該執(zhí)行文件關(guān)閉操作。關(guān)閉文件使用函數(shù)fclose 。 fcloae的調(diào)用方式是:fclose( fp ); 其中fp 是文件指針。fclose的功能是關(guān)閉由文件指針fp指向的文件。fclose的返回值是:第32頁(yè),共158頁(yè)。10.4 程序參數(shù) 【例10.2】實(shí)現(xiàn)DOS命令COPY的文本文件復(fù)制的功能。把某給定文件復(fù)制到另一個(gè)給定文件上。 解:該題目首先遇到的問(wèn)題是“源文件”和“目標(biāo)文件”怎么給出,DOS的CO
22、PY命令格式是:COPY 源文件名 目標(biāo)文件名 那么“源文件名”和“目標(biāo)文件名”怎么傳入程序中去? 使用程序參數(shù)可以解決這個(gè)問(wèn)題,編出程序如下:第33頁(yè),共158頁(yè)。#include / 1#include stdio.h/ 2void main(int argc, char *argv) /* 執(zhí)行方式:可執(zhí)行文件名 源文件名 目標(biāo)文件名 3 */ FILE *inputfile; /*源文件指針*/ 4 FILE *outputfile;/* 目標(biāo)文件指針 */ 5 char ch;/ 6 if(argc!=3) /*參數(shù)個(gè)數(shù)不對(duì)*/7 printf(the number of argum
23、ents not correctn);/ 8 printf(n Usage: 可執(zhí)行文件名 source-file dest-filen);/ 9 exit(0); /*退出*/ 10/ 11if (inputfile=fopen(argv1,r)=NULL) /*打開(kāi)源文件失敗*/ printf(can not open source filen);/ 13 exit(0);/ 14/ 15if (outputfile=fopen(argv2,w)=NULL)/*創(chuàng)建目標(biāo)文件失敗*/ printf(can not create destination filen);/ 17 exit(0);
24、/ 18/ 19 /* 復(fù)制操作部分,暫時(shí)略。*/ fclose(inputfile); /*關(guān)閉源文件*/ fclose(outputfile); /*關(guān)閉目標(biāo)文件*/在該程序中,主函數(shù)的函數(shù)定義說(shuō)明符的形式是:void main(int argc, char *argv)其中argc和argv是主函數(shù)main的參數(shù),argc是整數(shù)類(lèi)型,argv是指向指針數(shù)組的指針類(lèi)型。 當(dāng)程序運(yùn)行時(shí)使用COPY 源文件名 目標(biāo)文件名命令形式把“源文件名”和“目標(biāo)文件名”傳入程序中。例如:COPY jilin.dat Changchun.dat運(yùn)行結(jié)果演示第34頁(yè),共158頁(yè)。使用該形式運(yùn)行程序時(shí),系統(tǒng)開(kāi)辟
25、一個(gè)整數(shù)類(lèi)型變量空間保存參數(shù)argc。開(kāi)辟一個(gè)指向指針的指針變量空間保存參數(shù)argv;同時(shí)開(kāi)辟一系列字符串空間,保存命令以及命令行上各個(gè)程序參數(shù)字符串;再開(kāi)辟一個(gè)足夠的指針數(shù)組空間,保存命令行上每個(gè)字符串的指針。最后產(chǎn)生如下圖結(jié)構(gòu)的程序參數(shù)信息:第35頁(yè),共158頁(yè)。 顯然,argv是指向指針數(shù)組的指針變量;argv1是字符型指針變量,指向字符串“jilin.dat”;而argv14是字符類(lèi)型變量,值是字符“n”。在主函數(shù)main中,通過(guò)參數(shù)argc可以知道一共有幾個(gè)參數(shù),通過(guò)argv可以找到各個(gè)參數(shù)。argv:copy0argc:3jilin.dat0 changchun.dat0命令行co
26、py jilin.dat changchun.dat產(chǎn)生信息。第36頁(yè),共158頁(yè)。程序參數(shù)稱(chēng)為“命令行參數(shù)”。C程序從主函數(shù)main開(kāi)始執(zhí)行,當(dāng)操作系統(tǒng)啟動(dòng)C程序執(zhí)行時(shí),把三個(gè)信息傳入程序。這三個(gè)信息是:命令行中字符串個(gè)數(shù)(包括命令本身)命令行中每個(gè)字符串內(nèi)容表示程序運(yùn)行環(huán)境的各個(gè)字符串內(nèi)容 第一個(gè)信息是一個(gè)整數(shù); 第二個(gè)信息由一個(gè)個(gè)字符串組成,用一個(gè)指針數(shù)組保存這些字符串的首指針,操作系統(tǒng)傳遞給程序的是相應(yīng)指針數(shù)組的首地址; 第三個(gè)信息不常用,我們不涉及它。第37頁(yè),共158頁(yè)。 為了與操作系統(tǒng)聯(lián)系,傳遞上述信息,一般 main 函數(shù)有兩個(gè)形式參數(shù): 第一個(gè)對(duì)應(yīng)操作系統(tǒng)傳遞過(guò)來(lái)的“命令行中
27、字符串 個(gè)數(shù)”,經(jīng)常用argc表示; 第二個(gè)對(duì)應(yīng)操作系統(tǒng)傳遞過(guò)來(lái)的“指針數(shù)組的首地 址”,經(jīng)常用argv表示。帶參數(shù)的main函數(shù)的常用形式為: main ( int argc ,char * argv )int型參數(shù)argc標(biāo)識(shí)數(shù)組argv的元素個(gè)數(shù),字符指針數(shù)組argv的各個(gè)元素分別指向命令行中可執(zhí)行文件名和各個(gè)參數(shù)的字符串,argv0總是指向可執(zhí)行文件名。第38頁(yè),共158頁(yè)。例10.3 編程序輸出命令行的參數(shù)內(nèi)容#include void main(int argc,char* argv ) printf(argc=%dn,argc); printf(command name:%sn,
28、 argv0); for(int i=1;i tt se.txt hope ee efe 程序運(yùn)行結(jié)果為:argc=5commard name:ttArgument 1:se.txtArgument 2:hopeArgument 3:eeArgument 4:efe運(yùn)行結(jié)果演示第39頁(yè),共158頁(yè)。保障程序健壯 在例10.2程序中,第711行如下: if(argc!=3) /*參數(shù)個(gè)數(shù)不對(duì)*/ printf(the number of arguments not correctn); printf(n Usage: 可執(zhí)行文件名 source-file dest-filen); exit(0)
29、; /*退出*/ 使用程序參數(shù)argc判斷命令行中給定的參數(shù)個(gè)數(shù)是否正確。若不正確(3個(gè)),則給出信息,終止程序運(yùn)行。第40頁(yè),共158頁(yè)。 在例10.2程序中,第1215、1619行打開(kāi)文件都使用如下類(lèi)似的形式:if (inputfile=fopen(argv1,r)=NULL)printf(can not open source filen); exit(0);而不是象例12.1那樣簡(jiǎn)單的一行。 本程序的argv1指向字符串changchun.dat,程序的第12行打開(kāi)由argv1給定文件名的文件changchun.dat,把文件指針?biāo)腿薸nputfile中,這是基本功能。同時(shí)判斷這個(gè)打開(kāi)
30、操作是否執(zhí)行正確,若不正確(帶回NULL值)則終止程序運(yùn)行,因?yàn)樵傧蛳聢?zhí)行程序沒(méi)有任何意義。 判斷參數(shù)個(gè)數(shù)是否正確、以及打開(kāi)文件操作判斷是否打開(kāi)正確是十分必要的。這樣做的目的是保證程序的健壯性。 第41頁(yè),共158頁(yè)?!纠?0.4】完善例10.2程序中的拷貝部分程序片段。 解:程序邏輯十分簡(jiǎn)單,一個(gè)個(gè)字符的從input文件讀,向output文件寫(xiě),直到input文件結(jié)束。程序片段如下: while ( !feof(inputfile) ) /*復(fù)制源文件到目標(biāo)文件中*/ch=fgetc(inputfile);fputc(ch,outputfile); 該程序片段使用了從文件讀一個(gè)字符和向文件寫(xiě)
31、一個(gè)字符的函數(shù)fgetc和fputc。10.5 字符讀寫(xiě)第42頁(yè),共158頁(yè)。1.讀字符:fgetc函數(shù)原型:int fgetc( FILE * fp );功能從fp指向的文件中讀取一個(gè)字符,同時(shí)將讀寫(xiě)位置指針向前移動(dòng)1個(gè)字節(jié)函數(shù)fgetc和fputc的形式是: 第43頁(yè),共158頁(yè)。2.寫(xiě)字符:fputc 函數(shù)原型int fputc( int ch, FILE * fp );功能把字符ch寫(xiě)入fp指向的文件,同時(shí)將讀寫(xiě)位置指針向前移動(dòng)1個(gè)字節(jié)。第44頁(yè),共158頁(yè)。例10.5 創(chuàng)建某文本文件的副本, 副本文件要有行號(hào)#include #include stdio.h#define SIZE
32、256void main(int argc, char *argv) /* 執(zhí)行方式:可執(zhí)行文件名 源文件名 目標(biāo)文件名 */ FILE *inputfile; /*源文件指針*/ FILE *outputfile;/* 目標(biāo)文件指針 */ char ch; int line=1; if(argc!=3) /*參數(shù)個(gè)數(shù)不對(duì)*/ printf(the number of arguments not correctn); printf(n Usage: 可執(zhí)行文件名 source-file dest-filen); exit(0); /*退出*/ 運(yùn)行結(jié)果演示第45頁(yè),共158頁(yè)。 if (inp
33、utfile=fopen(argv1,r)=NULL) /*打開(kāi)源文件失敗*/ printf(can not open source filen); exit(0); if (outputfile=fopen(argv2,w)=NULL) /*創(chuàng)建目標(biāo)文件失敗*/ printf(can not create destination filen); exit(0);/* 復(fù)制 */fprintf( outputfile, %5d, line ); /*寫(xiě)入第一行行號(hào)*/while((ch=fgetc(inputfile)!=EOF)fputc( ch,outputfile ); /* 寫(xiě)入當(dāng)前字
34、符 */if ( ch=n | ch=r )fprintf( outputfile, %5d, +line ); /*寫(xiě)入行號(hào),行號(hào)增1*/ fclose(inputfile); /*關(guān)閉源文件*/ fclose(outputfile); /*關(guān)閉目標(biāo)文件*/第46頁(yè),共158頁(yè)。1. 讀字符串函數(shù)原型:char *fgets( char *str , int num , FILE * fpointer );功能:從fpointer指向的文件中讀取一個(gè)字符串,并將此串保存在str指向的字符數(shù)組中。字符串的自然結(jié)束符是 “換行符” 和 “文件結(jié)束符”。若讀到 num-1 個(gè)字符后還沒(méi)遇到結(jié)束符,
35、則也強(qiáng)制結(jié)束,這時(shí)把 num-1 個(gè)讀入的字符送入數(shù)組 str 中。讀入結(jié)束后,在數(shù)組 str的字符串末尾加字符串終止字符 NULL;并將文件讀寫(xiě)位置指針向前移動(dòng)實(shí)際讀取的字節(jié)個(gè)數(shù)10.6 字符串讀寫(xiě)第47頁(yè),共158頁(yè)。例10.6 創(chuàng)建某文本文件的副本, 副本文件要有行號(hào) 例10.5的程序還可以使用字符串I/O函數(shù)fgets和fputs,編出更簡(jiǎn)潔的程序。假設(shè)源文件每行最長(zhǎng)不超過(guò)256個(gè)字符。編出程序如下(省略了與前一個(gè)程序相似的部分): #define SIZE 256void main(int argc, char *argv) while(fgets(buf,SIZE,inputfil
36、e)!=NULL)/*復(fù)制源文件到目標(biāo)文件中*/ fprintf( outputfile, %5d, line+ ); /*寫(xiě)入行號(hào),行號(hào)增1*/ fputs(buf,outputfile);/*寫(xiě)入字符串*/ 讀/寫(xiě)字符串時(shí),使用fgets()和fputs()函數(shù)。10.6 字符串讀寫(xiě)運(yùn)行結(jié)果演示第48頁(yè),共158頁(yè)。1. 讀字符串:fgets 函數(shù)原型:char *fgets( char *str , int num , FILE * fpointer );功能:從fpointer指向的文件中讀取一個(gè)字符串,并將此串保存在str指向的字符數(shù)組中。字符串的自然結(jié)束符是 “換行符” 和 “文件
37、結(jié)束符”。若讀到 num-1 個(gè)字符后還沒(méi)遇到結(jié)束符,則也強(qiáng)制結(jié)束,這時(shí)把 num-1 個(gè)讀入的字符送入數(shù)組 str 中。讀入結(jié)束后,在數(shù)組 str的字符串末尾加字符串終止字符 NULL;并將文件讀寫(xiě)位置指針向前移動(dòng)實(shí)際讀取的字節(jié)個(gè)數(shù)第49頁(yè),共158頁(yè)。2.寫(xiě)字符串: fputs函數(shù)原型int *fputs( char *str , FILE * fpointer );功能:把str所指字符串(不包括字符串結(jié)束符NULL)寫(xiě)入fpointer指向的文件, 同時(shí)將讀寫(xiě)位置指針向前移動(dòng)num(字符串長(zhǎng)度)個(gè)字節(jié)。第50頁(yè),共158頁(yè)。10.7 格式化讀寫(xiě) 例10.5、例10.6的程序輸出的行號(hào)信
38、息使用語(yǔ)句 fprintf( output, %5d, line+ ); 把整數(shù)從內(nèi)部數(shù)據(jù)翻譯成ASCII字符數(shù)據(jù)輸出。 把內(nèi)部數(shù)據(jù)信息翻譯成ASCII字符串寫(xiě)入文件,或把文件中的ASCII字符串翻譯后讀入,使用fscanf()和fprintf()函數(shù),稱(chēng)為格式化“輸入”、“輸出”。 函數(shù)fscanf()和fprintf()與函數(shù)scanf()和printf()的功能相似,區(qū)別在于函數(shù)fscanf()和fprintf()操作對(duì)象是一般文件,而scanf()和printf()操作對(duì)象是標(biāo)準(zhǔn)輸入輸出文件。格式化讀寫(xiě)是把數(shù)據(jù)按fscanf()和fprintf()函數(shù)中格式控制字符串中控制字符的要求進(jìn)
39、行轉(zhuǎn)換,然后再進(jìn)行讀寫(xiě)。格式轉(zhuǎn)換在第三章的3.8節(jié)已經(jīng)介紹過(guò)。第51頁(yè),共158頁(yè)。1. 格式化輸入: fscanf 函數(shù)原型:int fscanf( FILE * fp , char * format , arg_list );功能:從fp所指文件,按format規(guī)定的格式進(jìn)行轉(zhuǎn)換,讀取arg_list對(duì)應(yīng)的數(shù)據(jù)第52頁(yè),共158頁(yè)。2. 格式化輸出:fprinf函數(shù)原型int fprinf( FILE * fp , char * format , arg_list );功能將arg_list內(nèi)的各參數(shù)值按format格式進(jìn)行轉(zhuǎn)換,輸出到fp所指的文件。第53頁(yè),共158頁(yè)。例 10.7 在
40、磁盤(pán)中建立一個(gè)正弦函數(shù)表文件“sin.tab” 格式如下: THE LIST OF SIN(X)a SIN(a) a SIN(a) a SIN(a) a SIN(a) a SIN(a)0 0.0000 1 0.0175 2 0.0349 3 0.0523 4 0.06985 0.0872 6 0.1045 7 0.1219 8 0.1392 9 0.1564. . 到 359為止第54頁(yè),共158頁(yè)。開(kāi)始打印表頭 for( v=0; v=71; v+) 寫(xiě)( fp , v*5+u , sin(v*5+u) */180) ) for( u=0; u=4; u+)寫(xiě)(fp,”n”)結(jié)束第55頁(yè),共
41、158頁(yè)。void main() int u,v; FILE *f; if ( f=fopen(“sin.tab”,w)=NULL) /*打開(kāi)文件*/ printf(can not open file sin.tabn); exit(0); fprintf( f , %20c THE LIST OF SIN(X)n , ) ; /* 表頭 */ fprintf( f , %5s %7s%5s %7s%5s %7s%5s %7s%5s %7sn,a,SIN(a),a,SIN(a),a,SIN(a),a,SIN(a),a,SIN(a) ) ; for ( v=0; v=71; v+ ) /* 表體
42、 */ for ( u=0; u name0 ; ADDRESS = addr顯示 name0讀入電話(huà)號(hào)碼 = telname0、addr、tel寫(xiě)入文件NAMEADDR.TAB第58頁(yè),共158頁(yè)。void main()FILE *name; /*名字源文件指針*/FILE *address; /*地址源文件指針*/FILE *nameaddr;/*目標(biāo)文件指針 */char name08,addr30,tel10;if (name=fopen(NAME.DAT,r)=NULL) printf(can not open source file NAME.DATn); exit(0); if
43、(address=fopen(ADDRESS.DAT,r)=NULL) printf(can not open source file ADDRESS.DATn); exit(0);第59頁(yè),共158頁(yè)。if (nameaddr=fopen(NAMEADDR.DAT,w)=NULL) printf(can not create destination file NAMEADDRn);exit(0);while(!feof(name)&!feof(address)/*控制全部處理*/ /* 控制讀 */fscanf(name,%8s,&name0); /* 讀入姓名=name0 */fscanf
44、(address,%32s,&addr); /* 讀入地址= addr */printf(name %s please input tel:,name0); /*輸出提示信息*/scanf(%s,&tel); /* 終端輸入電話(huà)號(hào)碼 = tel */ /* 姓名、地址、電話(huà)號(hào)碼寫(xiě)入文件NAMEADDR.DAT一行 */fprintf(nameaddr,%12s%32s%10sn,name0,addr,tel);fclose(name);fclose(address);fclose(nameaddr);運(yùn)行結(jié)果演示第60頁(yè),共158頁(yè)。10.8 數(shù)據(jù)塊讀寫(xiě) 本章第一個(gè)例題,例10.1中從文件中讀
45、數(shù)據(jù),使用語(yǔ)句fread( &card , sizeof(struct bookcard),1, cardpointer);把一個(gè)結(jié)構(gòu)體整體讀入。這些結(jié)構(gòu)體顯然是計(jì)算機(jī)內(nèi)部表示的二進(jìn)制形式的,中間不經(jīng)過(guò)任何翻譯過(guò)程。 【例10.9】編一個(gè)函數(shù),合并兩個(gè)已按遞增排序的整數(shù)文件成一個(gè)按遞增排序文件。 解:程序邏輯很簡(jiǎn)單,從兩個(gè)文件分別讀入一個(gè)整數(shù),不斷比較v1、v2大小,把小的寫(xiě)入目標(biāo)文件,然后在從相應(yīng)文件讀入下一個(gè)整數(shù),直到某文件結(jié)束;再把另一個(gè)文件中剩余內(nèi)容全部讀出并寫(xiě)入目標(biāo)文件。第61頁(yè),共158頁(yè)。開(kāi)始結(jié)束V1寫(xiě)入f3 ; 讀f1V2寫(xiě)入f3; 讀f2文件 f1 未結(jié)束文件 f2 未結(jié)束V
46、1寫(xiě)入f3 ;讀f1V2寫(xiě)入f3;讀f2文件 f1 與 f2均未結(jié)束v1v2打開(kāi)文件:f1、f2、f3 讀f1、f2v1、v2 第62頁(yè),共158頁(yè)。/*執(zhí)行方式:可執(zhí)行文件名 已排序源文件名 已排序源文件名 目標(biāo)文件名*/void main(int argc, char *argv)FILE *f1, *f2, *f3; int v1,v2 ;if(argc!=4) /*參數(shù)個(gè)數(shù)不對(duì)*/ printf(the number of arguments not correctn); printf(nUsage: 可執(zhí)行文件名 source-file source-file dest-filen)
47、; exit(0); /*退出*/if ( f1=fopen(argv1,r)=NULL) /*打開(kāi)源文件1失敗*/ printf(can not open source filen); exit(0);if ( f2=fopen(argv2,r)=NULL) /*打開(kāi)源文件2失敗*/ printf(can not open source filen); exit(0);if (f3=fopen(argv3,w)=NULL) /*創(chuàng)建目標(biāo)文件失敗*/ printf(can not create destination filen); exit(0);第63頁(yè),共158頁(yè)。fread( &v1
48、, sizeof(int) , 1 , f1 );fread( &v2 , sizeof(int) , 1 , f2 );while( !feof(f1) & !feof(f2) ) if (v1 v2) /* 取較小元素存入f3文件 */ fwrite( &v1 , sizeof(int) , 1 , f3 );fread( &v1 , sizeof(int) , 1 , f1 ); else fwrite( &v2 , sizeof(int) , 1 , f3 );fread( &v2 , sizeof(int) , 1 , f2 ); 第64頁(yè),共158頁(yè)。while( !feof(f1
49、) ) /* 處理f1文件尾部 */ fwrite( &v1 , sizeof(int) , 1 , f3 ); fread( &v1 , sizeof(int) , 1 , f1 ); while( !feof(f2) ) /* 處理f2文件尾部 */ fwrite( &v2 , sizeof(int) , 1 , f3 ); fread( &v2 , sizeof(int) , 1 , f2 ); fclose(f1); fclose(f2); fclose(f3); 在該程序中,保存在文件中的整數(shù)數(shù)據(jù)以及寫(xiě)入目標(biāo)文件中的整數(shù)數(shù)據(jù)都是計(jì)算機(jī)內(nèi)部形式的二進(jìn)制數(shù)據(jù),在讀寫(xiě)過(guò)程中使用fread、
50、fwrite函數(shù),不經(jīng)過(guò)翻譯過(guò)程。稱(chēng)這種讀寫(xiě)方式為數(shù)據(jù)塊讀寫(xiě)。 數(shù)據(jù)塊讀/寫(xiě)使用函數(shù)fread()和fwrite()。運(yùn)行結(jié)果演示第65頁(yè),共158頁(yè)。函數(shù)原型:int fread( void *buf , int size ,int count , FILE *fp );功能:從fp所指的文件中讀取count個(gè)字段,每個(gè)字段為size個(gè)字節(jié),把它們送到buf所指的緩沖數(shù)組中,同時(shí),將讀寫(xiě)位置指針向前移動(dòng)size* count個(gè)字節(jié)。一般來(lái)講,數(shù)組buf每個(gè)元素的尺寸為size ,每個(gè)字段正好對(duì)應(yīng)數(shù)組buf的一個(gè)元素;即讀入count個(gè)字段送入數(shù)組buf的count個(gè)元素中。1.讀數(shù)據(jù)塊:fr
51、ead在例10.1中,語(yǔ)句fread( &card , sizeof(struct bookcard),1, cardpointer);使用讀數(shù)據(jù)塊方式從cardpointer指向的文件card.dat中讀入一塊sizeof(struct bookcard)長(zhǎng)的數(shù)據(jù),送入結(jié)構(gòu)體變量card中。第66頁(yè),共158頁(yè)。2. 寫(xiě)數(shù)據(jù)塊: fwrite函數(shù)原型:int fwrite( void *buf, int size, int count, FILE *fp );功能:從buf所指的數(shù)組中,把count個(gè)字段寫(xiě)到fp所指的文件中,每個(gè)字段為size個(gè)字節(jié),同時(shí),將讀寫(xiě)位置指針向前移動(dòng)size*c
52、ount個(gè)字節(jié)。一般來(lái)講,數(shù)組buf每個(gè)元素的尺寸為size ,每個(gè)字段正好對(duì)應(yīng)數(shù)組buf的一個(gè)元素;即把數(shù)組buf的count個(gè)元素寫(xiě)到文件中。在例10.9中,語(yǔ)句fwrite( &v2 , sizeof(int) , 1 , f3 );使用讀數(shù)據(jù)塊方式向f3指向的文件(由argv3指出)中寫(xiě)入一塊sizeof(int)長(zhǎng)的數(shù)據(jù)。第67頁(yè),共158頁(yè)。10.9 文件定位C文件是一個(gè)流式文件,在該字節(jié)流上有一個(gè)隱含的暗標(biāo)記(文件讀寫(xiě)位置指針),該標(biāo)記總是指向文件中正要操作的字節(jié)。當(dāng)以讀模式(“r”)打開(kāi)文件時(shí),文件讀寫(xiě)位置指針指向文件開(kāi)始;當(dāng)以寫(xiě)模式(“w”)打開(kāi)文件時(shí),文件讀寫(xiě)位置指針指向文
53、件開(kāi)始;當(dāng)以追加寫(xiě)模式(“a”)打開(kāi)文件時(shí),文件讀寫(xiě)位置指針指向文件尾;當(dāng)以各種隨機(jī)模式(“a+”、“w+”、“a+”)打開(kāi)文件時(shí),文件讀寫(xiě)位置指針指向文件開(kāi)始。第68頁(yè),共158頁(yè)。在對(duì)文件進(jìn)行任何讀寫(xiě)操作時(shí),位置指針都自動(dòng)向下移動(dòng)相應(yīng)個(gè)數(shù)的字節(jié)。如果要打破這種規(guī)律,就必須使用定位函數(shù)對(duì)位置指針重新定位。函數(shù)rewind 和 fseek 用于位置指針定位函數(shù) ftell 和 feof 用于測(cè)試文件位置指針當(dāng)前所處位置。第69頁(yè),共158頁(yè)。 rewind( )函數(shù)原型:void rewind( FILE *fp );功能:使fp所指文件的位置指針重新指向文件開(kāi)始返回值:無(wú)ftell( )函數(shù)
54、原型:long int ftell( FILE *fp );功能:給出fp所指文件的位置指針當(dāng)前所處位置。第70頁(yè),共158頁(yè)。 fseek( )函數(shù)原型:int fseek( FILE *fp, long offset, int origin);功能: 使fp所指文件的指針指向origin+offset的位置表示起始位置的宏起始位置(origin)宏定義數(shù)字代表文件開(kāi)始SEEK_SET0文件當(dāng)前位置SEEK_CUR1文件結(jié)尾SEEK_END2第71頁(yè),共158頁(yè)。 feof( )函數(shù)原型:int feof( FILE *fp );功能:fp 是輸入流,標(biāo)志是否“讀”到fp所指文件末尾,即文件
55、是否結(jié)束。 第72頁(yè),共158頁(yè)。本章小結(jié)本章主要介紹了文件的概念及其操作。重點(diǎn)掌握文件打開(kāi)、關(guān)閉、讀寫(xiě)等操作。第73頁(yè),共158頁(yè)。第十一章 程序開(kāi)發(fā)自頂向下、逐步求精結(jié)構(gòu)化程序設(shè)計(jì)原則程序風(fēng)格作業(yè): 11.1 11.7 練習(xí): 11.6 第74頁(yè),共158頁(yè)。 編程序并不難,只要有算法,會(huì)程序設(shè)計(jì)語(yǔ)言,任何人都可以編出程序,但是不同人編出的程序卻大不相同。針對(duì)同一個(gè)問(wèn)題: 有人編的程序風(fēng)格好、易讀、易維護(hù)、易重用、可靠性高、運(yùn)行得既快又節(jié)省存儲(chǔ)空間; 有人編的程序風(fēng)格差、晦澀難懂、難于維護(hù)、冗長(zhǎng)、正確性和可靠性極低、運(yùn)行起來(lái)既慢又占用空間。編程序易,編好程序難。 要想編出一個(gè)風(fēng)格優(yōu)美、正確
56、可靠、各方面均優(yōu)秀的好程序,必須按照現(xiàn)代軟件工程的規(guī)范進(jìn)行。同時(shí)也必須遵循好的程序設(shè)計(jì)原則和使用好的程序設(shè)計(jì)方法。 本章介紹程序開(kāi)發(fā)、結(jié)構(gòu)化程序設(shè)計(jì)。第75頁(yè),共158頁(yè)。11.1 求三角形外心 -自頂向下、逐步求精 【例11.1】編程序,輸入平面上三個(gè)點(diǎn),求過(guò)該三點(diǎn)的圓的圓心。 解:為了簡(jiǎn)單,設(shè)該三點(diǎn)不在一條直線(xiàn)上。下邊考慮怎樣解決改問(wèn)題。 按幾何知識(shí),過(guò)該三點(diǎn)的圓的圓心應(yīng)該是由該三點(diǎn)組成的三角形的外心,即三條邊的垂直平分線(xiàn)的交點(diǎn)。設(shè)該三點(diǎn)為A、B、C,三點(diǎn)的坐標(biāo)分別為:ax、ay、bx、by、cx、cy。該問(wèn)題的解法可以描述為如下PAD.第76頁(yè),共158頁(yè)。讀入三點(diǎn)坐標(biāo)只是一個(gè)讀語(yǔ)句,不
57、必求精 ,下邊考慮求垂直平分線(xiàn)和求交點(diǎn)。 輸入三點(diǎn)坐標(biāo):ax、ay、bx、by、cx、cy計(jì)算邊AB的垂直平分線(xiàn)R計(jì)算邊BC的垂直平分線(xiàn)S求直線(xiàn)R、S交點(diǎn)T輸出交點(diǎn)T坐標(biāo)開(kāi)始結(jié)束第77頁(yè),共158頁(yè)。 求垂直平分線(xiàn)??梢韵仍O(shè)計(jì)一個(gè)函數(shù)求線(xiàn)段VU的垂直平分線(xiàn),然后分別以AB、BC為實(shí)在參數(shù)調(diào)用該函數(shù)。求線(xiàn)段的垂直平分線(xiàn)應(yīng)該找到該線(xiàn)段的中點(diǎn),和該線(xiàn)段的直線(xiàn)方程,然后過(guò)中點(diǎn)的與線(xiàn)段方程垂直的直線(xiàn)即是。按這個(gè)分析得如下PAD。計(jì)算邊UV的中點(diǎn)坐標(biāo)求線(xiàn)段UV的直線(xiàn)方程求垂直平分線(xiàn)方程開(kāi)始結(jié)束第78頁(yè),共158頁(yè)。計(jì)算UV中點(diǎn),只是兩個(gè)公式:x=(ux+vx)/2y=(uy+vy)/2第79頁(yè),共158頁(yè)
58、。求AB直線(xiàn)方程也只是兩個(gè)公式:斜率a=(uy-vy)/(ux-vx)截距b=uy-a*ux可以寫(xiě)一個(gè)函數(shù) line(x1,y1,x2,y2, *a,*b ) line*b = y1-*a*x1結(jié)束*a = (y2-y1)/(x2-x1)x1,y1,x2,y2:兩點(diǎn)坐標(biāo) *a, *b :直線(xiàn)方程系數(shù)垂直平分線(xiàn)方程為:斜率aa= -1/a截距bb=y-a*x問(wèn)題已經(jīng)解決。第80頁(yè),共158頁(yè)。 求R、S交點(diǎn)。已知AB的垂直平分線(xiàn) R 的斜率為aa,截距為bb ,設(shè)線(xiàn)段BC的垂直平分線(xiàn) S 的斜率aaa,截距為bbb,則兩條垂直平分線(xiàn)方程的交點(diǎn)為:x=(bb-bbb)/(aaa-aa)y=aa*x
59、+bb這就是所求。綜合上述分析,編出程序如下:第81頁(yè),共158頁(yè)。/*PROGRAM test*/#include stdio.h#include math.h/*求由兩點(diǎn)所確定直線(xiàn)方程系數(shù)y=a*x+b */void line(float x1,float y1,float x2,float y2,float *a,float *b)*a=(y1-y2)/(x1-x2);*b=y1-(*a)*x1;/*求由兩點(diǎn)所確定直線(xiàn)的中垂線(xiàn)的方程*/void vline(float x1,float y1,float x2,float y2,float *a, float *b)float ta,tb
60、;float x,y;x=(x1+x2)/2;y=(y1+y2)/2;/兩點(diǎn)所確定直線(xiàn)的中點(diǎn)line(x1,y1,x2,y2,&ta,&tb);/兩點(diǎn)所確定直線(xiàn)的方程*a=-1/ta;*b=y-(*a)*x;/中垂線(xiàn)方程運(yùn)行結(jié)果演示第82頁(yè),共158頁(yè)。/*求兩條直線(xiàn)交點(diǎn),計(jì)算交點(diǎn)坐標(biāo)*/void OnePoint(float a1,float b1,float a2,float b2,float *x,float *y)*x=(b2-b1)/(a1-a2);*y=a1*(*x)+b1; /交點(diǎn)坐標(biāo)/*主程序*/void main()float ax,ay,bx,by,cx,cy;/三點(diǎn)坐標(biāo)f
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度計(jì)算機(jī)信息系統(tǒng)集成合同
- 玩具生產(chǎn)承包合同
- 蓋瓦施工合同:醫(yī)院設(shè)施
- 行政年度工作總結(jié)精簡(jiǎn)版5篇
- 乳膠漆粉刷施工合同簽訂流程
- 倉(cāng)儲(chǔ)地產(chǎn)二手交易合同模板
- 房地產(chǎn)屋頂搭建施工合同
- 服務(wù)工作心得體會(huì)(8篇)
- 2024年度高端餐飲連鎖加盟合同
- 2024年度原料藥供應(yīng)協(xié)議
- 浙江省杭州市十三中教育集團(tuán)2024-2025學(xué)年七年級(jí)上學(xué)期期中科學(xué)試題(無(wú)答案)
- 100MWp戶(hù)用光伏發(fā)電EPC總承包 投標(biāo)方案(技術(shù)方案)
- 《中國(guó)心力衰竭診斷和治療指南2024》解讀
- BIM技術(shù)全過(guò)程工程管理及應(yīng)用策劃方案
- 彎扭構(gòu)件制作工藝方案(共22頁(yè))
- 水利工程填塘固基、堤身加固施工方法
- 中醫(yī)針灸的骨邊穴怎樣定位
- 人教版八年級(jí)上冊(cè)英語(yǔ)單詞表默寫(xiě)版(直接打印)
- 電脫水、電脫鹽講解
- 江西省科技創(chuàng)新平臺(tái)建設(shè)(PPT課件)
- 違約損失率(LGD)研究
評(píng)論
0/150
提交評(píng)論