PAT_B1011 布爾類型編譯錯誤及調試

題目概覽

題目鏈接: https://pintia.cn/problem-sets/994805260223102976/problems/994805312417021952.

思路分析

這道題看似非常簡單地判斷A+B是否大於C,但主要考察以下兩點:

  1. 數據類型
    A、B 、 C爲給定區間[231,2311][-2^{31},2^{31}-1]內的 3 個整數,該區間即int類型的表示範圍,寫作十進制即[-2147483648,2147483647],因此A+B的值可能超過int類型可表示的範圍,若測試數據中A與B的值都比較大,則會出現溢出錯誤,因此這裏我們把A、B和C定義爲long long類型,在scanf中輸入時,表示爲"%lld"。
  2. 輸入輸出格式
    根據題目要求的輸入輸出格式,每輸入三個數,就要進行A+B是否大於C的比較,但該示例正確與否不是當時就輸出的。而是一次輸入所有要比較的數對,一次輸出所有的比較結果,因此每次比較大小的結果需要用一個數組存儲起來。

macOS Xcode下編譯通過

在macOS Xcode下編譯的代碼如下(注意!以下代碼在Xcode中測試通過,但在PAT編譯器中提示出錯,稍後會分析出錯原因):

//
//  main.c
//  PAT_B1011
//
//  Created by silver on 2019/3/17.
//  Copyright © 2019年 silver. All rights reserved.
//
//  給定區間 [−2^​31​​,2^​31] 內的 3 個整數 A、B 和 C,請判斷 A+B 是否大於 C。
//  int 類型表示範圍 [-2^31,2^31-1] 即 [-2147483648,2147483647]
//  long long類型表示範圍 [-2^63,2^63-1]
//

#include <stdio.h>
#include <MacTypes.h> //這裏我用的macOS的Xcode,因此使用Boolean類型時需要加載MacTypes.h頭文件

int main(int argc, const char * argv[]) {
 int T,i;
 scanf("%d",&T); // T是測試用例的個數
 Boolean flag[T];
 if(T<0||T>10)
     return 0;   // T<=10,但這裏可寫可不寫
 long long A,B,C;
 for(i=0;i<T;i++){
     //由於題目輸入格式需要,我們必須先輸入所有要比較的數對,最後一次輸出結果,因此每次輸入數據時就進行比較,將比較結果放入一個布爾數組中
     scanf("%lld %lld %lld",&A,&B,&C);
     if((A+B)>C)
         flag[i]=true;
     else
         flag[i]=false;
 }
 for(i=0;i<T;i++){
     if(flag[i])
         printf("Case #%d: true\n",i+1);
     else
         printf("Case #%d: false\n",i+1);
     
 }
 return 0;
}

提交至PAT編譯器提示出錯

提示出錯原因是#include <MacTypes.h>,這種方式引入的Boolean類型在C語言編譯器中並不適用.

  • C語言標準(C89)中定義布爾類型需要藉助宏定義,如下:
    • 宏定義布爾類型
      #define BOOL int
      #define TRUE 1
      #define FALSE 0
    • 定義一個布爾變量
      BOOL flag = FALSE;
  • C99中提供了一個頭文件<stdbool.h> ,
    定義bool代表_Bool, true代表1, false 代表0
    使用方法如下:
    • 導入 stdbool.h 來使用布爾類型
      #include <stdbool.h># 修改代碼及錯誤分析
    • 定義一個bool變量
      bool flag = false; //疊乘標記
    • 修改變量值
      flag = true;

修改代碼並編譯運行通過

當你不知道這些關於布爾類型的導入和使用時,還可以採用一種快速的方法來修改你的代碼,這裏我將flag[]數組從Boolean類型改爲了int類型,幾處改動如下:

  1. 將~~#include <MacTypes.h>~~ 註釋掉
  2. 定義標記數組 int flag[T];
  3. 數組元素的值要變
     if((A+B)>C)
         flag[i]=1;
      else
          flag[i]=0;
    
  4. 輸出時的判斷語句改爲:
    if(flag[i]==1)
        printf("Case #%d: true\n",i+1);
    
    最後提交結果編譯通過!在這裏插入圖片描述

More about BOOL,bool and Boolean in ios

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章