zoukankan      html  css  js  c++  java
  • 朱航序20200910-3 命令行和控制台编程

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185

    问题1.熟悉命令行和控制台/标准输入和标准输出

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

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

    a.exe < b.txt > c.txt

    解答:

    数据流图如下图所示,这条控制台命令的作用是,首先用a程序获取b文件中的数据,在经过处理之后,再把处理之后数据输出到c文件中。

    问题2:请用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 {
    4     int a, b, c;
    5     scanf("a=%d b=%d c=%d", &a, &b, &c);
    6     printf("%d
    
    %d
    
    %d
    
    ", a, b, c);
    7     return 0;
    8 }

    控制台运行截图如下

    问题3:熟悉 测试用例

    (1)请在网站 [https://pintia.cn/]注册账号。(0分)

    (2)在题目集 PAT (Basic Level) Practice (中文) 中任选3道题目完成。截图如下,要求包括1.红色对号、2.标号、3.用户名(此例中为 Young)。(30分)

    (3)代码解读 (20分)

    发表博客,介绍上述3个题目代码中重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。

    解答:(2)PAT截图如下

     解答:(3)代码解读

    ①1001害死人不偿命的(3n+1)猜想:

    对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。

    对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

    重难点分析:我认为本题难点在于,在对n进行处理之后,要注意应该更新n的数值,不然会一直对n的初始值进行处理。

    重点代码片段如下

     1 #include "stdio.h"
     2 int main()
     3 {
     4     int n;
     5     int k = 0;
     6     scanf("%d", &n);
     7     while (n != 1)
     8     {
     9         if (n % 2 == 0) //当n为偶数时
    10         {
    11             n = n / 2;
    12             k++;
    13         }
    14         else            //当n为奇数时
    15         {
    16             n = n * 3 + 1;
    17             n = n / 2;
    18             k++;
    19         }
    20     }
    21     printf("%d
    ", k);
    22     return 0;
    23 }

    执行效果截图如下

    ②1004 成绩排名

    读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

    其中姓名学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

    对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

    重难点分析:本体重点我认为在于数组的应用,一维字符数组无法存储姓名学号这两种字符串数据,应该使用二维数组来解决这个问题。

    重点代码片段如下

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 int main()
     5 {
     6     int a;
     7     char name[200][11];
     8     char number[200][11];
     9     int grade[200];
    10     int i = 0, k = 0;
    11     int max = 0,min = 0;
    12     scanf("%d", &a);
    13     for (i = 0; i < a; i++)
    14     {
    15         scanf("%s %s %d",name[i],number[i],&grade[i]);  //输入学生信息
    16 
    17     }
    18     for (k = 0; k < a; k++)
    19     {
    20         if (grade[k] > grade[max])                      //记录分数最高学生
    21             max = k;
    22         if (grade[k] < grade[min])                      //记录分数最低学生
    23             min = k;
    24     }
    25         printf("%s %s
    ", name[max], number[max]);
    26         printf("%s %s
    ", name[min], number[min]);
    27 
    28     return 0;
    29 }

    执行效果截图如下

    ③1006 换个格式输出整数

    让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n<10),换个格式来输出任一个不超过 3 位的正整数。

    例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。

    重难点分析:我认为本题重难点在于获取输入数据的个位十位和百位的数字。

    重点代码片段如下

     1 #include "stdio.h"
     2 int main()
     3 {
     4     int a,i,b,c,k,j,d;
     5     scanf("%d", &a);
     6     b = a / 100;                             //判断数字是否为三位数
     7     if(b!=0)                                 //当输入数据为三位数时
     8     {
     9         for (i = 0; i < b; i++)
    10         {
    11             printf("B");
    12         }
    13         c =( a % 100)/10;
    14         for (k = 0; k < c; k++)
    15         {
    16             printf("S");
    17         }
    18         d = a % 10;
    19         for (j = 1; j <= d; j++)
    20         {
    21             printf("%d", j);
    22         }
    23     }
    24     else                                     //当输入数据为两位数时
    25     {
    26         c = a / 10;
    27         for (k = 0; k < c; k++)
    28         {
    29             printf("S");
    30         }
    31         d = a % 10;
    32         for (j = 1; j <= d; j++)
    33         {
    34             printf("%d", j);
    35         }
    36     }
    37 }

    执行效果截图如下

    问题四:PSP(8分)

    在同一篇博客中,参照教材第35页表2-2和表2-3,为上述3个题目制作PSP阶段表格。

    PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。

    要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。

    要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。

    要求3 对比要求1和要求2中每项时间花费的差距,分析原因。

    解答:

    时间差原因:

    1:C语言基础知识遗忘,基本语法在编程过程当中也会出错。

    2:编程能力不足,编程基础太差。

    3:编译器在运行过程当中出现了许多问题,比如vs中"scanf is unsafe"的问题,通过查资料和询问同学,得到了两种解决办法,在代码的最顶行写入#pragma warning(disable:4996),可以让之后使用scanf时不出现警告。还可以使用scanf_s,控制读取字符的数量这种方法让问题得到解决。

  • 相关阅读:
    Ubuntu JDK 安装及环境配置
    流式计算之Storm简介
    Amcharts 提示 字体找不到解决方法
    Amcharts 入门教程
    JavaMail 发送邮件简单 Demo
    JavaMail 发送邮件,以及sina、163、QQ服务器不同的解析结果(附图)
    MyEclipse 搭建 hadoop 环境
    淘宝主搜索体验
    【转】Net中VSS实现版本控制管理的一些使用方法
    IIS配置PHP环境(快速最新版)
  • 原文地址:https://www.cnblogs.com/gravity9874/p/13664122.html
Copyright © 2011-2022 走看看