1. 程式人生 > >C語言第十一次博客作業---函數嵌套調用

C語言第十一次博客作業---函數嵌套調用

指定 編譯預處理 define result 宏替換 多次 clu 菜單 tro

一、實驗作業

1.1 PTA題目

題目:遞歸實現順序輸出整數

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

printdigits函數
定義整型變量result存放結果
if n是10的倍數
    result=n
else
    取n的個位數賦值給result
    遞歸調用printdigits(n/10)
輸出result

3.代碼截圖

技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

①遞歸出口錯誤。零的情況考慮錯誤。
技術分享圖片

②修改遞歸出口後正確。
技術分享圖片

1.2 學生成績管理系統

1.2.1 畫函數模塊圖,簡要介紹函數功能

1.2.2 截圖展示你的工程文件

1.2.3 函數代碼部分截圖

本系統代碼總行數:XXXX
要求截圖你的頭文件、插入學生信息及學生成績信息代碼、刪除學生成績信息代碼、總分排序代碼。
代碼中務必加入必要的註釋。

1.2.4 調試結果展示

要求分別展示菜單、每個命令運行結果,對非法數據必須有檢驗並提示,如用戶學號輸入非法、或者輸入重復學號,提示插入失敗。查詢不到相應學生信息給予提示等等。
測試樣例越多,分值越高

1.2.5 調試碰到問題及解決辦法。

二、截圖本周題目集的PTA最後排名。

PTA排名

PTA提交列表

三、閱讀代碼

題目:整數拆分
給定一個整數n,輸出這個整數拆分的可能總數
例如:n==6有
6
5+1
4+2 4+1+1
3+3 3+2+1 3+1+1+1
2+2+2 2+2+1+1 2+1+1+1+1
1+1+1+1+1+1
共11種分解方法,所以輸出應該為11。

#include <stdio.h>
int q(int n,int m) //n為要拆分的數字,m為所拆部分中最大值 
{
    if(n == 1|| m == 1)
        return 1; 
    
    else if(n < m)
        return q(n,n);
    
    else if(n == m)
        return 1 + q(n,n - 1);
    
    else if(n > m)
        return q(n,m-1)+q(n - m,m);
}
 int main ()
 {
     printf("請輸入要拆分的數字\n");
     int n;
     scanf("%d",&n);
     int ret = 0;
     ret = q(n,n);
     printf("該數字一共有的拆分方法數\n");
     printf("%d",ret);
     return 0;
 }

分析:
① 當n=1時,只有一種劃分{1};
②當m=1時,只有一種劃分{1,1,....1,1,1};
③當n=m時,根據劃分中是否包含n,可以分為兩種情況: (1)劃分中包含n的情況,只有一個{n}; (2)劃分中不包含n的情況,使用不大於n-1的整數進行拆分;所以此時 q(n,n) = 1 + q(n, n - 1)。
④當n<m時,使用比n大的數進行拆分沒有意義,所以此時相當於q(n,n)
⑤當n>m時,這時候有兩種情況:
(1)使用m對n進行拆分,拆分出來的情況最大的數是m,剩下的所有數加起來為n-m,問題變成使用不大於m的整數對n-m進行拆分,所以此時為q(n-m,m)
(2)使用小於m的數對n進行拆分,使用小於m的數對n進行拆分,表示為q(n,m-1)
所以此時q(n,m) = q(n - m,m) + q(n, m - 1)。
綜上,①②屬於回歸條件,③④屬於特殊情況,⑤為通用情況,屬於遞歸的方法,其本質主要是通過減少n或m以達到回歸條件,從而解決問題。
遞歸表達式:技術分享圖片

四、本周學習總結

1.介紹本周學習內容

1.1.宏(宏替換)

  • 宏定義的格式:#define 宏名標識符 宏定義字符串
    註:
    1.不是真正的C語句,行尾不用加分號
    2.常采用大寫字母串作宏名,宏名與宏定義字符串間用空格分隔,所以宏名中間不能用空格
    3.宏定義字符串是任意字符串,中間可以有空格,以回車符做結束
    4.如果宏定義字符串後面跟分號,編譯預處理時把分號也作為宏替換內容
    5.宏定義可以嵌套使用

    #define PI 3.1415926
    #define S PI*r*r
  • 宏的用途
    1.符號常量,如PI、數組大小的定義
    2.簡單的函數功能實現
    3.當程序中需要多次書寫一些相同內容時,不妨把它寫成宏
    例:

    #define LONG_STRING "it represent a long string that   is used as an example."

    使用方式:printf(LONG_STRING )
    註:
    1.#define最後面跟的“”表示該行未結束,與下一行合起來成為完整一行
    2.LONG_STRING 代表帶引號的字符串,因此printf()中不必再加引號

  • 帶參數的宏定義
    #define 宏名(參數表) 宏定義字符串
    註:
    1.參數表中只有參數名稱,沒有類型說明
    2..宏名和小括號必須緊挨著;小括號不能省略
    3.如果替換文本中有括號,則進行宏替換時必須有括號;反之,如果替換文件中本身沒有括號,則宏替換時不能隨便加括號。
    4.宏替換不作計算。
    例:求y=(x+y)2
    錯誤:#define SQR(x) x*x 宏替換後 -> y=x+y*x+y≠(x+y)2
    正確:#define SQR(x) (x)*(x)宏替換後 -> y=(x+y)*(x+y)=(x+y)2

1.2.文件包含

  • 文件包含的格式:
    #include<需包含的文件名>#include"需包含的文件名"
    1.雙引號,是指系統先在源程序所在的目錄查找指定的包含文件,如果找不到,再按照系統指定的標準方式到有關目錄中去找。
    2.尖括號,系統將直接按照系統指定的標準方式到有關目錄中去尋找。

2.學習體會

  • 這周的內容學起來有點亂,特別是指針進階這一部分內容,還需要總結學習。
  • 這周的作業學生成績管理系統,代碼量增多,也是新的作業方式,多文件工程,對我有難度。
  • 一學期快結束了,前面的一些知識點也要著手復習總結,接下來應該是更忙碌的一個月了。

C語言第十一次博客作業---函數嵌套調用