2019春季第九周做業html
這個做業屬於哪一個課程 | C語言程序設計ll |
這個做業要求在哪裏 | (https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3124) |
我在這個課程的目標是 | 可以根據實際狀況合理定義結構,可以使用結構變量與結構數組進行熟練編程,掌握結構指針的操做,並應用於函數傳遞 |
這個做業在哪一個具體方面幫助我實現目標 | 可以根據實際狀況合理定義結構 |
參考文獻 | (http://c.biancheng.net/view/2031.html) |
本題要求實現一個根據學生成績設置其等級,並統計不及格人數的簡單函數。編程
函數接口定義:數組
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
#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; } int set_grade( struct student *p, int n ) { int i,sum = 0; for(i = 0;i < n;i++) { if(p[i].score <= 100 && p[i].score >= 85) { p[i].grade = 'A'; } else if(p[i].score <= 84 && p[i].score >= 70) { p[i].grade = 'B'; } else if(p[i].score <= 69 && p[i].score >= 60) { p[i].grade = 'C'; } else if(p[i].score < 60) { p[i].grade = 'D'; sum++; } } return sum; }
本題在調試過程當中沒有遇到任何問題
「一幫一學習小組」是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠後的學生排在一組。本題就請你編寫程序幫助老師自動完成這個分配工做,即在獲得全班學生的排名後,在當前還沒有分組的學生中,將名次最靠前的學生與名次最靠後的異性學生分爲一組。.net
輸入格式:
輸入第一行給出正偶數N(≤50),即全班學生的人數。此後N行,按照名次從高到低的順序給出每一個學生的性別(0表明女生,1表明男生)和姓名(不超過8個英文字母的非空字符串),其間以1個空格分隔。這裏保證本班男女比例是1:1,而且沒有並列名次。
輸出格式:
每行輸出一組兩個學生的姓名,其間以1個空格分隔。名次高的學生在前,名次低的學生在後。小組的輸出順序按照前面學生的名次從高到低排列。
輸入樣例:
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> int main() { struct student //學生信息結構定義 { int z; char m[9]; }; struct student s[50]; //定義結構變量 int n,i,j; scanf("%d",&n); for(i=0;i<n;i++) //循環輸入學生的性別和姓名 { scanf("%d ",&s[i].z); scanf("%s",&s[i].m); } for(i=0;i<n/2;i++) //只須要前一半學生 { for(j=n-1;j>0;j--) //從結尾開始找 { if(s[i].z != s[j].z && s[j].z != 2) //判斷這個學生是否爲異性並判斷是否已經排好座位 { printf("%s %s\n",s[i].m,s[j].m); s[j].z=2; //標記已經排好座位的學生 break; } } } return 0; }
問題:·在判斷循環條件的時候直接用了i<n,致使循環錯誤
解決方法:·調試後才知道循環多餘,只須要循環n/2次,而後就把循環條件改爲i<n/2
問題:·一開始不會標記已經排好座位的學生
解決方法:看了其餘博主的博客,而後本身改寫
每一個 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 a[17]; int z; int m; }; int main() { struct student stu[1000]; //定義結構變量 int i,j,N,x,y; scanf("%d",&N); for(i=0;i<N;i++) //循環輸入學生的准考證號、試機座位號及考試座位號 { scanf("%s%d%d",&stu[i].a,&stu[i].z,&stu[i].m); } scanf("%d",&x); for(j=0;j<x;j++) { scanf("%d",&y); for(i=0;i<N;i++) { if(stu[i].z==y) { printf("%s %d\n",stu[i].a,stu[i].m); break; } } } return 0; }
在前一題的基礎上編寫本題,沒有出現錯誤
遞歸就是一個函數在它的函數體內調用它自身。執行遞歸函數將反覆調用其自身,每調用一次就進入新的一層。遞歸函數必須有結束條件。當函數在一直遞推,直到遇到牆後返回,這個牆就是結束條件。因此遞歸要有兩個要素,結束條件與遞推關係。
遞歸有兩個基本要素:
(1)邊界條件:肯定遞歸到什麼時候終止,也稱爲遞歸出口。
(2)遞歸模式:大問題是如何分解爲小問題的,也稱爲遞歸體。遞歸函數只有具有了這兩個要素,才能在有限次計算後得出結果
在遞歸函數中,調用函數和被調用函數是同一個函數,須要注意的是遞歸函數的調用層次,若是把調用遞歸函數的主函數稱爲第0層,進入函數後,首次遞歸調用自身稱爲第1層調用;從第i層遞歸調用自身稱爲第i+1層。反之,退出第i+1層調用應該返回第i層。
一個遞歸函數的調用過程相似於多個函數的嵌套的調用,只不過調用函數和被調用函數是同一個函數。
優勢:使用遞歸時,經常可讓代碼更加簡潔
缺點:遞歸會佔用比較多的內存,當遞歸次數比較多時,性能就會下降,所以不建議多使用遞歸
定義:當遞推式中只含數列中的項,而無常數項或其它項時,就叫作遞歸公式.
求解遞歸式的三種方法:
(1)代換法:實質上就是數學概括法,先對一個小的值作假設,而後推測更大的值得正確性。因爲是數學概括法,那麼咱們就須要對值進行猜想。。
(2)遞歸樹方法:遞歸樹的求解精確度取決於你畫遞歸樹的精確度。。
(3)主方法:其實應該叫作主定理方法,利用這個方法,咱們只須要記住主定理的三種狀況,而且在知足必定的條件下,就能夠速度解出遞歸式。。
本週學習了第9章結構,在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體能夠被聲明爲變量、指針或數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱爲結構體的成員(member),且這些成員能夠爲不一樣的類型,成員通常用名字訪問。。
在C語言中,定義一個結構的通常形式爲:
struct結構名
{
//成員表列
};
成員表由若干個成員組成, 每一個成員都是該結構的一個組成部分。對每一個成員也必須做類型說明,其形式爲:「類型說明符 成員名;」。成員名的命名應符合標識符的書寫規定。。
當結構定義完成後,即建立了一種數據類型,能夠像int、float等內置類型同樣使用。。
對於本週的做業仍是有一些地方不清楚,本身會私下再繼續增強。。
感悟:雖然比較難,可是仍是會繼續努力的!加油!
本週三晚自習依舊是咱們結對編程的時間,感受此次收穫挺多的,在寫題目的時候咱們一塊兒討論了不少問題,咱們實行不懂就問對方,兩個都不懂就查資料或者問大佬。要是對方寫的代碼不同就互相講對方的思路,感受還不錯。
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
2/25-3/3 | 三天 | 45 | 數組的認識及用法 | 數組長度的理解 |
3/4-3/10 | 兩天 | 37 | 編寫程序時處理文件 | fscanf與fprintf的具體用法 |
3/11-3/17 | 三天 | 53 | 二維數組的使用及文件插入 | 二維數組的用法、上三角的判斷及文件的處理 |
3/18-3/24 | 兩天 | 113 | 選擇排序法、二分查找法、二維數組的引用與矩陣 | 不清楚選擇排序法和冒泡排序法的區別 |
3/25-3/31 | 兩天 | 78 | 判斷迴文、一維字符數組的用法、使用字符串編程 | 使用字符串編程 |
4/1-4/7 | 兩天 | 88 | 指針變量的基本運算,內存單元和地址之間的關係 | 不太瞭解指針數組 |
4/8-4/14 | 兩天 | 96 | 指針、數組和地址之間的關係 | 對於指針數組和數組指針的區別不是特別清楚 |
4/15-4/21 | 兩天 | 128 | 字符串和字符指針、經常使用的字符串處理函數 及用指針實現內存動態分配 | 對於指針都不是特別懂 |
4/22-4/28 | 兩天 | 120 | 定義結構,使用結構變量與結構數組進行編程 | 結構體參與判斷 |
時間 | 代碼行數 | 博客字數 |
---|---|---|
第一週 | 45 | 870 |
第二週 | 37 | 1055 |
第三週 | 112 | 1158 |
第四周 | 113 | 1696 |
第五週 | 78 | 1854 |
第六週 | 114 | 2977 |
第七週 | 96 | 3019 |
第八週 | 128 | 3264 |
第九周 | 120 | 3540 |