忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

             2005~2013
[1]  [2]  [3]  [4]  [5]  [6
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

という訳で以前の続きです。

といっても半月ほど前ですね。

この時は、「変数」という箱があるよ。なんて話を適当にしたと思います。


それで今回はまた別の話として、画面に文字を表示させる方法について紹介したいと思います。

例えば、画面にLuzと表示させるプログラムはこんな感じ。

#include <stdio.h>

int main(void)
{
     printf("Luz");
     return 0;
}
 

まぁこんな数行でLuzという文字をPCの画面に表示することができます。

見ればわかると思うのですが、ここで、実際に画面に文字を表示させる命令をしている文が5行目の

printf("Luz");

です。ここに書かれているprintfというものは”でくくった中の文字を表示することができる関数というものです。

要するにこのように書けば、"で囲われている部分の文字を画面に出力する。という命令になります。

それに、以前紹介したおまじないを付け加えることで、このようなプログラムができる訳です。

ここではprintf以外の命令は行っていないのでpirntf以外は全部おまじないですね。

因みに囲う文字は世界標準だと基本的に半角英数のみですが、

日本語の使えるPCであれば、日本語を表示することもできます。

まぁつまり日本にあるPCなら大抵日本語の表示ができるということです。

日本語の表示をするときもこんな風に

printf("るーす");

という感じで打てば大丈夫です。何ら変わりはありません。

なんでこのようなことができるかというと・・・半角だろうと全角だろうと

結局全部PCにしてみれば文字は数字の集合体であるということは以前説明したかと思いますが、

PC側が「その数字の集まりを文字に置き換えられれば」どんな文字でも出力することはできるんですね。

例えば日本語のPCなら数字の集まりを半角英数+日本語の文字として認識することができ、

中国語のPCなら半角英数+中国語の文字として認識することができ・・・といった具合です。


だからPCが日本語に対応していれば、printfに日本語を書いても、

その日本語をPCが理解して画面に出力することができるという訳です。

ちょっとムツカシイというか意味深な説明ですが、まぁこんなところでしょう。


因みにこのpirntfは変数の値も出力させることができて


例えば変数aの値を出力したければ

printf("%d",a);

となります。

これでaの値(数字)が出力されます。



具体的なプログラムだと

#include <stdio.h>

int main(void)
{
     int a=5;
     printf("aの値は%dです。",a);
     return 0;
}


こんな風にかけて、これだと出力結果は

aの値は5です。

となります。

要するに%dと書いたところに変数の値の数字が入って、

その入る変数を”のくくりの後にあるカンマの後に書くことで、変数の値を出力しているという訳です。

難しく言うと%dにaの値を代入している、ということになりますが、これの方がわかりやすいかな?

複数の変数の値を出したい場合は、

printf("aの値は%dで、bの値は%dです。",a,b);

とこのようになります。

因みに%dについてですが、これは変数がint型の時は%dでいいのですが

char型の時は%cに、float、double型の時は%fになります。

こういうのもちゃんち理由があり、また、他にもきっちりした区分けがあるのですが、

とりあえずややこしくなるので今回はこの話は省略で。


pirntf関数はまぁこのようにして使います。

他にも画面に文字を出力する関数はありますが、他のものはまた今度ということで。

次回は逆にキーボードから値をプログラムに入力する方法を紹介します。


それでは。

(^・ω・)ノRadiumProduction in RoboCup Junior
一昨日のプログラムの記事の続きです 。

今日はいきなりですが、変数というものについてのお話をしようと思います。


変数とは、まぁ所謂箱です。

プログラム上でいう箱なんです。


まぁ何を入れる箱かというと、具体的には値、即ち数値です。

ROBOLABでいうところのコンテナというやつです。

例えばセンサーの値だったり、時間の値だったり、まぁ色々です。

そういった数字を入れておく箱みたいなものだと思っていてください。


そんでもって変数は計算を行うこともできます。変数内の値を足したり引いたり・・・と色々できます。


また変数にはいくつか種類があって、この種類を型といいます。変数の型には、よく使うもので・・・

説明(簡易)
char 文字の格納に使われる。
int 整数の格納に使われる。 
float 少数の格納に使われる。 
double 少数の格納に使われる。 

このようなものがありますね。

まぁあとはlongとかshortとかbyteとかがあるかな。

変数という概念はC以外でもあっちこっちにあるので、結構言語によって色々な型があったりします。

なので、たくさんの言語を知っていると、こんがらがること必須ですが、その辺りは「慣れ」ですね。


それで変数の使い方ですが、変数は使用する前に、「変数の定義」をしなくてはありません。

これは、コンパイラに「このプログラムではこの変数を使いますよ」ということを教える為のもので、

変数を使う際には必ず変数ごとに必要な作業です。

変数の定義はプログラム上ででき、このように書くと変数の定義ができます。


型 変数名;


型は先程紹介した、intやchar等のところから使いたい型の種類を、選んで書いて

変数名の所には任意の文字を書いてください(半角英数一部記号が使えます。)

但し、最初の文字はアルファベットでないとコンパイルが通りません。

また、大文字、小文字は区別されますが、基本的に小文字を使うのが慣例です。

この辺りの理由はまた今度説明するかもです。


なので例と挙げるとこんな感じ。

int x;

char s;

float a;

double b;


これでint 型の変数xと、char型の変数sと、float型の変数aと、double型の変数bが定義されました。

これで例えば、

x=10;

とすることでxという変数に10という数字を入れることができます。


これを実際のプログラムにすると、

#include "stdio.h"

int main(void)
{
     int x;
     x=10;
     return 0;
}

となります。最初の一行は今はおまじないと覚えていてください。また今度説明します。

プログラムは基本、int main(void)というもので囲われた中に書くことになります。

この辺りも今はおまじないで大丈夫です。

Cには最初の段階だと結構の頻度でおまじないが出てきます。

最初の段階でこのおまじないを理解しようとするとC言語はまず理解できなくなるので

あっちこっちの参考書でも、この辺をおまじないにする傾向は強いようです。

という訳でプログラムの中を説明します。

このプログラムではまずint型の変数xを定義して、そのあとでxに10を代入しています。

それだけの意味のないプログラムです。


(因みにreturn 0;も今の段階ではおまじないです。とりあえず書けば動く。それだけです。)


また変数の値を計算する場合は

足し算なら(x+10の結果をxに代入する)

x=x+10;

引き算なら(x-10の結果をxに代入する)

x=x-10;

かけ算なら(x×10の結果をxに代入する)

x=x*10;

割り算なら(x÷10の結果をxに代入する)

x=x/10;

と書くことができます。

だからこのプログラムだとxの値は

#include "stdio.h"

int main(void)
{
     int x;
     x=10;
     x=x+10;//(この段階でx=20)
     x=x-10;//(この段階でx=10)
     x=x*10;//(この段階でx=100)
     x=x/10;//(この段階でx=10)
     return 0;
}

という訳でこのプログラムだと最終的にxは10になることになります。(あ。戻った(笑))


変数は基本的にこんな感じで使います。また変数の計算の方法や定義の方法はもっと短く書く方法などもありますが


今日はその辺りは省略させて頂きます。

とりあえず最初はこのくらいかな。

次は画面への表示の方法について書いていこうと思います。

(^・ω・)ノRadiumProduction in RoboCup Junior
といってもまだ基本中の基本ですけど。

とりあえず。書いていこうと思います。


例えばまずこんな簡単なプログラム。

#include "stdio.h"

int main(void)
{
     printf("このブログは普通に読むと、どうも「酔う」らしいので読むときは酔い止め推奨です。 \n");
     return 0;
}

こんなプログラムを打って、コンパイルして、実行してみると、


このブログは普通に読むと、どうも「酔う」らしいので読むときは酔い止め推奨です。 


という文字が画面に出力されてプログラムが終了します。

まぁこのように、プログラムを使うことで、何かのデータを画面などに表示(出力)させることができます。


また、このようなプログラムを打つと

#include "stdio.h"

int main(void)
{
     int i;
     printf("値を入力してください。 \n");
     scanf("%d",&i);
     printf("入力された値は%dです。 \n",i);
     return 0;
}


値を入力してください。
10
入力された値は10です。 


という風な出力の結果が得られます。

まぁこのように、このプログラムではキーボード等からデータを受け取ること(入力)ができます。


また、このようなプログラムを書くと


#include "stdio.h"

int main(void)
{
     int i;
     printf("値を入力してください。 \n");
     scanf("%d",&i);
     i=i+10;
     printf("入力された値は%dです。 \n",i);
     return 0;
}



値を入力してください。
10
入力された値は20です。


と、このように、このプログラムでは、データ同士の計算(演算)をすることができます。


このように、大体のプログラムというものは、

・外部からのデータの入力

・入力された値を演算

・演算された結果を出力


この3つの動作の1パターンの連続で成り立っているものなのです。まぁ多少の例外はありますけど・・・。

という訳でまずは、この3つの動作を簡単に行うことのできるプログラムを使ってこの3つを説明していこうと思います。


でもその前に、データの入力をするにも、そのデータの演算をするにも、データの出力をするにも、

そのデータを保存する場所がなければ、データなんて扱えませんよね?

という訳で次回はこのデータを保存する場所。変数について書いていこうと思います。

それでは今日はこの辺で。


(^・ω・)ノRadiumProduction in RoboCup Junior
やっぱりAtomだと限界が・・・Core2Duoのノートが欲しい。

なんて考えている今日この頃です。

でも買っちゃうと僕のノーパが5台に・・・それはちょっと多すぎる(笑) 

まぁ4台でもレポートやるにはこれくらいないときついですね。個人的には。


そんな感じで今日は以前に予告したようにコンパイラの話です。

とりま、コンパイラってなんでしょうって話は全壊前回したと思います。

詳しくはC言語基コンパイラ言語についての記事を参照して下さい。

といっても、全然詳しく書かれてないですけど(笑)

まぁここではとりあえず、「コンパイラ=翻訳機」である。といった感じのことは説明したと思います。

でもちょっと英語できる人だと疑問に思うのがこの点、

コンパイルは英語にするとcompile

これを日本語に直訳すると「編集する」という意味になるんです。


まぁ翻訳も編集のひとつかもしれませんが、そもそも翻訳するだけなら”とらんすれーしょん”でいいと思いませんか?

なんでわざわざコンパイルというんでしょうか。


まぁコンパイルの語源はともかく、結局コンパイラって、翻訳の為のものではあるけど、

「翻訳だけ」している訳じゃないんです。寧ろこっちの方が翻訳より大事かも知れないですね。

そのコンパイラが担当しているもうひとつの役目とは何か。という話ですが、その前に。

皆さん。プログラムって完璧に書けますか?

100%ミスなしでプログラム、作れます?

まぁ簡単なプログラムならできるでしょうけど、

複雑なプログラムなら大体1個や2個は気が付かない打ちミスとかがでてきます。


そのミスをそのまま放置して、機械語に翻訳させて、

ロボットに送ってその間違ったプログラム、実行させたらどうなると思います?


どうなるんでしょうね(笑)

静かにお亡くなりになるかも知れないし、いきなりロボットは真赤に輝きだすかもしれない。

頭のいいLEGOだったらFileErrorで済むかもしれませんけど・・・。ちょっと怖いですよね。

だからみんなちゃんと、プログラムは確認してからロボットに送りますが、それでも確認しているのも人間なので

やっぱり抜けが出ますよね。

でも、こういった打ちミス等の構文的なミスをした際に、

PC側でロボットに送られる前にそれがチェックできたら便利だと思いません?

そう思った先人達はそういった機能、即ちエラー発見機能を作ってしまいました。


それでそれをコンパイラに搭載してしまいました。つまり、翻訳の時に間違いがあったら

「ここおかしいぞ」と教えてくれるようなものを作ってしまったのです。

これによってコンパイラの機能は「翻訳」だけではなく、「エラー検出」も加わることになり、

文字通りプログラムの編集者として世に送り出されることになったのです。(ということらしいです)


因みに現実の翻訳家は明らかに文法とかがおかしかったりしても、

大体翻訳家の方で勝手に脳内修正して翻訳するらしいのでまだ翻訳作業に関しては現実の方が上ですね。


あ。エラーの検知といっても、明らかにやりたいことと違うプログラムを書いたり、括弧がなかったりしても

文法的にさえあっていれば、コンパイルは大体通っちゃうので

コンパイルが通ったからと言って実際に動かしたいように動くかというと、それはまた別の話だったりします。

これは現実の翻訳家でも同じですね。「これ明らかにおかしいだろー」って文章があっても、

とりあえず原文を尊重して原文のまま訳すのが翻訳家の仕事ですから。
まぁ最近は原文の著者に確認を取るケースも増えてきているらしいですが・・・


という訳でこの「翻訳」と「エラー検知」がコンパイラの2つの大きな役割です。という記事でした。

なのでコンパイルが正しく行われないと、プログラムを実行したり、ロボットに送ったり、ができないようになっています。

つまり、プログラムをロボットに送る前には必ず「コンパイル」という手順を踏まないといけません。


それを踏まないままプログラムを送信したり、実行しても、送ったプログラムは実行されません。

その場合は何も実行されないor最後にコンパイルして送信したプログラムが実行されるような仕様になっています。


因みにROBOLABNTX-GとかNQCNXCNBCの場合はプログラムの送信ボタンを押すと、

勝手にコンパイル+送信を一気にやってくれていたりします。


(^・ω・)ノRadiumProduction in RoboCupJunior
また新しいカテゴリーができてしまいました。回路がアリならプログラムもアリだろ!っていう発想で作ってみました。


まぁ。今回は一回目ということもありますので昔お世話になったROBOLABについての記事を書こうと思ったのですが、

ROBOLABってよくよく考えたらタイル式なので、紹介をするのにいちいちタイルの写真が必要になってしまう・・・

これは非常にめんどくさいのでいきなり「C言語」というものを紹介しようかと思っています。

まぁ今日は簡単なところから、

まず、C言語ってなんでしょう。とりあえず調べてみたら・・・

C言語(Cげんご)は、1972年にAT&Tベル研究所のデニス・リッチー (Dennis M. Ritchie) が主体となって作ったプログラミング言語である。英語圏では単に C と呼称されており、日本でも文書や文脈によっては同様に C と呼称される。 UNIXの移植性を高めるために開発された経緯から、オペレーティングシステムカーネル向けの低レベルな記述ができることを特徴としている。byうぃきぺでぃあ

へぇ。結構新しいんだ・・・。なんてことは置いておいて。

要するにプラグラムするための言語なんです。ソフトのことじゃないんです。

言語というからには、どこかの世界で通じる言葉なんですよね。


じゃあどこの世界でこの言葉は通じるのか。

とりあえず、地球上でこの言葉が通じるのは人間とコンパイラというものだけです。ロボットには通じません。



まぁこの辺でふたつほど疑問が出てきますよね。

コンパイラって何?ということと、ロボットには通じない?というあたりでしょうか。

このふたつの疑問、これは人間がロボットにプログラムを送る仕組みを説明すれば、同時に理解することができます。

まぁ、普通は人間がプログラムを書いてそれをロボットに送るので順序的には人間が一番最初になりますが、

それだと説明が難しいので、今回はあえて一番最後にあたるロボットから説明をしていこうと思います。



まずロボット、この中には小さいコンピューター、「マイコン」が入っていて、

それが人間でいう脳になってロボットを動かしている、という話はしたかと思います。


でもその脳はちょっと頭が悪い・・・というより人間の頭の構造とだいぶ違うので、

人間が理解できるような、文字で書かれた言語なんてものは到底理解できないんです。

じゃあマイコンはどんな言語が理解できるか、それは数字です。しかも1と0だけの二進法でしか理解ができません。

つまり、PCからロボットに送るプログラムは、1と0の羅列だけで表現しなくてはなりません。


でも、人間が直接そんな1と0との羅列だけで表されたプログラムなんか書けると思いますか?


まぁ一般人には無理ですね。なので人間側はわかりやすいように文字でプログラムを書く訳です。

でも、それでは使う言語が違うので人間は直接ロボットに命令を与える(プログラムを送る)ことができないですよね。

日本語のできないアメリカ人と、英語のできない高専生では会話になりませんよね。それと同じです。


そこで何が必要かというと・・・何が必要だと思います?まぁ現実の世界だと・・・




通訳ですよね(笑)

まぁそれ同じように、人間が書いた言語とロボットが理解できる1と0の羅列、これを機械語といいますが、

このふたつを翻訳できる「なにか」が必要になるわけです。

まぁその何かが翻訳機「コンパイラ」という訳です。

まぁこれはソフト・・・の部類なのかな?一応exeファイルだし。

まぁこれに人間が書いた言語を入れると勝手にロボットが理解できる機械語に変換してくれるよーっていう代物です。


という訳でプログラムを送る流れとしては、



人間がPCの前の椅子に座る

PCの電源を入れる

パスワードを入れてOSを起動させる

プログラムを書く

打ち間違える

打ち直す

プログラムが完成する

コンパイルさせる

コンパイルされたファイル(機械語)をロボットに送る。

ロボットが動く

ロボカップジュニアで世界優勝!


といった感じです。だったらいいなぁ。

まぁそういうことなので人が書いたプログラムは直接ロボットに送っても理解されず、

コンパイラという翻訳機にしか理解してもらえない。という訳です。


因みに一時期うちの学校で、人間相互でC言語を使ってコミュニケーションを図っていたこともありましたが、

あれはどうにお勧めできません。やっぱりC言語は人対コンパイラの構図以外では使わない方が無難です。


まぁそんな感じのC言語です。

まぁこのようにコンパイラがあって、プログラムを一度変換して実行や送信をしなくてはいけない言語を

「手続き型言語」と呼びます。その中でもこういった形式の言語はコンパイラ言語と呼びますね。

BとかCとかDとかがこれに該当しますね。あとはJAVAとかC++とかもそうですね。あとTex(言・・・語・・・?)とか・・・

LEGOでいうならNQC、NXC、RobotC全部そうですね。ROBOLABNXT-Gも中身はコンパイラ言語です。


それと対照にコンパイルが入らない言語もあります。

それを「スプリクト言語」といいます。

これはなんでコンパイルがいらんかというと、基本的にこの言語たちはPC内でしか使わない言語なんですね。

だからわざわざ機械語に翻訳しなくても理解できちゃうんです。(まぁホントはちょっと違うけど・・・)

特にWeb系列の言語には多いですね、JAVAスプリクトとかHTMLとかパイソンやエクセルのVBAもそうじゃないかな?

一部怪しいですが気しない方向で。

とまぁこんな感じ終わってみればC言語というよりコンパイラ言語の説明になってしまっていましたね(笑)

次回のProgram記事では、このコンパイラについてもうちっと詳しく説明します。

実際のC言語の書き方とかについては、もうちょい先になりそうですね。


ところで、回路、プログラムときたら次に来るのは・・・ロボットの機械構造・・・ですよね?

一番苦手分野なので微妙な記事になるかもですが、今後はLEGOブロックに関してを中心に

機械構造についてのカテゴリーも増やしていこうかと考えております。

それでは。

(^・ω・)ノRadiumProduction in RoboCupJunior
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最新CM
[05/09 ONE RoboCuper]
[05/07 HDD ほしいよー]
[04/21 ブラック3辛]
[12/26 bols-blue]
[06/08 ONE RoboCuper]
かうんた
カウンター カウンター
らじぷろ目次
らじぷろ検索機
プロフィール
HN:
Luz
性別:
男性

PR

忍者ブログ 2007-2021,Powered by Radium-Luz-Lα+-Rescatar in RadiumProduction [PR]


Related Posts Plugin for WordPress, Blogger...