本周作業頭
這個作業屬於那個課程 | C語言程序設計II |
---|---|
這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3126 |
我在這個課程的目標是 | 學會結構的運用 |
這個作業在那個具體方面幫助我實現目標 | 幫助我了解了結構 |
參考文獻 | C語言程序設計II第九章 |
基礎作業
PTA: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 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
1)實驗代碼
int set_grade( struct student *p, int n )
{
int i,count=0;
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)流程圖
3)本題調試過程碰到問題及解決辦法
發現自定義函數沒返回值,加上就對了。
4)運行截圖
5)自我評價
評價:對於這個題目,剛開始對結構不太熟悉,后來通過查閱相關知識了解結構,就寫出來了。
用時:2h.
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>
int main()
{
int n,i,j,x[52];
char p[52][9];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %s\n",&x[i],&p[i]);
for(i=0;i<n/2;i++){
for(j=n-1;j>=0;j--){
if(x[i]!=x[j]&&x[i]!=3&&x[j]!=3){
printf("%s %s\n",p[i],p[j]);
x[i]=3;
x[j]=3;
break;
}
}
}
return 0;
}
2)流程圖
3)本題調試過程碰到的問題及解決辦法
發現j不能從n開始,改成n-1就對了。
4)運行截圖
5)自我評價
評價:對於這個題目是在教室和結隊對象一起討論,然后寫出來的,感覺比一個人要好得多。
用時:1.5h。
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>
int main()
{
int n,i,j,m,k,z[1001];
char s[17],p[1001][17];
scanf("%d", &n);
for(i=0;i<n;i++)
{
scanf("%s %d %d",s,&j,&k);
strcpy(p[j],s);
z[j]=k;
}
scanf("%d", &m);
for(i=0;i<m;i++)
{
scanf("%d", &j);
printf("%s %d\n",p[j],z[j]);
}
return 0;
}
2)流程圖
3)本題調試過程中碰到的問題及解決辦法
通過詢問同學,將字符串的空間調大,就正確了。
4)運行截圖
5)自我評價
評價:這個題目總的來說難度不是很大,但思路總是斷斷續續的,說明我做題還是不夠熟稔。
用時:2h.
挑戰作業
思路:及時接着上周的題目,進行改寫,再加些其他內容就可以了,但我不會寫。
預習作業
第十周的教學內容是:第十章 函數與程序結構
什么是遞歸函數
答:通過閱讀書籍,我覺得遞歸函數就是自己調用自己的的形式叫做函數的遞歸調用也就是遞歸函數。
它的優點和缺點有哪些
優點:遞歸函數的本質是將問題簡化成形式相同、又比較簡單的情況。程序每經過一次遞歸,問題就得到了簡化,將問題不斷簡化下去,最終得到一個初始值就行了。
缺點:效率比較低,因為遞歸的本質就是把一個問題分解成許多個問題,要是那些被分解的問題存在重疊的部分,就會重復計算。可能導致調用棧溢出。每一次函數調用在內存棧中分配空間,而每個進程的棧的容量是有限的。當遞歸調用的層級太多時,就會超出棧的容量,從而導致棧溢出。參考https://blog.csdn.net/wscdylzjy/article/details/43493559
如何歸納出遞歸式
答:因為遞歸函數的關鍵是歸納出遞歸式子,而不同的問題它的遞歸式子也不同,這就需要我們去具體分析題目了,然后確定遞歸的終點也就是遞歸出口。遞歸式子也就確定了。
學習進度條
日期 | 這周所花時間 | 代碼行數 | 學到的知識點簡介 |
---|---|---|---|
4/20~4/26 | 7.5h | 180 | 結構的定義與運用 |
累計代碼行數和博客字數
時間 | 博客字數 | 代碼行數 |
---|---|---|
第一周 | 0 | 60 |
第二周 | 120 | 100 |
第三周 | 220 | 160 |
第四周 | 260 | 200 |
第五周 | 300 | 360 |
第六周 | 600 | 580 |
第七周 | 820 | 700 |
第八周 | 1130 | 920 |
第九周 | 1300 | 1100 |