A | Q |
---|---|
這個作業屬于那個課程 | C語言程序設計II |
這個作業要求在哪里 | 2019春第九周作業 |
我在這個課程的目標是 | 了解并且應用結構體和數組的知識 |
這個作業在那個具體方面幫助我實現目標 | 掌握了數組的簡單編程及應用,了解了結構體 |
參考文獻 | C語言chap3和C語言chap9 |
一、本周完成的作業
題目1.6-1 按等級統計學生成績 (20 分)
本題要求實現一個根據學生成績設置其等級,并統計不及格人數的簡單函數。
函數定義接口:
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
還需要返回不及格的人數。
裁判測試程序:
#include <stdio.h>
#define MAXN 10struct 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
1).實驗代碼
int set_grade( struct student *p, int n )
{
int count=0,i;
for(i=0;i<n;i++)
{ if((*p).score<60) { (*p).grade='D'; count++; } else if((*p).score>=60&&(*p).score<=69) {(*p).grade='C'; } else if((*p).score>=70&&(*p).score<=84) {(*p).grade='B'; }else {(*p).grade='A';} p++;
}
return count;
}
2) .設計思路
mermaid
flowchat
st=>start: 函數聲明,定義相關變量,聲明結構體
op=>operation: 利用if和else-if來進行成績在不同階層的分級
op1=>operation: 統計不及格人數
e=>end: return count;st->op->op1->e
3).本題調試過程碰到問題及解決辦法
問題:老實說這道題對我來說不算很南,難的只有在指針上的部分,還有些許粗心。
解決方法:查閱書籍,調試代碼。
4).運行結果截圖
題目2.7-1 一幫一 (15 分)
“一幫一學習小組”是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠后的學生排在一組。本題就請你編寫程序幫助老師自動完成這個分配工作,即在得到全班學生的排名后,在當前尚未分組的學生中,將名次最靠前的學生與名次最靠后的異性學生分為一組。
輸入格式:
輸入第一行給出正偶數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
1).實驗代碼
#include<stdio.h>
#include<string.h>struct student { int sex;char name[10];int flag; };
int main(){ struct student s[100]; int n;int count=0;scanf("%d",&n);for(int i=0;i<n;i++) {scanf("%d %s",&s[i].sex,&s[i].name);s[i].flag=0;} for(int i=0;i<n/2;i++) {for(int k=n-1;k>=n/2;k--){if((s[i].sex!=s[k].sex)&&s[i].flag==0&&s[k].flag==0){s[i].flag =1;s[k].flag =1;count=count+2;printf("%s %s\n",s[i].name ,s[k].name );}}if(count==n)break;}
}
2) 設計思路
mermaid
flowchat
st=>start: 編譯預處理函數,定義結構體
op=>operation: 定義相關變量,申明結構體
io=>inputoutput: 利用一個循環來輸入樣例
op1=>operation: 在利用for的雙重嵌套循環來進行分配任務
cond=>condition: 是異性且還沒有分配?
op3=>operation: 排除未配對統計已配對
cond1=>condition: count==n?
io1=>inputoutput: 輸出配對表
e=>endst->op->io->op1->cond
cond(yes,right)->op3->io1->cond1
cond(no)->op1
cond1(no)->op1
cond1(yes)->e
3).本題調試過程碰到問題及解決辦法
問題:提交pta之后老師答案部分正確,我就在想是不是少了什么,從答案的測試點出發進行調試。
解決方法:在最后在多定義一個flag來作為標記是否已分配,提交后答案正確。
4).運行結果截圖
題目3.*7-2 考試座位號 (15 分**)
每個 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
1).實驗代碼
#include<stdio.h>
#include<string.h>
struct student { char num[20];int x,y; };
int main(){ struct student s[1100]; int n,m;scanf("%d\n",&n);for(int i=0;i<n;i++) {scanf("%s %d %d\n",&s[i].num,&s[i].x,&s[i].y);} scanf("%d\n",&m);int b[m];for(int i=0;i<m;i++) {scanf("%d",&b[i]);} for(int i=0;i<m;i++) {for(int k=0;k<n;k++){if(s[k].x==b[i]) {printf("%s %d\n",s[k].num,s[k].y);}}}
}
2) 設計思路
mermaid
flowchat
st=>start: 聲明結構體,定義相關變量和數組
io=>inputoutput: 輸入n,并且利用循環輸入學號和座位號
io2=>inputoutput: 輸入m,并且利用for循環輸入座位號
op=>operation: 利用for的二重循環來進行在座位號的比較
cond=>condition: s[k].x==b[i]?
io3=>inputoutput: 輸出學號座位號
e=>end: 結束函數st->io->io2->op->cond
cond(yes)->io3->e
cond(no)->op
2) 本題調試過程中碰到問題及解決辦法
問題:pta提交答案錯誤,軟件上運行無法輸出
解決方法:仔細尋找發現原來是數組b[m]的位置沒放對應當放在輸入m之后。
4) 運行結果截圖
題目4.思考題
1.什么是遞歸函數?
答:調用自己定義的函數也可以覺遞歸函數,這是我自己比較淺顯的理解,具體參考:什么是遞歸函數?
2..遞歸函數的優缺點。
答: 我怕覺得吧優點在于實現比較簡單,缺點的話就是比較麻煩,調用的耗時長,效率也可能很低,占用空間也會大一些。這是我的理解。
3..如何歸納出遞歸式?
答: 我覺得遞歸式都是前人總結的,沒有足夠的經驗是沒有成型的總結式。我仔細閱讀過這篇文章,這就是我得出的體會。參考:C語言遞歸操作總結
二、學習進度統計和學習感悟
1).學習進度統計
2).學習感悟
本次作業讓我感覺難度非凡,深深的感到自己在結構體知識匱乏到了什么程度,幾天的時間才能完成作業,思路也不多太難了呀,耗時長,題目難,所幸在這個過程中還是又學習到一些東西的。
(1)本周你學習哪些內容?有哪些收獲?
本周學習了結構體和指針和數組的結合,三者的結合,難度誤以又提高了一個難度,難上加難。掌握了結構體的簡單應用,至少基礎作業做出來了。
(2)本周所學內容中你覺得哪些地方是難點?對此你做了哪些措施去客服這些難點?
我覺得都挺難的,主要看知識量和操作量的積累。我也精良去多做一些編程題目,題目太難的也不會去設計,都是先嘗試少量又相對簡單的編程題目。
三、結對編程的過程及優缺點
關于結對編程
本次結對編程地點在寢室,本次結對與室友搭檔,過程還是依然比較愉快的,結對編程中我們討論了第九周基礎作業第三題中代碼總是在軟件上運行無法輸出,我們進行了長時間的調試和討論分別的除了不一樣的結果。
結對編程的優缺點:
優點:1.結對編程更適用于解決一些方向性的問題;2.結對編程中,雙方的互動目的在于開啟思路,避免單獨編程時思維容易阻塞的情況。3.多雙眼睛,少點 bug,也能增加不一樣的編程經驗
缺點:拍照編程還是有些讓人覺得不太自然。