LoginSignup
0
0

More than 3 years have passed since last update.

[C言語アルゴリズム]ブロック移動

Posted at

C言語でブロック移動アルゴリズムを実装した

学習にあたって使用した環境

  • ideone.com (https://ideone.com/) ※オンライン上でプログラミング学習ができるサイト

参考資料

C言語による最新アルゴリズム辞典 (奥村晴彦著/1991年初版 技術評論社:249ページ)

ブロック移動アルゴリズムの概要

文字列内のブロックを入れ替えるアルゴリズムである。

(以下は参考資料により引用)

エディタの命令、例えばテキスト xyz12345abcdefg 中でブロック12345をブロックabcdの後に移動すると、xyzabcd12345efgとなる。この操作は12345とabcdとを交換すること、あるいは12345abcdを右に4文字だけ回転することでもある。

今回は、"PROGRAMMING"と"PRINCIPLES"の2単語で構成される文字列"PROGRAMMINGPRINCIPLES"を、単語を入れ替えて"PRINCIPLESPROGRAMMING"とする処理を実装した。

ソースコード

moveblock.c
/* ブロック移動 block move */

#include <stdio.h>
#include <stdlib.h>

char sentense[] = "PROGRAMMINGPRINCIPLES";

int main(void) {
    printf("%s\n",sentense);
    // 文字列移動関数を呼び出す
    rotate(0, 10, 20);  
    printf("%s\n", sentense);

    return EXIT_SUCCESS;
}

// 文字列反転関数
// 文字列長が奇数の場合には、中央の文字だけは反転しない
void reverse(int i,int j){
    // 置換するためのtmp変数
    int t;
    while(i < j){
        t = sentense[i];
        sentense[i] = sentense[j];
        sentense[j] = t;

        // 処理する文字列位置を一つずつずらす
        i++;
        j--;

        printf("%s i=%d j=%d (reverse)\n", sentense, i, j);
    }
}

// 文字列移動関数
// reverse関数を呼び出す
// 第一引数:入れ替える文字列の左側部分の開始位置
// 第二引数:入れ替える文字列の右側部分の開始位置
// 第三引数:入れ替える文字列全体の文字列
void rotate(int left, int mid, int right){
    reverse(left, mid);
    reverse(mid + 1,right);
    reverse(left, right);
}

実行結果

期待した通りの結果になった。

result.txt(任意)
Success #stdin #stdout 0s 4488KB

PROGRAMMINGPRINCIPLES
GROGRAMMINPPRINCIPLES i=1 j=9 (reverse)
GNOGRAMMIRPPRINCIPLES i=2 j=8 (reverse)
GNIGRAMMORPPRINCIPLES i=3 j=7 (reverse)
GNIMRAMGORPPRINCIPLES i=4 j=6 (reverse)
GNIMMARGORPPRINCIPLES i=5 j=5 (reverse)
GNIMMARGORPSRINCIPLEP i=12 j=19 (reverse)
GNIMMARGORPSEINCIPLRP i=13 j=18 (reverse)
GNIMMARGORPSELNCIPIRP i=14 j=17 (reverse)
GNIMMARGORPSELPCINIRP i=15 j=16 (reverse)
GNIMMARGORPSELPICNIRP i=16 j=15 (reverse)
PNIMMARGORPSELPICNIRG i=1 j=19 (reverse)
PRIMMARGORPSELPICNING i=2 j=18 (reverse)
PRIMMARGORPSELPICNING i=3 j=17 (reverse)
PRINMARGORPSELPICMING i=4 j=16 (reverse)
PRINCARGORPSELPIMMING i=5 j=15 (reverse)
PRINCIRGORPSELPAMMING i=6 j=14 (reverse)
PRINCIPGORPSELRAMMING i=7 j=13 (reverse)
PRINCIPLORPSEGRAMMING i=8 j=12 (reverse)
PRINCIPLERPSOGRAMMING i=9 j=11 (reverse)
PRINCIPLESPROGRAMMING i=10 j=10 (reverse)
PRINCIPLESPROGRAMMING

所感

  • プログラミング学習環境としてのideone.comは大変使い勝手がよい。利用方法は調べたらもっとありそうなので、今後の課題とする。
  • やはり、書いて動かしてみると理解が進みやすい。
  • 実際にこのアルゴリズムを製品コードに組み込むケースを想定すると、若干の手直しが必要になりそうと思う。(グローバル変数の文字列をガシガシ編集したりするのはどうなんだろう、という観点)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0