7-5 バイト分析 (parse_byte) PTA C++ 入門質問への回答

7 ~ 5 バイトの解析 (parse_byte)

スコア 10

全画面表示でトピックをブラウズ

スイッチ レイアウト

著者王正ユニット山東大学

バイトのサイズは歴史的にハードウェアに依存しており、サイズを義務付ける決定的な標準は存在しませんでした。

規格のないバイト数、古代のプログラマーたちはどのような生活を送っていたのか?幸いなことに、バイトは現在 8 ビットに統一されています。

私はすでに C++ のかなりしっかりした基礎を持っているので、基礎となる開発を探ることができます. まず、16 進数のバイト データを解析する関数を作成しましょう。

入力仕様

  • 読み取られる各バイト データは、空白以外の 2 文字で構成されます。

  • 通常の 16 進数のバイトデータであれば、上位ビットが先で下位ビットが後になります

  • 大文字と小文字を区別しません。

  • 項目は、可変数の空白文字で区切られます。特別な処理をしなくても、cin で直接読み取ることができます。

出力仕様

  • 1 行に 1 項目を出力します。最初に読み取った文字をコロンとスペースで区切って出力し、次にバイトの値を 10 進数で出力します。

サンプル入力

 0A    a3
Ff +z

サンプル出力

0A: 10
a3: 163
Ff: 255
+z: invalid

サンプル説明

  • 0A: 0 * 16 + 10 * 1 = 10

  • a3: 10 * 16 + 3 * 1 = 163

  • Ff: 15 * 16 + 15 * 1 = 255

  • +z には無効な文字が含まれています。

ヒント: 以降の質問は同様の関数を使用します。設計時に再利用性を考慮してください。

コード フレーム

#include<iostream>usingnamespacestd;
unsignedcharparse_byte(unsignedchar hi, unsignedchar lo){
return0; // TODO}
intmain(){
for(char hi, lo; cin >> hi >> lo;){
cout << hi << lo << ": ";
if(is_hex(hi) && is_hex(lo)){ // 重用cout << (int)parse_byte(hi, lo) << endl;
    }else{
cout << "invalid" << endl;
    }
  }
}

コード長制限 16KB

制限時間 200ms

メモリ制限 1 MB

答え

#include <iostream>
using namespace std;

int too(char v);
unsigned char parse_byte(unsigned char hi, unsigned char lo) 
{
    return too(hi) * 16 + too(lo);
}
int too(char c) 
{
    if (c >= 'a' && c <= 'f')return c - 'a' + 10;
    if (c >= 'A' && c <= 'F')return c - 'A' + 10;
    if (c >= '0' && c <= '9')return c - '0';
}
bool is_hex(char d) 
{
    if (d >= '0' && d <= '9' || d >= 'A' && d <= 'F' || d >= 'a' && d <= 'f')return true;
    return false;
}

int main() 
{
    for (char hi, lo; cin >> hi >> lo;) 
    {
        cout << hi << lo << ": ";
        if (is_hex(hi) && is_hex(lo)) { // 重用
            cout << (int)parse_byte(hi, lo) << endl;
        }
        else 
        {
            cout << "invalid" << endl;
        }
    }
}

おすすめ

転載: blog.csdn.net/lifesize/article/details/128945158