標籤:過程 解法 特殊情況 時間換算 遞迴調用 結構 ring 參考 手機號碼
一、PTA實驗作業題目1:結構體數組中尋找指定編號人員1. 本題PTA提交列表
2. 設計思路
struct student fun(struct student *std, char *num){ 定義struct student p用來儲存返回人員的資料 定義變數i,j,flag用來控制迴圈for i=0 to N-1{ flag賦值為1 for j=0 to 5 { if std->num[j]與num[j]不相等 那麼讓flag變成0,std++,停止內迴圈 } 經過上面的迴圈如果 flag還是為1,說明制定編號人員存在,立即停止外迴圈} 將*std的資料複製到p上 if flag不等於0 返回 p}
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明。直接讓p賦上std的資料,編譯錯誤,後來才發現是忘記加星號(*)。改用一個一個資料複製的方法賦值。題目2:時間換算1. 本題PTA提交列表
2. 設計思路
struct Time{ int hour; int min; int sec;}time;//該結構體表示時間的小時數,分鐘數,秒數定義變數n表示增加的秒數;輸入時間和秒數;給原秒數做加法運算time.sec+n;if time.sec不小於60{ 分鐘數增加,秒數減去60 if time.min不小於60{ 小時數增加,分鐘數減去60 if time.hour不小於24 小時數變為0 }}if time.hour<10輸出0 /*如果時間不足兩位要補0*/輸出 小時數:if time.min<10輸出0輸出 分鐘數:if time.sec<10輸出0輸出 秒數
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明。這道題問題不大,思路清楚,就是最後輸出時如果時間是個位元前面要輸出0,我的處理方法感覺比較麻煩,要進行三次判斷。題目3:通訊錄的錄入與顯示1. 本題PTA提交列表
2. 設計思路
struct communication{ char name[11]; char birthday[11]; char sex; char tel[17]; char mob[17];};//該結構表示通訊錄人員的姓名,生日,性別,固定和手機號碼定義變數i,j來控制迴圈定義N,k表示通訊錄人員總數和要查詢的編號個數定義通訊錄人員數組struct communication person[N]for i=0 to N-1錄入成員資訊輸入要查詢的編號個數k定義數組count[k]用來儲存要查詢的編號for j=0 to k-1錄入編號for j=0 to k-1 if 0<=count[j]<N 輸出該編號人員的資訊 else 輸出"Not Found"
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明。
仔細檢查自己思路沒問題,後來發現電話號碼不超過15位但還要算上加號,所以存放號碼的數組大小至少為17,否則會溢出。二、本周題目集的PTA最後排名。
三、閱讀代碼1.時間換算:本題要求編寫程式,以hh:mm:ss的格式輸出某給定時間再過n秒後的時間值(超過23:59:59就從0點開始計時)。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>int all[10]={0},i=0;void tosex(int n) //轉換為60進位{ if(n>59) tosex(n/60); all[i]=n%60; i++; return 0;//原代碼有return 0,如果要在dev上測試,需要刪除}int main(){ int h,m,s,n,stamp,j; scanf("%d:%d:%d\n%d",&h,&m,&s,&n); stamp=s+m*60+h*3600+n; //時間戳記 tosex(stamp); all[i-3]=all[i-3]%24; //小時是24進位的 for(j=i-3;j!=i;j++) { if(all[j]<10) printf("0"); printf("%d",all[j]); if(j<i-1) printf(":"); } return 0;}
這是本周PTA的一道題,我們使用結構體來做,然而上面的代碼採用了遞迴的做法,方法更加巧妙。先算出總的秒數,利用遞迴函式和數組all來計算儲存換算後的時間,最後逆序輸出。2.角穀定理:輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算後,總可以得到自然數值1。求經過多少次可得到自然數1。
#include<stdio.h>//定義遞迴函式,參數為數字和步驟數int jg(int n,int step){ if(n!=1) { if(n%2 == 0) { printf("%d ", n); n = n / 2; } else if (n % 2 == 1) { printf("%d ", n); n = 3 * n + 1; } return jg(n, step + 1); } else { printf("%d ", n); step++; } printf("\nSTEP=%d\n",step);//輸出步驟數}//主函數int main(){ int s=0; int num; printf("請輸入一個數:"); scanf("%d",&num);//輸入數字 jg(num,s); return 0;}
可以利用遞迴解決一些複雜的數學問題,找出遞迴出口和遞迴式子就可以完成,可以試著挑戰一些題目,主要是要發現其中的共同規律。四、本周學習總結1.總結本周學習內容。嵌套函數(1)在一個函數中再調用其他函數,可以使問題解決過程局部化,避免功能之間的相互幹擾。(2)對於一個具體問題設計方法的原則一般如下:(i)自頂向下(ii)逐步求精(iii)函數實現(3)在設計函數時應注意:(i)限制函數的長度(ii)避免函數功能間的重複(iii)減少全域變數的使用(4)遞迴函式(i)遞迴函式即自己調用自己的函數(ii)遞迴函式的兩個要點:遞迴出口和遞迴式子(iii)注意運算式子不能這樣寫:fact(n)=n*fact(n-1);結構體、共用體、枚舉這種構造資料類型特點· 結構體的特點(i)結構體和數組一樣都是構造型資料類型,和數組不一樣的是,結構體可以處理不一樣類型的資料,但是數組中的元素必須是同一資料類型(ii)結構體變數所佔的記憶體長度為所有成員所佔記憶體的長度之和(iii)結構體數組每個元素都是一個結構體類型的資料(定義資料時要注意)· 共用體的特點(i)共用體變數所佔的記憶體長度等於最長的成員的長度(ii)同一段記憶體可以存放幾種不同類型的成員,但是每一瞬間,只能存放一種,其他成員都不起作用(iii)共用體變數中起作用的成員是最後一次存放的成員(iv)共用體變數的地址和其成員地址都是同一地址,&a, &a.i都一樣(v)不能對共用體變數名賦值,不能引用共用體變數名來得到一個值,不能在定義共用體變數時對它進行初始化(vi)不能將共用體變數作為函數參數,不能使函數返回共用體變數,但可以使用指向共用體變數的指標(vii)共用體使用了記憶體覆蓋技術,同一時刻只能儲存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。· 枚舉的特點(i) 枚舉類型是指變數的值可以全部列出,定義1個枚舉變數後,變數的值確定在定義之中。(ii)枚舉和結構體、共用體的區別在於,枚舉元素是常量,只可以在定義階段賦值。(iii)枚舉定義的量屬於全域常量,在其他地方不能再有與之重名的量。(iv)變數的值只限於列舉出來的值的範圍內遞迴函式原理(i)遞迴通常用來解決結構自相似的問題。所謂結構自相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規模小。實際上,遞迴是把一個不能或不好解決的大問題轉化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決。(ii)遞迴函式的內部執行過程
一個遞迴函式的調用過程類似於多個函數的嵌套的調用,只不過調用函數和被調用函數是同一個函數。為了保證遞迴函式的正確執行,系統需設立一個工作棧。具體地說,遞迴調用的內部執行過程如下:
(1)運動開始時,首先為遞迴調用建立一個工作棧,其結構包括值參、局部變數和返回地址; (2)每次執行遞迴調用之前,把遞迴函式的值參和局部變數的當前值以及調用後的返回地址壓棧; (3)每次遞迴調用結束後,將棧頂元素出棧,使相應的值參和局部變數恢複為調用前的值,然後轉向返回地址指定的位置繼續執行。
(參考自遞迴函式工作原理)
2.羅列本周一些錯題。課堂派C語言複習作業--結構體(1)
輸入資料時,要在前面加上&。(2)
定義函數時要根據函數的作用是什麼來定義類型。C語言預習作業--函數嵌套調用(1)
函數調用數組時應當用指標或數組來調用,a是整型變數,不能用來調用數組。
C語言部落格作業--結構體