• ベストアンサー

プログラミングの変数の使い方について

プログラミングについておききしたいのですが、 ライントレースで左右のカーブを曲がる際に 変数を使って、「さっきは右に曲がったので次は右から曲がる」や 「さっきは左に曲がったから左から曲がる」といったプログラムは どのようにつくったらいいのでしょうか? まだ初心者なので変数をうまく使えなくて悩んでいます。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ライントレースというのが、具体的にどんなものを想定しているかよくわかりませんが。 if 「さっき左に曲った」then 右に曲がる というプログラムにしたいのなら「さっき左に曲がった」ということを「記憶」しておく必要があります。 それが「変数」の役目です。 どんな変数にするかは、何を覚えさせたいか、によります。 直前の分岐だけが対象なら、「最後に曲がった方向」変数を用意して  sub 右に曲がる { 進行方向=右 ; 最後に曲がった方向:=右 }  sub 左に曲がる { 進行方向=左 ; 最後に曲がった方向:=左 }  if 最後に曲がった方向=左 then Call 右に曲がる みたいになるだろうし、「交差点」をさっきどちらへ曲がった、ということなら、  sub 左に曲がる(交差点番号) { 進行方向=左 ; 最後に曲がった方向[交差点番号]:=左 }  if 最後に曲がった方向[交差点番号]=左 then Call 右に曲がる[交差点番号] みたいに、交差点毎に記憶させる必要があるでしょう。

shizuku4171
質問者

補足

ご回答くださってありがとうございます! 今のところ下記のような感じにできているのですが 修正点や加えた方がいい点、省略できる点はありますでしょうか? よろしくお願いします。 mainの上は省略させて頂きました。 int main(void) {  int R = 0; while(1) {  if(GetTouch(CH_2) == 1){//タッチスイッチでのON/OFFスイッチです  while(GetTouch(CH_2) == 0);  MotorPower(CH_B|CH_C, 0);  while(GetTouch(CH_2) == 1);  while(GetTouch(CH_2) == 0);  MotorPower(CH_B|CH_C, 40);  while(GetTouch(CH_2) == 1); }else{  //ここからライントレースの内容です  clock_t start,end;  clock_t start2,end2; if (GetSensor(CH_3) > kuro && R == 0) {  start = clock();  migi(CH_B|CH_C);  while(GetSensor(CH_3) > kuro){  end = clock();  start2 = clock(); if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){  hidari(CH_B|CH_C);  while(GetSensor(CH_3) > kuro);  end2 = clock();  MotorPower(CH_B|CH_C,40);  R = 1;  break; } while( R == 1 ){ if(GetSensor(CH_3) > kuro){ hidari(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); R = 0; break; }else { if(((double)(end2 - start2)/CLOCKS_PER_SEC)>0.2){ migi(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); }//ifのカッコ }//whileのカッコ }//elseのカッコ }//whileのカッコ }//ifのカッコ }//elseのカッコ }//whileのカッコ }//mainのカッコ

その他の回答 (1)

  • Willyt
  • ベストアンサー率25% (2858/11131)
回答No.1

コンピュ-タは幾何的な情報を扱うのは大変難しいのです。左カーブ、右カーブを表現するのは高度なテクニックが必要です。曲がったかどうかは座標の二回微分がゼロであるかどうかで分るのですが、そのプラスマイナスをどう決めるかは座標系の採り方で変わって来るのです。通常はZ軸を上にとる場合、X→Y への変化は反時計回りですが、これを時計回りにすると、符号が逆になります。これに留意し、データの二回差分の符号を判定して行けばいいのです。ただ、二回差分をとるにはデータは2個では不足で、3個必要になることはわかりますよね。ちなみにどういうわけか、地図データは左手系、つまりX→Yが時計回りになる座標系を使います。地図データを扱う場合、これを誤認すると大変なことになりますよ。

関連するQ&A

  • ライントレース 変数の使い方について

    プログラミングについておききしたいのですが、 ライントレースで左右のカーブを曲がる際に 変数を使って、「さっきは右に曲がったので次は右から曲がる」や 「さっきは左に曲がったから左から曲がる」といったプログラムは どのようにつくったらいいのでしょうか? まだ初心者なので変数をうまく使えなくて悩んでいます。 よろしくお願いします。 今のところ下記のような感じにできているのですが 修正点や加えた方がいい点、省略できる点はありますでしょうか? よろしくお願いします。 mainの上は省略させて頂きました。 int main(void) {  int R = 0; while(1) {  if(GetTouch(CH_2) == 1){//タッチスイッチでのON/OFFスイッチです  while(GetTouch(CH_2) == 0);  MotorPower(CH_B|CH_C, 0);  while(GetTouch(CH_2) == 1);  while(GetTouch(CH_2) == 0);  MotorPower(CH_B|CH_C, 40);  while(GetTouch(CH_2) == 1); }else{  //ここからライントレースの内容です  clock_t start,end;  clock_t start2,end2; if (GetSensor(CH_3) > kuro && R == 0) {  start = clock();  migi(CH_B|CH_C);  while(GetSensor(CH_3) > kuro){  end = clock();  start2 = clock(); if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){  hidari(CH_B|CH_C);  while(GetSensor(CH_3) > kuro);  end2 = clock();  MotorPower(CH_B|CH_C,40);  R = 1;  break; } while( R == 1 ){ if(GetSensor(CH_3) > kuro){ hidari(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); R = 0; break; }else { if(((double)(end2 - start2)/CLOCKS_PER_SEC)>0.2){ migi(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); }//ifのカッコ }//whileのカッコ }//elseのカッコ }//whileのカッコ }//ifのカッコ }//elseのカッコ }//whileのカッコ }//mainのカッコ

  • (プログラミング)Scratchについて、です。

    (プログラミング)Scratchで簡単な「お描きソフト」をつくりました。 添付しました画像がそのプログラムです。 【ステージ】が小さいと、右クリックでは描くことができますが、左クリックではえがけません。 【ステージ】を全画面に切り替えると、右クリックでも左クリックでも描けることができます。 この理由を教えていただけないでしょうか? よろしくお願い申し上げます。

  • プログラミングを学びたいが…

    プログラミングの知識は全くありません。 右も左もわからない初心者です。 プログラミングには言語がいくつもありますが、それは、ひとつの基盤になる言語が人それぞれあり、その言語でできないことを他の言語で補うという認識でいいのでしょうか。 もしそうであれば、まずは汎用性の高い言語を学び、他の言語を用途に応じて順に学んでいこうと思っています。 まずは何を学べばよいのでしょうか。

  • プログラミング?について

    プログラムやデータベースについての勉強をしようと思っているのですが、右も左もわからず、簡単に学べるものだと思っていました。 ですが、調べてみると想像と違いどういったことからはじめればいいのかわかりません。 現時点では初心者のなかの初心者です。 「プログラムといってもどういうことなのか」 と思うヒトもいるかもしれませんが、プログラム関連について勉強する場合、本屋などでの専門書を購入して読んだりするのがいいのか、ネットでサーフィンしてみれば学べるものなのか、ほかに勉強方法があれば回答していただきたいです。 お願いします!

  • 変数について

    教えてください。 色々なプログラミング教科書で変数について、データを入れる箱のようなものと書かれていますが初心者にとってはそれだけの説明ではいまいちイメージできません。 どういうものを変数に代入したりして定義する必要があるのかもう少し小学生にも解るような例えはないでしょうか? 教えてください。

    • 締切済み
    • CGI
  • javaのプログラミング環境に関して

    プログラミング初心者でJAVAのプログラミング環境を整えたいと考えているのですが、JDKのダウンロードとインストールは完了したのですが、バスの設定に関しても環境変数の変数値でも行末に ;C:\Program Files\Java\jdk1.6.0_14\bin と編集はしました。 これで一応は環境は整ったということでいいんでしょうか? http://www.bohyoh.com/Java/JDK/index.html を参照しました。

  • SharedObject.getLocal()、オブジェクト名.data.変数の「変数」の部分に変数を入れる方法について

    SharedObject.getLocal()、オブジェクト名.data.変数の「変数」の部分に変数を入れる方法について ActionScript初心者なので頓珍漢な事を書いているかもしれませんが、 よろしくお願いします。 オブジェクト名.data.変数の変数の部分に変数を入れたく、 AS2.0で //////////////////////////////////////////////// my_hozon = SharedObject.getLocal("test", "/"); count = 0; for (count=0; count<=3; count++) { abc = "test_"+count; trace(abc); my_hozon.data.abc= "a"; trace(my_hozon.data.abc);//結果"a" trace(my_hozon.data.test_0);//結果"undefined" trace(my_hozon.data.test_1);//結果"undefined" trace(my_hozon.data.test_2);//結果"undefined" trace(my_hozon.data.test_3);//結果"undefined" } //////////////////////////////////////////////// と書いてみたのですが、 trace(my_hozon.data.abc); は結果が返ってきたのですが、 trace(my_hozon.data.test_0); trace(my_hozon.data.test_1); trace(my_hozon.data.test_2); trace(my_hozon.data.test_3); だとundefinedになり失敗しました。 どうすれば変数に変数が入るのか教えていただけないでしょうか。 よろしくお願いします。

  • プログラミングを学ぼうと思っています。

    技術者向けのカテゴリのなか、初心者の質問失礼します。 大学の講義で初心者向けのコンピュータプログラミング講座を受講したいと考えています。 C言語について、javaについて、コンピュータグラフィックスについて、の三つの講座があるのです。 C言語についての講座は受講を決めているのですが、javaとコンピュータグラフィックスのどちらをとるか悩んでいます。 私はプログラミングについては右も左も分からないのですが、プログラミングを最初から学ぶのなら、やはりjavaを取った方が良いでしょうか? また、「社会に出て役に立つか」という面から考えるとコンピュータグラフィックスの方が良い、と言われたのですが、本当にそうなのでしょうか?javaは数年後に古くなる、ということですか? どうかアドバイス・ご意見下さい。

  • c言語プログラミングでキーボードからint型の変数

    c言語プログラミングでキーボードからint型の変数aに値を入力し、約数をすべて表示するプログラムを作成したいのですが分かるかたお願いします

  • C言語プログラミングで、多項式の展開をする

    プログラミングの初心者です。 emacsを使って次のようなプログラムを作りたいのですがよくわかりません。 たとえば、a=2 b=3 を入力すると、 f(X)=(x+a)(x+b)=x^2+5x+6 と出力されるようなものです。 いろいろやってみてはいるのですが、「xの変数の型が宣言されていません」などと、(やってるつもりなんだけど)表示されたりしてうまくいきません。どなたか助けてください。