




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
高級語言程序設計模塊三編程初級應用任務3.1函數的應用C語言程序設計基礎與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務3.1函數的應用01問題引入05技能點檢測一問題引入一款游戲的開發,需要公司各部門各司其職,通力合作。策劃部門負責主策劃,劇情,文案,系統,版本等;美術部門負責場景,2D,3D,人物,原畫,平面,視頻等;程序部門負責主程序,客戶端,引擎等。同樣,一個較大規模程序的設計也需要化整為零,讓各部分完成相對獨立的功能,這些獨立的部分就是函數。那么如何編寫自定義函數,如何調用它們呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.1函數的應用二技能點分析1、了解函數的概念2、掌握函數的定義與調用3、能夠使用自定義函數去解決規模較大的問題學習目標1.什么是函數?為什么要使用函數?2.函數定義的一般格式是什么?3.什么是形參?什么是實參?4.函數調用的方法是什么?學期預習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.1函數的應用三技能點詳解函數就是一段封裝好的,可以重復使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復的代碼。函數可以提前保存起來,并給它起一個獨一無二的名字,只要知道它的名字就能使用這段代碼。函數還可以接收數據,并根據數據的不同做出不同的操作,最后再把處理結果反饋給我們。函數還有很多叫法,比如方法、子例程或程序,等等。三技能點詳解——1庫函數C語言在發布時已經為我們封裝好了很多函數,它們被分門別類地放到了不同的頭文件中(暫時先這樣認為),使用函數時引入對應的頭文件即可。這些函數都是專家編寫的,執行效率極高,并且考慮到了各種邊界情況,各位讀者請放心使用。C語言自帶的函數稱為庫函數。庫(Library)是編程中的一個基本概念,可以簡單地認為它是一系列函數的集合,在磁盤上往往是一個文件夾。C語言自帶的庫稱為標準庫,其他公司或個人開發的庫稱為第三方庫。C標準庫提供了大量的程序可以調用的內置函數。例如,函數strcat()用來連接兩個字符串,函數memcpy()用來復制內存到另一個位置。自己編寫的函數稱為自定義函數,自定義函數和庫函數在編寫和使用方式上完全相同,只是由不同的機構來編寫。三技能點詳解——2函數的定義函數是一組一起執行一個任務的語句。每個C程序都至少有一個函數,即主函數main(),所有簡單的程序都可以定義其他額外的函數。C語言中的函數定義的一般形式如下:在C語言中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的所有組成部分:函數類型:也即函數返回值類型,一個函數可以返回一個值。有些函數執行所需的操作而不返回值,在這種情況下,函數類型是關鍵字void。函數名:是所定義函數的名稱,它可以是C語言中任何合法的標識符。注意,在一個程序中函數名必須是唯一的,別的函數都是通過函數名來調用函數的。三技能點詳解——2函數的定義形式參數表:是由“<類型><參數名>”對組成的參數表,每對之間用逗號隔開。被調函數就是通過這些形參,接收從調用函數傳遞過來的數據。定義的函數可以有參數,也可以沒有參數,分別稱為有參函數和無參函數。不過,即使是無參函數,其后面的圓括號也不能省略。函數體:函數體由一對花括號“{}”括起,包含一組定義函數執行任務的語句。以下是max()函數的源代碼。該函數有兩個參數num1和num2,會返回這兩個數中較大的那個數:三技能點詳解——2函數的定義三技能點詳解——3函數聲明函數聲明會告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義。函數聲明包括以下幾個部分:針對上面定義的函數max(),以下是函數聲明:intmax(intnum1,intnum2);在函數聲明中,參數的名稱并不重要,只有參數的類型是必需的,因此下面也是有效的聲明:intmax(int,int);當您在一個源文件中定義函數且在另一個文件中調用函數時,函數聲明是必需的。在這種情況下,您應該在調用函數的文件頂部聲明函數。三技能點詳解——4函數的調用創建C函數時,會定義函數做什么,然后通過調用函數來完成已定義的任務。當調用有參函數時,會發生參數值的傳遞,實參會把值傳遞給形參,被調函數接收了傳遞過來的實參后,就依據這些數據執行自己函數體里的語句。執行結束后,就把控制返回到調用者發出函數調用的地方,繼續它的執行。根據一個函數是否由返回值,C語言將以兩種不同的方式對它們進行調用。(1)沒有返回值的函數,是以函數調用語句的方式進行調用的,即:(2)有返回值的函數,是以函數表達式的方式調用的,即:三技能點詳解——4函數的調用這兩種調用方式的區別是:前者是一個語句,以分號結尾;后者是一個表達式,凡是一個表達式能出現的地方,它都可以出現。比如出現在賦值語句的右邊;比如出現在一個算術表達式里參與計算等等。函數調用時,在實際參數表中,必須列出與被調函數定義的形參個數相等、類型相符、次序相同的實參,各實參之間仍以逗號分隔。三技能點詳解——5函數調用中的參數傳遞(1)傳值方式向函數傳遞參數的傳值調用方法,調用者是把實參變量的值賦給被調用的形參變量的。由于實參變量和形參變量占用的是內存中不同的存儲區,被調函數對形參的加工,是在形參變量自己的存儲區里進行,所以不會影響到實參變量。所以,這種數據傳遞的方式是單向的。(2)引用方式通過引用傳遞方式,形參為指向實參的指針,當對形參的指向操作時,就相當于對實參本身進行的操作。傳遞指針可以讓多個函數訪問指針所引用的對象,而不用把對象聲明為全局可訪問。三技能點詳解——5函數調用中的參數傳遞(3)參數為數組的傳遞方式如果您想要在函數中傳遞一個一維數組作為參數,您可以用下面三種方式來聲明函數形式參數,這三種聲明方式的結果是一樣的,因為每種方式都會告訴編譯器將要接收一個整型指針。同樣地,您也可以傳遞一個多維數組作為形式參數。方式1:形式參數是一個已定義大小的數組:三技能點詳解——5函數調用中的參數傳遞方式2:形式參數是一個非固定長度的數組:方式3:形式參數是一個指針:三技能點詳解——6函數的嵌套調用函數的嵌套調用是指當前被調用的函數里又調用了另一個函數,這就類似于在大盒子里裝小盒子,小盒子里可以再裝更小的盒子。如下所示:我們看到在主函數main()中調用了func2()函數,而在func2()函數中又調用了func1()函數,如此就構成了函數的嵌套調用。案例3.1.1函數的調用在這個案例中,我們定義了一個max()函數用來實現求兩數中較大者,然后在主函數main()中對其進行調用。/*****************************************內容簡述:通過調用max()函數求兩數中的較大者。*****************************************/#include
<stdio.h>intmax(intnum1,intnum2);//函數聲明intmain(){
inta=100;
intb=200;intret;
ret=max(a,b);//調用max()函數
printf("Maxvalueis:%d\n",ret);
return0;}intmax(intnum1,intnum2)//定義max()函數返回兩個數中較大的那個數{
intresult;
if(num1>num2) result=num1;
elseresult=num2;
returnresult;}三技能點詳解——案例案例3.1.2
傳值方式參數傳遞在這個案例中,我們定義了一個swap()函數用來實現交換兩數值,swap()函數的參數是普通變量,然后在主函數main()中對其進行調用。/*****************************************內容簡述:查看調用swap()函數是否能交換兩數值。****************************************/#include
<stdio.h>voidswap(intx,inty);//函數聲明intmain(){
inta=100;
intb=200;
printf("交換前,a的值:%d\n",a);
printf("交換前,b的值:%d\n",b);swap(a,b);//調用swap()函數
printf("交換后,a的值:%d\n",a);
printf("交換后,b的值:%d\n",b);
return0;}
voidswap(intx,inty)//定義swap()函數{
inttemp;temp=x;x=y;y=temp;}三技能點詳解——案例案例3.1.3引用方式參數傳遞在這個案例中,我們定義了一個swap()函數用來實現交換兩數值,swap()函數的參數是指針變量,然后在主函數main()中對其進行調用。/*****************************************內容簡述:查看調用swap()函數是否能交換兩數值。*****************************************/#include
<stdio.h>voidswap(int*x,int*y);//函數聲明intmain(){
inta=100;
intb=200;
printf("交換前,a的值:%d\n",a);
printf("交換前,b的值:%d\n",b);swap(&a,&b);//調用swap()函數,&a為指向a的指針,&b為指向b的指針
printf("交換后,a的值:%d\n",a);
printf("交換后,b的值:%d\n",b);
return0;}voidswap(int*x,int*y)//函數定義{
inttemp;temp=*x;*x=*y;*y=temp;}三技能點詳解——案例案例3.1.4
參數為數組的傳遞方式在這個案例中,我們定義了一個getAverage()函數用來求5個整數的平均值,getAverage()函數的參數是數組,然后在主函數main()中對其進行調用。/*******************************************************內容簡述:通過調用getAverage()函數實現求5個整數的平均值*******************************************************/#include
<stdio.h>
double
getAverage(int
arr[],intsize)//函數定義{
int
i;
doubleavg;
doublesum=0;
for(i=0;i<size;++i) { sum+=arr[i]; } avg=sum/size;
returnavg;}
intmain(){
intbalance[5]={1000,2,3,17,50};
double
avge;
avge=getAverage(balance,5);//函數調用,傳遞一個指向數組的指針作為參數
printf("平均值是:%f\n",avge);
return0;}三技能點詳解——案例案例3.1.5
函數的嵌套調用案例題目:求任意3個整數的方差,方差公式如下:/*******************************內容簡述:求任意3個整數的方差*******************************/#include
<stdio.h>#include
<math.h>floatavg(int
a,int
b,intc)//定義求平均值函數avg(){
floatm; m=(a+b+c)/3.0;
returnm;}floatvar(int
d,int
e,intf)//定義求方差函數var(){
float
ave,vai;
ave=avg(d,e,f);//調用avg()函數求出平均值賦給ave
vai=(pow((ave-d),2)+pow((ave-e),2)+pow((ave-f),2))/3.0;//求出方差
return
vai;}
intmain(){
int
x,y,z;
floatw;
printf("請輸入3個整數:");
scanf("%d,%d,%d",&x,&y,&z); w=var(x,y,z);//調用求方差函var()
printf("方差是:%f\n",w);
return0;}三技能點詳解——案例04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.1函數的應用四技能點拓展——1作用域規則任何一種編程中,作用域是程序中定義的變量所存在的區域,超過該區域變量就不能被訪問。C語言中有三個地方可以聲明變量:在函數或塊內部的局部變量在所有函數外部的全局變量在形式參數的函數參數定義中讓我們來看看什么是局部變量、全局變量和形式參數。四技能點拓展——1作用域規則(1)局部變量在某個函數或塊的內部聲明的變量稱為局部變量。它們只能被該函數或該代碼塊內部的語句使用。局部變量在函數外部是不可知的。下面是使用局部變量的實例。在這里,所有的變量a、b和c是main()函數的局部變量。如下例所示:四技能點拓展——1作用域規則(2)全局變量全局變量是定義在函數外部,通常是在程序的頂部。全局變量在整個程序生命周期內都是有效的,在任意的函數內部能訪問全局變量。全局變量可以被任何函數訪問。也就是說,全局變量在聲明后整個程序中都是可用的。下面是使用全局變量和局部變量的實例:四技能點拓展——1作用域規則在程序中,局部變量和全局變量的名稱可以相同,但是在函數內,如果兩個名字相同,會使用局部變量值,全局變量不會被使用。下面是相關實例:運行結果:四技能點拓展——2形式參數函數的形式參數,被當作該函數內的局部變量,如果與全局變量同名它們會優先使用。如下例所示:運行結果:四技能點拓展——2形式參數全局變量與局部變量在內存中的區別是全局變量保存在內存的全局存儲區中,占用靜態的存儲單元;局部變量保存在棧中,只有在所在函數被調用時才動態地為變量分配存儲單元。當局部變量被定義時,系統不會對其初始化,您必須自行對其初始化。定義全局變量時,系統會自動對其初始化,如下所示:正確地初始化變量是一個良好的編程習慣,否則有時候程序可能會產生意想不到的結果,因為未初始化的變量會導致一些在內存位置中已經可用的垃圾值。04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.1函數的應用五技能點檢測1)以下函數定義正確的是:(
)。A)doublefun(intx,inty)B)doublefun(intx;inty)C)doublefun(intx,inty);D)doublefun(intx,y)2)C語言規定,簡單變量作實參,它與對應形參之間的數據傳遞方式是:(
)。A)地址傳遞;B)單向值傳遞;C)雙向值傳遞;D)由用戶指定傳遞方式3)以下關于C語言程序中函數的說法正確的是:(
)。A)函數的定義可以嵌套,但函數的調用不可以嵌套;B)函數的定義不可以嵌套,但函數的調用可以嵌套;C)函數的定義和調用均不可以嵌套;D)函數的定義和點用都可以嵌套。五技能點檢測4)以下正確的函數形式是:(
)。A)doublefun(intx,inty)B)fun(intx,y){z=x+y;returnz;}{intz;returnz;}C)fun(x,y)D)doublefun(intx,inty){intx,y;doublez;{doublez;z=x+y;returnz;}z=x+y;returnz;}5)若用數組名作為函數調用的實參,傳遞給形參的是(
)。A)數組的首地址B)數組第一個元素的值C)數組中全部元素的值D)數組元素的個數課后作業完成課堂任務,在線提交;完成技能檢測,在線提交;C語言程序設計基礎與實踐模塊一編程技術基礎任務3.2多文件編程C語言程序設計基礎與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務3.2多文件編程01問題引入05技能點檢測一問題引入
進入數字經濟時代,開源技術的重要價值日漸凸顯,已經成為數字經濟的基礎設施與底座。開源技術是一個巨大的知識寶庫,我們在享用這個知識寶庫的同時,當知這個知識寶庫正是無數前人的奉獻積累而成的。
那么如何使我們的C語言編程代碼能夠共享交流,實現開源技術的價值呢?這就需要我們掌握多文件編程的方法,使編程思路更清晰、程序結構更簡單、更易于程序的讀寫和移植。04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.2多文件編程二技能點分析1.掌握頭文件編寫方法;2.學會使用多文件編程模式編寫程序。學習目標1.什么是多文件編程?多文件編程具有哪些優點?2.頭文件一般包括哪些內容?3.頭文件的引用格式有哪些?它們之間有何異同點?學期預習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.2多文件編程三技能點詳解——1頭文件多文件編程就是將程序中所用的變量、函數或宏定義等程序元素分散到兩個以上的源文件中定義實現,并通過包含頭文件方式實現在多個源文件中共享。三技能點詳解——1頭文件
頭文件是擴展名為.h的文件,有兩種類型的頭文件:程序員編寫的頭文件和編譯器自帶的頭文件。在前面的程序中,我們已經多次使用到
stdio.h
頭文件,它是編譯器自帶的頭文件。頭文件一般包含全局變量的聲明、函數的聲明、宏定義、結構體定義等,如stdio.h頭文件中包含putchar()、getchar()、printf()、scanf()等標準輸入輸出函數的聲明。1)頭文件的引用格式
使用預處理指令#include引用用戶自編和系統自帶的頭文件。它的形式有以下兩種:三技能點詳解——1頭文件格式一:#include<文件名>
本命令的特點是在文件名的首尾用尖括號括起來。文件名可以帶路徑。在預處理時將只在所指定的標準目錄(即C系統安裝后形成的include子目錄,該子目錄中有系統提供的頭文件)中查找包含文件。格式二:#include"文件名"
本命令格式的特點是在文件名的首尾用雙引號括起來。其中,文件名指出的是待包含進來的文件,且可以帶路徑。若文件名帶路徑,則預處理時在指定的路徑下去查找。若查找不到,再到系統指定的標準目錄中找。找到文件后,用文件內容替換該命令。因此格式二的查找功能包含了格式一的查找功能。另外,兩種格式的include后可以不帶空格。2)頭文件的引用操作如果文件A中有一條文件包含預處理命令:#include<B>該命令將指定文件B的內容替換掉文件A中“#include<B>”命令,共同組成一個程序文件,即在文件A中產生文件B的一個副本。例如,如果一個程序中有一個頭文件
header.h,包含的代碼如下:char*test(void);三技能點詳解——1頭文件三技能點詳解——1頭文件3)頭文件的編寫結構
如果一個頭文件被引用兩次,編譯器會處理兩次頭文件的內容,這將產生錯誤。為了防止這種情況,標準的做法是把文件的整個內容放在條件編譯語句中,一般結構如下:#ifndef_HEADER_H_#define_HEADER_H_……#endif這種結構就是通常所說的包裝器#ifndef?!癬HEADER_H_”通常以下劃線“_”作為開頭和結尾,下劃線之間的字符串通常是大寫的頭文件名,并且“#ifndef”后的標識符和“#define”后面的完全相同,但不同的頭文件中的標識符是不同的。三技能點詳解——2多文件編程
假如我們現在需要編程實現輸出從鍵盤輸入的兩個整數中最大值和最小值,首先我們編寫一個只含有一個源文件test.c的程序。#include
<stdio.h>
intmax(intx,inty);//max函數聲明intmin(intx,inty);//min函數聲明
voidmain(void){
inta,b,m,n; printf("請輸入第一個數:"); scanf("%d",&a); printf("請輸入第二個數:"); scanf("%d",&b); m=max(a,b);//max函數調用 n=min(a,b);//min函數調用 printf("max=%d\n",m); printf("min=%d\n",n);}
intmax(intx,inty)//max函數定義{
intm; m=x>y?x:y;
returnm;}
intmin(intx,inty)//min函數定義{
intn; n=x<y?x:y;
returnn;}三技能點詳解——2多文件編程
根據前面所說的多文件編程的基本思路,下面我們把上面的程序改寫為多文件編程的形式。在各個文件中,一個源文件對應一個頭文件,且文件主名相同,如maxmin.c源文件對應maxmin.h,通常主程序main.c不編寫main.h。頭文件maxmin.h#ifndef_MAXMIN_H_#define_MAXMIN_H_
intmax(intx,inty);//函數聲明intmin(intx,inty);//函數聲明
#endif主程序main.c#include
<stdio.h>#include
"maxmin.h"
voidmain(void){
inta,b,m,n; printf("請輸入第一個數:"); scanf("%d",&a); printf("請輸入第二個數:"); scanf("%d",&b); m=max(a,b); n=min(a,b); printf("max=%d\n",m); printf("min=%d\n",n);}三技能點詳解——2多文件編程子程序maxmin.c#include
"maxmin.h"
intmax(intx,inty)//max函數定義,比較出最大值{
intm; m=x>y?x:y;
returnm;}
intmin(intx,inty)//min函數定義,比較出最小值{
intn; n=x<y?x:y;
returnn;}案例3.2.1計算器采用多文件編程方式編寫一個簡單計算器的程序,可以實現對輸入的兩個整數進行加、減、乘、除計算,并輸出計算的結果。********************************************************************內容簡述:兩個整數的加、減、乘、除的簡單計算器*******************************************************************/counter.h頭文件:#ifndef_COUNTER_H_#define_COUNTER_H_
intadd(int
x,inty);//加法函數的聲明intsub(int
x,inty);//減法函數的聲明int
mul(int
x,inty);//乘法函數的聲明floatdiv(int
x,inty);//除法函數的聲明
#endif
三技能點詳解——案例display.h頭文件:#ifndef_DISPLAY_H_#define_DISPLAY_H_
#include
<stdio.h>
void
disp_result(int
x,inty);//打印輸出結果的函數聲明
#endif
getnum.h頭文件:#ifndef_GETNUM_H_#define_GETNUM_H_
#include
<stdio.h>
intgetnum1(void);//輸入第一整數的函數聲明intgetnum2(void);//輸入第二整數的函數聲明
#endif
counter.c源文件:intadd(int
x,inty)//加法函數的定義{
return
x+y;}
intsub(int
x,inty)//減法函數的定義{
returnx-y;}
int
mul(int
x,inty)//乘法函數的定義{
returnx*y;}
floatdiv(int
x,inty)//除法函數的定義{
return(float)x/y;}三技能點詳解——案例display.c源文件:#include
"counter.h"#include
"display.h"
void
disp_result(int
x,inty){
ints;
floatt;
s=add(x,y);//加法運算的結果
printf("%d+%d=%d\n",x,y,s);
s=sub(x,y);//減法運算的結果
printf("%d-%d=%d\n",x,y,s);
s=mul(x,y);//乘法運算的結果
printf("%d*%d=%d\n",x,y,s);
t=div(x,y);//除法運算的結果
printf("%d/%d=%.2f\n",x,y,t);}getnum.c源文件:#include
"getnum.h"
intgetnum1()//輸入第一個整數{
inta;
printf("請輸入第一個整數:");
scanf("%d",&a);
returna;}
intgetnum2()//輸入第二個整數{
inta;
printf("請輸入第二個整數:");
scanf("%d",&a);
returna;}三技能點詳解——案例main.c源文件:#include
"getnum.h"#include
"display.h"
voidmain(void){
int
a,b; a=getnum1();//調用函數getnum1,獲取第一個整數 b=getnum2();//調用函數getnum2,獲取第二個整數
disp_result(a,b);//顯示運算結果}實現算術運算的子程序對應counter.c的頭文件對應display.c的頭文件對應getnum.c的頭文件實現打印輸出的子程序通過調用子程序中的函數完成所有功能的主程序獲取輸入數值的子程序三技能點詳解——案例04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.2多文件編程四技能點拓展——1條件編譯條件編譯是在對源程序編譯之前的處理中,根據給定的條件,決定只編譯其中的某一部分源程序,而不編譯另外一部分源程序。1)控制條件為常量表達式的條件編譯(1)類單分支格式#if常量表達式程序段#endif功能是:如果常量表達式為真(即非0),程序段被編譯。否則,程序段不被編譯。四技能點拓展——1條件編譯(2)類雙分支格式:#if常量表達式程序段1
#else
程序段2
#endif功能是:如果常量表達式的值為真(即非0),則在程序編譯時只對程序段1進行編譯,否則只對程序段2進行編譯。四技能點拓展——1條件編譯(3)類多分支格式:#if常量表達式1程序段1#elif常量表達式2程序段2#elif
常量表達式n程序段n#else
程序段n+1#endif2)控制條件為定義標識符的條件編譯(1)格式1:
#ifdef標識符
程序段1#else
程序段2#endif(2)格式2:
#ifndef標識符程序段1#else
程序段2#endif04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.2多文件編程五技能點檢測完成課堂任務,在線提交;完成技能檢測,在線提交;C語言程序設計基礎與實踐模塊二編程初級應用任務3.3
編程規范C語言程序設計基礎與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務3.3編程規范01問題引入05技能點檢測一問題引入
大江東流,日月交替,大自然生生不息,用規則演繹著生命的軌跡。火車之所以能夠奔馳千里,是因為它始終離不開兩條鐵軌;風箏之所以能高高飛翔,是因為它總是情系著手中的線;宇宙間無數顆恒星亙古不變地燦爛,是因為它們都按照自己的軌道運行。不以規矩,不成方圓。我們要編寫一個高質量的代碼,就必須遵守一定的規范,這樣才能保證代碼的易讀性和易維護性。那么規范化的編程有哪些要求呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.3編程規范二技能點分析1.了解C語言編程的基本規范2.能夠使用簡化版本對程序注釋3.能夠使用編程規范編寫代碼學習目標1.程序編寫過程種,為什么需要注意代碼的規范化?2.代碼規范化主要體現在那幾個方面?3.文件注釋的完整版本的規范寫法是什么?4.函數注釋的完整版本的規范寫法是什么?
學期預習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.3編程規范三技能點詳解
代碼規范化的原則是在遵守編譯器要求的代碼規范下,追求代碼整體清晰、美觀、易閱讀、易排錯,有利于團隊程序開發。一般來說,規范化主要從結構、排版、注釋、命名四個方面入手。三技能點詳解——1結構每個C程序通常分為兩個文件。一個文件用于保存程序的聲明,稱為頭文件。另外一個文件用于保存程序的實現,稱之為定義文件。C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴。/************************************函數聲明:文件名,版本,歷史信息等信息***********************************//*頭文件包含*/#include
<xxxxx.h>
#include
"xxxxx.h"
/*變量定義*/intnum_man;
/*函數聲明*/voidsum_add(void);
/*主函數*/voidmain(void){sum_add();//子函數使用
}
/************************************函數聲明:文件名,函數版本等信息***********************************/voidsum_add(void)/*子函數*/
{
//子函數體}1)空行
空行起著分隔程序段落的作用,空行得體將使程序的布局更加清晰。兩個相對獨立的程序塊、定義變量后必須要加空行。比如上面幾行代碼完成的是一個功能,下面幾行代碼完成的是另一個功能,那么它們中間就要加空行。voidDemoFunc(void){ uint8_ti;
//局部變量和語句間空一行
/*功能塊1*/
for(i=0;i<10;i++) {
//... }
//不同的功能塊間空一行
/*功能塊2*/
for(i=0;i<20;i++) {
//... }}三技能點詳解——2排版2)空格
在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;(1)逗號、分號只在后面加空格。inta,b,c;(2)比較操作符,賦值操作符"="、"+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前后加空格。if(current_time>=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(3)"!"、"~"、"++"、"--"、"&"(地址運算符)等單目操作符前后不加空格。*p='a';//內容操作"*"與內容之間flag=!isEmpty;//非操作"!"與內容之間p=&mem;//地址操作"&"與內容之間i++;//"++","--"與內容之間(4)"->"、"."前后不加空格。p->id=pid;//"->"指針前后不加空格(5)if、for、while、switch等與后面的括號間應加空格,使if等關鍵字更為突出、明顯,函數名與其后的括號之間不加空格,以與保留字區別開。if(a>=b&&c>d)三技能點詳解——2排版3)對齊
成對的符號一定要成對書寫,如()、{}。不要寫完左括號然后寫內容最后再補右括號,這樣很容易漏掉右括號,尤其是寫嵌套程序的時候。{和}分別都要獨占一行。#include
<stdio.h>intmain(void){
if(…)
return0;}三技能點詳解——2排版4)代碼行
一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,并且便于寫注釋。if、else、for、while、do等語句自占一行,執行語句不得緊跟其后。#include
<stdio.h>
intmain(void){
if(…-){
while(…-)}
return0;}三技能點詳解——2排版三技能點詳解——3注釋行注釋一行注釋采用//…,多行注釋必須采用/*…*/。在一般情況下,源程序有效注釋量必須在20%以上。/*變量定義*/intnum_man;//班級男生人數0~50之間
a=a+1;//a自身加1(沒有必要)文本注釋主要針對整個文件進行的注釋,這個注釋內容較多,便于閱讀者快速了解文件的相關信息。/****************************************************************Copyright(C),2021-2023,C語言項目開發組*文件名:main.c*內容簡述:實現小球沿著不同方向碰撞墻壁,并實現反彈。*文件歷史:*版本
日期
作者
說明*1.02021-12-01課題組
實現小球的碰撞轉向*2.02022-06-12課題組
采用函數,優化程序****************************************************************/
針對一些練習用的小函數,不需要填寫全部信息,可以采用簡化版本。/****************************************************************內容簡述:根據給定的年、月、日計算是星期幾?需要采用基姆拉爾森算法。*Weekday=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7****************************************************************/三技能點詳解——3注釋函數注釋主要針對一個函數進行的注釋,這個注釋內容較多,便于閱讀者快速了解函數的相關信息。在函數實現之前,應該給出和函數的實現相關的足夠而精練的注釋信息。內容包括本函數功能介紹,調用的變量、常量說明,形參說明,特別是全局變量。/***************************************************************函數名:voidPositionBall(intx,inty)*功
能:在不同位置繪制小球*輸
入:小球的x方向的坐標window_left--window_right*小球y方向的坐標window_top--window_bottom*輸
出:無**************************************************************/針對一些練習用的小程序,不需要如此嚴格,可以采用簡化版本。/***************************************************************功
能:根據輸入年月日,計算星期**************************************************************/三技能點詳解——3注釋命名主要是標識符的命名,命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解。temp可縮寫為tmp;
flag可縮寫為flg;
message可縮寫為msg;statistic可縮寫為stat;
increment可縮寫為inc;
unsigned
chardat01;//修改unsignedcharliv_date;voidSet00(unsigned
charc);//修改voidSetName(unsignedcharc);
intClass_width;//局部整形變量,教室寬度charStudent_name;//全局字符型變量,學生名字函數命名,單詞詞間首字母大寫,voidCommInit();三技能點詳解——4命名案例1.2.1簡化規范根據給定的年、月、日計算是星期幾?需要采用基姆拉爾森算法,算法公式如下Weekday=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7。針對一些練習用的小程序,我們采用簡化規范,簡化規范主要體現在注釋上面。三技能點詳解——5案例見教材內容!案例1.2.2標準規范
針對一些能夠進行拓展的程序,我們需要較為詳細的注釋,確保程序的可讀性和可移植性,我們進行標準的規范。
實現小球沿著不同方向碰撞墻壁,并實現反彈。三技能點詳解——5案例見教材內容!04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.3編程規范四技能點拓展——1頭文件路徑在引用頭文件時,不要使用絕對路徑。如果使用絕對路徑,當需要移動目錄時,必須修改所有相關代碼,繁瑣且不安全;使用相對路徑,當需要移動目錄時,只需修改編譯器的某個選項即可。#include“/project/inc/hello.h”//不應使用絕對路徑#include“../inc/hello.h”//可以使用相對路徑在引用頭文件時,使用<>來引用預定義或者特定目錄的頭文件,使用“”來引用當前目錄或者路徑相對于當前目錄的頭文件。#include
<stdio.h>
//標準頭文件#include
<projdefs.h>
//工程指定目錄頭文件
#include“global.h”//當前目錄頭文件#include“inc/config.h”//路徑相對于當前目錄的頭文件為了防止頭文件被重復引用,應當用
ifndef/define/endif結構產生預處理塊。#ifndef__DISP_H//文件名前名加兩個下劃線“__”,后面加“_H”#define__DISP_H......#endif頭文件中只存放“聲明”而不存放“定義”,通過這種方式可以避免重復定義。/*模塊1頭文件:module1.h*/extern
inta=5;//在模塊1的.h文件中聲明變量
/*模塊1實現文件:module1.c*/uint8_tg_ucPara;//在模塊1的.h文件中定義全局變量g_ucPara如果其它模塊需要引用全局變量g_ucPara,只需要在文件開頭包含module1.h/*模塊2實現文件:module2.c*/#include“module1.h”//在模塊2中包含模塊1的.h文件......g_ucPara=0;......四技能點拓展——2.頭文件防重包含04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.3編程規范五技能點檢測完成課堂任務,在線提交;完成技能檢測,在線提交;C語言程序設計基礎與實踐模塊三編程初級應用任務3.4編程錯誤排查C語言程序設計基礎與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務3.4編程錯誤排查01問題引入05技能點檢測一問題引入現實生活中,我們總是會不停的犯錯,為了避免犯錯我們會制定很多規則,也會采取許多措施,比如開車,我們會制定很多交通規則,為了遵守交通規則我們會采取很多措施,比如十字路口會設定交通燈,汽車座椅會有安全帶,測速系統會有超速警告,甚至還有攝像頭進行駕駛員疲勞駕駛監測。程序員要編寫一個好的程序,就必須遵守代碼規范,編程工具也會提供很多工具幫助程序員檢查語法、調試程序,那么這個工具如何使用呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.4編程錯誤排查二技能點分析1.編譯程序2.設置斷點3.單步執行命令4.使用數據提示檢查變量學習目標1.什么叫編譯2.什么是調試?3.什么是斷點?學期預習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務3.4編程錯誤排查
寫在源文件中的源代碼是人類可讀的源。它需要"編譯",轉為機器語言,這樣CPU可以按給定指令執行程序。C語言編譯器用于把源代碼編譯成最終的可執行程序。
“調試”這一術語可能有很多不同的含義,但從字面上看,它指從代碼中刪除bug。現在,可通過多種方法實現此目的。例如,你可以通過掃描代碼以查找拼寫錯誤來進行調試,也可以使用代碼分析器進行調試。你可以使用性能探查器來調試代碼,也可以使用“調試器”進行調試。
調試器是一種非常專業的開發人員工具,它可附加到正在運行的應用,并允許你檢查代碼。毫無疑問,軟件開發人員編寫的代碼并不總是按照預期行事。有時它執行一些完全不同的操作!三技能點詳解——1如何啟動調試我們在創建完程序后,通過“調試”菜單的“啟動調試”,或者按F5啟動調試功能/**************************************************程序內容:利用雙重循環打印10行*號,n行有n個星號*************************************************/#include
<stdio.h>//該頭文件定義了
printf()函數
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機構活動派對活動方案
- 暑期少先隊實踐活動方案
- 景區立春活動策劃方案
- 棗莊奶茶活動方案
- 暑期簽到活動方案
- 普洱紋眉活動策劃方案
- 機構周末活動方案
- 朋友圈店鋪活動方案
- 晚會活動安全活動方案
- 從管控到賦能:我國文藝演出市場發展進程中政府職能轉變探究
- 安全標準化考試試題及答案
- 科研團隊經費管理制度
- 車輛進廠出廠管理制度
- 商協會公章管理制度
- 企業檔案利用管理制度
- 安全生產月題庫-2025年安全生產月安全知識競賽題庫(附題目答案)
- 口腔正畸模型測量分析
- 2025年中小學美術教師招聘考試美術專業知識必考題庫及答案(共170題)
- 四川省德陽市2023-2024學年高二下學期7月期末考試英語試題(含答案)
- 【MOOC】人工智能導論-西安電子科技大學 中國大學慕課MOOC答案
評論
0/150
提交評論