這個做業屬於哪一個課程 | C語言程序設計II |
這個做業要求在哪裏 | 2019年春季學期第九周做業 |
我在這個課程的目標是 | 我但願可以經過學習C語言的知識,編寫程序 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我知道了根據實際狀況合理定義結構,可以使用結構變量與結構數組進行熟練編程,掌握結構指針的操做,並應用於函數傳遞 |
參考文獻 | C 結構體 |
本題要求實現一個根據學生成績設置其等級,並統計不及格人數的簡單函數。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還須要返回不及格的人數。數組
裁判測試程序樣例:併發
#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; } /* 你的代碼將被嵌在這裏 */
輸入樣例:app
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 count = 0; for(int i = 0;i < n;i ++, p ++) { 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 if( (*p).score >= 85 && (*p).score <= 100) (*p).grade = 'A'; } return count; }
「一幫一學習小組」是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠後的學生排在一組。本題就請你編寫程序幫助老師自動完成這個分配工做,即在獲得全班學生的排名後,在當前還沒有分組的學生中,將名次最靠前的學生與名次最靠後的異性學生分爲一組。性能
輸入格式:
輸入第一行給出正偶數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 gender; char name[100]; int flag; }; int main() { int N; scanf("%d", &N); struct student stu[55]; for (int i = 0; i < N; i++) { scanf("%d %s", &stu[i].gender, stu[i].name); stu[i].flag = 0; } for (int m = 0; m < N; m++) for (int n = N-1; n > 0; n--) { if (stu[m].gender != stu[n].gender && stu[m].flag == 0 && stu[n].flag == 0) { printf("%s %s\n", stu[m].name, stu[n].name); stu[m].flag = 1; stu[n].flag = 1; } } 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 { long long ID; int test; int seat; }; int main(void) { int N; scanf("%d", &N); struct student stu[1001]; for (int i = 0; i < N; i++) scanf("%lld %d %d", &stu[i].ID, &stu[i].test, &stu[i].seat); int M, s[1001]; scanf("%d", &M); for (int i = 0; i < M; i++) scanf("%d", &s[i]); for (int i = 0; i < M; i++) for (int j = 0; j < N;j++) { if(stu[j].test == s[i]) { printf("%lld %d\n", stu[j].ID, stu[j].seat); break; } } return 0; }
本週,咱們來作一作關於字符串的挑戰題:
九宮格鍵盤對應英語單詞
九宮格鍵盤通常能夠用於輸入字母。如用2能夠輸入A、B、C,用3能夠輸入D、E、F等。如圖所示:
對於號碼5869872,能夠依次輸出其表明的全部字母組合。如:JTMWTPA、JTMWTPB……
1.您是否能夠根據這樣的對應關係設計一個程序,儘量快地從這些字母組合中找到一個有意義的單詞來表述一個電話好嗎呢?如:能夠用單詞「computer」來描述號碼26678837.
2.對於一個電話號碼,是否能夠用一個單詞來表明呢?怎樣纔是最快的方法呢?顯然,確定不是全部的電話號碼都可以對應到單詞上去。可是根據問題1的解答,思路相對比較清晰。
題目來源:《編程之美——微軟技術面試心得》稍有修改
第一步 輸入1-9每一個數字分別可表明的字母
第二步 輸入電話號碼
第三步 找到每一個電話號碼可能造成的字符串
第四步 在這些字符串中找到有意義的單詞(這一步還不知道該怎麼作,查找資料ing)
第五步 輸出該單詞
找到可參考的資料電話號碼
請你們查閱資料,思考問題中的三問:1.什麼是遞歸函數,2.它的優勢和缺點有哪些,3.如何概括出遞歸式?
答:
1.本身的理解:能夠調用本身的函數,遞歸函數就是用上一步算出來的未知數求下一個未知數,相似於數列。
遞歸函數是一種計算過程,若是其中每一步都要用到前一步或前幾步的結果,稱爲遞歸的。用遞歸過程定義的函數,稱爲遞歸函數,例如連加、連乘及階乘等。凡是遞歸的函數,都是可計算的,即能行的。引用自遞歸函數百度百科
前面的學習過程當中,咱們已經看到過不少調用其餘函數的函數實例。例如,函數 A 能夠調用函數 B,而函數 B 又能夠調用函數 C。
實際上,函數也能夠調用它本身。調用本身的函數稱爲遞歸函數,引用自什麼是遞歸函數
2:優勢:簡潔,可以解決一些其餘方法難以解決的問題
缺點:使用遞歸函數所需的技術性強,並且難以概括出遞歸式
效率較低。遞歸是有時間和空間消耗的。另外,遞歸有可能不少計算都是重複的,從而給性能帶來很大的負面影響。由於遞歸的本質是把一個問題分解成連個或者多個小問題。若是多個小問題存在相互重疊的部分,那麼就存在重複的計算。
可能致使調用棧溢出。每一次函數調用在內存棧中分配空間,而每一個進程的棧的容量是有限的。當遞歸調用的層級太多時,就會超出棧的容量,從而致使棧溢出。引用自函數遞歸的優缺點
3.看書得出
在查找資料時總看到有人說遞歸函數其實與數學的概括法差很少,尋找遞歸式時也應該可使用數學概括法吧。
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
3/2-3/8 | 20h | 300行 | 數組,指針的大體意義,文件入門 | 數組串的使用,指針 |
3/9-3/15 | 25h | 400行 | 二維數組,文件與數組的結合運用 | 雙for循環的流程圖(再不上課,光自學感受太艱難了) |
3/16-3/22 | 22h | 450行 | 一維數組,二維數組,幾種數組排序法 | 字符串使用 |
3/23-3/29 | 20h | 350行 | 字符串的定義及其使用 | 指針的具體使用 |
3/30-4/5 | 15h | 340行 | 指針變量的定義,使用,初始化及其基本運算,指針做爲函數參數的做用;使用指針實現函數調用返回多個值 | 指針在運行時內存的變化 |
4/6-4/12 | 13h | 400行 | 數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,指針和數組能夠實現相同的操做,結構體的定義,使用 | 結構體的具體使用,結構體的流程圖 |
4/13-4/19 | 18h | 500行 | 經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 | 結構體的流程圖 |
4/20-4/26 | 13h | 400行 | 根據實際狀況合理定義結構,可以使用結構變量與結構數組進行熟練編程,掌握結構指針的操做,並應用於函數傳遞 | 遞歸函數 |