彭思雨20190905-3命令行和控制台编程
此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/5523]
- 熟悉 命令行和控制台
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,
请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
- exe < b.txt > c.txt
作用是:通过运行程序a,将文件b中的内容作为输入内容再保存到文件c中。
数据流图为:
请用C言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。运行效果形如下面的示例(6分)
d.exe a=1 b=2 c=3
1
2
3
d.exe a=11 b=22 c=33
11
22
33
代码展示:
1 #include<stdio.h> 2 int main(){ 3 int a, b, c; 4 scanf("a=%d b=%d c=%d", &a, &b, &c); 5 printf("%d\n", a); 6 printf("%d\n", b); 7 printf("%d\n", c); 8 9 return 0; 10 11 }
运行截图:
- 熟悉 测试用例
完成程序题目截图:
(1)题号为1001,该题题意对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?例如输入3应该被输出为5。
思路:该题重点在判断输入数的奇偶性,设一个计数变量,保证每次对折时加一。
关键代码:
1 #include<stdio.h> 2 int main() { 3 int n; 4 int count=0;//计算折半次数 5 scanf("%d", &n); // 6 while(n != 1) { 7 if(n % 2 == 0) { 8 n = n/2; 9 count++; 10 } else { 11 n = (3 * n + 1)/2; 12 count++; 13 } 14 } 15 printf("%d\n", count); 16 }
运行截图:
(2)题号为1006,该题题意用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数,例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。
思路:该题重点是将所输入的正整数进行拆分,分别用除法、取余求出每一位上的数字,按题目要求循环输出每一位上数字所对应的字母或者数字。
关键代码:
1 #include <stdio.h> 2 int main(){ 3 int i; 4 int n, b, s, g; 5 while(scanf("%d", &n)==1){ 6 b = n / 100; 7 s = n % 100 / 10; 8 g = n % 10; 9 for(i = 0; i < b; i++) printf("B"); 10 for( i = 0; i < s; i++) printf("S"); 11 for(i = 1; i <= g; i++) printf("%d", i); 12 } 13 return 0; 14 }
运行截图:
(3)题号为1023,该题题意为给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。现给定数字,请编写程序输出能够组成的最小的数。输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。
思路:将输入的数存放在一个数组中,数组下标表示真正要参与组合的数字,数组中存放的数是对应下标数字的个数。
关键代码:
1 #include<stdio.h> 2 int main() { 3 int a[10], i, j; 4 for(i=0; i<10; i++) 5 scanf("%d",&a[i]); //依次输出0-9每个数的个数 6 for(i=1; i<10; i++) { 7 if(a[i]!=0) { 8 printf("%d",i); 9 a[i]--; 10 break; 11 } 12 } 13 for(i=0; i<10; i++) { 14 for(j=a[i]; j>0; j--) { 15 if(a[i]!=0) 16 printf("%d",i); 17 } 18 } 19 return 0; 20 }
运行截图:
(4)PSP阶段表格
类别 |
估算时间min |
实际花费时间min |
时间差min |
估算编程一共需要多长时间 |
40 |
47 |
7 |
程序1001 |
10 |
5 |
5 |
程序1006 |
15 |
17 |
2 |
程序1023 |
15 |
25 |
10 |
时间差产生原因:第一题比较简单用时较少,第二题时间较长是由于没读懂题干,没按要求输出,导致提交时反复出现“答案错误”,第三题是理解题意花费时间较长,总之还是由于对C语言的基础知识遗忘太多,导致整体做题时间延长。