このBlogに価値ありとお思いの読者の方は、Amazonでお買い物の際に左のバナーから商品検索してからご購入いただければ幸いです。

2018年03月30日

【プログラミング・最終】アルゴリズム(2)

誰がよんでるかわからないこの【プログラミング】シリーズ。これで最後にしましょう。ちょっと多くなりそうですけど。。


ソートですよ。大きい順に並び替えます。それを具体的に一つ一つ進めます。


では、数字の大きい順に並び替えをしていきましょう。


最初の状態はこれです。



まずは、aを基準にします。


aに一番大きい数字が置かれるように動かして行きます。


1.aとbを比べ、大きい方を、aに移動する。bの63の方が大きいので、入れ替えます。するとこうなります(上の画像が下の結果になるという見方をしてください)。



2.aとcを比べ、大きい方を、aに移動する。この場合、aが大きいので移動はしません


3.aとdを比べ、大きい方を、aに移動する。75が。aに移動しました。



4.aとeを比べ、大きい方を、aに移動する。



これで、aに一番大きい、90が移動しました。


念のために言っておきますが、入れ替えは前回説明したように、もう一つの作業場所であるwを使って行ってください。片手でトランプを移動させていくイメージですね。


次は、こうします。


aはすでに決まりました。ですから、b〜eを並び替えて行きましょう。



1.bとcを比べて、大きい方を、bに移動します。50の方が大きいので実際は移動しません。



2.bとdを比べて、大きい方を、bに移動します。



3.bとeを比べて、大きい方を、bに移動します。これで、bも決まりました。



ここまでくると、もう同じように進めていくだけです。


a、bはすでに決まっているので、c〜eを並び替えて行きます。



省略しますが、cが決まってこうなります。



そうしたら、最後、d〜eを並び変えます。こうなりますね。



これで完了です。


そして突然ですが、C言語のソースコードです。


#include 

int main()
{
int tokuten[] = {50,63,33,75,90};
int sagyobasho, i, j;

int yososu = sizeof tokuten/sizeof(int);
printf("ソートする得点の要素数は、%d です\n", yososu);

for (j = 0; j < yososu - 1; j++) {
for (i = j+1; i < yososu; i++) {
if (tokuten[j] < tokuten[i]) {
sagyobasho = tokuten[j];
tokuten[j] = tokuten[i];
tokuten[i] = sagyobasho;
}
printf("j=%d:i=%dについて比較しました\n",j,i);
}
}

for (i=0; i < yososu; i++) {
printf("%d: tokuten=%d\n",i,tokuten[i]);
}

return 0;
}


いくつか需要な解説をします。


まず、これまでの説明では、a、b、c、d、eと書いてきましたが、プログラムでは、0、1、2、3、4と書きます。これはルールです。0から始まってしまうのが難点です。


ただ、アルファベットより数字を使うほうがやりやすいのは確かなんですよね。


aからeまで比較し、次にbからeまで比較するというのを、0から4まで比較し、1から4まで比較するという風に書けます。その時に、基準を示すために、0に1だけ足してあげれば1になるわけです。わかりにくいでしょうけど。


でも、これを見るともう少し意味がわかります。



プログラムの中で、どれとどれを比較しているのか一つ一つ出力させています。


0と1を比較し、続けて、0と2を比較し、0と3、0と4と続きます。


そして、1と2、1と3、1と4。続いて2と3、2と4。最後に3と4です。


この部分が理解できれば、ソートの考え方はわかったといっていいです。あとは、プログラミング言語の書き方を知ればいいだけです。アルゴリズムは、言語に依存しないので、こうやって考えれば結果が出せるということが示せればよいのです。


では、ソース自体を少し見ておきましょう



5行目。これは、並び替える数字を設定しています。50はtokuten[0]にあります。63はtokuten[1]です。これを配列といいます。


6行目の、sagyobashoが、wに相当する場所です。


8行目では、並び替える数字の数を求めています。


14行目から16行目が、入れ替えの部分です。


13行目が、比較している部分です。


11行目が基準となる場所を決めていて、12行目が、基準の場所の隣の位置から比較を始め、要素数より小さい間、繰り返す部分となります。


12行目の繰り返しが終わると、また、11行目に戻り、基準の場所を1つ加算して、12行目を実行します。forというのは、ある数値から1つずつ加算し(実は2つずつとか、減算してとかいろいろありますが..。)、ある条件である間、繰り返すという意味になります。


22行目から24行目で、最終的な並べ替えの結果を出力しています。


では、5行目、中括弧の中を書き換えてみましょう。例えば{80,24,39,71,51,27,90,75,43,82}として、Executeすれば、この場合もきちんと並べ替えできるはずです。



さて、ソートのアルゴリズムはこれだけではありません。


ここで示した方法では、かなり手数が多いんです。要素が100であれば99+98+97+...+2+1=4950回も比較・入れ替えを行う必要があります。


例えば、0から50、51から100までの2つのグループに分けて、要素数が50ずつにちょうど分かれるとしましょう。これであれば、50個分のソートを2回行えばいいことになります。1225回を2回で2450回です。グループ分けのために、100回の比較処理を事前にすることになりますが、それを加えても2550回ですから、かなり減りますよね。


50ずつに分かれることはないでしょうから、実用的には、単純に半分に分けて、最後にまた比較しつつくっつける方がいいんですけど。そうやって、実効性のあるアルゴリズムを考えていけばよいでしょう。


ソートのアルゴリズムにはこういったものがあって見て分かるようにしてますよ、というリンクを貼っておきます。


https://qiita.com/r-ngtm/items/f4fa55c77459f63a5228


おわり

posted by pon at 12:30| Comment(0) | PC/ネット関連 | このブログの読者になる | 更新情報をチェックする

2018年03月25日

【プログラミング】アルゴリズム(1)

誰がよんでるかわからないこの【プログラミング】シリーズ。もう少し続けます。


今回はアルゴリズムについて、ですが、導入部というか、全然アルゴリズムまでは行きませんけど、重要なところ。


ソートを取り上げます。並び替えです。そんなのExcelでやりゃいいじゃんとか、そんなんじゃ、あれっすよ。まーいいですけど。


例えば、県コード、市町村コード、人口というスプレッドシートがあったとして、並びがばらばらだとしましょう。これを、県コード、市町村名、人口の順に並び替えて、県ごとに小計出力して、県コードに県名を紐づけて、印刷してね♪と指示されたら何をどういう手順で行うか、なかなか論理的な思考ができないと難しいんですよ。


数学も、哲学も、プログラミングも、論理であって、どれも大事。ソートなんて、どんなプログラミング言語にでも、ツールにでも最初から機能が付いてますけど、その先の応用をしっかり実行するには、こういった基本の基本の基本ができないと駄目です。


だから、ソート。


だけど、まだもっとさらに基本の話をします。


テストの答案を、得点の高い順に並べるとしましょう。


5枚の答案用紙があります。これ、5枚だからさくっと並べればいいじゃん、っていうことじゃないですよ。これが、100枚でも1000枚でも、やらないといけません。それがアルゴリズムなのです。


何をどういう手順で実行すればきちんと結果が出るかを示すのがアルゴリズムです。


sort1-1.png

まずは、床をきれいにして、答案を並べる場所を確保しましょう。a、b、c、d、eです。そして、きちんと並べます。下には、得点だけ示しています。


sort1-2.png

では、aとbを入れ替えてみましょう。bの方が高得点ですから。それだけが今回のテーマです。


人がやると、何気に、両手でさくっと入れ替えてしまいます。


sort1-3.png

が、これは駄目です。同時に2つのことをしてます。コンピューターは一つ一つのことを順々にしかできないと思ってください。


一つ一つ行うには、片手で処理するように考えればいいです。


というわけで、実はもう一つ場所が必要です。wとします。


sort1-4.png

そうしたら、簡単ですね。入れ替えてください。


















はい。答え合わせをします。一例ですよ。


まず、aからwに移動します。aが空きます。


sort1-5.png

次に、空いたaにbの答案を移します。bが空きますね。


sort1-6.png

最後、wにある答案を、bに移します。


sort1-7.png

これで、aとbの答案が入れ替わりました。


簡単ですね!!


でも、まだまだです。一番大きい90が一番左に来ないといけないのですから


そもそも、人間が見ると90が一番でっかいってすぐわかりますけど、コンピューターはそうではありません。一度に一つのことしかできないのですから。


今は、5枚の答案を一度に見てますけど、コンピューターは一つづつしか見ることはできません。だから、90が一番でかいなんてすぐにはわからないんです。


さっきのaとbの入れ替えであれば、


aの得点をみる


bの得点をみる


aの得点とbの得点を比べる


aよりbの得点が大きいことがわかる


aとbを入れ替える。ここがさっきのところなので、一度で済むところではなかったですよね。

posted by pon at 11:16| Comment(0) | PC/ネット関連 | このブログの読者になる | 更新情報をチェックする

2018年03月24日

【IT】結局スマホにしろってことなんだろうけどねー

Twitterにメールで投稿する仕組みは作ったのだけども、今度はFacebookではどうかと思い、調べていたのだ。前は、Facebookにモバイル投稿アドレスっていうのがよく表示されてたけど今はない。

結論からすると無理そうな感じ。

というより、Twitterが緩いんだろうと思う。Facebookだと、このSeesaaでも連携できるわけですけど、いったん、認証するでしょ?その認証が通っていれば、あとは、Facebookにログインしてようがしてまいが、記事を投稿するとFacebookにも投稿される。

メールの場合、この認証行為ができない。

Seesaaにメール投稿して、それがFacebookにも投稿されるっていうのでは、前にも書いたけど、「Blogを更新しました」っていう誘い記事として投稿されるので、よろしくない。

でも、何らかのWebsiteで一旦認証だけしておけば、その先はメールだけでもできるかもなー。。

もう少し考えてみようかとは思いますが。。

おわり。
posted by pon at 13:16| Comment(0) | PC/ネット関連 | このブログの読者になる | 更新情報をチェックする

2018年03月22日

【IT】まいったーーーーー

結局、cowitter版にしたんですよ。

最初に試してた段階ではすぐに終わりそうだった。

でも、やたらと失敗を重ねて時間がかかったかかったかかった。

参るなー。

まずねー、かたかたとTwistOAuthからcowitterに手直しして、動かしたら駄目で。

で、メール送信して、エラーが返ってくるんだけど、それが、
#!/usr/local/bin/php: not found とか、
xx.php: 9: Syntax error: word unexpected (expecting ")") とか。。

なんで?なんで?となり、元ファイルに戻しては、修正してみても駄目で、その繰り返し。どうもおかしいと思い、元ファイルに戻して、何も変えずに上書き保存して試したら、やっぱり同じ状況に。。

あーそーかー、とここで気づきました。

今日に限ってメモ帳使ってたんですよ。これかー。。

きちんと動くプログラムなのに、ただメモ帳で上書き保存するだけで、上のエラーが返ってくるのだった。

昨日まではそんなことしてなかったのに。なんか手軽かなーってついつい使ってしまったのだ。

それと、[]()の、始まりと終わりをきちんとしなきゃいけないのに、間違ってた。これはこれで哀しいけど、シンプルなエディターじゃなくて、そういうチェックをしてくれるIDEだったりすれば、絶対に間違わないものなんだけど、これまた、片手間にやろうとするとこうなるよってことですね。

おわり。
  → [ 読む ]。。
posted by pon at 16:42| Comment(0) | PC/ネット関連 | このブログの読者になる | 更新情報をチェックする

【IT】変なエラーが出てたcowitterについてあれまーな結末

phpによるツイートについて、cowitterだとうまくいかなくて、古いTwitOAuthにしましたって書いてましたが、あっけなくできるようになりました。

昨日の作業中に、cowitterをあきらめ、TwitOAuthで実装を進めていた時に、さくらインターネットからのphpバージョンアップのお知らせに気づいて、7.1に上げてたんですよね。

で、ついさきほど、もしかして7.1なら動くんじゃないか、、と思いやってみたら、できました。

なんなんだか。。

cowitterに合わせて書き換えるかどうか。。いまのうちにやっとくか。あんなに苦労したのにすんごい簡単にできてしまったのでした。

おわり。
  → [ 読む ]。。
posted by pon at 14:49| Comment(0) | PC/ネット関連 | このブログの読者になる | 更新情報をチェックする

2018年03月21日

【IT】メールして、サーバーでphpが動いて、Twitterに投稿するやつ

どうにかできてるというか、それなりに動いてる感じになったけど、やり方の詳細はここでは書きません。ぐぐるといっぱい出てくるから。

まーまー動くんだけど、Yahooメールからと携帯メールからだと、どっちかが文字化けする感じになるので、携帯で使うものなのでそっちに合わせた。

まだ、変なエラーが返るときがあるので、そこはもう少しかな。でも、投稿は出来てるんだよね。

↓にあった、cowitterでやろうとしたんだけど、、。
https://blog.dav.red/?p=74

どうしても、Syntax errorで動かず。Traits.AuthenticatorTrait.phpのLine17だったかな。
unexpected CurlExecutorとかでだめだった。

しょうがないので、TwistOAuthっていうもうメンテされてないからね、っていう古いやつを使ったら動いた。しかも、deprecatedのメソッド使っちゃってるから、この先、不安が残りますね。
https://qiita.com/mpyw/items/7bedf8c23de286cef0f9

そこも直したほうがいいよなー。雨で外に出たくないから出ない。

--------------------------
気になったので直した。変なエラーは、if文中に宣言した変数をifを抜けてから使っていた、せいじゃないかと思う。あと、deprecatedのメソッドもやめた。当面これで行けるかな。

おわり。
  → [ 読む ]。。
posted by pon at 16:44| Comment(0) | PC/ネット関連 | このブログの読者になる | 更新情報をチェックする