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