1. 程式人生 > >C語言函數嵌套調用作業

C語言函數嵌套調用作業

clu 設計思路 數組名 所有 blog 聯系 post 後來 運算

一、實驗作業

1.1 PTA題目:6-4 十進制轉換二進制

設計思路

如果n大於1   對n/2繼續進行該函數運算
輸出n%2的值

代碼截圖

技術分享圖片

調試問題

  • 我第一次做的時候判斷的邊界條件是大於0繼續進行運算,但這樣是錯的,因為當n等於1時,n%2等於0,由於二進制是逆序輸出,又因為這個0是放在開頭的,可省略

    1.2 學生成績管理系統

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

    技術分享圖片

1.2.2 截圖展示你的工程文件

技術分享圖片

1.2.3 函數代碼部分截圖

  • 主函數
    技術分享圖片

  • 新建
    技術分享圖片

  • 修改
    技術分享圖片

  • 輸出全部
    技術分享圖片

1.2.4 調試結果展示

  • 新建與輸出
    技術分享圖片

技術分享圖片

  • 修改及修改後
    技術分享圖片

技術分享圖片

  • 刪除
    技術分享圖片

這個步驟我采用的是將要刪除的學生後面的所有學生向前移一位,這樣做的缺點就是最後的一個學生將會登記兩次,目前我還沒想到什麽剛好的方法

  • 其他步驟因為有一些較大的錯誤,還未改正,在此無法貼出圖片

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

  • 1、修改學生成績的函數中,我忘了修改完後要重新計算平均分和總分了,後來運行結果不對,我才發現這個問題,然後再代碼後加了計算
  • 2、我一開始把計算平均分和總分的函數寫在addition裏面,但是這樣結果卻是沒有進行計算,所以我只好在輸入完後直接計算平均分和總分
  • 3、查找學生信息的結果中聯系方式會出錯,目前還沒找出它的錯誤= =

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

技術分享圖片

三、閱讀代碼

角谷定理:

  • 輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算後,總可以得到自然數值1。求經過多少次可得到自然數1。
    如:輸入22,
    輸出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
    STEP=16;
  • 程序實現:

    #include<stdio.h>
    int Fun(int m) //定義m為自然數
    {
    printf("%4d",m);
    if(m==1)
    return 1; //當m=1的時候返回1
    if(m%2==1)
    return Fun(m*3+1)+1;//m為奇數,返回它的三倍加1,後面的加一是步數加一
    if(m%2==0)
    return Fun(m/2)+1; //m為偶數,返回它的一半,同理後面的加一是步數加1
    }
    void main()
    {
    int m,n=0;
    printf("請輸入一個自然數:");
    scanf("%d",&m);
    n=Fun(m); //定義步數為n,並將m的值傳遞給形參
    printf("\nSTEP=%d\n ",n);
    }
  • 該題通過遞歸,省去繁瑣的過程,較容易地得到結果
  • 其思路大致為:首先輸入一個自然數m,調用函數Fun(int m),將m的值傳給形參。每次進行判斷如果是偶數返回Fun(m/2),是奇數返回Fun(m*3+1),遞歸調用Fun()函數,直到m=1的時候,返回1,調用結束。另外為了方便計算步數,可在判斷是奇數時,直接返回Fun(m/2)+1,偶數同理。然後利用n=Fun(m),輸出n的值即為運算的步數。

四、本周學習總結

1.介紹本周學習內容

一、指針進階

  • 1、指針數組
    格式:類型名 *數組名[數組長度]
    優點:使用指針數組不會造成內存單元的浪費
  • 2、二階指針
    一般格式:類型名 * *變量名
  • 3、命令行參數
    一般形式:命令行 參數一,參數二,參數三,······參數n
    命令名和各個參數用空格隔開,可以無參數
    註意:使用命令行的程序不能在編譯器中執行
  • 4、指針作為函數返回值
    註意:不能返回在函數內部定義的局部數據對象的地址

    2.學習體會。

  • 這周學習的知識都比較難,例如二階指針,它的運算很復雜,容易出錯,又比如鏈表,它的概念我現在也不是很了解(所以沒在總結裏寫上他= =)
  • 指針數組是比較好用的,但使用起來也是比較復雜的,需要仔細思考好

C語言函數嵌套調用作業