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

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

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

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

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

数据图:

作用:在控制台执行命令时,将文本b.txt中的数据输入到程序a.exe中运行,输出的结果存储到文本c.txt中。

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

运行效果:

代码如下:

#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

%d

%d

",a,b,c);
    return 0;
}

2.熟悉测试用例

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

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

注意,需要读完本作业全部题目才能开始做题,有对时间记录和代码解读的要求。

 (3)代码解读 (20分)

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

1004 成绩排名:

重点/难点:此题需要用到结构体,同时要注意字符串的语法。题目中要求文本长度不超过10,由于字符串长度是字符长度加上,所以字符数组的长度应为11。

代码:

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

struct student
{
    char name[11];
    char number[11];
    int score;
};

typedef struct student st;

int main()
{
    int n;
    scanf("%d",&n);
    st list[n];
    for(int i=0; i<n; i++)
    {
        //输入名字 学号 成绩
        scanf("%s %s %d",list[i].name,list[i].number,&list[i].score);
    }
    //选出分数最高和分数最低的学生
    st max=list[0], min=list[0];
    for(int i=1; i<n; i++)
    {
        if(max.score<list[i].score)
        {
            max=list[i];
        }
        if(min.score>list[i].score)
        {
            min=list[i];
        }
    }
    printf("%s %s
%s %s
",max.name,max.number,min.name,min.number);
    return 0;
}

执行效果:

1009 说反话:

重点/难点:此题需要考虑字符串应该如何存储才能使逆序算法更简单。

代码:

#include<stdio.h>

int main()
{
    //用二维数组储存
    char str[20][80];
    int n=0;
    do
    {
        scanf("%s",str[n]);
        n++;
    }
    while(getchar()!='
');
    //逆序输出
    for(int i=n-1; i>=0; i--)
    {
        printf("%s",str[i]);
        if(i>0)
        {
            printf(" ");
        }
    }
    return 0;
}

执行效果:

1013 数素数:

重点/难点:本题需要用到数学中素数的知识。按照题目要求,需注意最后一个数即使不是第10个也不输出空格。

代码:

#include<stdio.h>
#include<math.h>

//判断是否为素数
int IsPrime(int num)
{
    int flag=1;
    for(int i=2; i<=sqrt(num); i++)
    {
        if(num%i==0)
        {
            flag=0;
            break;
        }
    }
    return flag;
}

int main()
{
    int m,n,i=0,num=2,count=0;
    scanf("%d %d",&m,&n);
    //循环输出N个质数
    while(i<n)
    {
        //如果是素数则打印
        if(IsPrime(num))
        {
            i++;
            if(i>=m)
            {
                printf("%d",num);
                count++;
                //每10个数换行
                if(count%10==0)
                {
                    printf("
");
                }
                else if(i<n){
                    printf(" ");
                }
            }
        }
        num++;
    }
}

执行效果:

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

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

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

1004 成绩排名:

输入样例:

3
Joe 2020990112 77
Sia 2020990830 90
Mike 2020991301 85

输出样例:

Sia 2020990830
Joe 2020990112

测试结果图:

1009 说反话:

输入样例:

How are you

输出样例:

you are How

执行效果图:

1013 数素数:

输入样例:

7 20

输出样例:

17 19 23 29 31 37 41 43 47 53
59 61 67 71

执行效果图:

(5) PSP(8分)

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

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

PSP阶段 预计花费时间 实际花费时间 时间差 原因
题目1004 30 46 16  字符串数组长度少了一位
题目1009 20  15  -5  在设计存储结构时将一维数组改为二维数组
题目1013 20 29  9 格式错误,多了空格
原文地址:https://www.cnblogs.com/siahu/p/13659346.html