20200910-3 命令行和控制台编程
作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185
1.熟悉 命令行和控制台/标准输入和标准输出
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
数据流图:
a.exe < b.txt > c.txt 控制台命令的作用:b文件中的数据输入a应用程序中执行,将结果数据覆盖到新生成的c文件中。<和>为重定向命令。
请用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.熟悉 测试用例
(2)在题目集 PAT (Basic Level) Practice (中文) 中任选3道题目完成。截图如下,要求包括1.红色对号、2.标号、3.用户名(此例中为 Young)。(30分)
(3)代码解读 (20分)
发表博客,介绍上述3个题目代码中重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。
1006 换个格式输出整数 (15分)
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
重点/难点:求个、十、百位的数字,并根据数字循环输出。
重要代码:
while(scanf("%d",&n)!=EOF&&n<1000) { b=n/100; for(i=0;i<b;i++) { printf("B"); } s=n/10%10; for(i=0;i<s;i++) { printf("S"); } g=n%10; for(i=0;i<g;i++) { printf("%d",i+1); } }
运行截图:
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
重点/难点:
- 定义一个字符数组存放不超过1000位的正整数N,且进行初始化,否则数组中各元素的值不可预料。
- 如果数字出现次数为0,则不输出,所以需要加上代码if(b[j]==0)continue;,continue作用不执行continue之后的语句而执行下一次循环。
重要代码:
for(i=0;a[i]!='\0';i++) { num=a[i]-'0'; b[num]++; } for(j=0;j<10;j++) { if(b[j]==0)continue; printf("%d:%d\n",j,b[j]); }
运行截图:
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
输入格式:
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。
输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
输入样例:
This is a simple TEST. There ARE numbers and other symbols 1&2&3...........
输出样例:
e 7
重点/难点:
- 由于统计时不区分大小写,所以a和A的个数都统计在a[0]中,其它同理。
- 统计并输出出现频率最高的英文字母及其次数,设置一个max变量,如果有比它次数更高的则替换,同时解决了并列问题。
重要代码:
for(i=0;arr[i]!='\0';i++) { if('a'<=arr[i]&&arr[i]<='z') num[arr[i]-'a']++; if('A'<=arr[i]&&'Z'>=arr[i]) num[arr[i]-'A']++; } for(i=0;i<26;i++) { if(max<num[i]) { max=num[i]; c=i+'a'; } } printf("%c %d",c,max);
运行截图:
(4)控制台应用 (15分)
要求在博客中给出测试数据。参照上一题中“控制台”的知识,给出运行时从控制台读入测试数据和向控制台输出的截图。
图表过小、字迹不清、错别字、句子不通顺的,教师会因为读不懂而对此题扣分。
1006 换个格式输出整数:
测试数据:
345
124
34
测试结果图:
1021 个位数统计:
测试数据:
123433
测试结果图:
1042 字符统计:
测试数据:
asgdhdjk
测试结果图:
(4) PSP(8分)
在同一篇博客中,参照教材第35页表2-2和表2-3,为上述3个题目制作PSP阶段表格。
PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。
要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求2中每项时间花费的差距,分析原因。