DLLが動かない(何故かプログラム(アルゴリズム)の話)

もうすぐ還暦のKASAです。

もう幾つ寝るとお給金♪ ・・・ 早くこいこいお給金♪

などと歌いながらブログのネタを仕込んでおりました。

USB切替ネタ用のLSIボードを引っ張り出して次のブログの準備をしていると

が~ん、Excelから使えた操作用のDLL動かんやん、数年前までは動いていたはずなのに~

 

 

まずこの替え歌は1月に入社した私のお財布事情を物語る歌です。

弊社は月末〆、翌25日支払いの月給制度です。

そうです、1月働いてもそのお給金は2月の25日まで手にできません。

新なネタのための資金がありません!

プログラマなら自分でDLLプログラム書けやと言われそうですが、やっぱり面倒です。

でも一応プログラマなのでお金のいらないプログラム(アルゴリズム)のお話をいくつか…

 

 

素数を求める話

”ステキ”ではありませんよ、”そすう”です、 わかりやすいけど奥は深いです。(泥沼)

n(整数)が素数かどうか知るには、nを割りきれる1とn以外の値(整数)がないかを調べることになります。

割り切れる値がない場合、素数ということです。

n÷2は割り切れるかで始まり、n÷3は、n÷4は・・・n÷(n-1)は割り切れるかまで繰り返すわけです。

これだとn-2回(1とn以外)試す必要があります。

とりあえずWindowsで誰でも使えるPwershellで書いてみます

「WindowsPowerShell」は「スタート(田)」→「WindowsPowerShell」あたりにいます。

以下をPowerShellの画面にコピぺ(コピーして貼り付け)します。

 

=== この下から ===

 

function TestPrime($no)

{

    $pflg = 1

    foreach  ($i in 2..($no-1)) {

        if(($no%$i) -eq 0){

            echo $i で割れた

            $pflg = 0

            break

        }

    }

  

    if($pflg -eq 1){

        echo “素数”

    }

    else{

        echo “素数じゃない”

    }

}

 

=== この上まで ===

 

もしコピペしたあとコマンドプロンプトに戻らない(>>となっている)場合は以下を参考に

でコマンドプロンプト(最初に出てたもの)が出たら

TestPrime(7)

と入力してEnterキーを叩いてください。

7が素数と教えてくれます。

ブラボー

( )の中に入れる数字を適当に変えればその数値が素数か調べてくれます。

えー(n-1)までじゃなく、nの半分(n÷2)まで調べれば充分じゃんと思った文系のあなた、弊社への応募お待ちしてます。

偶数(4,6,8…)で割る意味ある?思った文系のあなたも弊社への応募お待ちしてます。

まあプログラマは色々工夫をして、無駄を省き、SDGsに貢献するわけです。(コンピュータは答えを出すために電気を熱に変えてるわけなので)

今では、コンピュータがめっちゃ早くなったので思ったままプログラムしても問題になるほど遅いことは少なくなり、

見た目(何をしたいかすぐわかる事)重視となってきました。

それこそ私が就職した時代は今の数千倍いやもっと遅かったので、イミフでも早く動くように作るのが当たり前だったのです。

その話はいずれしたいと思います。

 

 

テストに出るソート(並べ替え)

次はプログラムの入門として確実に登場するソート(数字を順に並べなおす)のプログラムです。

色々なやりかたがあってgoogleでも試験問題にもなったりしたようですが、

実作業では面倒なのでライブラリ(準備済みの部品)を使うのが吉です。

こんなご時世ですから(どんな時世?)、私がとても気にいったソートアルゴリズムを紹介したいと思います。

 

概要はこうです。

ソートしたい数値をその数値分だけsleep(停止)した後にその数値を出力します。

それをえいやっと同時に実行すれば数値の小さいものから出力が返ってくる、そうソートされているわけです。

こればすごい発想ですね、並べなおすのに数値の比較をしないんです。

実用性はありませんが、こういう発想ができる人尊敬します

 

とりあえずこれもPowerShellで書いてみましょう

 

=== この下から ===

#指定された数値秒分Sleepして指定数値を表示する関数

function Test($text){

    Start-Sleep -Seconds $text

    Write-Host “$text”

}

 

#Workflowで関数を並列(同時)に動かす関数

Workflow TestWorkflow($data)

{

    foreach -parallel ($i in 0..($data.count-1)) {

        Test $data[$i]

    }

}

#データを外部でセット

$datax = ‘6’,’3′,’5′,’1′,’7′

 

=== この上まで ===

 

これをコピぺします。

TestWorkflow($datax)

と入力してEnterキーを叩いてください。

1

3

5

6

7

と数字が小さい順に並べばOKです。

 

こいつはPowerShell(x86)では動かないようなので(x86)とついていないPowerShellを使ってください。

エラーだとこんな感じ

注意! 何故か1回目は時間がかかるし、並びがおかしいことがあります。

一回目は並列処理の準備が手間取るようですね

その時はもう一度「TestWorkflow($datax)」を実行すればたぶんうまくいくと思います。

 

次に任意のソートをしてみましょう

$datax = の後に「’」で囲んだ数字を「,」で区切って適当な順に並べて書いてください。(「’」で括らないとうまく動きません)

$datax = ’11’,’1′,’7′,’5′,’3′

と入力してEnterキーを叩いてください。

その後で、

TestWorkflow($datax)

 

Enterキーを叩くと、今度は

11, 1, 7, 5, 3を小さい順にソートして

1

3

5

7

11

と出力されるはずです。

 

ここで注意点です、どうもPowerShellの処理の並列数が5で、これ以上無理なんです。

よって指定できる数は5個まででお願いします。

まあこんな使い方するための機能ではないので文句はいえません。

ここであんまり大きな数字を使わないほうが良いねぇと気づいた文系のあなた、弊社への応募お待ちしてます。

マイナスの数字は無理よねと気づいた文系のあなたも弊社への応募お待ちしてます。

 

わからない人にはとことんわからない話をしました。

プログラムの世界は心地良い?沼です。

さああなたも弊社でどっぷりとプログラミングにはまりませんか?