彭思雨20190905-3命令行和控制台编程

 

  此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/5523]

  1. 熟悉 命令行和控制台

假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,

请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)

  1. 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. 熟悉 测试用例

完成程序题目截图:

(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语言的基础知识遗忘太多,导致整体做题时间延长。

 

 

 

posted @ 2019-09-09 16:11  彭思雨  阅读(195)  评论(2编辑  收藏  举报