一位35歲老實程序員心魔因委屈而孕育,因失望而長大
792
2025-04-02
函數的遞歸!!
函數自己調用自己就叫遞歸!通俗來說:把一個大型復雜的問題層層轉化為一個與原問題相似的的規模小的問題求解:隨便提一嘴!!!,遞歸只是把大事化小而已!與循環有差別。
補充:則在C語言中其個位、十位、百位、千位依次這樣計算:n/1%10,n/10%10,n/100%10,n/1000%10
遞歸存在的兩個條件:存在限制條件,但滿足這個限制條件的時候,遞歸便不再繼續。
每次遞歸調用之后越來越來接近這個限制條件。
寫代碼的時候注意:1.不能死遞歸,都有跳出空間,每次遞歸逼近跳出條件!
2.遞歸層次不能太深!
www.stackoverflow.com 號稱程序人的百科全書!!!
www.github.com(這網站可以查看資料)
關于冒泡法的使用!
如果要用冒泡法 對N個數進行排序,要進行幾輪排序?
總結:冒泡排序法是把N個數通過N-1倫排序,升序排序中大的數往下沉,小的數往上浮,降序排序中小的數往下沉,大的數往上浮!
練習題:打印楊輝三角!
#define?MAX??7
#include
int?main?(){
int?i?,j,k;
int?c[MAX][MAX]={0};
c[0][0]=1;
for(i=1;i for(j=1;j<=i;++j){ if(j==0||j==MAX-1){ c[i][j]=1; } else c[i][j]=c[i-1][j-1]+c[i-1][j]; } } for(i=1;i for?(j=1;?j<=i;j++) printf("%-3d",c[i][j]); printf("\n"); } return?0; } 由于一些特殊因素所以不后續將會補上視頻遞歸!!p50-28.51時間記得回顧!! 初見 素組 數組:是一組相同類型元素的集合 數組分:完全初始化,和不完全初始化 注意兩者的差異 總結:數組是通過下標來訪問的,小標是從零(0)開始的 2.數組的大小可以通過計算來得到! 二維數組在內存里面也是連續存放的! 一行內部連續,跨行也還是連續的! 兩個用途: 數組作為函數參數!! 冒泡排序的思想:兩兩相鄰的元素作為比較,并且可能的話需要交換 #include int?main(){ int?i=0; for(i=0;i int?j=0; for(j=0;j if(arr[j]>arr[j+1]){ int?tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } } } } 數組名就首元素的地址! 1.但是有兩個例外sizeof(數組名)——素組名代表整個數組-計算的是整個數組的大小單位是字節! 2.&數組名-數組名表示整個數組-取出的是整個數組的地址. 1.在while循環中以EOF作為文件結束標志,這種以EOF作為文件結束標志的文件,必須是文本文件。在文本文件中,數據都是以字符的ASCII代碼值的形式存放。我們知道,ASCII代碼值的范圍是0~127,不可能出現-1,因此可以用EOF作為文件結束標志 2021年12月8日; 再次探索函數!函數的的使用方法可以先定義!: 例如:張三(蛋炒飯,20) 我,張三 帶飯(蛋炒飯,20) 數組 char ch[5]=={a,b,c} //不完全初始化,剩下的默認為0! 2021.12.9日 關鍵字:static修飾函數,使得函數只能在自己所在的源文件里面使用, 本質上,static是將函數的 外部連接屬性變成了內部連接屬性 初涉指針:4.294.196.296BIT /8=536.870.912byte/1024=524.288kb/1024=512 mb=/1024=0.5gb 指針的大小是相同 ! 指針 是用來地址的; 指針需要多大空間,取決于地址的存屬需要多大空間! 存放指針數據的內存的大小在同樣位數的系統里是相同的,但在不同的系統當中一般是不同的,比如16位,32位,64位系統當中指針內存大小是不一樣的 循環:break;//在While循環中,break用于永久終止循環! continue的作用的是跳過本次循環continue后邊的代碼//然后看看后面代碼條件執不執行! 循環的建議=不可以在for循環體內修改循環變量,防止for循環失去控制 2.建議for語句的循環 控制變量的取值采用“前閉后開區間”寫法! break;只能跳出一個循環體 例題:在一個有序數組中查找具體的某個數字n---可以使用二分法!也叫折半法 rand函數返回了一個0~32767之間的數字 ; rand() rand()函數是使用線性同余法做的,它并不是真的隨機數,因為其周期特別長,所以在一定范圍內可以看成隨機的。 srand()為初始化隨機數發生器,用于設置rand()產生隨機數時的種子。傳入的參數seed為unsigned int類型,通常我們會使用time(0)或time(NULL)的返回值作為seed。下面我們來進行實驗,從而對它進行更深入的感知。 strlen: strlen()[計算字符串的長度]是一種函數。' strlen()[計算字符串的長度]是一種函數。'\0’作為終止符;2.strlen()[計算字符串的長度]是一種函數。'\0’作為終止符;其參數必須是字符型指針(char*)。頭文件為#include strlen()[計算字符串的長度]是一種函數。'\0’作為終止符;2.strlen()[計算字符串的長度]是一種函數。'\0’作為終止符;其參數必須是字符型指針(char*)。頭文件為#include system:可以理解為一個清除或者終止代碼! C語言的魔法!! 代碼吃力正常! 1.總結 2.代碼模仿+上思考 ,然后放一邊,不是照著抄沒有用!,然后脫離別人的代碼進行思考開始入手。 3.入手代碼題:把代碼想成一個簡單的問題,想出解決方案,轉換成代碼(這一步需要語法); 代碼調制: 感受代碼的調試,感受他的執行 函數返回類型的地方寫出:void,表示這個函數不返回任何值,也不需要返回 C語言中strlen函數功能及用法 用法:#include 功能:計算字符串s的(unsigned int型)長度 return的用法 在有反回值的方法中,返回方法指定類型的值,同時結束方法執行; 也可以用在返回值為void的方法中,用來終止方法運行; return是使整個函數返回的 小結: 1) 函數名+括號:fn1()==return后面的值 2) 所有函數默認返回值為:未定義 3) return后面任何代碼都不執行了 斐波那契數列的概念 它的規律是:這個數列從第 3 項開始,每一項都等于前兩項之和 在數學上,斐波那契數列以如下被以遞推的方法定義:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),顯然,斐波那契數列是一個線性遞推數列 int?F(int?n)?//斐波那契數列函數?遞歸形式 { if(n?==?0)?//初始化 return?0; if(n?==?1?||?n?==?2) return?1; return?F(n-1)?+?F(n-2);?//如果n?!=?1?&&?n?!=?2?進行遞歸運算 } int?main() { int?t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%d\n",?F(n)); } return?0; } 函數 1、一個源程序由多個函數組成。 2、C程序的執行從main()函數開始; 3、所有函數都是平行的; 4、函數分類;可以分為標準和自定義,還可以分為有參函數和無參函數。 函數定義的一般形式: 2、預定義標識符 預定義標識符在c語言中也有特定的含義,但可以用作用戶標識符,預定義標識符分為兩類: (1)、庫函數名字,比如(printf,scanf,sin,isdigit等) (2)、編譯處理命令名,比如(define,include) C語言的關鍵字 2.1 定義 關鍵字就是C語言提供的有特殊含義的符號,也叫做“保留字” C語言一共提供了32個關鍵字,這些關鍵字都被C語言賦予了特殊含義auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static 3 標識符 3.1 定義 標識符就是在程序中自定義的一些符號和名稱。要跟關鍵字區分開來:關鍵字是C語言默認提供的符號,標識符是程序員自定義的. 3.2 作用 標識符,從字面上理解就是用來標識某些東西的符號,標識的目的就是為了將這些東西區分開來 其實,標識符的作用就跟人類的名字差不多,為了區分每個人,就在每個人出生的時候起了個名字 C語言是由函數構成的,一個C程序中可能會有多個函數,為了區分這些函數,就給每一個函數都起了個名稱。函數的名稱就是標識符的一種。除了函數,變量的名稱也是標識符 3.3 命名規則 只能由26個英文字母的大小寫、10個阿拉伯數字0~9、下劃線_組成 嚴格區分大小寫,比如test和Test是2個不同的標識符 不能以數字開頭 不可以使用關鍵字作為標識符 如果標識符中含有多個單詞,可以使用駝峰標識(除開第一個單詞,后面每個單詞的首字母都是大寫):firstName、myFirstName,或者使用下劃線_來連接:first_name、my_first_name 3.4 常見錯誤 fromNo12 from#12 標識符中不能使用#符號 my_Boolean my-Boolean 標識符中不能使用“-”符號,應使用下劃線“_”代替 Obj2 2ndObj 標識符不能使用數字開頭 myInt int “int”是內建關鍵字 jack_rose jack&rose 符號“&”不能出現在標識符中 GUI G.U.I 標識符內部需要出現“.”分隔符 C語言的常量——不能改變的量 注意!如果有使用VS2019的編譯器記得加上 ? ? #define _CRT_SECURE_NO_WARNINGS .1 C語言的基礎:定義變量變量由一個類型聲明符加一個或多個變量名 int a; // a是int類型的變量 double b=1.0; //b是double類型的變量,賦1.0為初值 char c, d; // c, d是char類型的變量 變量有兩種類型: 字符串的用法: 標識符: 標識符是C程序的最基本組成部分,例如:變量名稱、函數名稱、數據類型等等,都是一個標識符。標識符的要求是:必須由字母(區分大小寫)、數字、下劃線組成。而且,標識符的第一個字符不可以是數字。例如: abc --- 合法 _abc123 --- 合法 abc555 --- 合法 123abc --- 非法 abc$!! --- 非法 在C語言中,大寫字母和小寫字母被認為是不同的字符,所以,ABC與abc表述的標識符是不一樣的。 標識符 在編程過程中,經常需要定義一些符號來標記一些名稱,如變量名、方法名、參數名、數組名等,這些符號被稱為標識符。在 C語言中標識符的命名需要遵循一些規范。 規范: 1.標識符只能由字母、數字和下劃線組成。 2.標識符不能以數字作為第一個字符。 3.標識符不能使用關鍵字。 4.標識符區分大小寫字母,如 add、Add和 ADD是不同的標識符。 5.盡量做到“見名知意”,以增加程序的可讀性,如用age表示年齡等。 6.ANSIC中沒有規定標識符的長度,但建議標識符的長度不超過 8 個字符。 7.在上面的規范中,除了6和7外,其他的命名規范都是必須要遵守的,否則程序就會出錯。 為了讓大家對標識符的命名規范有更深刻地理解,接下來列舉一些合法與不合法的標識符,具體如下: 下面是一些合法的標識符: 下面是一些不合法的標識符: area 3a DATE ab.c _name long lesson_1 abc#zz 函數的遞歸!! 函數自己調用自己就叫遞歸!通俗來說:把一個大型復雜的問題層層轉化為一個與原問題相似的的規模小的問題求解:隨便提一嘴!!!,遞歸只是把大事化小而已!與循環有差別 小練習:從鍵盤上輸入10個數,求其平均值: #include? void?main(){ int??a,i,sum=0; float?ave;; for(i=0;i<10;i++){ scanf("%d",&a); sum+=a; } ave=(float)sum/10; printf("ave?=?%f\n",?ave); } 練習題:對指針數組中N個指針元素進行大小排序 void?sort(int*?p,int?lenth) { int?temp; //用指針對數組進行從小到大的排序 for?(int?i=0;i { for(int?j=i;j { if?(*(p+i)>*(p+j+1)) { temp=*(p+j+1); *(p+j+1)=*(p+i); *(p+i)=temp; } } } for?(int?k=0;k { printf("%d?",*(p+k)); } } void?main() { int?arr[10]={4,2,8,11,3,6,9,33,23,15}; sort(arr,sizeof(arr)/sizeof(arr[0])); } 題目2. 輸入一個圓半徑r,當r>=0時,計算并輸出圓的面積和周長,否則,輸出提示信息。 #include? #define?PI?3.14 int?main(voi????d) {?double??r?,area?,?girth; printf("please?input?r:\n"); scanf("%lf",&r); if?(r>=0) {?area?=PI*r*r; girth?=2*PI*r?; printf("the?area?is?%.2f\n",?area); printf("the?girth?is?%.2f\n",?girth);} else printf("Input?error!\n"); return?0; } 從鍵盤輸入n個數存放在數組中,將最小值與第一個數交換,輸出交換后的n個數。 #include? int?main(void){ int?i,n,iIndex,temp; int?a[10]; printf("Enter?n:?"); scanf("%d",?&n); printf("Enter?%d?integers:\n?");