PAT_B1011 布爾類型編譯錯誤及調試
題目概覽
題目鏈接: https://pintia.cn/problem-sets/994805260223102976/problems/994805312417021952.
思路分析
這道題看似非常簡單地判斷A+B是否大於C,但主要考察以下兩點:
- 數據類型
A、B 、 C爲給定區間內的 3 個整數,該區間即int類型的表示範圍,寫作十進制即[-2147483648,2147483647],因此A+B的值可能超過int類型可表示的範圍,若測試數據中A與B的值都比較大,則會出現溢出錯誤,因此這裏我們把A、B和C定義爲long long類型,在scanf中輸入時,表示爲"%lld"。 - 輸入輸出格式
根據題目要求的輸入輸出格式,每輸入三個數,就要進行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;
- 導入 stdbool.h 來使用布爾類型
修改代碼並編譯運行通過
當你不知道這些關於布爾類型的導入和使用時,還可以採用一種快速的方法來修改你的代碼,這裏我將flag[]數組從Boolean類型改爲了int類型,幾處改動如下:
- 將~~#include <MacTypes.h>~~ 註釋掉
- 定義標記數組 int flag[T];
- 數組元素的值要變
if((A+B)>C) flag[i]=1; else flag[i]=0;
- 輸出時的判斷語句改爲:
最後提交結果編譯通過!if(flag[i]==1) printf("Case #%d: true\n",i+1);