忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

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

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

全滅が危惧された電磁気ではまさかの一人勝ちをしました。



今日は久しぶりにプログラムについての記事を書いて見ることにしました。

今日は配列についてです。

まぁまずは配列ってなんぞやというお話だけして今日は終わろうと思います。

まぁ例えば、複数の値を格納しておきたい時、

普通の変数を使うとなると・・・格納したい値の数だけ変数を宣言しなくてはなりませんよね。

int a,b,c,d,e,f,g;

みたいな感じで。


でもこれ、面倒ですよね。

というのででてくるのが配列です。

配列というのは配列の名前とその配列の番号(要素)がセットになっていて、

配列を宣言すると、その配列の1番目の要素、2番目の要素、3番目の要素・・・

という感じで複数の要素が一気に定義できます。

それでその要素それぞれが全て変数となっています。


つまり複数の変数を同時に宣言できてしまう。というのがこの配列です。

本来はもっと重要な意味があるのですが、今のところはこういうことにしておきましょう。



まぁこんなのが配列です。

次の記事ではちゃんとした宣言の仕方、使い方についてお話しします。

それでは


(^・ω・)ノ RadiumProduction in RoboCup Junior
前回までのあらすじ。

前回は関数ってなんだろなーという話から進展し、

Cにおける関数作成の流れのようなものを説明致しました。

といってもなんのこっちゃかわからない説明になりましたが・・・

という訳で今日は前回告知したように、実際に適当に関数を作って説明でもしようと思います。


今日は一先ず、与えられた値の2倍の値を返すtimeという関数でもつくってみることにしましょう。地震だー

まず、関数の宣言、これはこのように宣言します。茨城北部かぁ

int time(int num);

これでint型の関数timeが宣言されました。震度3?うそこけ!

変数の宣言と似ていますよね。茨城で震度4?


因みに()内のint numですが、

これは仮引数といってmainの関数からデータを受け取るときに受け取り先となる変数です。

この関数内であれば普通の変数として使用ができます。震源は茨城南部かぁ


次に関数の定義です。今回は与えられた数を2倍にする関数なのでこのような感じになります。

int time(int num)
{
      return num*2;
}

関数はこんな感じに定義することになります。M4.1ね
returnというのは戻り値といってこの関数がmainに返す値・・・つまり結果的に示す値となります。

この場合はnum*2となっていますのでnumの値の2倍の値が返されることになります。


最後に関数の呼び出し。

このように表記されます。

x=time(x);

変数xにtime関数の値を代入するということになります。

ここで()内のxは実引数といって、ここのxの値が引数として関数の方に(ここでは変数numに)送られます。



ここでこれを実際のプログラムにしてみましょう。23区は震度3ですね

このような感じになります

#include "stdio.h"

int time(int num);

int main(void)
{
      int x;
      printf("xの入力");
      scanf("%d",&x);
      x=time(x); 
      printf("x=%d",x);
      return0;
}

int time(int num)
{
      return num*2;
}


外部から整数xを入力することで、xの2倍の数を表示するプログラムになります。

まず関数timeを最初に宣言して、次にmain関数がきて、その中で変数xを定義、scanfで入力、

そして関数timeを呼び出します。そして関数time内で引数として送られてきたxの値を変数numに代入し、

そのnumの値を2倍したものを関数timeの値としてreturnでmain関数に返します。

それをまたxに再代入して、pirntfで出力しています。


とりあえず関数の使い方としてはこんな感じです。

また、複数の変数を引数として使いたい場合は

int time(int a,int b)

のような具合にプログラムします。

また、変数と同じように戻り値として使用したい数字の型によって関数の型を変更することができます。

戻り値を使わない関数の場合はvoid型という型を使用することも出来ます。

というわけで関数の説明は以上になります。


次は・・・なんだろう、配列ってやったっけ?(笑)

配列かポインタのどちらかになるかと思われます。

それではまた。

(^・ω・)ノ RadiumProduction in RoboCup Junior
此方も一ヶ月以上経過していますね(笑)

とりあえず前回のお話は関数って何?という定義的なことを説明した、よくわからない内容でした。

今日はCにおける関数の作り方ということで書かせて頂きます。


C言語における関数というのは、所謂命令の塊のようなものです。


例えば、関数にaという数字が入ると、様々な動作をして、最終的にbという値を返す。みたいな関数もあれば

関数にcという数字が入るだけでdのような処理をする。というような関数もあります。

ロボットでいうと、前者がセンサーの値を取得する関数。後者がモーターを動かす関数等に例えられますね。

今まで普通に使っていたセンサーの値を取得する命令や、モーターを動かす命令といったものも

まぁ要するにすべて関数だと、云う訳です。

まぁそんな関数ですが、関数はいったいどうやって作ってどうやって使うのか。

これは基本的に3つのプロセスに分けて考えられます。


まずは関数の宣言。

このプログラムでは、このような関数を使いますよー、ということを最初に定義する必要があるのです。

まぁこの定義を宣言と言ったりするので関数の宣言と表記しています。


次が関数の定義

上の定義とごっちゃになりますが、此方の定義は関数そのものの定義です。

この関数はどういった関数なのか。どういう動作をするのかということを定義する関数です。

つまり、モーターの関数ならモーターを動かすのに必要な命令が、

センサーの関数ならセンサーの値取得に必要な命令がすべて詰まっているという訳です。

関数制作の上で一番の中心となっているのがこの部分でしょう。


そして最後は関数の呼び出し。

これは簡単で、関数を使いたい時に使う呼び出しです。

ROBOLABだったらあのタイルその物がそれに該当するし、NCXだったらOnFwd等の文章全てがそれに該当します。

C言語においては、これは関数名を使って呼び出すことになるので、

関数宣言や定義のところで決めることになる関数の名前はとても重要になってきます。



まぁここまで聞けばわかるでしょうが、実はROBOLABってプログラミングソフトというより、

関数の呼び出しを羅列するだけのソフトだったりするんですね。
まぁ普通はどんなソフトでもそうなんですが・・・ROBOLABは特にその傾向が・・・


だからROBOLABはあまり関数そのものを作ったりすることには適していないような作りになっています。

まぁできなくもないといえばできなくもないんですけどね。ROBOLABだと新たに関数を作るメリットは少ないかな・・・

ROBOLABは普通のプログラミングソフトとはだいぶ異なり、

ジャンプ主体になりがちなのでどっちかっていうとアセンブラに近いプログラムになるんですよね。

C言語の概念とはまた違ったものでプログラムを組む必要があるので

ROBOLABからのCの乗換は結構大変だったりします。逆にNXT-Gからの方が楽かもね。



まぁという感じで関数の組み方のお話は以上です。


といってもこれじゃなんのこっちゃかわかりゃしないので次の記事で実際に関数をC言語で作ってみようと思います。

それでは。

(^・ω・)ノ RadiumProduction in RoboCup Junior
ずいぶん前になりますが、前回のプログラムの記事の中で、ヘッダのお話をいたしました。

これはどういうものかというと、ディレクティブのひとつで、#includeというものがあったと思うのですが、

これを使って別のファイルから関数を読み出す・・なんてことを書きました。

今日はその関数ってなんぞやという話です。


関数というのは、元々函数という漢字で書かれていて(函館の函ですね)

その名の通り何かを入れる函という意味のものです。(現在では函が当用漢字でなくなったため関になりました。)

数学的な定義を言うと、「ある変数に依存して決まる値、あるいはその対応を表す式」ということになります。
数の集合に値を取る写像、という定義の方が今は使われるようですが、
色々説明要素が多そうなので上のもので説明することにします。


某ライなんとかさんがそれを提唱して、今ではそれが一般化、様々なものに応用されてきています。

例えばsinとかcosとかtanとか、logとかΣとか∫とか、こういったものは全て関数です。

もっと簡単にいえば、y=ax+b。せんけー方程式の、一次方程式の一般式ですね。

これは、定数a、bが分かっていれば、変数yの値は変数xに依存して決定されます。

こんなことは小学校でもやる常識ですが、このy、これは実は関数なのです。

上記した、関数の定義、「ある変数に依存して決まる値、あるいはその対応を表す式」

ここでのある変数というのがx、依存して決まる値というのはy、

そしてその対応を表す式というのはy=ax+bという式そのもの。

つまりyは関数であることが分かります。

そしてyはxによって変化されます。なのでyとxの関係を示すために「yはxの関数」と言うのが一般的です。

そしてその関数の中の式、つまりyの中身を表す式がy=ax+bとなるわけです。

だって=というのは数学では等価という意味ですからね。


これが本来の関数というものです。

そしてこれはプログラムにも応用されています。

プログラムでは主に関数はプログラムの簡略化、高速化、小型化等を目的としていて、

数学の関数と違い、プログラムでの関数というものは、「関数の作成」が主となっています。

数学では、一般の人は既存の関数を使って計算をすることが殆どですからね。

そもそも今の時代だと数学での関数の作成→プログラムでの関数の作成という構図ができていますから、

プログラム使わずに関数を作るなんてことはそうそうないでしょう。それってもう数学の概念を作ることに等しいですからね。
上記したものも含め、数学上の一般的な関数はもう概念といってもいいようなものばかりですよ(笑)


なんて話はさておき、プログラムでは、そういった関数を自分で作るということが非常に大切になってくるわけですね。

とりあえず今日の記事はこれくらいにしておきましょう。

次の記事ではちゃんとした関数の作り方を紹介しようと思います。

(^・ω・)ノ RadiumProduction in RoboCup Junior
今日の記事はプリプロセッサについてです。

プリプロセッサってなんでしょう、という話から始まるのですが、

別に難しいものではありません。

というより、C言語を齧ったことがあって、この単語を知らない人は、

十中八九名前を知らずに使っている場合が殆どでしょう。

Cの場合(でなくとも)、使わないとほとんど何もできないに等しいですからね。



ところで、これは何かというと


・・・。

コンパイラです。

というより今のコンパイラに付属されている機能といった方が正しいでしょう。

じゃあこのプリプロセッサはどういう機能なのかと言いますと、「ある処理を実行する機能」という答えになります。

では、それはどういう処理かと言いますと、

例えば、
#include

例えば、
#define

このあたりがC言語だと一番有名でしょうね。(というより主なものを挙げるとこれしかないような・・・)

まぁあとは#ifとか#ifdefとかその類のものがあったり・・・します。

どちらも単体で意味は知っていたりするものでしょうね。



#includeは日本語にすると、「含む」とか「組み込む」という意味になります。

これは要するに別のファイルで定義した関数や定数等をプログラムで使いたいときに使用するものですね。

例えばプログラム内に、#include"stdio.h"

と書くと、stdio.hのファイル内に定義された関数等をそのプログラムで使用することができます。

この.hの拡張子のファイルはプログラムにおける、定義ファイルのようなもので、

ライブラリファイルとかヘッダファイルなどと呼ばれています。

ここにC言語の時と同じように関数や定数を定義することで、プログラムの方で#includeを記述すると

プログラム内でヘッダファイルで定義した関数等が使えるようになるというものです。

ただヘッダを作る際には場合によって、環境変数をいじらなくてはならないのでちょっとめんどくさいです。

ちなみに記述方法は2通りあって、

#include"ヘッダ名"

#include<ヘッダ名>

の2通りです。どちらでも意味は変わりません。


また、#defineは日本語にすると「定義」になります。これはそのままの意味、つまり定数を定義するのもので

#define X 10

などと書くことで数字を文字に置換することができるものです。

プログラム内にこれを記述することで、そのプログラム内ではXという文字は数字の10と同様の扱いになります。

例えば上の#defineと変数xが定義されたプログラムなら、

if(x==10)と、

if(x==X)は、同一のものとなります。



まぁこのような処理を行うものをプリプロセッサといいます。

これには大体最初に#が入っているのですぐにわかるようになっていると思います。

まぁなんでこれらが総称して、このように呼ばれているかと言いますと、

プリプロセッサに該当するものはすべて、プログラムをコンパイルした時に、

ソースそのものがコンパイルされる前に、「前処理」という形で処理されます。

まぁ要するに一番最初にコンパイルされる、という言い方が分かり易いでしょうか。(ちょっと違う気がするけど・・・)

この「前処理」を英訳すると、

前→pre

処理→process

前+処理=pre+process=preprocess

これを名詞にしてみると→preprocessor

∴ プリプロセッサという訳です。


また、このプリプロセッサを行う命令、

つまり#include#defineのことをディレクティブとか言ったりします。(この単語絶対使わないな・・・)


というわけで今日は前処理についてのお話でした。

このディレクティブについてですが、

基本的に関数の外、プログラムの一番上に宣言部としてまとめて宣言するのが通例ですね。


ちなみに僕の場合、このディレクティブ、宣言部だけで

副部長のプログラムの総量(約140行)を超えています(笑)



(^・ω・)ノ RadiumProduction in RoboCup Junior
最後に残ったC言語の主な条件文がこのswitch文です。

ちょっと前に紹介したif文の派生系みたいなものでしょうか。

基本的なswitch文のプログラムはこんな感じになります。


#include <stdio.h>
int main(void)
{
     int x;
     printf("数字を入力してください。");
     scanf("%d",&x);

     switch(x){
  
       case 1:
       printf("入力された数字は1です。/n");
       break;

       case 2:
       printf("入力された数字は2です。/n");
       break;

       case 3:
       printf("入力された数字は3です。/n");
       break;

      default:
       printf("1、2、3以外の数が入力されました。/n");
      }

     return 0;
}


数字を入力し、それが1か2か3だったら「入力された数字は~です。」と出力し、

それ以外の数字なら、「1、2、3以外の数が入力されました。」と出力するプログラムです。

switch文はこのようにcaseというものとセットで使います。

switchのカッコ内に入れた値とcaseと:の間に入れた値が等しければ、

それ以下のプログラムを実行するようになっています。

なのでxの値が1ならcase1以下の文を、2ならcase2以下の文を、3ならcase3以下の文を、それぞれ実行します。

xの値がcaseのどれにも該当しない場合はdefault以下の文を実行することになります。

このdefaultは省略することもできます。

そして最後にbreak;をつける。これがswitch文の定型となります。(defaultには無くても良い)


このbreak;という文ですが、これはbreak文といって、これもひとつの構文になっています。

これはどういう命令かというと、「一番中側の中括弧から抜ける」命令です。

例えばさっきのswitch文ですが、

あのプログラムでは例えば、case1のときの処理とcase2の間にbreakがありました。

あのプログラムだと、case1の処理が終わったら、breakを使って、switch文の中括弧から抜け出ているのです。

もしあそこでbreakをいれなかったら、xの値が1だったときに

case1の処理を行った後でcase2の処理を行ってしまうことになります。

もっと単純な例を出すと、whileでの無限ループの例、

int x=0;
while(1){
     if(x==100)
           break;
     x++;
}

このようなプログラムがどこかにあったとします。

これはwhile文で無限ループをしていますが、xが100になると、if文に入って、breakします。

つまり、このwhileループを抜けでるのです。

このようにbreakはswitch文以外でも、様々な条件文で使用することができます。


「一番中側」という定義があるのは、

こういった場合は、永遠にループから出られないということです。

int x=0;
while(1)
{
      while(1)
      {
           if(x==100)
            break;
      x++;
      }
}

中側のループはbreakで出られますが、直ぐ外側のループによってまた戻ってしまいますからね。


このような文がbreak文です。似たようなもので、continue文というものがあります。

これはbreakと逆で、ループの一番最初に戻ると言う構文です。

なのでプログラム内で、これがあれば、一番中側の中括弧の部分の一番最初に戻ると言うわけです、

つまりこれも無限ループです。


#include <stdio.h>
int main(void)
{
     int x;
     printf("数字を入力してください。");
     scanf("%d",&x);

     switch(x){
  
       case 1:
       printf("入力された数字は1です。/n");
       continue;

       case 2:
       printf("入力された数字は2です。/n");
       continue;

       case 3:
       printf("入力された数字は3です。/n");
       continue;

      default:
       printf("1、2、3以外の数が入力されました。/n");
      }

     return 0;
}

最初に1,2,3以外の数字を入力しないと、無限にループします。

コンパイラによってはこれだとエラーがでるかもしれませんけど・・・

こっちはbreakと違って、結構使いどころが限られそうな構文ですね。


とりあえず今日はswitch文とbreak文とcontinue文についての紹介でした。


次は・・・フリプロセッサかなぁ。まぁなにかしら紹介すると思います。


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


(^・ω・)ノ RadiumProduction in RoboCup Junior
条件文の続きです。

今日は前回の予告通りに「何回ループを行うか」というループを、

while文やdo~while文より簡単に作れる条件文を 紹介します。


その条件文の名前はfor文。

while文やdo~while文と同じようなル―プ形の条件文です。


ちょっと簡単なプログラムを書いてみましょうか。

#include <stdio.h>
int main(void)
{
     int i;
     for(i=1;i<=5;i++){
           printf("%d回目のループです。/n",x);
      }
     return 0;
}

例えば、こんなプログラム。

これは前回のwhile文の時にサンプルとして書いた、

このプログラムと同じ出力結果になります。


#include <stdio.h>
int main(void)
{
     int i;
     i=1;
     while(i<=5){
           printf("%d回目のループです。/n",x);
           i++;
      }
     return 0;
}


確かこれの出力結果は

1回目のループです。
2回目のループです。
3回目のループです。
4回目のループです。
5回目のループです。

となりましたよね?

上のfor文を使ったプログラムでもこれと同じ出力結果になります。

上のプログラムと下のプログラム、結果的には同じですが、書き方は全然違います。

じゃあまずどこが違うかを探してみましょう。

まずループに入る前のi=1;つまり最初にiに数字を入れる代入の式の有無があります。

while文ではありますが、for文にはありません。


その代わり、for文の条件の括弧の中に似たようなものがありますよね。

for(i=1;i<=5;i++){

この一番左の部分に

そしてこの真ん中の部分はwhile文の時の条件と同じであることがわかります。

そして一番右、i++というものですが、これはwhile文のどこかで見覚えがありませんか?


while文の下から4行目にありますよね?i++;って。確かこれはiに1を足すという、

インクリメント演算子とかいうやつでした。

これ、for文の方ではありませんよね?


違いといえば、こんなものでしょうか。この違いはどういうことかといいますと、

つまりwhile文で回数ループを行うときは、プログラム内で最初のiの値を代入する文を書いたり、

ループごとにiの値を増やすような文を個別に書かなくてはなりませんでした。


でもfor文では、それを一個一個代入したりする文をプログラム内に書く必要はなく、

全部for文の条件の中にまとめてかけるという訳です。

ここでもう一回for文の条件の部分を確認しましょう。

for(i=1;i<=5;i++){

このようになっていて、i=1とi<=5とi++がセミコロン(;)で分けられていました。

これはそれぞれ全く別の命令を示していて、

一番左の部分は「初期化」の部分と言われ、ループ前の変数の値を定義します。

そして真ん中の文がwhile文と同じ条件の文になります。

この「iが5以下である」という条件が成立する間この文を繰り返すという命令になります。

そして一番右端がループ内の処理が1回終わるごとに行う命令を記述する部分です。

今回はここにi++とありますが、これによって、このループ処理が一回行われるごとにiに1足していく処理になります。


要するにこのプログラムの場合、ループは最初i=1の状態でスタートし、iが6になるまでループを繰り返します。

そして一回ループ内の処置が終わるごとに、iの値が1ずつ増えていくようなプログラムになるのです。


これがfor文の基本構造です。

また、条件の確認の位置はwhile文と同じになるので、図にするとこのようになります。
for文の構成です。while文と全く同じですね。
実はwhile文の使いまわしだったり(笑)

とりあえずfor文は駆け足でしたが以上で終了です。


次はもうひとつだけ条件文を紹介します。

今度はif文を発展させたようなものになります。

それではー。

(^・ω・)ノRadiumProduction in RoboCup Junior
今日はなんとなくプログラムの記事の続きを書こうという気分になりました。

前回のif文の記事で記載したように、 今日はwhile文について、

それとよくwhile文と対をなして示されることの多いdo~while文について書こうと思います。

これらもif文と同じように、条件文の1種なのですが、if文はある条件が成立したらこっちの文、しなかったらこっち・・・

という風に「分岐」を作る条件でした。

でもこれからやるwhile文やdo~while文は「ある条件が成立している間この文を繰り返す」という

繰り返し、ループを作る条件文になります。


例えばこんな感じで、

#include <stdio.h>
int main(void)
{
     int i;
     i=1;
     while(i<=5){
           printf("%d回目のループです。/n",x);
           i++;
      }
     return 0;
}


またはこんな風に、

int main(void)
{
     int i;
     i=1;
     do{
           printf("%d回目のループです。/n",x);
           i++;
      }while(i<=5)
     return 0;
}


この二つのプログラムはどちらも実行の結果は

1回目のループです。
2回目のループです。
3回目のループです。
4回目のループです。
5回目のループです。

という風になります。

iが1から5の間、つまり5回分ループ回数の表示を行うプログラムです。

whille文で変数iの値と、5という数字を比較して

iの方が小さければ{ }内の命令文を繰り返すようなプログラムになっています。

iの方が大きい場合は、{ }内の処理は行われなくなるので、{ }の下のプログラムに移動します。

といってもこのプログラムの場合、return 0; とあるのでこのままプログラムは終了します。


因みに7行目のi++;という命令は変数iに1を足す。という命令で、この++をインクリメント演算子といいます。

逆の--というのもあってこれはデクリメント演算子といいます。

今、上のプログラムと下のプログラムは同じだという説明をしました。

whileとdo~while、違うものを使っているはずなのに同じになるなんておかしくありませんか?

同じになるならなぜ2つも同じものがあるのだろう。まぁこれにはちょっと訳がありまして、


この二つにある違いがあるのですが、このプログラムでは、その違いが出力結果に表れないのです。

じゃあ違いを出すにはどうするか、こうすればでてきてくれますよ。

#include <stdio.h>
int main(void)
{
     int i;
     i=10;
     while(i<=5){
           printf("%d回目のループです。/n",x);
           i++;
      }
     return 0;
}




int main(void)
{
     int i;
     i=10;
     do{
           printf("%d回目のループです。/n",x);
           i++;
      }while(i<=5)
     return 0;
}


この2つのプログラム、どこが変わったかといいますと、4行目。

i=1;がi=10;に変わっています。つまりどちらの条件式も満たさない、

つまり当てはまらないようなiの値をあらかじめ示したという訳です。


この場合、上のプログラムの実行結果は




つまり何も実行されないのですが、下のプログラムの場合、このように出力されます。

10回目のループです。

条件に当てはまっていないのに条件文内のプログラムが1回だけ実行されています。

これの原因は条件を調べるタイミングが大いに関係しています。

ちょっと図を使いましょうか。

これがwhile文の構成です。

while文の構成です。
まず最初に条件を確認し、条件が成立するなら、下の条件文を実行し、赤矢印を通って条件の確認に戻ります。

この時、条件が不成立になった時は青矢印を通って条件の外の文にジャンプします。これがwhile文です。


ところがdo~while文はこのようになっています。
do~while文の構成です。

do~while文では、先に条件内の文を実行してから、条件の確認を行い、

条件が成立すれば赤矢印のように条件内の文の最初に飛びます。

不成立の場合は青矢印のようにそのまま下の文を実行します。

つまりdo~while文はwhile文と違い、条件がどうであろうと、最低一回は必ず条件内の文を実行するのです。

これが2つの違い、先程のプログラムの出力結果の違いの訳です。



これがwhile文とdo~while文です。

また、while文の使い道としては、こんなのがあります。

#include <stdio.h>
int main(void)
{
     while(1){
           printf("お腹がすきました。/n");
      }
     return 0;
}

このプログラムは

お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
お腹がすきました。
(以下無限)

という出力、つまり無限ループを行うプログラムです。

なぜ条件の部分に1を入れると、こうなるのでしょうか、

C言語では、1というものは「真」というものを意味していて、これは「常に正しい」という意味と捉えることができます。

なので条件の中に 1 とだけ入れておくと、「この条件は常に正しい」という意味になります。

常に正しいのだから、ずっと繰り返し続ける→無限ループ、という訳です。

因みに0は「偽」、常に正しくないという意味を持っていますのでこれを条件に入れちゃうと・・・


因みにこれはdo~while文でも、もちろん行ううことができます。

以上でwhile文とdo~while文の説明は以上です。

次もまた条件文の説明です。今度は先程の一番最初のプログラムで説明したような、

変数を条件とするとこで指定した回数ループを行うようなプログラムをもっと作りやすくするための条件文を紹介します。


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

(^・ω・)ノRadiumProduction in RoboCup Junior
PICの記事は新しく作ったPICカテゴリーに移送されました。

これで少しはわかりやすくなった・・・かな?


今日は半月ほど前に書いたProgramカテゴリー記事の続きです

なんか「条件文について」ということになっているようですので、それについて書いていこうと思います。


まず条件文にある、「条件」についてですが、

条件とはなんでしょうか?


例えば、学校に行くときに自転車を使っている人がいるとしましょう。

その人は普通、天気を見て、晴れていたら自転車で、雨だったら歩いて、学校に行きますよね。

この時この人は、「天気」を判断して自転車で行くか、歩いていくかを決めますね。

この「天気」、この「天気が晴れか雨か」がこの場合の条件になっています。

まぁ図解するとこうなりますよね。
こんな感じの条件が成り立つ・・・といいな。
晴れだったら自転車、雨だったら徒歩。まぁ大体こんな感じですよね。


これが条件、つまり条件文というのはこれをC言語の文にしたもの、

つまり条件によって実行する文を変える処理構文ということです。


それでその条件に当てはまるのが、変数の値だったり、センサーの値だったり・・とする訳です。


それでこの条件文を使ったプログラムがこちら。




#include <stdio.h>
int main(void)
{
     int x;
     printf("点数を入力してください。");
     scanf("%d",&x);

     if(x>=60){
           printf("点数は%d点です。/n",x);
           printf("あなたは黒点です。/n");
      }
     else{
          printf("点数は%d点です。/n",x);
          printf("あなたは赤点です。/n");
      }
     return 0;
}




高専生おなじみの赤点判定プログラムです。

まず点数を入力させて、それが60点以上なら黒点、60点未満なら赤点を表示させる

通称「現実を見せるプログラム」です。血も涙もないプログラムとも言うそうです。

それでこのプログラムですが、最初にscanfで、値の入力を行い、そのあとでifという文があります。

これが先ほど言った条件文なのです。

このfi(条件式)で条件式が正しければ、その下の{}で括られた文を実行し、

条件式が正しくない場合は、その下のelse{}で囲われた部分の文を実行します。

このように使われるのがif文です。

因みにifの中に更にifをいれることもできるし、elseの方は省略することもできます。

さらに言うとelseの部分を、else if(条件文)と書く事で、上のif文の条件が正しくなかったときに更にif文を作る、

みたいなプログラムを作ることもできます。



とりあえずこれが基本的なifの条件式の書き方です。

でも、実はまだ条件分というのはあったりします。


今度の記事では、これ以外の条件文に付いて書いていこうと考えています。

それではー


(^・ω・)ノRadiumProduction in RoboCup Junior
改悪だろこれ。見にくい・・・(笑) 

という訳で、以前お話しした耀に今回は、scanf文のもっとコアな使い方について説明したいと思います。

前回の話では、通常はscanfの文は


こんな風や、

scanf("%c",&s);

こんな風に

scanf("%d",&x);


記述することで、キーボードから値を入力することができるものであるというで辺りで終わったかと思います。


今回はこの入力をもっと複雑に行う方法について紹介します。

例えばこんな感じのプログラム。

#include <stdio.h>
int main(void)
{
     char s;
     printf("PIC講習は終了しましたか?(y/n)");
     scanf("%[yn]",&s);
     printf("貴方の答えは%cです。",s);
     return 0;
}



このプログラムだと、scanfは小文字のyとnしか認識しません。

yかn以外の文字や数字が入力された場合は、強制的に読み取りを中止します。

つまりyかn以外の返答は無視されるようなプログラムが作成できます。


このように[]内で指定した文字のみを入力し、それ以外を入力しないシステムを、スキャン集合指定子といいます。

なんだかフィルタのようなものですよね。実際そんな感じです。



でも、この読み取る文字が例えば、数字以外、なんて感じにしたい場合に、これだと大変ですよね。

なので逆に今度は「読み取らない文字」を指定する方法を紹介します。

#include <stdio.h>
int main(void)
{
     char s;
     printf("評価を入力してください(A~Zランク)");
     scanf("%[^0123456789\n]",&s);
     printf("評価ランクは%cです。",s);
     return 0;
}

このように読み取らない文字を指定する場合は、先程と同じように指定したい文字を[]で囲います。

そして指定する文字の前に^を付けます。これで読み取らない文字の指定をすることができます。


このプログラムで読み取らない文字は0から9の数字と\nという記号です。

これは\とnではなく、\nで一つの記号を意味しています。記号の意味はズバリ、「改行」です。

C言語においては、改行を\nという記号で示しているのです。これをそのまま改行記号といいます。

だから例えばprintfで








と表示したい場合は

printf("あ




");

と記述するのではなく、

printf("あ\nい\nう\nえ\nお\n");


と記述すればいいという訳です。


また先程の0から9の指定は

scanf("%[^0-9\n]",&s);

このようにハイフンを使って簡略化することができます。

これは全てのコンパイラで対応している訳ではないんですが、

一般的に使える方法なので覚えておくとさらに便利ですね。



まだまだscanfには色々と複雑な記述方法がありますが、

scanfだけをいつまでもぐだぐだやっている訳にもいかないので、

scanfの話はこの辺で一度終了とさせていただきます。

まぁまた時間があればこの話はしていこうかな。

それで次回ですが、次回はいよいよ条件式、まずはif文について書いていこうと思います。


それではまたまた。

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

前回は文字の出力の仕方について記載したかと思います。

今度は逆に文字を入力するときについて記載しようと思います。


入力した文字(一文字)を出力するプログラムはこんな感じ




#include <stdio.h>
int main(void)
{
     char s;
     printf("文字を入力してください。");
     scanf("%c",&s);
     printf("入力された文字は%cです。",s);
     return 0;
}

数字だとこんな感じになります。

#include <stdio.h>
int main(void)
{
     int x;
     printf("数字を入力してください。");
     scanf("%d",&x);
     printf("入力された数字は%dです。",x);
     return 0;
}

とまぁこのようなプログラムになります。数字の時はint型を、

文字の時はchar型を使っている。ただそれだけの違いですね。

それで大体感じで分かるとは思いますが、このプログラムはどちらも入力された値を変数に入れて、

そのままprintfで出力するというものです。

プログラムを実行して、キーボードで文字や数字(文字の場合は一文字のみ)を入力すると、

その入力した文字が表示されるというものですね。




pirntfがわからなければこちらの記事を参照ください。


このプログラムで値の入力を行っているのが、6行目のscanfという文です。

文の書き方はprintfに似ていますね。括弧があって、””でくくわれていて・・・

一般的なscanf文の書き方はこのようになっています

scanf("変換指定文字",&値を入れたい変数名);

この変換指定文字というのがprintfでもでてきた%dや%cのことです。

int型の整数のときには%dを、char型の文字の時には%cを使います。

またfloat型やdouble型の時は一般的に、%fを使います。指数表示させたい時は%eになります。




値を入れたい変数名とはそのままの意味です。上のプログラムだとsとかxになります。

ここで重要なのが、printf文の時はカンマの後にすぐ変数名になりましたが、

scanf文の場合は、カンマと変数名の間に&が入ります。


なぜこれが必要かという話はアドレスというものを理解しなくてはなりません。

その話はこのペースだとだいぶ先になるので、今はこういうものだと割り切ってください(笑)

まぁこのような感じでscanf文は使います。


次のProgram記事ではscanf文のもうちょっと発展した使い方を紹介します。


それでは

(^・ω・)ノ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...