這個做業屬於哪一個課程 | C語言程序設計Ⅱ |
---|---|
這個做業要求在哪裏 | 第九周做業 |
我在這個課程的目標是 | 可以使用c語言實現基本的程序設計,以致最後可以設計出較大的項目 |
這個做業在哪一個具體方面幫助我實現目標 | 學習告終構以及結構變量的定義與運用 |
參考文獻 | C語言程序設計(第3版); C Primer Plus (第6版) |
本題要求實現一個根據學生成績設置其等級,並統計不及格人數的簡單函數。
函數接口定義:編程
int set_grade( struct student *p, int n );
其中p是指向學生信息的結構體數組的指針,該結構體的定義爲:數組
struct student{ int num; char name[20]; int score; char grade; };
n是數組元素個數。學號num
、姓名name
和成績score
均是已經存儲好的。set_grade
函數須要根據學生的成績score
設置其等級grade
。等級設置:85-100
爲A
,70-84
爲B
,60-69
爲C
,0-59
爲D
。同時,set_grade
還須要返回不及格的人數。
裁判測試程序樣例:app
#include <stdio.h> #define MAXN 10 struct student{ int num; char name[20]; int score; char grade; }; int set_grade( struct student *p, int n ); int main() { struct student stu[MAXN], *ptr; int n, i, count; ptr = stu; scanf("%d\n", &n); for(i = 0; i < n; i++){ scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score); } count = set_grade(ptr, n); printf("The count for failed (<60): %d\n", count); printf("The grades:\n"); for(i = 0; i < n; i++) printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade); return 0; }
/* 你的代碼將被嵌在這裏 */
輸入樣例:函數
10 31001 annie 85 31002 bonny 75 31003 carol 70 31004 dan 84 31005 susan 90 31006 paul 69 31007 pam 60 31008 apple 50 31009 nancy 100 31010 bob 78
輸出樣例:學習
The count for failed (<60): 1 The grades: 31001 annie A 31002 bonny B 31003 carol B 31004 dan B 31005 susan A 31006 paul C 31007 pam C 31008 apple D 31009 nancy A 31010 bob B
int set_grade( struct student *p, int n ) { int i,count=0; for (i=0; i<n; i++) { if (p[i].score>=85&&p[i].score<=100) p[i].grade='A'; else if (p[i].score>=70&&p[i].score<=84) p[i].grade='B'; else if (p[i].score>=60&&p[i].score<=69) p[i].grade='C'; else if (p[i].score>=0&&p[i].score<=59) { p[i].grade='D'; count++; } } return count; }
無測試
「一幫一學習小組」是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠後的學生排在一組。本題就請你編寫程序幫助老師自動完成這個分配工做,即在獲得全班學生的排名後,在當前還沒有分組的學生中,將名次最靠前的學生與名次最靠後的異性學生分爲一組。.net
輸入格式:
輸入第一行給出正偶數N
(≤50),即全班學生的人數。此後N行,按照名次從高到低的順序給出每一個學生的性別(0表明女生,1表明男生)和姓名(不超過8個英文字母的非空字符串),其間以1個空格分隔。這裏保證本班男女比例是1:1,而且沒有並列名次。設計
輸出格式:
每行輸出一組兩個學生的姓名,其間以1個空格分隔。名次高的學生在前,名次低的學生在後。小組的輸出順序按照前面學生的名次從高到低排列。3d
輸入樣例:指針
8 0 Amy 1 Tom 1 Bill 0 Cindy 0 Maya 1 John 1 Jack 0 Linda
輸出樣例:
Amy Jack Tom Linda Bill Maya Cindy John
#include<stdio.h> struct student { int n; char name[20]; }; int main () { int n,i,k; scanf ("%d",&n); struct student a[n]; for (i=0; i<n; i++) scanf ("%d %s",&a[i].n,&a[i].name); for(i=0; i<n/2; i++) { for(k=n-1; k>=0; k--) { if(a[i].n!=a[k].n&&a[k].n!=2) { printf("%s %s\n",a[i].name,a[k].name); a[k].n=2; break; } } } return 0; }
無
每一個 PAT 考生在參加考試時都會被分配兩個座位號,一個是試機座位,一個是考試座位。正常狀況下,考生在入場時先獲得試機座位號碼,入座進入試機狀態後,系統會顯示該考生的考試座位號碼,考試時考生須要換到考試座位就座。但有些考生遲到了,試機已經結束,他們只能拿着領到的試機座位號碼求助於你,從後臺查出他們的考試座位號碼。
輸入格式:
輸入第一行給出一個正整數 N(≤1000)
,隨後 N
行,每行給出一個考生的信息:准考證號 試機座位號 考試座位號。其中准考證號由 16 位數字組成,座位從 1 到 N
編號。輸入保證每一個人的准考證號都不一樣,而且任什麼時候候都不會把兩我的分配到同一個座位上。
考生信息以後,給出一個正整數M(≤N)
,隨後一行中給出 M 個待查詢的試機座位號碼,以空格分隔。
輸出格式:
對應每一個須要查詢的試機座位號碼,在一行中輸出對應考生的准考證號和考試座位號碼,中間用 1 個空格分隔。
輸入樣例:
4 3310120150912233 2 4 3310120150912119 4 1 3310120150912126 1 3 3310120150912002 3 2 2 3 4
輸出樣例:
3310120150912002 2 3310120150912119 1
#include<stdio.h> struct student { char s[20]; int m,n; }; int main () { int i,p,q,c,j; scanf ("%d",&p); struct student a[p]; for (i=0; i<p; i++) scanf ("%s %d %d\n",&a[i].s,&a[i].m,&a[i].n); scanf ("%d\n",&q); for (i=0; i<q; i++) { scanf ("%d",&c); for (j=0; j<p; j++) { if (c==a[j].m) printf ("%s %d\n",a[j].s,a[j].n); } } return 0; }
無
什麼是遞歸函數:遞歸函數就是在解決問題過程當中經過不斷調用函數自身,把規模大的、較難解決的問題變成規模較小的、易解決的同一問題。規模較小的問題又變成規模更小的問題,而且小到必定程度能夠直接得出它的解,從而獲得原來問題的解。遞歸函數包括遞歸出口,遞歸式子兩個重要元素。其中遞歸出口,即遞歸結束條件,到什麼時候再也不遞歸調用下去。遞歸式子,即遞歸的表達式。(參考文獻:C語言程序設計(第3版)P240-P246; 博客)
遞歸函數的優勢:在解決問題時,運用遞歸是代碼更簡潔,而且實現起來很容易。(參考文獻:博客1 博客2)
遞歸函數的缺點:因爲遞歸思想即經過不斷調用函數自己,將問題由大化小,再由小化更小,因此在函數運行時會致使效率很低,須要運行不少次。會很佔用內存。(參考文獻:博客1 博客2)
如何概括出遞歸式:根據問題找規律。能夠從後往前推,先肯定第n項的計算表達式,而後推n-1第項.....肯定好出口後在出口處結束遞歸;也能夠從前日後推,知道首項的計算表達式後,推第二項,第三項......而後在出口處中止遞歸。
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
3/2-3/8 | 三天六小時 | 50 | 一、定義、運用文件指針;二、如何打開、關閉文件三、如何讀出指定文件中的數據;四、如何向指定文件中寫入數據; | 字符、字符串有什麼區別?兩者輸入、輸出有沒有很大不一樣?什麼纔算字符串?什麼算字符?在文件中兩者有沒有差異? |
3/9-3/15 | 四天三小時 | 180 | 一、運用二維數組解決問題,矩陣的判斷;二、對一組數的全部子數組求和 | 如何在輸出時利用數組的性質 |
3/16-3/22 | 三天八小時 | 210 | 一、二維數組加深理解,二維數組與矩陣;二、選擇排序法解決問題;三、二分查找法 | 二分查找法這周沒練習,只是看看書上例題大體懂了,不知道真正應用時可否掌握。 |
3/23-3/29 | 三天兩小時 | 120 | 一、判斷回;文二、字符數組的概念及其簡單運用;三、一些簡單的與字符數組相關的暫時沒接觸補充知識,一些函數,用法等。 | 在做業運用文件指針時,一開始老是出現從文件裏輸不出來結果,打印不出來,後來發現可能與本身輸入時格式未搞好,原本不該該出現的空格出現了,致使打印不出來結果。文件指針還不是很熟練 |
3/30-4/5 | 兩天 | 150 | 一、指針的含義,變量、地址、指針變量等間的關係;二、指針變量的初始化,運用指針作一些簡單運算;三、指針與數組之間的關係 | 在用指針處理字符串時,應怎樣定義指針變量 |
4/6-4/12 | 三天 | 200 | 一、更深一步掌握指針與數組間的關係;二、懂得指針能夠實現數組的一些功能;三、指針在碰到字符數組時的應用 | 在代碼中,若是遇到要輸出單個字符,%s與%c有什麼區別? scanf()與 getchar 兩種輸入方式有區別嗎?會不會在有些狀況下能影響到輸出結果? |
4/13-4/19 | 兩天 | 170 | 一、學習了與字符串有關的一些字符串處理函數;二、學習了利用指針實現內存動態分配 | 究竟什麼狀況下采用內存動態分配?具體要採用哪種動態內存分配? |
4/20-4/26 | 兩天 | 135 | 一、學習告終構及結構變量的定義與運用 | 若是運用遞歸函數解決問題,雖然使代碼簡化了,更美觀了。但會致使相同的運算重複進行,佔內存。感受遞歸弊大於利。 |
這周主要就講告終構,剛開始接觸一下,感受並非很難的樣子。老師看在不少同窗因爲以前做業稍有難度致使抄襲現象嚴重,這周做業難度不大,因此我在作的時候並無出現很大的錯誤,預習做業也有改變。這周做業是本身去查閱資料找到相關解釋,本身理解。感受這樣的話,會更有時間理解課本,預習會有效果,但從另外一方面講,只是預習了知識,並無真正實踐,效果也會不佳。
這周題目不難,週三下午沒課,就坐在電腦前慢慢作,而後就做完了。晚上結對編程時,我就拿着課本去預習了,隊友題目也進行了一部分,結構剛接觸,上課講的聽懂的話,題目難度也不大,所碰到的都是一些小問題,並無針對題目討論好久。
時間 | 累計代碼行數 | 累計博客字數 |
---|---|---|
第一週 | 80 | 275 |
第二週 | 50 | 883 |
第三週 | 180 | 1303 |
第四周 | 210 | 1849 |
第五週 | 120 | 1988 |
第六週 | 150 | 2717 |
第七週 | 200 | 3000 |
第八週 | 170 | 2820 |
第九周 | 135 | 2855 |