第九周作业及其总结
第九周作業
一、本周作業頭
| 這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/computer-scienceclass1-2018/homework/2828 | |
| 我在這個課程的目標是 | 靈活的使用結構類型來解決問題 | |
| 這個作業在那個具體方面幫助我實現目標 | 通過對結構的嵌套定義結構的變量定義再結合其他所學知識 | |
| 參考文獻 | c語言教課書和百度 |
二、基礎作業
6-1 按等級統計學生成績 (20 分)
本題要求實現一個根據學生成績設置其等級,并統計不及格人數的簡單函數。
函數接口定義:
int set_grade( struct student *p, int n );
其中p是指向學生信息的結構體數組的指針,該結構體的定義為:
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一、實驗代碼。
int set_grade( struct student *p, int n ) {int i;int S=0;for (i=0;i<n;i++){if ((*p).score>=0&&(*p).score<=59){(*p).grade='D';S++;}else if ((*p).score>=85&&(*p).score<=100){(*p).grade='A';}else if ((*p).score>=70&&(*p).score<=84){(*p).grade='B';}else {(*p).grade='C';}p++;}return S; }二、設計思路既流程圖。
三、本題調試過程遇到的問題及解決辦法。
1、出現了幾次的答案錯誤和編譯失敗?
解決辦法:詢問助教,以及自己慢慢調試,發現首先在if語句后其他含有括號的語句中輸入指針變量不能直接輸入,要這樣:(*p).score或者p->score.
在最后輸出時,要加上return返回。
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一、實驗代碼。
#include<stdio.h> struct student {int sex;char name[10];int sign; }; int main() {struct student a[50];int n;int i,j;int sum=0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d %s", &a[i].sex, a[i].name);a[i].sign=0;}for(int i=0;i<n;i++){for(int j=n-1;j>=0;j--){if((a[i].sex!=a[j].sex)&&a[i].sign!=1&&a[j].sign!=1){a[i].sign =1;a[j].sign=1;printf("%s %s\n", a[i].name , a[j].name );sum+=2;}}if(sum==n)break;}return 0; }二、設計思路既流程圖。
三、本題調試過程中遇到的問題及解決辦法。
1、開始自己進行運行時不知道怎么對學生進行配對,以及出現答案錯誤?
解決辦法:和一些同學進行討論交流,用兩個循環語句分別從前后對學生進行篩選,例:for(int i=0;i<n;i++),for(int j=n-1;j>=0;j--),一個遞增一個遞減,再配對時,要對以及配對的學生進行標記也就是令其a[i].sign=a[j]sign=1.否則會匹配錯誤。最后還要跳出循環,當匹配的人數等于總人數時。
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一、實驗代碼。
#include<stdio.h> struct student {char num1[1000];int num2;int num3; }; int main() {struct student a[1000];int n,m,i,j;int num4[1000];scanf("%d",&n);for(i=0;i<n;i++){scanf("%s %d %d",a[i].num1,&a[i].num2,&a[i].num3);}scanf ("%d",&m);for(j=0;j<m;j++){scanf("%d",&num4[j]); }for(j=0;j<m;j++)for(i=0;i<n;i++){if(num4[j]==a[i].num2)printf("%s %d\n",a[i].num1,a[i].num3);}return 0; }二、設計思路既流程圖。
三、本題調試過程遇到的問題及解決辦法。
1、再運行程序時沒有出現任何錯誤,不過答案總是不對
解決辦法:自己摸索,調試,發現了問題的所在,再輸入雙重循環語句時要先輸出 for(j=0;j<m;j++),再輸入for(i=0;i<n;i++),否則輸出格式就錯了,雖然dev上沒有錯誤,再一個就是接收數據時n,m不能同時接收,否則答案會不正確。
預習作業
第十周的教學內容是:第十章 函數與程序結構
請大家查閱資料,思考問題中的三問:什么是遞歸函數,它的優點和缺點有哪些,如何歸納出遞歸式?
請將你的思考用自己的語言寫下來。如果有引用他們的文字,請一定要標出出處(使用Markdown的鏈接方式)。
1、什么是遞歸函數?
遞歸函數是數論函數的一種,其定義域與值域都是自然數集,只是由于構作函數方法的不同而有別于其他的函數。處處有定義的函數叫做全函數,未必處處有定義的函數叫做部分函數。最簡單又最基本的函數有三個:零函數O(x)=0(其值恒為0);射影函數;后繼函數S(x)=x+1。它們合稱初始函數。要想由舊函數作出新函數,必須使用各種算子。
2、它的優缺點有哪些?
優點:
2.在樹的前序,中序,后序遍歷算法中,遞歸的實現明顯要比循環簡單得多。
缺點:
1.遞歸由于是函數調用自身,而函數調用是有時間和空間的消耗的:每一次函數調用,都需要在內存棧中分配空間以保存參數、返回地址以及臨時變量,而往棧中壓入數據和彈出數據都需要時間。
3、如何歸納出遞歸式?
不同的問題其遞歸式子也不同,需要具體分析,然后確定遞歸盡頭,也就是遞歸出口,遞歸函數的核心語句就是這兩點。
學習進度統計和學習感悟
折線圖
學習感悟
學習一時,受用一世。今天的努力,明天的成功。
結對編程
優點:
1、程序員互相幫助,互相教對方,可以得到能力上的互補。
2、可以讓編程環境有效地貫徹Design。
缺點:
1、兩個人在一起工作可能會出現工作精力不能集中的情況。程序員可能會交談一些與工作無關的事情,反而分散注意力,導致效率比單人更為低下。
2、結對編程可能讓程序員們相互學習得更快。有些時候,學習對方的長外,可能會和程序員們在起滋生不良氣氛一樣快。比如,合伙應付工作,敷衍項目。
有時候發現結對編程還是有點用,結隊編程就是讓我們知道合作的重要性。
轉載于:https://www.cnblogs.com/neir/p/10769422.html
總結
- 上一篇: gcc 编译
- 下一篇: Ubuntu安装apache+Yii2