20200910-3命令行和控制台编程 作业提交
作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185
1.熟悉 命令行 和 控制台/标准输入和标准输出
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,
请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
作用:将b.txt中的数据输入到a.exe程序中执行,最后输出到c.txt中。
请用C语言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。运行效果形如下面的示例(6分)
#include <stdio.h> #include <stdlib.h> int main() { int a,b,c; scanf("a=%d b=%d c=%d",&a,&b,&c); printf("%d\n%d\n%d\n",a,b,c); return 0; }
运行结果:
2.熟悉 测试用例
(1)请在网站 [https://pintia.cn/]注册账号。(0分)
(2)在题目集 PAT (Basic Level) Practice (中文) 中任选3道题目完成。截图如下,要求包括1.红色对号、2.标号、3.用户名(此例中为 Young)。(30分)
注意,需要读完本作业全部题目才能开始做题,有对时间记录和代码解读的要求。
(3)代码解读 (20分)
发表博客,介绍上述3个题目代码中重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。
1001 害死人不偿命的(3n+1)猜想
本题难点在于计算猜想的步数,那么就需要一个设一个计数的值,每循环一次计数值加一即可。
循环也很容易理解,奇数就是3n+1再除2,偶数直接除2,直到数值变为1。
#include <stdio.h> #include <stdlib.h> int main() { int numb; scanf("%d",&numb); int count=0; while(numb!=1) { count++; if(numb%2==0) numb=numb/2; else numb=(3*numb+1)/2; } printf("%d",count); }
运行结果如下:
1002 写出这个数
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
本体难点在于将数字和打印成拼音,所以我先设立了一个数组,将拼音存入数组中,先计算这么大的一个数字的每位数之和,
再将和的每位数存在一个新的数组中,最后再倒序打印对应的拼音。
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { int sum=0,i=0,j=0; char py[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; char numb[100]; int a[10]; scanf("%s",numb); //计算各个位数之和 for(i;i<strlen(numb);i++) sum+=numb[i]-'0'; //将和的每位数存储到数组中 while(sum>0) { a[j++]=sum%10; sum=sum/10; } //因为存储再数组中的每位数是反过来的,所以需要倒序打印拼音 for(i=j-1;i>=0;i--) { if(i==0) { printf("%s",py[a[i]]); }else{ printf("%s ",py[a[i]]); } } return 0; }
结果如下:
1006 换个格式输出整数
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。
本题重点:因为最多不超过1000,所以可以用abc代表个十百位上的数,然后是几就输出几个B或者S,个位数输出稍微不同,用一下循环语句就好。
#include <stdio.h> #include <stdlib.h> int main() { int numb,a,b,c; scanf("%d",&numb); if(numb>=0) a=numb%10; else return 0; if(numb/10>0) b=(numb/10)%10; else b=0; if(numb/100>0) c=numb/100; else c=0; pfB(c);//输出百位 pfS(b);//输出十位 pfG(a);//输出个位 } void pfS(int n) { int i; for(i=0;i<n;i++) printf("S"); } void pfB(int n) { int i; for(i=0;i<n;i++) printf("B"); } void pfG(int n) { int i; for(i=1;i<=n;i++) printf("%d",i); }
结果如下
(4)控制台应用 (15分)
要求在博客中给出测试数据。
参照上一题中“控制台”的知识,给出运行时从控制台读入测试数据和向控制台输出的截图。
1001害死人不偿命的(3n+1)猜想 :
测试数据:
5
测试结果截图:
1002写出这个数 :
测试数据:
24234234324234
测试结果截图:
1006换个格式输出整数 :
测试数据:
234
测试结果截图:
(5) PSP(8分)
预计花费时间min | 实际花费时间min | 花费时间差距min | 原因 | |
题目1001 | 10 | 13 | 3 | 一开始在思考计数的数放在哪里合适 |
题目1002 | 20 | 30 | 10 | 有一些细节没有注意到,浪费了很多时间比如最后一位输出不能有空格,还有转变数据格式有点慢。 |
题目1006 | 8 | 10 | 2 | 想用函数调用所以就慢了点 |