實在是不會做了,求大神幫幫忙捋一捋思路?。?/h1>
2 回答

TA貢獻1858條經驗 獲得超8個贊
函數在C語言中是必不可少的一部分,大致可以分為兩種:系統定義好的和我們自己寫的。不管是哪種函數,它們都默默地、兢兢業業地完成著屬于自己的任務。只要給它一些參數,它就會把參數處理好、有些函數還會把處理結果返回出來。以下幾種特殊函數,你有見過嗎?會用嗎?
1、靜態函數
普通的函數一般是全局的,可見范圍是跨文件的,比如a.c 這個文件中有一個函數名為 func() , b.c文件 中是可以直接調用a.c中的func函數的。而靜態函數不同,它被static修飾之后可見范圍縮小到本文件可見,其它文件不可見。
如果真的是閑得蛋疼想在一個文件中調用一個別的文件中的靜態函數,也有辦法:
1.直接把func所在的函數包含進來 #include "b.c"
2.可以把static 修飾的函數寫在頭文件中
2、遞歸函數:
這個名字看起來有一點數學味,比較高級的樣子。其實它的定義也很簡單:在一個函數內部調用了自身,那這個函數就是遞歸函數。
下面寫了一個例子:
使用遞歸函數的時候有幾個問題要注意:
1.只有能被遞歸解決的問題才可以使用遞歸來解決。(階乘、冪運算、字符翻轉等)
2.遞歸函數中必須有一個可以直接退出(返回)的條件,否則會進入無限循環。
3.遞歸的過程包含兩個:逐漸遞進,層層回歸。
4.遞歸函數會使用大量的棧內存空間,要注意遞歸的層次不要太深,如果一定要用的話可以嘗試把??臻g的大小臨時設置一下。(ulimit -s)
3.指針函數
這種函數是什么其實很明顯了,指針函數就是返回值是指針類型的函數。
使用的時候要確保該函數的返回值是指針,不然編譯器會報警告。
4、回調函數
函數的實現方,它不方便直接調用該函數,而是由第三方接口來調用該函數,該函數就是回調函數。概念有點繞,我們直接看代碼:
可以看到我們在主函數main里面并沒有直接調用func()函數,而是運用函數指針P通過一個signal函數去調用它。在實際工程中回調函數會用得比較多,就像圖中的signal函數,假設這個函數是從別人手上買回來的,我們無權訪問其源碼,只能夠使用。賣家給我們留下了接口讓我們使用它,因此我給了它兩個參數,當它收到信號2的時候,我希望它能幫我調用我寫的func()函數。那么func()就是所謂的回調函數。
5、內聯函數
如果有一個函數被多次調用,那么該函數在調用過程中會消耗程序執行的時間, 而內聯函數指的就是可以把需要調用的函數副本拷貝到調用者的內部,節約了調用過程中的時間。
普通函數的調用與切換過程:
內聯函數示意圖:
內聯語法:
什么時候應該用內聯函數:一個函數在另一個函數多次被調用,而且被調用函數的內容比較少的情況。
6、變參函數
如果一個函數的參數類型以及參數的數量都是可變的,那么這個函數就稱之為變參函數(如我們常用的printf)。
函數形參在棧中分配內存的順序,從右到左的獨特順序使得第一個參數是棧頂元素(即示例中的參數 format),我們就可以根據第一個已知的參數(綠色)所提供的線索, 來回溯剩下的未知的參數(黃色)

TA貢獻1802條經驗 獲得超4個贊
我給你一個簡版的吧 代碼實在不想全寫 我給你寫個判斷的
for(int i = 0; i < n -m ;i++){ // 這里是第幾行
for(int j =0; j < n-m;j++){ // 這里是第幾列
if(m矩陣第一個值 == n矩陣的i行j列的值){
//這里使用循環去判斷m是不是n的子矩陣,使用兩個循環對比每一個點是否一樣
int x =0,y = 0;
for(x= 0; x < m; x++){
for(y = 0; y < m; y++){
if(arrM[x][y] != arrN[i + x][j+y]){
// 不是子矩陣
}
}
}
if(x == m && y == m){
y和x都等于m表示是子矩陣,輸出i+1和j+1
}
}
}
}
- 2 回答
- 0 關注
- 561 瀏覽
添加回答
舉報