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


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

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

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

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

a.exe < b.txt > c.txt

作用:将b.txt输入到a.exe程序中,a程序执行完毕后输出到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\n\n",a);   //打印第一个参数
    printf("%d\n\n",b);   //打印第二个参数
    printf("%d",c);      //打印第三个参数

    return 0;
}

 效果:

 2.熟悉 测试用例

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

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

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

(3)代码解读 (20分)

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

1004成绩排名题目比较简单,主要考察了结构体,字符串数组的用法

此题的重点:主要是注意输出时字符串的输出格式

 

#include<stdio.h>
#include<stdlib.h>
struct student
{
    char name[15];
    char IDnumber[15];
    int score;
};
typedef struct student student;
int main()
{
    int cnt;
    scanf("%d",&cnt);
    student max={"","",0},min={"","",100};
    while(cnt--)
    {
        student new;
        scanf("%s%s%d",new.name,new.IDnumber,&new.score);
        if(new.score>max.score)
            max=new;          
        if(new.score<min.score)    
            min=new;
    }
    printf("%s %s\n",max.name,max.IDnumber);
    printf("%s %s\n",min.name,min.IDnumber);
    return 0;
}

运行结果图:

 

1009说反话  题目给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出

此题主要重点:①记录每个单词的起始和终止位置以及二维数组字符串的用法

                         ②注意处理最后一个字符的时候需要记录上个单词的末尾位置

 

 #include<stdio.h>
 #include<string.h>
 char str[85];
 int words[85][2];
 int main()
 {
   scanf("%[^\n]",str);          //scanf这里使用了[^\n],作用是一读入换行符就结束一行字符串的输入,等同于gets()
   int i,j,ins=strlen(str),con=0,size=0;    //con记录每一个字符的状态
   for(i=0;i<ins;i++)
   {
     if(str[i]!=' '&&!con)     // 遍历进入字符串,当前字符不为空,则说明是字母字符
      {
        con=1;
        words[size][0]=i;      //记录该单词的起始位置
      }
     else if(str[i]==' '&&con)  //遍历至空格,当前字符是空格字符
      {
        con=0;
        words[size++][1]=i;   //记录上个单词的末尾位置
   }
 }
  if(con)               //如果遍历至末尾字符且上个字符为字母字符,则记录上个字符的末尾位置
  words[size++][1]=ins;  
  for(i=size-1;i>=0;i--)
  {
   for(j=words[i][0];j<words[i][1];j++)
     printf("%c",str[j]);
     printf("%c",i==0?'\n':' ');
  }
   return 0;
 }

 运行结果图:

 

 

1011A+B和C  题目给定区间 [231​​,231​​] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C

输入格式:

输入第 1 行给出正整数 T (≤),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。

输出格式:

对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。

此题:解法容易理解,但注意输入输出格式和给定变量的区间范围

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) (a<b?b:a)
#define min(a,b) (a>b?b:a)
int main(int argc, char *argv[])
{
    int cnt;
    scanf("%d",&cnt);
    for(int i=1;i<=cnt;i++)
    {
        long long a,b,c;
        scanf("%ld%ld%ld",&a,&b,&c);
        if(a+b>c)
            printf("Case #%d: true\n",i);
        else
            printf("Case #%d: false\n",i);
    } 
    return 0;
}

运行结果:

 

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

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

图表过小、字迹不清、错别字、句子不通顺的,教师会因为读不懂而对此题扣分。

1004成绩排名题目
测试数据:
2
xucancan 101 98
wangfang 102 97

测试结果截图:



1009说反话题目
测试数据:
i love you

测试结果截图:



1011 A+B和C题目
测试数据:

2
123 33 44
123 66 400

测试结果截图:



(5) PSP(8分)

  预计花费时间  实际花费时间 花费时间差距 原因
题目1004 12min 18min 6min 题目本身思路不难,由于二位数组和字符串的使用不够熟练,实际时间超出了预计
题目1009 20min 25min 5min 在if语句:判断行、列;在最后的字符单词的末尾位置的判断上出现了错误,输入输出格式上花费了一定时间。
题目1011 12min 14min 2min 没有考虑输入的范围以及输出格式输入格式,花了一些时间

 

 













免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM