C語言--結構體

1、PTA實驗做業

題目1:結構體數組按總分排序

1. 本題PTA提交列表

2. 設計思路

struct student                  
{
int num;
char name[15];
float score[3];
float sum;
};//該結構體表示學生的編號,姓名,得分和總分
struct student stu[5];
定義循環變量 i,j;
定義浮點型變量 f,存放各學生各得分數;
for i=0 to i=4
    輸入學生編號,姓名
    for j=0 to j=2
        輸出得分
        存放入數組score
    end for
end for
調用函數calc求總分
調用函數sort對總分進行從高到低排序
排好序後按順序輸出編號和姓名和各項得分和總分
求總分函數:
    struct student stu[5];
    定義循環變量 i;
    for i=0 to n-1
        調用結構體數據求和
     i++,p++;
   end for
排序函數
    struct student stu[5];
    定義循環變量 i,j;
    定義結構體變量temp
    for i=0 to n-1
        for j=i+1 to n-1
            若是(*(p+j)).sum>(*(p+i)).sum)
                利用item作中間量,實現互換
               end for
       end for

3.代碼截圖

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

排序函數一開始我用的和求和函數一個思路,就是數組處理,發現輸出沒變化,就對後面部分改動,改爲指針操做,而後發現出現上述結果,看上去像是丟了一次排序過程,可是調試結果倒是進行了四次循環排序。後來想到會不會由於if語句使用的是數組操做,然後面是指針操做,運行過程當中對結果形成影響。統一成指針操做後答案正確。算法

題目2:時間換算

1. 本題PTA提交列表

2. 設計思路

struct time{
        int hh;
        int mm;
        int ss;
    }t1;//該結構體表示小時,分鐘,時間
    定義變量n表示增長的秒數,amount表示轉化爲秒後總秒數
        輸入小時數,分鐘數,秒數
    輸入增長的秒數
       計算總秒數amount
           將總秒數轉化爲新的小時分鐘秒數
               秒數滿60分鐘數進一
               分鐘數滿60小時數進一
              小時數對24進行取餘
         輸出新的小時,分鐘,秒數

3.代碼截圖

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

這一題一開始是想到用if判斷是否總秒數大於23:59:59轉化後總秒數,而後考慮零點問題,後來發現小時數對24取餘就能夠實現這一內容了。答案錯誤是由於不知道如何實現00這樣的輸出,在科委的幫助下,順利獲得了正確答案。數組

題目3:通信錄的錄入與顯示

1. 本題PTA提交列表

2. 設計思路

struct friend{
        char name[11];
        char birthday[11];
        char sex;
        char mobile[20];
        char sta[20];
    }f[100];//該結構體表示朋友的姓名,出生日期,性別,移動電話,座機號碼
    定義循環變量 i,k表示要查詢個數,n表示通信錄中人數,t用來存放要查詢編號;
    定義數組a[k]存放查詢編號
    輸入總人數
    for i=0 to n-1
        輸入姓名,出生日期,性別,移動電話,座機號
       輸入要查詢的個數
    for  i=0  to k-1
        輸入查詢編號數並存入數組a
    for i=0 to i<k
         若是編號查詢有結果
             輸出該編號對應姓名,座機號,移動電話,性別,出生日期
             不然輸出  Not Found

3.代碼截圖

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

一開始是經過輸出f(i)來輸出相應信息,運行發現結果錯了,想要輸出的是第二條,可是輸出的是第一條,想到的解決辦法是把i改成i+1,這樣結果就對了,由於測試的幾組數據都有1這個編號,答案都符合預期結果,當時還沒反應過來這樣改算法都錯了,果真PTA提交答案錯誤,仔細理了一遍發現f中的變量錯了,應該是數組元素,而不是數組下標,個人算法會形成只要第一個測試編號是找的到結果的就會執行f(1),測試正好選擇的編號是1,答案正好吻合了,因此一時沒檢查出錯誤,仔細讀了一遍才發現問題框架

2、截圖本週題目集的PTA最後排名。

3、閱讀代碼

(1)記錄平常收支



該代碼功能:記錄流水號、發生日期、收支名稱、發生金額、餘額、登記人等信息,還能增長新紀錄,查詢記錄

優勢:結構體在作這些系統管理信息時比較方便,結構體代碼借鑑的主要方面我以爲是整個程序框架的構建,好比有菜單欄輸出,利用switch語句調用相應函數實現指定命令從而知足用戶的需求。把一個個功能利用函數封裝起來,整個思路會清楚不少,須要時就調用指定函數,也比較便於查錯,另外改善程序也很方便,好比某些功能沒考慮到,只要添加部分語句,完成函數調用就能夠了,否則,你可能還須要寫一遍函數

(2)實現矩陣轉置


該代碼功能::實現矩陣的轉置運算,reverse函數完成轉置,Input函數輸出原函數,Output輸出轉置後的矩陣

優勢:用指針作形參,調用函數所執行的操做後會傳給主調函數。矩陣較大時,指針操做不須要像數組計算申請很大的內存空間,計算更快。

4、本週學習總結

1.總結本週學習內容。

(下面兩項內容必須查閱資料回答,有其餘認識也能夠放在這個總結中)函數

1.結構體、共用體、枚舉這種構造數據類型特色。

結構體:(1)能夠把多種基本數據類型彙集在一塊兒
              (2)結構體所佔內存空間是各成員變量所佔內存之和
              (3)結構體成員能夠單獨引用
              (4)結構體不能總體輸入輸出,必須一個一個
              (5)結構體每一位成員都用來表示一種具體事務的屬性、
              (6)結構體能夠有結構函數
共用體:(1)多變量共享存儲空間,容許幾種不一樣的變量共用同一存儲空間
              (2)共用體成員能夠表示多種屬性(同一存儲空間能夠存儲不一樣類型的數據)。
              (3)共用體空間等於最大成員佔據的空間
              (4)共用體不能複製
枚舉:(1)變量的值能夠所有列出,定義一個枚舉變量後,變量的值肯定在定義之中
              (2)枚舉元素是常量,只能在定義階段賦值
              (3)枚舉類型默認爲是int類型,並默認爲從0,1,2,3...遞增排序,也可爲屬性賦值,也可改變枚舉類型的int類型(如將其換成byte來減小內存的消耗)
              (4)枚舉類型內的都是同類型的屬性變量

2.遞歸函數原理。

遞歸就是某個函數直接或間接地調用了自身,這種調用方式叫作遞歸調用。既然是函數調用,那麼就有一個雷打不動的原則:全部被調用的函數都將建立一個副本,各自爲調用者服務,而不受其餘函數的影響。遞歸多少次,就有多少個副本,再利用內存的棧式管理,反向退出。凡是遞歸的函數,必定會在某一個地方存在可以返回上一層函數的代碼,也就是遞歸出口,不然一定死遞歸,也就是說,某一個函數進入了無限調用自身的狀況,永無止境地消耗內存等資源。
 遞歸的基本思想是把規模大的問題轉化爲規模小的類似的子問題來解決。在函數實現時,由於解決大問題的方法和解決小問題的方法每每是同一個方法,因此就產生了函數調用它自身的狀況。另外這個解決問題的函數必須有明顯的結束條件,這樣就不會產生無限遞歸的狀況了,因此遞歸思想用遞歸用程序表達出來有三個要素:遞 + 結束條件 + 歸。
任何遞歸函數必須包含條件,來判斷是否要遞歸下去,一旦結束條件成立,遞歸克隆不該該繼續,以遞歸出口值做爲函數結果,而後返回,結束一個遞歸克隆函數體,再經過一層層的返回,一層層計算,最終獲得結果

3.結構體複習

(1)struct和它後面的結構名一塊兒組成一個新的數據類型名學習

(2)結構的嵌套定義:先定義成員的結構類型再定義主結構類型測試

(3)結構變量的定義和初始化
i 單獨定義、混合定義、無類型名定義
ii 結構變量的初始化採用初始化表的方法,大括號內各數據項間用逗號隔開,將大括號內的數據項按順序對應的賦給結構變量內各個成員,且要求數據類型一致設計

(4)結構變量成員的引用3d

i 結構名.結構成員名 如 s1.sum
ii 嵌套結構成員引用相似 如 struct nest_student nest_s1
規則:從左到右 從外到內指針

(5)結構變量的總體賦值
容許將一個結構變量的值直接賦給另外一個結構變量,可是必須是相同結構類型變量調試

(6)結構指針

訪問結構成員 i 用*p訪問
ii 用指向運算符->

###4.遞歸

1.函數嵌套調用 先調用後返回

2.倆個要點:遞歸式子和遞歸出口

3.任何遞歸函數必須包含條件,來判斷是否要遞歸下去,一旦結束條件成立,遞歸克隆不該該繼續,以遞歸出口值做爲函數結果,而後返回,結束一個遞歸克隆函數體,再經過一層層的返回,一層層計算,最終獲得結果

2.羅列本週一些錯題。

結構體每一個成員相對於結構體首地址的偏移量都是成員大小的整數倍,若有須要編譯器會在成員之間加上填充字符,因此char mouth被補充了3個字節。而指針變量的大小在64位的機器上永遠是8,在32位上永遠是4

比較字符串大小看錯了。。。 根據題意 d=b 因此d.sno=2002 *p=&d 因此 p->name 爲Shangxian

相關文章
相關標籤/搜索