みなためラボ

【C言語】10進数から8進数に変換するプログラム

文字サイズ

はじめに

どうも! みなため(@MinatameT)です。

この記事では、入力された10進数を8進数に変換するプログラムを紹介します。プログラミング言語はC言語です。

8進数は、0から7までの数字を使って値を表現するものですね。

あまり難しいものではありませんし、1つずつ確実に理解していけばOKです。

それでは、プログラムをさっそく確認していきましょう。

10進数から8進数に変換するプログラムの例

ソースコード

#include<stdio.h>
#include<math.h>
#include<string.h>

int main(void)
{
  int d; //入力値d
  char x[9] = "01234567"; //8進数の配列
  char x0[2] = {0}; //8進数の右から1ケタめ
  char x1[2] = {0}; //8進数の右から2ケタめ
  char x2[2] = {0}; //8進数の右から3ケタめ
  char x3[2] = {0}; //8進数の右から4ケタめ
  char x4[2] = {0}; //8進数の右から5ケタめ
  char x5[2] = {0}; //8進数の右から6ケタめ
  char xfin[7] = {0}; //8進数に変換した結果
  int L; //ループ用変数L
  int xv0,xv1,xv2,xv3,xv4,xv5; //8進数のそれぞれの桁の重み

  printf("0から262143までの10進数の整数値を入力。>");
  scanf("%d",&d); //dに10進数の整数値が入る。
	
  /*8進数の計算*/
  xv0 = (int)(d/(pow(8,0)))%8; //8^0の位
  xv1 = (int)(d/(pow(8,1)))%8; //8^1の位
  xv2 = (int)(d/(pow(8,2)))%8; //8^2の位
  xv3 = (int)(d/(pow(8,3)))%8; //8^3の位
  xv4 = (int)(d/(pow(8,4)))%8; //8^4の位
  xv5 = (int)(d/(pow(8,5)))%8; //8^5の位

  for(L=0; L<8; L=L+1)
  {
    if(xv0==L)
    {
      strncpy(x0,x+L,1); //x0に、配列xのL番めからの値を1つ分代入する。
    }
    if(xv1==L)
    {
      strncpy(x1,x+L,1); //x1に、配列xのL番めからの値を1つ分代入する。
    }
    if(xv2==L)
    {
      strncpy(x2,x+L,1); //x2に、配列xのL番めからの値を1つ分代入する。
    }
    if(xv3==L)
    {
      strncpy(x3,x+L,1); //x3に、配列xのL番めからの値を1つ分代入する。
    }
    if(xv4==L)
    {
      strncpy(x4,x+L,1); //x4に、配列xのL番めからの値を1つ分代入する。
    }
    if(xv5==L)
    {
      strncpy(x5,x+L,1); //x5に、配列xのL番めからの値を1つ分代入する。
    }
  }

  snprintf(xfin,7,"%s%s%s%s%s%s",x5,x4,x3,x2,x1,x0); //xfinにx5~x0を連結させたものを代入する。
  printf("%d(10進数) = %s(8進数)\n",d,xfin); //8進数に変換した結果を出力する。
  
  return(0);
}

#include<math.h>は、pow関数を使うために必要です。pow関数については、以下の記事を参考にしてください。

#include<string.h>は、strncpy関数を使うために必要です。strncpy関数は、ある文字列を他の文字列に「上書き」するために利用されます。

strncpy関数の使い方については、以下の記事を参考にしてください。

snprintf関数についてですが、左から順番に見ていくと、xfinが代入先です。次に、「7」というのは代入する合計文字数 + 1の値です。次に、%sが6つありますが、これは代入する変数の数だけ%sを書きます。最後に、代入する変数名を「,」で区切って順番に書きます。

snprintf関数の使い方については、以下の記事を参考にしてください。

char配列の宣言時に必要な文字数 + 1のサイズを確保しているのは、終端文字(NULL)が1つ入るためなのですが、ここでは詳しく説明しません。

また、char配列の宣言時に {0}; としているのは、配列の中を0で埋め尽くすため(ゼロクリアー)です。これをしないと、計算結果が間違う可能性があります。

それでは、実行結果を確認していきます。

実行結果の例

0から262143までの10進数の整数値を入力。>77
77(10進数) = 000115(8進数)

これは、入力値の77(10進数)が115(8進数)に変換された様子ですね。

念のため、正解しているかどうか、検算してみましょうか。

右から3ケタめの大きさが、1 × 64 = 64ですね。

右から2ケタめの大きさが、1 × 8 = 8ですね。

一番右のケタの大きさが、5ですね。

……ということで、64 + 8 + 5 = 77になり正解です。

0から262143までの10進数の整数値を入力。>443
443(10進数) = 000673(8進数)

これは、入力値の443(10進数)が673(8進数)に変換された様子ですね。

これも、念のために検算してみます。

右から3ケタめの大きさが、6 × 64 = 384ですね。

右から2ケタめの大きさが、7 × 8 = 56ですね。

一番右のケタの大きさが、3ですね。

……ということで、384 + 56 + 3 = 443になり正解です。

今回はここまでです。ややこしい文法もありますが、慣れたら平気です。皆さん、お疲れ様でした。

以下、関連記事です。興味があればどうぞ。


 

みなためじゃんけん

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

私が出したのは……





グー

グーでした! パーの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集