作業要求參見:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185
1.熟悉 命令行 和 控制台/標准輸入和標准輸出
假設在當前目錄下存在應用程序 a.exe 和 文件文件 b.txt,
請以數據流圖並輔助以文字說明下述控制台命令的作用是什么。(5分)
a.exe < b.txt > c.txt
作用:將b.txt輸入到a.exe程序中,a程序執行完畢后輸出到c.txt保存
請用C語言開發應用程序d.exe,從控制台指令讀入命令行參數,並在控制台分別打印出a、b、c的值。運行效果形如下面的示例(6分)
代碼:
#include <stdio.h> int main(int argc, char *argv[]) { int a,b,c; sscanf(argv[1], "a=%d", &a); sscanf(argv[2], "b=%d", &b); sscanf(argv[3], "c=%d", &c); printf("%d\n\n",a); //打印第一個參數 printf("%d\n\n",b); //打印第二個參數 printf("%d",c); //打印第三個參數 return 0; }
效果:
2.熟悉 測試用例
(1)請在網站 [https://pintia.cn/]注冊賬號。(0分)
(2)在題目集 PAT (Basic Level) Practice (中文) 中任選3道題目完成。截圖如下,要求包括1.紅色對號、2.標號、3.用戶名(此例中為 Young)。(30分)
注意,需要讀完本作業全部題目才能開始做題,有對時間記錄和代碼解讀的要求。
(3)代碼解讀 (20分)
發表博客,介紹上述3個題目代碼中重點/難點,展示重要代碼片斷,給出執行效果截圖,展示你感覺得意、突破、困難的地方。
1004成績排名題目比較簡單,主要考察了結構體,字符串數組的用法
此題的重點:主要是注意輸出時字符串的輸出格式
#include<stdio.h> #include<stdlib.h> struct student { char name[15]; char IDnumber[15]; int score; }; typedef struct student student; int main() { int cnt; scanf("%d",&cnt); student max={"","",0},min={"","",100}; while(cnt--) { student new; scanf("%s%s%d",new.name,new.IDnumber,&new.score); if(new.score>max.score) max=new; if(new.score<min.score) min=new; } printf("%s %s\n",max.name,max.IDnumber); printf("%s %s\n",min.name,min.IDnumber); return 0; }
運行結果圖:
1009說反話 題目給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出
此題主要重點:①記錄每個單詞的起始和終止位置以及二維數組字符串的用法。
②注意處理最后一個字符的時候需要記錄上個單詞的末尾位置
#include<stdio.h> #include<string.h> char str[85]; int words[85][2]; int main() { scanf("%[^\n]",str); //scanf這里使用了[^\n],作用是一讀入換行符就結束一行字符串的輸入,等同於gets() int i,j,ins=strlen(str),con=0,size=0; //con記錄每一個字符的狀態 for(i=0;i<ins;i++) { if(str[i]!=' '&&!con) // 遍歷進入字符串,當前字符不為空,則說明是字母字符 { con=1; words[size][0]=i; //記錄該單詞的起始位置 } else if(str[i]==' '&&con) //遍歷至空格,當前字符是空格字符 { con=0; words[size++][1]=i; //記錄上個單詞的末尾位置 } } if(con) //如果遍歷至末尾字符且上個字符為字母字符,則記錄上個字符的末尾位置 words[size++][1]=ins; for(i=size-1;i>=0;i--) { for(j=words[i][0];j<words[i][1];j++) printf("%c",str[j]); printf("%c",i==0?'\n':' '); } return 0; }
運行結果圖:
1011A+B和C 題目給定區間 [−231,231] 內的 3 個整數 A、B 和 C,請判斷 A+B 是否大於 C
輸入格式:
輸入第 1 行給出正整數 T (≤),是測試用例的個數。隨后給出 T 組測試用例,每組占一行,順序給出 A、B 和 C。整數間以空格分隔。
輸出格式:
對每組測試用例,在一行中輸出 Case #X: true
如果 A+B>C,否則輸出 Case #X: false
,其中 X
是測試用例的編號(從 1 開始)。
此題:解法容易理解,但注意輸入輸出格式和給定變量的區間范圍
#include<stdio.h> #include<stdlib.h> #include<string.h> #define max(a,b) (a<b?b:a) #define min(a,b) (a>b?b:a) int main(int argc, char *argv[]) { int cnt; scanf("%d",&cnt); for(int i=1;i<=cnt;i++) { long long a,b,c; scanf("%ld%ld%ld",&a,&b,&c); if(a+b>c) printf("Case #%d: true\n",i); else printf("Case #%d: false\n",i); } return 0; }
運行結果:
(4)控制台應用 (15分)
要求在博客中給出測試數據。參照上一題中“控制台”的知識,給出運行時從控制台讀入測試數據和向控制台輸出的截圖。
圖表過小、字跡不清、錯別字、句子不通順的,教師會因為讀不懂而對此題扣分。
1004成績排名題目
測試數據:
2
xucancan 101 98
wangfang 102 97
測試結果截圖:
1009說反話題目
測試數據:
i love you
測試結果截圖:
1011 A+B和C題目
測試數據:
2
123 33 44
123 66 400
測試結果截圖:
(5) PSP(8分)
預計花費時間 | 實際花費時間 | 花費時間差距 | 原因 | |
題目1004 | 12min | 18min | 6min | 題目本身思路不難,由於二位數組和字符串的使用不夠熟練,實際時間超出了預計 |
題目1009 | 20min | 25min | 5min | 在if語句:判斷行、列;在最后的字符單詞的末尾位置的判斷上出現了錯誤,輸入輸出格式上花費了一定時間。 |
題目1011 | 12min | 14min | 2min | 沒有考慮輸入的范圍以及輸出格式輸入格式,花了一些時間 |