20200910-3命令行和控制台编程
作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185
1.熟悉 命令行 和 控制台/标准输入和标准输出
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
a.exe < b.txt > c.txt
数据流图如下图1所示:
将b.txt文档作为输入重定向到a.exe程序中,经过程序执行再重定向输出到c.txt文件中。
请用C语言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。运行效果形如下面的示例(6分)
代码如下:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int a,b,c;
sscanf_s(argv[1],"a=%d", &a);
sscanf_s(argv[2],"b=%d", &b);
sscanf_s(argv[2],"c=%d", &c);
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
运行结果:如下图2和图3
2.熟悉 测试用例
(1)请在网站 [https://pintia.cn/]注册账号。(0分)
(2)在题目集 PAT (Basic Level) Practice (中文) 中任选3道题目完成。截图如下,要求包括1.红色对号、2.标号、3.用户名(此例中为 Young)。(30分)
注意,需要读完本作业全部题目才能开始做题,有对时间记录和代码解读的要求。
1.解答题目如下图4:
2.代码解读:
题目1001害死人不偿命的(3n+1)猜想:刚看到题目感觉挺简单的,实际操作起来也是十分流畅,但是再代码编写的过程中犯了一个自以为很小的错误,浪费了大量时间。在n>1的情况下我们要区分奇,偶数然后运算,我使用if语句进行操作。我并没有想到的是自己竟然想当然的使用了两个if语句进行了处理,使逻辑出现了错误,排查错误浪费了时间。代码的编写真的是需要十分谨慎啊!!
重要代码片段如下:
if(n<=1000&&n>0)
{
do {
if(n%2==0)
{
n=n/2;
count++;
continue;
}
if(n>1)
{
if(n%2!=0)
{
n=(3*n+1)/2;
count++;
continue;
}
}
}while(n!=1);
System.out.print(count);
}
else System.out.print(count);
代码运行如下图5:
题目1002写出这个数:此题目我感觉对于我的难点是对于题目的理解不透彻以及Java中一些数据类型的范围不了解所造成的。刚开始看到题目中的整正数我使用的是long来定义我们要输入的数据,然后对数据进行操作。当输入题目中的数据是系统给了错误提示,我又跑去看了一遍题目以及在资料中查找了long的范围,才明白自己的错误。思考了好久在我短暂时间内查找的资料来看并不能输入这么大的数据,于是我就采用了字符串输入的方法,然后使用ASCLL码对字符转化为数字,进行单个操作。
重要代码如下:
public class Main {
public static void main(String[] args) {
int sum = 0;
char[] n = new char[101];
int i=0,j=0;
int[] b =new int[20];
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
for (int t=0;t<s.length();t++){
n[t] = s.charAt(t);
}
while (n[i] !='\0'){
sum += n[i] -'0';
i++;
}
if (sum ==0){
pinyin(0);
}
else {
while (sum!= 0){
b[j] = sum %10;
sum/=10;
j++;
}
for (i=j-1;i>0;--i){
pinyin(b[i]);
System.out.print(" ");
}
}
pinyin(b[0]);
}
public static void pinyin(int l){
String[] yin=new String[] {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
System.out.print(yin[l]);
}
}
代码运行如下图6:
题目1006换个格式输出整数:此题目较为简单,只需要会简单的逻辑即可。
重要代码如下:
public class Answer {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
char bai='B';
char shi='S';
char[] ge=new char[] {'1','2','3','4','5','6','7','8','9'};
int n=sc.nextInt();
if(n<0&&n>=1000)
System.out.print(0);
else {
int b=n/100;
for(int i=0;i<b;i++) {
System.out.print(bai);
}
int s=n/10%10;
for(int i=0;i<s;i++) {
System.out.print(shi);
}
int g=n%10;
for(int i=0;i<g;i++) {
System.out.print(ge[i]);
}
}
}
}
代码运行如下图7:
3. PSP
在同一篇博客中,参照教材第35页表2-2和表2-3,为上述3个题目制作PSP阶段表格。PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。
要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求2中每项时间花费的差距,分析原因。
PSP如下图8所示: