zoukankan      html  css  js  c++  java
  • 张兵杰 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类方法不熟悉

  • 相关阅读:
    leetcode刷题笔记303题 区域和检索
    leetcode刷题笔记301题 删除无效的括号
    20201208日报
    20201118日报
    20201117日报
    20201116日报
    20201115日报
    20201114日报
    20201113日报
    20201112日报
  • 原文地址:https://www.cnblogs.com/ZhangBingjie/p/13663972.html
Copyright © 2011-2022 走看看