张兵杰 20200910-3 命令行和控制台编程

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

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

(1) 

作业题目:

熟悉 命令行 和 控制台/标准输入和标准输出

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

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

作业回答:

①数据流图:

 ②简述:

将b.txt文件内容在a.exe中执行,最终将结果存储在c.txt中

(2)

作业题目: 

请用C语言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。(6分)

作业回答:

代码如下:

/*

1.argc是命令行总的参数个数
2.argv[]为保存命令行参数的字符串指针
  argv[0]为程序的全名
3.sscanf() 从一个字符串中读进与指定格式相符的数据.
*/
# include<stdio.h>
int main(int argc,char *argv[]){
  int a, b, c;
  sscanf(argv[1], "a=%d", &a);
  sscanf(argv[2], "b=%d", &b);
  sscanf(argv[3], "c=%d", &c);
  printf("%d

", a);
  printf("%d

", b);
  printf("%d", c);
  return 0;
}

运行效果:

2.熟悉 测试用例

(1)(2)

作业回答:

 

 (3)

代码解读 (20分)

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

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

题目

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 ( 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

5

重点/难点

题目分析:若为偶数,则直接进行除以2;若为奇数,则进行乘3后加1再除以2,循环执行,直到n为1,记录除以2的次数即为所求。

奇偶数判断,使用n%2是否等于0,若为0则是偶数,若不为0则是奇数。

重要代码

while(n != 1){
  if(n % 2 == 0){
    //偶数
    n = n / 2;
  }else{
    //奇数
    n = (3 * n + 1) / 2;
  }
  num++;
}

执行效果图

 

②1002 写出这个数

题目

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 1。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

重点/难点

题目分析:以字符数组输入,循环字符数组,将字符转int,依次相加得到sum整数。

对sum进行取余循环,依次取出各位数,经过switch输出每位数字对应的拼音。

1.以字符数组输入,若为数字,则会产生整数存不下的问题

2.将字符型转int,可以使用这种方式 num[i] - '0'

3.取出整数中的每一位数据,使用循环,进行取余,除法的操作

4.使用switch语句,进行数字与拼音的转换

重要代码

for(i = 0; i < strlen(num); i++){
  sum = sum + (num[i] - '0');//将字符型转int
}
for(j = 0; sum > 0; j++)
{
  total[j]= sum % 10;
  sum = sum / 10;
}

for(i = j - 1; i >= 0; i--){
  switch(total[i]){
    case 0: printf("ling");break;
    case 1: printf("yi");break;
    case 2: printf("er");break;
    case 3: printf("san");break;
    case 4: printf("si");break;
    case 5: printf("wu");break;
    case 6: printf("liu");break;
    case 7: printf("qi");break;
    case 8: printf("ba");break;
    case 9: printf("jiu");break;
}
if(i != 0)
  printf(" ");
}

执行效果图

 

③1004 成绩排名

题目

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

输入格式:

每个测试输入包含 1 个测试用例,格式为

1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
  ... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
 

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

输出格式:

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

输入样例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例:

Mike CS991301
Joe Math990112

重点/难点

题目分析:循环字符串数组,分别以空格切分每个字符串,将切分后的分数字符串转为整型,分别与最大最小值进行对比,循环中定位最大最小的字符串数组下标。

1.使用java提交代码时,类名必须为Main

  即:

public class Main{

public static void main(String[] args){

2.java语言的输入,Scanner 用法,nextInt()方法输入数字,nextLine()方法读完整一行,返回值为String

数字行与字符串行之间,需要一个nextLine()方法。

3.最大值初始化应为小于等于0,最小值初始化应为大于等于100

4.注意字符串数组应初始化尽量大一点,否则可能产生n太大,字符串数组溢出

重要代码

import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    int i, score, max = -1, min = 999, maxt = 0, mint = 0;
    String[] messages = new String[1000];
    String[] message;
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();//输入n
    sc.nextLine();
    for(i = 0 ;i < n; i++){
      messages[i] = sc.nextLine();//输入每行字符串
    }
    for(i = 0 ;i < n; i++){
      message = messages[i].split(" ");//通过空格拆分字符串
      score = Integer.parseInt(message[2]);
      if(max <= score){ //比较最大
        max = score;
        maxt = i;
      }
      if(min >= score){ //比较最小
        min = score;
        mint = i;
      }

    }

    message = messages[maxt].split(" ");
    System.out.println(message[0] + " " + message[1]);
    message = messages[mint].split(" ");
    System.out.println(message[0] + " " + message[1]);
  }
}

执行效果图

(4)控制台应用 (15分)

要求在博客中给出测试数据。

参照上一题中“控制台”的知识,给出运行时从控制台读入测试数据和向控制台输出的截图。

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

测试数据:

3

测试结果:

5

效果截图:

②1002 写出这个数

测试数据:

1234567890987654321123456789

测试结果:

yi san wu

效果截图:

③1004 成绩排名

(由于本人在做本题目时使用的是java语言,与上题要求C语言编写,exe运行不符合,因此本题重新进行C代码编写)

代码:

#include<stdio.h>
#include <string.h>

struct student
{
    char name[11];
    char number[11];
    int score;
};
int main()
{
    int n, i;
    struct student students[150];
    struct student max, min;
    max.score = -1;
    min.score = 101;
    scanf("%d",&n);
    for(i = 0; i < n; i++)
        scanf("%s %s %d",students[i].name,students[i].number,&students[i].score);
    for(i = 0; i < n; i++)
    {
        if(max.score <= students[i].score)
        {
            max = students[i];
        }
        if(min.score >= students[i].score)
        {
            min = students[i];
        }
    }
    printf("%s %s
",max.name,max.number,min.name,min.number);
    printf("%s %s
",min.name,min.number);
    return 0;
}

测试数据:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

测试结果:

Mike CS991301
Joe Math990112

 效果截图:

 (五) PSP(8分)

题目 预计花费时间 实际花费时间 时间差 原因
1001 10min 8min -2min 题目容易理解,编码较简单
1002 20min 28min +8min

1.将字符型转整型知识点不熟练

2.将整数的各个位数存至数组知识遗忘,不熟练

1004 35min 55min +20min

1.中途由C语言切换至Java语言编程浪费时间

2.使用Java语言时,使用自定义类名Test,故产生编译错误问题,不知题目集 PAT代码提交时,有固定的类名Main

3.java输入语句Scanner类方法不熟悉

原文地址:https://www.cnblogs.com/ZhangBingjie/p/13663972.html