![c語言 補(bǔ)充內(nèi)容_第1頁](http://file4.renrendoc.com/view/daf7d4114edaa25ac4abe99d4541290f/daf7d4114edaa25ac4abe99d4541290f1.gif)
![c語言 補(bǔ)充內(nèi)容_第2頁](http://file4.renrendoc.com/view/daf7d4114edaa25ac4abe99d4541290f/daf7d4114edaa25ac4abe99d4541290f2.gif)
![c語言 補(bǔ)充內(nèi)容_第3頁](http://file4.renrendoc.com/view/daf7d4114edaa25ac4abe99d4541290f/daf7d4114edaa25ac4abe99d4541290f3.gif)
![c語言 補(bǔ)充內(nèi)容_第4頁](http://file4.renrendoc.com/view/daf7d4114edaa25ac4abe99d4541290f/daf7d4114edaa25ac4abe99d4541290f4.gif)
![c語言 補(bǔ)充內(nèi)容_第5頁](http://file4.renrendoc.com/view/daf7d4114edaa25ac4abe99d4541290f/daf7d4114edaa25ac4abe99d4541290f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言補(bǔ)充內(nèi)容內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序命令行參數(shù)以命令行運(yùn)行程序時所帶的參數(shù)intmain(intargc,char*argv[]);intmain(intargc,char**argv);幾乎所有的實(shí)際應(yīng)用程序都需要處理命令行參數(shù)舉例:notepad.exea.txt7z命令行參數(shù)(2)intmain(int
argc,int*argv[]);argc:正整數(shù),表示命令行參數(shù)的個數(shù)。注意:可執(zhí)行文件名本身也是一個參數(shù)argv:指針數(shù)組,數(shù)組中的元素分別指向一個字符串,即命令行參數(shù)的各個字段例如在命令行終端下輸入:
notepad.exe
a.txt
argc的值是2,argv[0],argv[1]的值分別是“notepad.exe”和“a.txt”/*Fig.14.3:fig14_03.cUsingcommand-linearguments*/#include<stdio.h>intmain(intargc,char*argv[]){FILE*inFilePtr;/*inputfilepointer*/FILE*outFilePtr;/*outputfilepointer*/intc;/*definectoholdcharactersinputbyuser*//*checknumberofcommand-linearguments*/if(argc!=3){printf("Usage:mycopyinfileoutfile\n");}/*endif*/else{/*ifinputfilecanbeopened*/if((inFilePtr=fopen(argv[1],"r"))!=NULL){/*ifoutputfilecanbeopened*/if((outFilePtr=fopen(argv[2],"w"))!=NULL){下面的程序?qū)⒁粋€文件中的內(nèi)容逐字符的復(fù)制到另一個文件中假如這個程序的可執(zhí)行文件是mycopy,運(yùn)行:mycopyinput.txtoutput.txt/*readandoutputcharacters*/while((c=fgetc(inFilePtr))!=EOF){fputc(c,outFilePtr);}/*endwhile*/}/*endif*/else{/*outputfilecouldnotbeopened*/printf("File\"%s\"couldnotbeopened\n",argv[2]);}/*endelse*/}/*endif*/else{/*inputfilecouldnotbeopened*/printf("File\"%s\"couldnotbeopened\n",argv[1]);}/*endelse*/}/*endelse*/return0;/*indicatessuccessfultermination*/}/*endmain*/內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序可變長的實(shí)參列表函數(shù)接受的實(shí)參個數(shù)可以是不確定的例:intprintf(constchar*format,…);其中…表示這個函數(shù)可以接受可變數(shù)目的實(shí)參,省略號必須放在形參列表的末尾include<stdarg.h>stdarg.h中的宏和定義va_list:為了訪問可變長實(shí)參列表中的實(shí)參必須聲明一個類型為va_list的對象va_start:在一個可變長實(shí)參列表中的實(shí)參被訪問前,先要調(diào)用這個宏。其功能:初始化用va_list聲明的對象,以便讓宏va_arg和va_end來使用va_arg:宏,展開成一個表示可變長實(shí)參列表中下一個實(shí)參的值和類型的表達(dá)式。va_end:正常返回/*Fig.14.2:fig14_02.cUsingvariable-lengthargumentlists*/#include<stdio.h>#include<stdarg.h>doubleaverage(inti,...);/*prototype*/intmain(void){doublew=37.5;doublex=22.5;doubley=1.7;doublez=10.2;printf("%s%.1f\n%s%.1f\n%s%.1f\n%s%.1f\n\n","w=",w,"x=",x,"y=",y,"z=",z);printf("%s%.3f\n%s%.3f\n%s%.3f\n","Theaverageofwandxis",average(2,w,x),"Theaverageofw,x,andyis",average(3,w,x,y),"Theaverageofw,x,y,andzis",average(4,w,x,y,z));return0;/*indicatessuccessfultermination*/}/*endmain*//*calculateaverage*/doubleaverage(inti,...){doubletotal=0;/*initializetotal*/intj;/*counterforselectingarguments*/va_listap;/*storesinformationneededbyva_startandva_end*/
va_start(ap,i);/*initializestheva_listobject*//*processvariablelengthargumentlist*/for(j=1;j<=i;j++){total+=va_arg(ap,double);}/*endfor*/
va_end(ap);/*cleanupvariable-lengthargumentlist*/returntotal/i;/*calculateaverage*/}/*endfunctionaverage*/
內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序輸入輸出重定向所謂重定向,就是不使用系統(tǒng)的標(biāo)準(zhǔn)輸入端口、標(biāo)準(zhǔn)輸出端口或標(biāo)準(zhǔn)錯誤端口,而進(jìn)行重新的指定,所以重定向分為輸出重定向、輸入重定向和錯誤重定向:STDIN0標(biāo)準(zhǔn)輸入鍵盤命令在執(zhí)行時所要的輸入數(shù)據(jù)通過它來取得
STDOUT1標(biāo)準(zhǔn)輸出顯示器命令執(zhí)行后的輸出結(jié)果從該端口送出
STDERR2標(biāo)準(zhǔn)錯誤顯示器命令執(zhí)行時的錯誤信息通過該端口送出輸入輸出重定向?qū)τ跇?biāo)準(zhǔn)輸入輸出的程序允許將輸入重定向?yàn)閺囊粋€文件中輸入,或者將輸出重定向到一個文件中輸出>:輸出重定向符cmd>data.out<:輸入重定向符cmd<data.in輸出重定向把執(zhí)行相應(yīng)DOS/UNIX命令時本應(yīng)在屏幕上顯示的內(nèi)容輸出到重定向命令所指向的文件或設(shè)備中去。輸出重定向命令>、>>:>原文件會被刪除,重新生成新的文件>>它以追加的方式,將命令的輸出寫入文件的末尾,原文件內(nèi)容會被保留,新的內(nèi)容會添加到原文件內(nèi)容的后面輸入重定向輸入重定向使輸入信息來自文件小于號<是輸入重定向操作符,在<之后的文件名或設(shè)備名是重定向的輸入源如果一個程序需要輸入較多數(shù)據(jù),使用輸入重定向可以提高效率。如more、sort和find命令。其中more進(jìn)行分屏顯示;find查找符合條件的內(nèi)容;sort(按行)排序?qū)嵗齧ore<c:\readme.txtcmd>file把stdout重定向到file文件中cmd>>file把stdout重定向到file文件中(追加)cmd1>file把stdout重定向到file文件中cmd2>file把stderr重定向到file文件中cmd2>>file把stderr重定向到file文件中(追加)cmd<file>file2cmd命令以file文件作為stdin,以file2文件作為stdoutprog.c#include<stdio.h>intmain(void){charc;while(scanf("%c,&c)==1){printf("%c",c);
printf("%c",c);}
return0;}嘗試一下命令cmdcmd<infile.txtcmd>outfile.txtcmd<infile.txt>outfile.txt輸出重定向的一個應(yīng)用如在批處理命令執(zhí)行期間為了禁止命令或程序執(zhí)行后輸出信息而擾亂屏幕,可用DOS重定向功能把輸出改向NUL設(shè)備(NUL不指向任何實(shí)際設(shè)備)例如:C:\>copya.txtb.txt>NUL命令執(zhí)行結(jié)束不顯示"1file(s)copied"的信息。輸入重定向的一個應(yīng)用有的交互程序在執(zhí)行時要求很多鍵盤輸入,但有時輸入是固定不變的,為加快運(yùn)行速度,可預(yù)先建立一個輸入文件,此文件的內(nèi)容為程序的鍵盤輸入項(xiàng),每個輸入項(xiàng)占一行。假如有一個程序cx其輸入項(xiàng)全部包括在文件in.dat中,執(zhí)行C:\>cx<in.dat>NUL程序就自動執(zhí)行。管道進(jìn)程從“管道”的一端發(fā)送另一端接收,也就是說將若干命令用輸入輸出“管道”串接在一起,這就是管道;管道在某種程度上是輸入和輸出重定向的結(jié)合,前一個命令的輸出,作為下一個命令的輸入,而不需要經(jīng)過任何中間文件。豎線字符”|”是管道操作符,管道命令經(jīng)常與一些過濾命令聯(lián)合使用。DOS的管道功能是使一個程序或命令的標(biāo)準(zhǔn)輸出用做另一個程序或命令的標(biāo)準(zhǔn)輸入。typeaaa|DEBUG>bbb如把DEBUG的輸入命令寫入文件aaa,用type命令通過管道功能將aaa的內(nèi)容傳輸給DEBUG,在DEBUG執(zhí)行期間不再從控制臺索取命令參數(shù),從而提高了機(jī)器效率。dir|more使得當(dāng)前目錄列表在屏幕上逐屏顯示。dir的輸出是整個目錄列表,它不出現(xiàn)在屏幕上而是由于符號“|”的規(guī)定,成為下一個命令more的輸入,more命令則將其輸入,more命令則將其輸入一屏一屏地顯示,成為命令行的輸出。dir|find”hello”>file其中dir的輸出是當(dāng)前目錄列表,不出現(xiàn)在屏幕上而是成為find命令的輸入。find命令在輸入文件中尋找指定字符串“hello”并輸出包含這個字符串的行,由于輸出重定向符號>的規(guī)定,最后的輸出已存入文件file,不出現(xiàn)在屏幕上。dir|find"<dir”>file則是將當(dāng)前目錄項(xiàng)中的子目錄項(xiàng)尋找出來并存入文件file中。內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序動態(tài)內(nèi)存分配靜態(tài)內(nèi)存分配在編譯時完成分配,自動釋放——方便、效率高棧空間,大小有限制(默認(rèn)情況下,windows系統(tǒng)1M,Linux下8M)動態(tài)內(nèi)存分配數(shù)據(jù)結(jié)構(gòu)的存儲空間不是在程序運(yùn)行前事先分好,而是在程序運(yùn)行中根據(jù)需要臨時分配程序員自己申請并指明大小,自己釋放——靈活堆空間,空間大小幾乎沒有什么限制(只受到計(jì)算平臺存儲空間資源和操作系統(tǒng)對存儲空間資源分配策略的限制)c/c++程序內(nèi)存分配棧(stack)程序運(yùn)行時由編譯器自動分配,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。程序結(jié)束時由編譯器自動釋放。堆(heap)在內(nèi)存開辟另一塊存儲區(qū)域。一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事。全局區(qū)(靜態(tài)區(qū))(static)編譯器編譯時即分配內(nèi)存。全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放文字常量區(qū)程序代碼區(qū)堆棧實(shí)例代碼比較實(shí)例:#include<stdlib.h>
#include<string.h>inta=0;//全局初始化區(qū)char*p1;//全局未初始化區(qū)voidmain()
{
intb=1; //棧chars[]="abc"; //棧char*p2; //棧char*p3="123456"; //"123456\0"在常量區(qū),p3在棧上。staticintc=0; //全局(靜態(tài))初始化區(qū)p1=(char*)malloc(10);p2=(char*)malloc(20); //分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。strcpy(p1,“123456”); //123456\0放在常量區(qū),編譯器可能會將它與p3 //所指向的"123456"優(yōu)化成一個地方
system("pause");}動態(tài)內(nèi)存分配malloc函數(shù)和free函數(shù)Cvoid*malloc(size_tsize);int*gradeArray=malloc(sizeof(int));voidfree(void*ptr);free(gradeArray);new/deleteC++運(yùn)算符調(diào)用類的構(gòu)造函數(shù)(new)或者析構(gòu)函數(shù)(delete)int*gradeArray=newint[10];delete[]gradeArray;堆/棧的不同堆和棧的主要區(qū)別由以下幾點(diǎn):
1、管理方式不同;
2、空間大小不同;
3、能否產(chǎn)生碎片不同;
4、生長方向不同;
5、分配方式不同;
6、分配效率不同;
堆棧的不同管理方式不同;管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memoryleak??臻g大小不同;空間大?。阂话銇碇v在32位系統(tǒng)下,堆內(nèi)存可以達(dá)到4G的空間,從這個角度來看堆內(nèi)存幾乎是沒有什么限制的。但是對于棧來講,一般都是有一定的空間大小的,例如,在VC6下面,默認(rèn)的??臻g大小是1M。當(dāng)然,這個值可以修改。
堆棧的不同能否產(chǎn)生碎片不同;碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出,在他彈出之前,在他上面的后進(jìn)的棧內(nèi)容已經(jīng)被彈出,詳細(xì)的可以參考數(shù)據(jù)結(jié)構(gòu)。堆棧的不同生長方向不同;生長方向:對于堆來講,生長方向是向上的,也就是向著內(nèi)存地址增加的方向;對于棧來講,它的生長方向是向下的,是向著內(nèi)存地址減小的方向增長。分配方式不同;分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由malloc函數(shù)進(jìn)行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。堆棧的不同分配效率不同;分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫函數(shù)會按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會分到足夠大小的內(nèi)存,然后進(jìn)行返回。顯然,堆的效率比棧要低得多。函數(shù)調(diào)用的棧操作寄存器ebp用做幀指針(framepointer) esp用作棧指針(stackpointer)函數(shù)調(diào)用操作包括從一塊代碼到另一塊代碼之間的雙向數(shù)據(jù)傳遞和執(zhí)行控制轉(zhuǎn)移。數(shù)據(jù)傳遞通過函數(shù)參數(shù)和返回值來進(jìn)行。在進(jìn)入函數(shù)時為函數(shù)的局部變量分配存儲空間,并且在退出函數(shù)時收回這部分空間函數(shù)調(diào)用的棧操作voidswap(int*a,int*b){
intc;
c=*a;*a=*b;*b=c;
}
intmain(){
inta,b;
a=16;b=32;
swap(&a,&b);
return(a-b);
}內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序C預(yù)處理#include預(yù)處理命令文件包含#define預(yù)處理命令符號常量和宏條件編譯#error和#pragma預(yù)處理命令assert#include文件#include“文件名“或#include<文件名>
文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當(dāng)前的源程序文件連成一個源文件。尖括號與雙引號差別:目錄查找次序不同一個include包含一個文件允許嵌套包含
條件編譯#define符號常量和宏#undef條件編譯的三種形式
條件編譯#ifdef標(biāo)識符
程序段1
#else
程序段2
#endif
#ifndef標(biāo)識符
程序段1
#else
程序段2
#endif
#if常量表達(dá)式
程序段1
#else
程序段2
#endif
如果標(biāo)識符已被#define命令定義過則對程序段1進(jìn)行編譯;否則對程序段2進(jìn)行編譯。,如果標(biāo)識符未被#define命令定義過則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。如常量表達(dá)式的值為真(非0),則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。條件編譯#ifdef/#else/#endif#defineNUMok
main(){
ps=(structstu*)malloc(sizeof(structstu));
ps->num=102;
ps->name="Zhangping";
ps->sex='M';
ps->score=62.5;
#ifdefNUM
printf("Number=%d\nScore=%f\n",ps->num,ps->score);
#else
printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
#endif
free(ps);
}structstu
{
intnum;
char*name;
charsex;
floatscore;
}*ps;條件編譯#ifndef/#define/#endif避免頭文件的重定義 #ifndef_TEST_H
#define_TEST_H//一般是文件名的大寫
頭文件結(jié)尾寫上一行:
#endif
這樣一個工程文件里同時包含兩個test.h 時,就不會出現(xiàn)重定義的錯誤了。條件編譯#ifdef/#else/#endif判斷表達(dá)式真假的條件編譯 #defineR1
main(){
floatc,r,s;
printf("inputanumber:");
scanf("%f",&c);
#ifR
r=3.14159*c*c;
printf("areaofroundis:%f\n",r);
#else
s=c*c;
printf("areaofsquareis:%f\n",s);
#endif
}預(yù)處理命令#error主要的作用是在編譯的時候輸出編譯錯誤信息token-sequence,從方便程序員檢查程序中出現(xiàn)的錯誤。該指令用于程序的調(diào)試,當(dāng)編譯中遇到#error指令就停止編譯。 #defineCONST_NAME1"CONST_NAME1"
printf("%s\n",CONST_NAME1);
#undefCONST_NAME1
#ifndefCONST_NAME1
#errorNodefinedConstantSymbolCONST_NAME1
#endif預(yù)處理命令#pragma主要的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。其格式一般為:
#pragmapara
其中para為參數(shù),
常用參數(shù)組合:#pragmamessage:編譯信息輸出窗口中輸出相應(yīng)的信息。例如#pragmamessage(“消息文本”)預(yù)處理命令當(dāng)我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設(shè)置這些宏,此時我們可以用這條指令在編譯的時候就進(jìn)行檢查。假設(shè)我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法
#ifdef_X86#Pragma
message(“_X86macroactivated!”)#endif
當(dāng)我們定義了_X86這個宏以后,應(yīng)用程序在編譯時就會在編譯輸出窗口里顯示“_X86macroactivated!”。預(yù)處理命令#pragmacode_seg
#pragmacode_seg(["section-name"[,"section-class"]])
它能夠設(shè)置程序中函數(shù)代碼存放的代碼段,當(dāng)我們開發(fā)驅(qū)動程序的時候就會使用到它。#pragmaonce(比較常用)
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次。預(yù)處理命令其他pragma的參數(shù)#pragmahdrstop#pragmaonce#pragmaresource#pragmawarningassert宏斷言voidassert(intexpression)assert宏的原型定義在<assert.h>中,其先計(jì)算表達(dá)式expression,如果其值為假(即為0),那么它先向stderr打印一條出錯信息,然后通過調(diào)用abort來終止程序運(yùn)行。其優(yōu)勢是利于調(diào)試,缺點(diǎn)是頻繁的調(diào)用會極大的影響程序的性能,增加額外的開銷。調(diào)試結(jié)束后,可以通過在包含#include<assert.h>的語句之前插入#defineNDEBUG
來禁用assert調(diào)用。#include<stdio.h>
#defineNDEBUG
#include<assert.h>assert()使用實(shí)例 #include<stdio.h>
#include<assert.h>
#include<stdlib.h> intmain(void)
{
FILE*fp;
fp=fopen(“test.txt”,“w”);//文件可創(chuàng)建,打開成功
assert(fp);//所以這里不會出錯
fclose(fp);
fp=fopen(“noexitfile.txt”,“r”);//文件不存在,打開失敗
assert(fp);//所以這里出錯
fclose(fp);//程序永遠(yuǎn)都執(zhí)行不到這里來 return0;
}運(yùn)行后,錯誤提示為:badptr.c:14:main:Assertion`fp'failed.斷言assert的用法assert用法在函數(shù)開始處檢驗(yàn)傳入?yún)?shù)的合法性;intresetBufferSize(intnNewSize){ assert(nNewSize>=0);
assert(nNewSize<=MAX_BUFFER_SIZE);}每個assert只檢驗(yàn)一個條件,多個條件分別斷言;assert(nOffset>=0&&nOffset+nSize <=m_nInfomationSize);劣assert(nOffset>=0);
assert(nOffset+nSize<=m_nInfomationSize);優(yōu)斷言內(nèi)不可使用改變環(huán)境的語句;assert(i++<100);
劣-調(diào)試結(jié)束,取消斷言后程序出錯斷言定義文件#include"cvidef.h"#include"cvirte.h"#ifndef_ASSERT_H_#define_ASSERT_H_#ifdef__cplusplusextern"C"{#endif#undefassert
#ifdefNDEBUG #defineassert(exp)((void)0)#else voidCVIANSI_assert(char*,char*,int); #defineassert(exp)((exp)?(void)0:_assert(#exp,__FILE__,__LINE__))#endif
#ifdef__cplusplus }#endif
#endif/*_ASSERT_H_*/內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯器編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序gcc編譯器C/C++程序的編譯運(yùn)行g(shù)cc/g++是GNC的開源編譯器,用來對c/c++程序進(jìn)行編譯、調(diào)試后綴為.c的程序,gcc當(dāng)成c程序,g++當(dāng)成c++程序;而后綴為.cpp的程序兩者都當(dāng)成c++程序//hello.c#include<stdio.h>
intmain(){
printf("helloworld\n");return0;}gcc編譯過程預(yù)處理對源代碼文件中的文件包含、預(yù)編譯語句進(jìn)行分析gcc-ohello.i
-Ehello.c編譯及優(yōu)化將預(yù)處理文件進(jìn)行匯編,生成匯編語言程序
gcc-ohello.s-Shello.i匯編將匯編的代碼進(jìn)一步進(jìn)行處理,生成相應(yīng)的目標(biāo)文件,以.o為擴(kuò)展名gcc-ohello.o-chello.s鏈接將生成的目標(biāo)文件與其他目標(biāo)文件(或庫文件)連接成可執(zhí)行的二進(jìn)制代碼文件gcc-ohellohello.ogcchello.c–ohello多個文件的編譯鏈接對于一個程序的多個源文件進(jìn)行編譯連接時,可以使用如下格式:gcc–otestfirst.csecond.cthird.c該命令將同時編譯3個源文件,將它們連接成一個可執(zhí)行文件,名為test常用編譯選項(xiàng)(1)-c僅把源程序編譯為目標(biāo)代碼而不做鏈接不生成最終的可執(zhí)行程序,只生成一個與源程序文件名相同的以.o為后綴的目標(biāo)文件。-o<file>將編譯結(jié)果寫入文件<file>中-vGcc的版本信息-xlanguage強(qiáng)制編譯器指定的語言編譯器來編譯某個源程序,例如gcc-xc++test.c-I<DIR>庫依賴選項(xiàng),指定庫及頭文件路徑l<library>在函數(shù)庫<library>中查找需要鏈接的函數(shù)-L<DIR>將目錄<dir>加入到搜索鏈接函數(shù)庫的目錄集合中常用編譯選項(xiàng)(2)-w禁止輸出警告信息-Wall在標(biāo)準(zhǔn)輸出上顯示所有的警告信息-O或-O<n>指定編譯優(yōu)化級別,<n>可以為1,2,3和s,-O等于-O1-g生成調(diào)試輔助信息,以便使用GDB等調(diào)試工具進(jìn)行調(diào)試-pg加入運(yùn)行剖面生成代碼,以便生成可以被gprof解讀的程序運(yùn)行剖面數(shù)據(jù)gcc實(shí)例-----------------------
清單main.c
-----------------------
#include
<stdio.h>
#include
<unistd.h>
intfactorial(intn);
intmain(intargc,char**argv)
{
intn;
if(argc<2){
printf(“Usage:%sn\n”,argv[0]);
return-1;
}else{
n=atoi(argv[1]);
printf(“Factorialof%dis%d.\n”,n,factorial(n));
}
return0;
}-----------------------
清單factorial.c
-----------------------
intfactorial(intn)
{
if(n<=1)
return1;
else
returnfactorial(n-1)*n;
}Gcc-ofactorialmain.cfactorial.c/factorial5Factorialof5is120.
內(nèi)容命令行參數(shù)可變長的實(shí)參列表輸入輸出重定向動態(tài)內(nèi)存分配c預(yù)處理gcc編譯參數(shù)編程中的注意事項(xiàng)編程舉例:事務(wù)處理程序編程中的注意事項(xiàng)數(shù)值的表示和計(jì)算復(fù)雜數(shù)據(jù)類型的解讀變量定義中的復(fù)雜類型說明強(qiáng)制轉(zhuǎn)換中的復(fù)雜類型數(shù)值的表示和計(jì)算整型(定點(diǎn)型)有符號和無符號無符號數(shù)和標(biāo)志位截?cái)嗯c擴(kuò)展計(jì)算中的溢出整除引起的誤差浮點(diǎn)數(shù)據(jù)類型表示方法有效數(shù)字和最低位當(dāng)量比較大小計(jì)算中的溢出計(jì)算中的類型轉(zhuǎn)換按位操作數(shù)值計(jì)算速度整型數(shù)據(jù)類型字符、短整型、整型、長整型C語言對各種整型程度沒有限制僅約束sizeof(long)>=sizeof(int)>=sizeof(short)>=sizeof(char)Sizeof(int)>=2bytes,sizeof(int)>=2bytes,sizeof(long)>=4bytesLimits.h定義一些常數(shù),表示各個數(shù)據(jù)類型的范圍包括SCHAR_MIN,SCHAR_MAX,UCHAR_MAXSHRT_MIN,SHRT_MAX,USHRT_MAXINT_MIN,INT_MAX,UINT_MAXLONG_MIN,LONG_MAX,ULONG_MAX有符號和無符號數(shù)有符號數(shù)和無符號數(shù),對最高位的解釋不通如果是有符號,0-表示正,1-表示負(fù)大的無符號數(shù)轉(zhuǎn)換成有符號數(shù),可能變成負(fù)數(shù)一個負(fù)數(shù)轉(zhuǎn)換成無符號數(shù),變成一個整數(shù)000000011101022011331004-41015-31106-21117-1——補(bǔ)碼的計(jì)算1的二進(jìn)制碼為001取反為110加上末尾1為111-1的補(bǔ)碼為111有符號和無符號數(shù)例子intsi;unsignedui;si=-1;ui=(unsigned)INT_MAX+1;printf(“%#x=signed%d=unsigned%d\n”,si,si,si);printf(“%#x=signed%d=unsigned%d\n”,ui,ui,ui);0xffffffff=signed-1=unsigned42949672950x80000000=signed-2147483648=unsigned2147483648參考前頁有符號和無符號數(shù)運(yùn)算有符號/無符號,同時出現(xiàn),隱含強(qiáng)制轉(zhuǎn)換有符號到無符號也就是“窄”變””寬”Unsignedshortui=5;Shortsi=-5;Printf(“%d\n”,ui>si)輸出0因?yàn)?5轉(zhuǎn)換成無符號數(shù),成為一個很大的數(shù)有符號和無符號數(shù)無符號數(shù)相減Unsignedintx=57,y=663;Printf(“x>y:%d,y>x:%d,x-y>0:%d,y-x>0:%d\n”,x>y,y>x,x-y>0,y-x>0);對于無符號數(shù),x-y>0總是成立的
0111有符號和無符號數(shù)無符號數(shù)和有符號數(shù)使用原則盡量使用有符號數(shù)需要更大數(shù)值范圍的處理時,使用更長位數(shù)的整數(shù)無符號數(shù)和標(biāo)志位無符號數(shù)的使用數(shù)據(jù)掩碼計(jì)算機(jī)網(wǎng)絡(luò)的IP地址比如<sys/stat.h>定義了不同的文件類型#define_S_IFMT0170000//文件類型bit#define_S_IFDIR0040000//目錄文件判斷辦法If(mode&_S_IFMT)==_S_IFDIR){……}整型的截?cái)嗪蛿U(kuò)展整型的截?cái)郔ntn;shorts;N=0x12345678;S=n;Printf(“n:%d(%#x),s:%d(%#x)\n”,N,n,s,s);N:305441741(ox12345678),s:-21555(ox5678)高位字節(jié)被丟棄整型的截?cái)嗪蛿U(kuò)展整型的擴(kuò)展無符號數(shù)/有符號數(shù),擴(kuò)展后不變Shortps=12345,ns=-12345;Unsignedshortpus=(unsignedshort)ps;Unsignedshortnus=(unsignedshort)ns;Intpi,ni;Unsignedintpui,nui,ui;Pi=ps;ni=ns;Pui=pus;nui=nus;Printf(“pi=%d(%#x),ni=%d(%#x)”,pi,pi,ni,ni);Printf(“pui=%d(%#x),nui=%d(%#x)”,pui,pui,nui,nui);整型的截?cái)嗪蛿U(kuò)展整型的擴(kuò)展無符號數(shù)/有符號數(shù),擴(kuò)展后不變Shortps=12345,ns=-12345;Unsignedshortpus=(unsignedshort)ps;Unsignedshortnus=(unsignedshort)ns;Intpi,ni;Unsignedintpui,nui,ui;Pi=ps;ni=ns;Pui=pus;nui=nus;Printf(“pi=%d(%#x),ni=%d(%#x)”,pi,pi,ni,ni);Printf(“pui=%d(%#x),nui=%d(%#x)”,pui,pui,nui,nui);無符號擴(kuò)Ps--pus-pui--pi(有符號)無符號擴(kuò)Ns--nus--nui--ni(有符號)Pi=12345(0x3039),ni=-12345(0xffffcfc7)Pui=12345(0x3039),nui=53191(0xcfc7)整型計(jì)算的溢出溢出的情況兩個符號相同的數(shù)值+兩個符號相異的數(shù)值-兩個大數(shù)×原因:整型是由一定范圍的Inta=12,b=8388608,c=1024;Printf(“a*c=%d,b*c=%d\n”,a*c,b*c);A*c=12288,b*c=0整型計(jì)算的溢出判斷加法是否溢出Inta,b,c;C=a+b;If((a>=0)==(b>=0)&&(a>=0)!=(c>=0)){//overflow)}乘出來的數(shù)值符號不對了,問:能否解決正數(shù)+負(fù)數(shù),負(fù)數(shù)+負(fù)數(shù)的判斷整型計(jì)算的溢出判斷乘法是否溢出Intx,y,z;Z=x*y;If(x!=z/y){//overflow}結(jié)果除以y不等于x了整型計(jì)算的溢出計(jì)算平均值IntI,n,avg,sum,x[MAX_NUM];For(sum=i=0;i<n;i++)sum+x[i];Avg=n>0?Sum/n:0;問題:每個數(shù)值較大,中間結(jié)果溢出。整型計(jì)算的溢出計(jì)算平均值—解決辦法For(rem_sum=avg=i=0;i<n;i++){avg+=x[i]/n;rem_sum+=x[i]%n;}If(n>0)avg+=rem_sum/n;整除的結(jié)果累加余數(shù)先整合起來,最后除以n,再加到avg里面,避免誤差整除所引起的誤差均分窗口大小For(i=1;i<n;i++){p_x[i]=i/n*win_w+win_x;prinft(“%d\t”,p_x[i])}Putchar(‘\n’);000000000因?yàn)椋篿/n一直為0整除所引起的誤差均分窗口大小—改進(jìn)W=win_w/n;For(i=1;i<n;i++){p_x[i]=w*i
+win_x;prinft(“%d\t”,p_x[i])}Putchar(‘\n’);當(dāng)win_w=100,n=10, 102030405060708090當(dāng)win_w=99,n=10, 9,18,27,36,45,54,63,72,81,81與右邊界99差18像素,不均衡整除所引起的誤差均分窗口大小—再改進(jìn)For(i=1;i<n;i++){p_x[i]=win_w*i/n
+win_x;prinft(“%d\t”,p_x[i])}Putchar(‘\n’);當(dāng)win_w=99,n=10, 9,19,29,39,49,59,69,79,89,89與右邊界99差10像素,均分OK先win_w*i再除以n,保證精度整型數(shù)據(jù)的字節(jié)序和尾端大尾端bigendian高位字節(jié)-低端地址,低位字節(jié)在高端地址小尾端littleendian正好相反實(shí)例32位整數(shù)ox12345678從低地址到高地址大尾端:0x12,0x34,0x56,0x78小尾端:0x78,0x56,0x34,0x12整型數(shù)據(jù)的字節(jié)序和尾端考慮尾端的情況不同系統(tǒng)之間進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸一個系統(tǒng)寫入文件,另外一個系統(tǒng)讀出文件解決辦法Uint32_thtonl(uint32_thostlong);主機(jī)-網(wǎng)絡(luò)Uint32_tntohl(uint32_thostlong);網(wǎng)絡(luò)-主機(jī)Uint16_thtons(uint16_thostshort);主機(jī)-網(wǎng)絡(luò)Uint16_tntohs(uint16_thostshort);網(wǎng)絡(luò)-主機(jī)整型數(shù)據(jù)的字節(jié)序和尾端實(shí)例Union{Charbyte[4];Unsignedshortusi[2];Unsignedintu_int;}data;IntI;Data.byte[0]=‘a(chǎn)’;Data.byte[1]=‘b’;Data.byte[2]=‘c’;Data.byte[3]=‘d’;For(inti=0;i<4;i++){Putchar(data.byte[i]);putchar(‘‘);}Printf(“%#x:%d,%#x:%d\n”,data.usi[0],data.usi[0],data.usi[1],data.usi[1]);Printf(“%#x:%d”,data.u_int,data.u_int);整型數(shù)據(jù)的字節(jié)序和尾端實(shí)例Union{Charbyte[4];Unsignedshortusi[2];Unsignedintu_int;}data;IntI;Data.byte[0]=‘a(chǎn)’;Data.byte[1]=‘b’;Data.byte[2]=‘c’;Data.byte[3]=‘d’;For(inti=0;i<4;i++){Putchar(data.byte[i]);putchar(‘‘);}Printf(“%#x:%d,%#x:%d\n”,data.usi[0],data.usi[0],data.usi[1],data.usi[1]);Printf(“%#x:%d”,data.u_int,data.u_int);大尾端內(nèi)存布局0x61,0x62,0x63,0x64
短整型0x61620x6364
整型0x61626364小尾端——內(nèi)存布局一樣,解釋不一樣內(nèi)存布局0x61,0x62,0x63,0x64
短整型0x62610x6463
整型0x64636261浮點(diǎn)數(shù)表示方法——單精度和雙精度的浮點(diǎn)數(shù)313023220符號指數(shù)(8)尾數(shù)(23)636252510符號指數(shù)(11)尾數(shù)(52)V=(-1)s*M*2E浮點(diǎn)數(shù)規(guī)格化浮點(diǎn)數(shù)指數(shù)部分不是全0,不是全1非規(guī)格化浮點(diǎn)數(shù)指數(shù)部分全0用處表示0.0表示非常接近0.0的數(shù)無窮大指數(shù)部分全1,小數(shù)部分全0NaN(NotaNumber)指數(shù)部分全1,小數(shù)部分非全0浮點(diǎn)數(shù)有效數(shù)字單精度:7位雙精度:16位對尾數(shù)的有效位數(shù)內(nèi)不能精確表示的數(shù)據(jù)會產(chǎn)生誤差誤差的災(zāi)難性后果1991年,海灣戰(zhàn)爭,愛國者導(dǎo)彈誤炸美軍兵營,30人喪生浮點(diǎn)數(shù)的加法和乘法滿足單調(diào)性A>b且c>=0,則a+c>b+c,a*c>b*c浮點(diǎn)數(shù)的加法和乘法滿足交換性A+b==b+a,a*b==b*a浮點(diǎn)數(shù)的加法不滿足結(jié)合型(a+b)+c==a+(b+c)(1.23+1e17)–1e17=0較大的誤差導(dǎo)致1.23被忽略1.23+(1e17-1e17)=1.23浮點(diǎn)數(shù)精度實(shí)例T=1.234;x=t*2.01;Y=t+t+t/100.0;If(x==y)Printf(“x(%.10f)==Y(%.10f)\n”,x,y);ElsePrintf(“x(%.10f)!=Y(%.10f)\n”,x,y);結(jié)果x(2.4803400000)!=Y(2.4803400000)比較奇怪,因?yàn)檫@兩個實(shí)際上是不相等的,放大1016就能夠看出差別來X(24803399999999996.00)!=y(24803400000000000.00)浮點(diǎn)數(shù)浮點(diǎn)數(shù)的比較下面的實(shí)例將死循環(huán)Doublei;For(i=0.0;i!=1.0;i+=0.1)Printf(“%.2f\n”,i);由于誤差的累計(jì)10個0.1相加不等于1.00避免使用浮點(diǎn)數(shù)做循環(huán)變量浮點(diǎn)數(shù)浮點(diǎn)數(shù)的比較浮點(diǎn)數(shù)的相等/不相等If(fabs(a-b)<ESP)…浮點(diǎn)數(shù)是否等于0If(x<ESP&&x>-ESP)float.h定義一個最小單位,1.0+x不等于1.0的最小值#defineFLT_EPSILON1.19209290e07F#defineDBL_EPSILON2.2204460492503131e-16浮點(diǎn)數(shù)浮點(diǎn)數(shù)的上溢和下溢絕對值很大的數(shù)和絕對值很小的數(shù)同時參與運(yùn)算的時候泊松分布實(shí)例P(m,k)=mk*e–m/K!#include<math.h>doublefactorial(intn){inti;doublef=1.0f;for(i=1;i<=n;i++)f*=(double)I;returnf;}doublep_1(doublem,intk){returnpow(m,k)*exp(-m)/factorial(k);}mk和K!都增長得較快,發(fā)生溢出,比如170!是一個很大的數(shù)浮點(diǎn)數(shù)泊松分布實(shí)例——改進(jìn)P(m,k)=mk*e–m/K!Doublep_2(doublem,intk){Doublex=1.0;intI;If(m>k){For(i=0;i<k;i++)x*=m/M_E/(k-i);for(;i<m;i++)x/=M_E;returnx;}For(i=0;i<k;i++)x*=m/M_E/(k-i);for(;i<m;i++)x/=M_E;returnx;}
M_E在<math.h>中定義,接近e的一個近似值本改進(jìn)試圖解決計(jì)算過程的溢出,當(dāng)m和K的數(shù)據(jù)較大時,仍然會產(chǎn)生溢出浮點(diǎn)數(shù)泊松分布實(shí)例——再改進(jìn)P(m,k)=mk*e–m/K!doublep_2(doublem,intk){doublex=1.0;intem,mk,nk;Em=mk=nk=0;While(em<m||mk<k||nk<k){While(mk<k&&x<MAX_INTER){x*=m;mk++}if(x<MIN_INTER)return0.0;While(nk<k&&x>MIN_INTER){nk++;x/nk;}While(em<m&&x>MIN_INTER){x/M_E;em++}}Returnx;}X先長大,長的不能再大,則長小,長的不能再小,再長大??偸遣划a(chǎn)生溢出。MAX_INTER/MIN_INTER是符號常量,定義double所表示的范圍的極限值數(shù)值計(jì)算中的類型轉(zhuǎn)換目標(biāo)—保證數(shù)值不變轉(zhuǎn)換類型基本轉(zhuǎn)換,char/short->int,float->double自動轉(zhuǎn)換,較窄的數(shù)據(jù)類型向較寬的數(shù)據(jù)類型轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換,用戶顯式要求轉(zhuǎn)換Shortsa;Floatfb;Intx;x=sa+fb;基本轉(zhuǎn)換:sa->int,fa->double自動轉(zhuǎn)換:int轉(zhuǎn)換為double再進(jìn)行加法,最后給x賦值數(shù)值計(jì)算中的類型轉(zhuǎn)換一些問題浮點(diǎn)型轉(zhuǎn)換成整型,小數(shù)部分丟失絕對值超過2的32次方的double型,轉(zhuǎn)換成整型,產(chǎn)生截?cái)嗾拖騠loat轉(zhuǎn)換,由于有效數(shù)字的位數(shù)較少,可能造成數(shù)據(jù)精度丟失Int->double轉(zhuǎn)換是安全的數(shù)值計(jì)算中的類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換Intx;Doubled1,d2;X=(int)(d1*d2);X=(int)d1*d2);這兩個強(qiáng)制類型轉(zhuǎn)換的作用范圍是不一樣的沒有確切理解和把握,不要進(jìn)行類似的強(qiáng)制類型轉(zhuǎn)換1996年阿麗亞娜火箭-5發(fā)射失敗,使用了型號4的軟件,但是型號5的參數(shù)和型號4不同,未經(jīng)檢驗(yàn)直接強(qiáng)制轉(zhuǎn)換導(dǎo)致問題取整數(shù)和小數(shù)部分Intint_part;Floatx,decimal_part;Int_part=(int)x;Decimal_part=x-(int)x;Char的符號類型C語言沒有規(guī)定char是有符號還是無符號如下代碼在不同系統(tǒng)輸出可能不同Charcc=0xc1;Inti=cc;Printf(“%d(%#x)\n”,i,i);無符號系統(tǒng),輸出193(0xc1)有符號系統(tǒng),輸出-63(0xffffffc1)Char的符號類型Char和int型的轉(zhuǎn)換應(yīng)用:圖像處理避免使用char類型做轉(zhuǎn)換在一些應(yīng)用場合,不得不用則明確是無符號還是有符號unsignedintui=(unsignedchar)cc;intI=(signedchar)cc;變量符號的判斷#defineTEST_UNSIGN(n)n=-1;if(n>0)printf(#n”isunsigned\n”);\Elseprintf(#n”issigned\n”);按位操作按位操作壓縮,加密/解密外設(shè)控制主要的操作包括&按位與|按位或~按位取反^按位異或<<向左移位>>向右移位按位操作向左移位右邊填0無符號數(shù):等價于乘以2n,移位操作比乘法快不產(chǎn)生溢出的情況下,移位效果對有符號數(shù)和無符號數(shù)是一樣的不管有無符號,數(shù)據(jù)的左移都可能溢出對于有符號數(shù),左移改變了符號位,數(shù)值正負(fù)發(fā)生改變左移實(shí)例
signed0x2faf0800(800000000)<<4=0xfaf0800(-8490188)0xffffcfc7(-12345)<<4=0xfffcfc70(-197520)Unsigned0x3039(12345)<<4=0x30390(197520)0xffffcfc7(4294954951)<<4=0xfffcfc70(4294769776)按位操作向右移位無符號數(shù),高位填0有符號數(shù),正數(shù)高位填0,負(fù)數(shù)高位填1-5>>16=-1二進(jìn)制碼0000000000000101補(bǔ)碼是1111111111111011右移16位左右的位都是1,對應(yīng)-1左移實(shí)例
signed0x3039(12345)>>4=0x303(771)0xffffcfc7(-12345)>>4=0xfffffcfc(-772)Unsigned0x3039(12345)>>4=0x303(771)0xffffcfc7(4294954951)<<4=0xfffffcfc(268434684)按位操作標(biāo)志位的設(shè)置操作系統(tǒng)、編譯系統(tǒng)、圖形界面用二進(jìn)制位描述對象屬性狀態(tài),這些對象的狀態(tài)是2值的比如window圖形界面,窗口具有若干屬性#defineWIN_BORDER0x001#defineWIN_CAPTION0x002#defineWIN_CHILD0x004……Style|=WIN_CAPTIONIf((style&WIN_CAPTION)!=0)
設(shè)置WIN_CAPTION標(biāo)志Else
沒有設(shè)置WIN_CAPTION標(biāo)志清楚某個標(biāo)志Style&=~WIN_CAPTION按位操作常用位操作1)不借用第三個存儲單元交換數(shù)據(jù)X^=y;Y^=x;X^=y;2)生成最右邊n位為全1,其余各位為0的掩碼X=(1<<n)-110000-1=011113)生成最右邊n位為全0,其余各位為1的掩碼X=~((1<<n)-1)4)將一個整數(shù)最右側(cè)的1變成0X&=x-1X=10101100X-1=10101011結(jié)果101010005)分離出一個整數(shù)最右邊的1X&=-xx=10101100,-x=01010100結(jié)果00000100按位操作常用位操作6)分離出一個整數(shù)最右側(cè)的0X=~x&(x+1)X=10101111,x+1=01010000,x+1=10110000,結(jié)果就是000100007)構(gòu)造一個整數(shù)最右側(cè)連續(xù)的0對應(yīng)的掩碼X=~x&(x-1)X=10110000,~x=01001111,x-1=10101111,結(jié)果就是00001111按位操作判斷獲獎人員,6個人,可能有若干獲獎組合,現(xiàn)在根據(jù)一定條件判斷有哪些組合可以用6重循環(huán),程序很臃腫用一個整數(shù)的6個bit來進(jìn)行操作,000000->1111110–26-1Enum{A=0,B,C,D,E,F,NUM};#defineastatus[A]#definebstatus[B]#definecstatus[C]#definedstatus[D]#defineestatus[E]#definefstatus[F]按位操作Intstatus[NUM];Charinfo[][32]={{“
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 定金租賃合同
- 裝修合作協(xié)議合同
- 藥品經(jīng)營質(zhì)量保證協(xié)議書
- 本家具采購合同
- 小學(xué)六年級 分?jǐn)?shù)加減乘除口算題
- 2025年重慶貨運(yùn)從業(yè)資格考試題目及答案解析大全
- 2025年拉薩貨運(yùn)從業(yè)資格證考試內(nèi)容
- 2024-2025學(xué)年高中化學(xué)專題3從礦物到基礎(chǔ)材料第三單元含硅礦物與信息材料學(xué)案含解析蘇教版必修1
- 2024-2025學(xué)年二年級數(shù)學(xué)上冊第四單元表內(nèi)除法一第7課時練習(xí)九1教案蘇教版
- 一年級上冊語文工作計(jì)劃
- 環(huán)衛(wèi)清掃保潔、垃圾清運(yùn)及綠化服務(wù)投標(biāo)方案(技術(shù)標(biāo) )
- 醫(yī)院定崗定編方案文檔
- 4-熔化焊與熱切割作業(yè)基礎(chǔ)知識(一)
- 控制器型式試驗(yàn)測試報告
- 2024學(xué)年高二語文選擇性必修中冊《荷花淀》優(yōu)質(zhì)課件
- 2023年200MW儲能電站儲能系統(tǒng)設(shè)計(jì)方案
- 個人安全與社會責(zé)任的基本知識概述
- 班級管理交流-班主任工作經(jīng)驗(yàn)交流課件(共28張ppt)
- 建筑裝飾工程計(jì)量與計(jì)價試題一及答案
- 名校介紹南京大學(xué)ppt
- 腹腔鏡外科介紹課件
評論
0/150
提交評論