忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

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

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

ということなので、うちの部活も駆り出されることになりました。

参加される方は何処かでお会いするかもしれませんね。


今日は研究室での活動が凄かったです。

今日の活動は・・・ゲーム作り(笑)

あれ?本来の研究の趣旨からだいぶ脱線しているような・・・どんどん違う方向に突っ走っている今日この頃でした。

しかも今日は言うことを聞く気配がまるで感じられないびすたん(vistaの通称)に

プログラミング環境を構築するだけで終わりました。っていうかVisual C++全然インスト-ル終わらないし・・・



しかも今回、4人で作ることになったのですが、なんと4人全員が違う言語で書かないといけないなんて制約が。

とりあえずCとJavaとHSPとRubyに別れましたが、

Rubyの子は環境構成が終わらず、HSPの子はプログラムの書き方の勉強止まり、Javaの子は何もできず・・・。

Cの自分は若干でもプログラムが進んだので良しとしましょう。


やっぱり研究室で使うPCにびすたん割り当てたのはまずかったかなぁ。funキーなんか浮いてるし。


因みに部活の方はと言いますと、今週のノルマが終わって部品がないので何も出来ずに終わりました。

とりあえず明日学校行く前に部品買って、先に進みたいと思います。

それでは今日はこのへんで。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今回は文字列の扱い方についてです。

前回の記事で、文字列は、配列やポインタで表現するという説明を致しました。

今回はその続きからです。


例えば、配列を使う場合、これに関しましては、前回の記事でも触れましたが、

char型の配列要素一つにつき、半角英数一文字が格納できるようになっています。

つまり、配列を使って文字列を格納する際には、

納する文字の数だけの要素のある配列を用意すれば良いということになるかと思うのですが・・・


実際にはちょっと違います。

実は、文字列と文字いうものは、それそれ1セットで一つの情報という扱いですが、

これだと文字と文字列との区別がつきません。

ということで、文字列であることを示すために、文字列には最後の文字の次に\0という記号が含まれます。

これはNull文字と呼ばれ、NULLとも表記されます。

つまりNULL文字の分を含めて

最低でも、格納したい文字数+1個の要素数の配列が必要になるわけです。


例えば、配列sにrobocupという文字列を格納しようとするとこうなります。

char s[8]="robocup";

ここで注意しないといけないのが、この文が変数の宣言文だという点です。

実は、配列に文字列を格納する場合は%sを使ってscanfで読み取るか、初期化の際に代入するか、

または専用の関数を使用するかしかありません。

つまり普通の変数のように、後から

s=" robocup";

という感じにはできないということです。


また、文字の時は'でくくりましたが、文字列の場合は"でくくわれています。ここも注意すべき点ですね。

これはなんで変わってくるかといいますと、ポインタがまた関わってきます。

まぁこの件は配列とポインタの関係の理解が必要なので今回は割愛します。


と、いう訳で、これが配列における文字列の扱い方です。

次回はポインタにおける文字列の扱い方について紹介します。

(^・ω・)ノ RadiumProduction in RoboCup Junior
今回は文字列についての記事です。

まずは文字について、

例えば、文字といえば、a、b、cこんな感じですよね。

C言語における文字というのは半角英数一文字を指します。

この文字というもの、0と1しか理解出来ないコンピューターに理解させる為にはどうしましょうか。

0と1となると2進数、2進数は数字ですよね。

つまり文字を数字に置き換えてやればいいですよね。

という訳でCに限らず、プログラミングにおいては、文字は数字で表現します。

だから例えばaをコンピューターで表す時には0を使って、bを表す時は1を使って・・・と決めることで、コンピューター上で文字を扱えるようにしている訳ですね。


具体的には文字ひとつで1バイト、つまり0から255までの数字で表現されています。

この文字と数字の対応を決定しているのが、所謂文字コードというものです。
文字化けとかの原因はこの文字コードの設定の不一致によるものですよね。

まぁ文字コードにも色々ありますが、C言語だと、半角英数にはASCIIを、全角にはシフトJISが使われます。

だから、コンピューター上で文字を表す時はこの文字コードに従って数字を入力すればいいわけです。

まぁでも流石にそれはいちいちコードを調べなくてはいけないので面倒ですよね。

という訳で、C言語では、文字は'a'という風に、'で囲ってやることで、表現できるようになっています。


文字を変数に入れる場合はchar型の変数を使用します。

例えばこんなふうに

char c = 'a';

これでaが変数cに代入されました。

この状態で出力を行うと・・・

printf("%c",c);

aという文字が出力されます。char型変数を使う際には%cを使うところはもう大丈夫ですよね。


これが文字です。

では文字列とは何でしょうか。

文字の列、文字の集まり、

つまり、abc等の二文字以上の文字の並びのことですね。

この場合の扱いはどうなるでしょうか。

実はC言語には、文字を扱う変数はありますが、文字列を扱う変数はないんです。

つまり、他の変数のような使い方はできないんです。

ならどのようにするか、という話ですが、変数を使って順列のデータを操作する方法が2種類程ありましたよね。

例えば、配列、例えば、ポインタ

こういったものがそれに該当します。

と、いうことは・・・コンピューター上では文字列はchar型の配列やポインタで表現できるということです。

つまり、配列で考えると、1要素ごとに文字列の一文字分が格納されることになるわけですね。


只、ここで気をつけないといけない点は、配列を使う際とポインタを使う際では微妙に扱いが異なってきてしまうのです。

次回は、この配列の時とポインタの時の違いをプログラムを書きながら紹介していこうと思います。

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

(^・ω・)ノ RadiumProduction in RoboCup Junior
今回はポインタの続きです。

前回までで、ポインタと変数の関係についてつらつらと書いていったかと思います。

今回の記事ではここら辺を実際のプログラムを使ってもう一度書いていこうと思います。

と、いう訳で早速プログラムです。

int main(void)
{
int x=5;
int y=2;
int *p;
printf("%d",x);
printf("%p",&x);
p=&x;
printf("%d",*p);
printf("%p",p);
p=&y;
printf("%d",*p);
printf("%p",p);

return 0;
}

例えばこんなプログラムがあったとしましょう。

まず一番目のprintfでは、xの値である5が出力されるのは大丈夫ですね。

じゃあ二番目のprintfは何でしょう。

二番目のprintfは変数xのアドレスになりますので、


わかりません(笑)


変数のアドレスがどうなるかは、その時のメモリーの空き具合によって変わりますので、

プログラムを実行する度に変わってきてくるのです。

因みにアドレスを出力する際には%pを使います。

そして三番目のprintf、ここでは前にpにxのアドレスを代入していることから、これはxの値である5が出力されます。

同様に四番目のprintfは・・・xのアドレスなので此方も不明ですね。

まぁ、二番目のprintfの結果と同じ値が出力されることになります。

そして五番目、ここでは、既にpに新たな変数yのアドレスが代入されていますね。

ということは、ここで出力されるのは、yの値である2になる訳です。

同様に六番目のprintfは変数yのアドレスになります。これもxと同様に数値そのものはわかりませんが、

xのアドレスとyのアドレスが一致することはありませんので、二番目、四番目の値とは異なる値になるはずです。

また、こんなプログラムになると出力はどうなるでしょう。

int main(void)
{
int x=5;
int y=2;
int *p;

p=&x;
*p+=y;
printf("%d",*p);
printf("%d",x);

return 0;
}

このプログラムの場合、まずはポインタpに変数xのアドレスを代入しています。

そしてさらに、そのポインタpの示す値に変数yの値を加えています。

ということなので、一番目のprintfが出力するのは5+2なので7となります。

二番目はと言いますと、pにはxのアドレスがありますので、pがxのアドレスと一致している間は必ず
*p=xとなります。

よって二番目の出力も7ということになります。


こんな感じで、片方が変わればもう片方も変わる。

こういった同期する仕様になっているので、ちゃんと使えば非常に便利ですが、

やっぱり値の変動とか、そもそも今どのポインタがどの変数を示しているのか等、

一目ではわかりにくい部分がどうしても出てきてしまいます。


だから難しい、だからわからない。こうなる訳です。

まぁこれに関しては、正直慣れが一番の特効薬ではないでしょうか。

最初のうちはわかりません。常識です。でもやっていればそのうち慣れてくると思います。



さて、ここまできて一つ疑問に思うのが、「これ、何に使うんだ?」というところでしょう。

だって変数のアドレスがわかったって・・・ん?

ってなりますよね。

実はこのポインタ、例えば関数とか、配列とか、文字列とか、構造体とか、

そこら辺と兼ね合わせて使うことが殆どになります。

まぁこれらの話は後程するとして、まずは先程ちょろっと出てきた文字列や構造体について紹介していこうと思います。


まぁそんなところで今日は終了です。

(^・ω・)ノ RadiumProduction in RoboCup Junior
以前に、変数について紹介した記事があったかと思います。


その時に、変数の値を計算する場合についてのことが書かれていました。

単純な四則演算、つまり足す、引く、掛ける、割る、の4つの計算の方法ですね。


この時は、この4つの演算についてしか記述しませんでしたが、

実はC言語で行うことのできる演算はまだまだ他にも沢山あったりするのです。


今日はそのことについて紹介していこうと思います。


・・・とその前に。まずは演算子と言う言葉の話から。

演算子と言うのは、「この演算をしますよ」という一種の命令みたいなものです。例えば足し算だったら+だし、引き算だったら-になりますね。

普通の計算でもそうですが、

演算子は演算をする際には必ず必要になってくる上、行う演算によって表記も変わってきますので、

この演算子をまず理解できないと、実際にどういった演算が行われているかが理解できなくなってしまうのです。


と云うわけで、これから紹介する演算では、演算と演算子、合わせて紹介を行っていくことにします。

まぁ今回紹介するのは演算子のなかでもほんの一部、特にメジャーな演算子のみとさせていただきます。


まずはインクリメント演算子。++とかです。

これらは何かというと、要するに今の変数に1足しますよ。という命令です。実際に書いてみると、

x++;

このような感じになります。これだと、変数xに1足すと言う意味になります。

既存のxの値に1足すという命令なので、xに元々何かしらの数字が入っていないと多分エラーか警告を吐くと思います。


因みにこのインクリメント演算子、前置式と後置式がありまして、前置式は++x;、後置式はx++;と表記します。

これはまぁどちらも変数xに1を足すという意味になるのですが、実はほんのちょっとだけ意味が変わってきます。

変わってくるのは例えばこういった場合。

int X=0;

printf("%d",++x);

例えばこの場合、表示される数は、xに1足されるので1になります。


でもこっちの場合はというと・・・

int X=0;

printf("%d",x++);


なんと0になるのです。


というのも、実は++xの場合は演算を実行してからprintfにxの値を送信しているので

xは1の状態でprintfに送られているのですが、

x++の場合はprintfにxの値を送信してから演算を実行しているのです。

つまり最終的にプログラムではxの値はどちらも1になっているのに、

printfの出力結果はx++と++xで変わってきてしまうのです。

こういった演算子がインクリメント演算子です。

また、同様に--で表記するデクリメント演算子と言う演算子もあります。

これはインクリメント演算子とは真逆で、元の値から1引くと言う演算になっています。


次に紹介するのは論理演算子と言う演算子です。

論理演算子にも色々ありますが、今日紹介するのは&&と||です。

前者が論理&演算子、後者が論理OR演算子と呼ばれる演算子です。

文章で説明するのもいいですが、結構面倒なので実際のプログラムで説明します。


まずは論理&演算子です。例えば論理&演算子だとこんなプログラムが書けます。

if((x==5) && (y==2))

これだと、&&演算子を使うことで、ifの条件が、xが5のときとyが2のとき、両方が成立している場合になります。

このように、論理&演算子では、

「複数の条件が同時に成立している」という条件を作り出すことができる演算子と言うことになります。


同様に論理OR演算子の場合はこのようなプログラムが書けます。

if((x==5) || (y==2))

これだと、||演算子を使うことで、ifの条件が、xが5のときとyが2のとき、どちらかが成立している場合になります。

このように、論理OR演算子では、

「複数の条件のどちらかが成立している」という条件を作り出すことができる演算子と言うことになります。


つまり、この演算子を使うことによってROBOLABやNXT-Gでいう、複合分岐がたった一行で書くことができると言う訳です。

特にロボット等の組み込みプログラムだと、あれやこれやと意味不明な条件の複合が大量に出現しますので、

これを使用することで非常に便利にプログラムを記述することができるようになります。


と云うわけで今日は演算子と演算の紹介でした。演算にはまだまだ沢山の種類が存在しますし、

演算によって優先度なんかも発生したりしますので今後はこういった内容についても記述していこうと思います。
例えばさんすうの世界でも、+より×の方が、×より更に()の方が優先度が高いですよね。

という訳で今日の記事はこの辺で。

(^・ω・)ノRadiumProduction in RoboCup Junior
前回の記事では、ポインタってなんなんだ?というお話をしましたね。

今回の記事は、ポインタの宣言の仕方や使い方について書いていこうと思います。


まずはポインタの宣言の方法から、

例えば、ポインタpを宣言するにはこんな風に記述します。

int *p;

変数の宣言と似ていますね。というか、間に*を入れるだけです。

これで、int型のポインタpを宣言することができました。

ここで注意するところは、ポインタを宣言する際は、使用する型の扱いについてです。

これは、実際にポインタに代入するアドレスの指し示す変数の型に合わせる必要があります。

つまり、今宣言したポインタpは、int型の変数のアドレスを格納できるということになります。


次は変数のアドレスの表現方法です。

例えば、変数xのアドレスは以下のように表現できます。

&x

つまり、変数名の前に&をつけてやることで、その変数のアドレスは表現することができる訳です。

だから、ポインタpに変数xのアドレスを代入しようと思ったら、

p=&x;

となりますね。

逆に、ポインタを使って変数の値を表現することもできます。

さっきの続きで、例えば、ポインタpが指し示す変数の値を示す時は、

*p

となります。だから今度はポインタの前に*をつけてやることで、そのポインタが指し示す変数の値、

つまりこの場合、変数xの値になる訳です。


だからこの場合、xと*p、&xとpはそれぞれ同じ値を示すことになります。


まずはここがちょっとややこしいですね。変数が&でポインタが*で・・・

宣言だけでこんなややこしいのがポインタです。

Cの中でも、特に難しいと言われる理由がわかって頂けたのではないかと思います。


次回の記事では、実際にポインタを使ったプログラムを書いてみようと思います。

それではまた次回ー。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今日はイオンの5%OFFの日ですね。


今回の記事はポインタについてです。

今回は一回目なので、また例の如く、ポインタってなんなんだ!?という概念的な説明を行います。


ポインタはC言語の基本のなかでは最上級に難しい部類に入りますので、

ここが理解できるかどうかで、C言語が出来るようになるかどうかが決まると言っても言い過ぎではないと思います。

というわけで内容に入る訳ですが、まずポインタの前に、アドレスというものについて紹介します。


アドレスとは、端的にいうと、変数の格納場所を示す数列です。住所みたいなものですね。

コンピューターの場合、変数は一次元で配列されていますので、

上から何番目の変数かが分かればそこが指し示す変数は一つに特定されます。

実際にはアドレスは、メモリ内における変数の値の保存場所だと思って頂ければ大丈夫です。


それでポインタというのは、そのアドレスを保存する変数という位置づけけになります。だから変数の仲間のようなものです。

このアドレスをポインタに格納することによってプログラムをもって効率的に走らせることが出来るのですが・・・

ちょっと複雑なので、今まで以上に記事を分けて紹介することになるかと思われます。

という訳で、今日の記事はこのくらいで。

最近NXTやってないなぁ。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今回の記事はbitとbyteについてです。


まずはbitについて。

bitとは引数プログラムのデータに構造における最小単位のことです。

この単位は2進数でいう一桁に相当するもので、中には0か1かの数字が入っています。

なので1桁の2進数なら1bit、2桁の2進数なら2bitに相当する訳です。

だからよくプログラムでは、2進数の何桁目かを何bit目と呼ぶことが多いです。

そして、8bit、つまり2進数8個で1byteになります。

つまり2byteで16bitになる訳ですね。

これがbitとbyteの概念です。


因みにbyteの上位にwordというものもありますが、

定義が場合によって2byteだったり4byteだったりして、わかりにくいのであまり使われません。



基本的にレジスタのサイズだとか、変数のサイズだとか、

コンピューターにおけるデータのサイズはだいたいこのbitとbyteで表現されます。
HDDも○○G byteですからね。

特にレジスタにおいては、どこでもかしこでもbit単位で表記がされていますので、非常に重要になってきます。


という訳で、今回はbitとbyteについて紹介しました。

このbitとbyteにはデジタル回路だと、信号線の数にも相当させることもできます。

このことに関しましては、また今度紹介しようと思いますのでよろしくお願いします。


それではまた次回の記事でー。

(^・ω・)ノ RadiumProduction in RoboCup Junior
最近更新速度が右肩あがりなので久しぶりに思えますが、実はまだ二週間も立っていない配列の記事の続きです。

前回は、基本的な配列の使い方についての紹介を行いました。

今回は、タイトルにもあるように、配列についての実践的な使い方について紹介します。


まずはカウンタ変数を使った配列の実践例

例えば、配列の要素全てを連続で読み出したい、または書き込みたい場合に使われます。

配列の要素は数字で番号が振られていて、[ ]内に書かれますよね。

実はその数字、そのプログラム内で数字と判断できるものは何を書いてもいいんです。

従って当然、変数の名前を書いてもそれは有効なんです。

たがらこういうこともできます。

#include"stdio.h"
#define NUM 5

int main(void)
{
  int i;
  int data[NUM]


  for(i=0;i<NUM;i++)
    {
    data[i]=i;
    }

  for(i=0;i<NUM;i++)
    {
    prinft("%d",data[i]);
    }

}



このようにfor文を利用することで、いちいち全ての要素のプログラムを記述しなくとも

要素の書き込みや読み込みを連続して行うことが出来るのです。


次は関数の引数に配列を使う実践例です。

前に関数の引数の話はしましたが、普通の変数の場合は引数となった変数のデータは関数にコピーされます。

従ってどんなに関数にコピーされた引数が変更されようと、元の変数に影響はありません。


しかし、配列の場合はそうではありません。

配列の場合、要素単体を引数とする場合は変数と同じように関数側の値を変えても要素に影響はありませんが、

配列そのものを引数とする場合は、引き渡した関数側の配列の中身を変えると、元の配列の中身も変化してしまうのです。

これにはアドレスというものが深く関わっていますが、ここでは一先ず触れないことにしておきましょう。

つまりプログラムにすると、

#include"stdio.h"
#define NUM 5

void input(int a;int x[])
{
  x[1]=5;
  a=5;
}

int main(void)
{
  int i;
  int data[NUM]


  for(i=0;i<NUM;i++)
    {
    data[i]=i;
    }

  input(data[0],data);

  for(i=0;i<NUM;i++)
    {
    prinft("%d",data[i]);
    }

}

この時、関数inputの前ではdata[0]=0、data[1]=1になっていますね。

しかし、関数inputの後ではdata[0]は0のままですが、data[1]は5に変わってしまっているのです。

配列の名前が違うのでややこしいですが、配列の場合は、引数として引き渡すと、

元の配列と引渡し先の関数の配列名前は違っても要素の中身は同じになるのです。


これが配列の大きなな特徴です。これは非常に意味があって、アドレスを習ったり、配列をもっと複雑に使うようになると

この重要さが理解できるようになると思います。

因みに配列を引数として呼ぶ場合は、メイン文の方の引数の部分(実引数)は配列名だけにしてください。

それで関数の方(仮引数)は普通に配列の定義と同じように記述して下さい。一次元配列の場合は要素の所は空でも大丈夫です。



最後に紹介するのは多次元配列です。

C言語では、多次元配列と言って、配列の中に配列配列IN配列を作成することができます。

多次元配列の定義はこんな感じ。

int x [4][5];

こんな風に[]の数を後ろから増やしていく形式を取ります。これでx[4]を一つの要素とした要素5個の配列を作った訳です。

要素の総数は4×5で20個ですね。


forの2重ループで2次元平面での座標取りなんかをする場合に非常に便利です。

この他の使用方法は他の配列をまぁ大差ありません。同じように使うことができますね。

また、2次元だけでなく、3次元、4次元と、同じようにすればもっと大きな多次元配列も作成できます。



配列の実践的な用法はこんな感じでしょうか。実践と言いつつ、実用的なプログラムが一切出て来なかったのは仕様です。

「実用なんたら・・・って名前の授業ほど実用性がない」という例の高専の法則に肖ってみたつもりです。内輪ネタですね。


という訳で名ばかりの実践編は以上です。配列についてはひと通り書いたつもりですが、まだ、色々残ってはいるので、

この先もっと他の構文についての説明が終わった辺りでまた紹介したいと思います。

それでは今回はこのへんで


(^・ω・)ノ RadiumProduction in RoboCup Junior

さて、いつ以来でしょうか。

去年の後期中間で一人勝ちした電磁気以来のようですね。


という訳で配列の記事です。前回の記事は此方


前回は、配列とは、複数の変数を要素という形で同時に宣言して便利に使えるよーというものであることを説明しました。

今回は実際に配列の宣言の方法、使い方について説明します。

まずは配列xを宣言してみましょう。

配列は変数と同じように名前を持っていて、変数と同じように宣言をすることができます。


基本的な配列の宣言方法はこんな感じです。

int x[5];

これでint型の配列を5個宣言することができました。配列の型はそのまま配列の要素の型になります。

そして配列に値を入れるときはこのようにします。

x[0]=1;

これで配列xの番目の要素に1が入りました。

配列に値を入れるというより、配列の要素に値を入れるという方が正しい表現ですね。

実は配列そのものは抽象的な概念なので実体を持つものではありません。

要するに配列名(ここでいうx)というのは電車の名称で、配列の要素というのは電車の車両という訳です。

皆さんは電車に乗るとき、電車の車両に乗りますよね?車両以外の部分には乗らないはずです。

それと同じで、配列も値を代入するときには「要素」に代入するんです。

そしてここで注意するべきなのは、要素の番号です。

電車の場合は一号車、2号車という風に、番号は1から始まっていますが、

配列・・・というより一般的にプログラムの世界では、数字の始まりは0からなのです。

つまり配列も、0番目の要素、1番目の要素・・・という風になっています。


なのでint x[5];で配列を5個定義すると、使える要素は

x[0]、x[1]、x[2]、x[3]、x[4]

の5個なのです。x[5]は5番目ですが、6個目なので使えません。


まぁこれが配列で注意するべきところでしょうか。これさえわかれば配列はもう自由に使うことができると思います。


只、例えば普通の変数だと、int x=5;のように、変数の宣言と同時に初期値を代入することができましたが、

配列はint x[5]=5;で初期化はできません。値が実際に格納されるのは要素の方ですからね。

配列で宣言時に値を代入するときには次のような方法を用います。

int x[5]={0,1,2,3,4};

このように、中括弧でくくってカンマで分けます。これで0から順番に要素の初期値を代入することができます。


基本的な配列の使い方は以上です。

まぁでもこれだけだと、「複数の変数をまとめて定義出来るだけ」ですよね。

次回の記事ではこの配列のメリット、実践的な使い方について説明します。

という訳で今日はこのへんで。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今日は一日中Cのプログラムで遊んでいたらいつの間にか終わっていました。

どういうことなの・・・?

因みに明日も期末試験です。教科は政経と情報

(^・ω・)ノ RadiumProduction in RoboCup Junior
カレンダー
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...