03-06 繰り返し(while文1)

練習問題3-6-1

400×400にした時の画像

動作は正常に行われました
この問題を見たときに切りのいい数字ならうまくいくと考えましたが、切を悪くしたらどうなるのだろうかと思い、キリの悪い数字にしてみましたが、少し見切れる程度だったので、汎用性が高いのだと感じました。

練習問題3-6-2

次のfor文のプログラムをwhile文に書き換えなさい。

function setup() {
  createCanvas(300, 300);
  background(220);
  strokeWeight(3);
  
  let y=0
  while(y<height){
    line(0, y, width, y)
    y+=30
  }
}
どこで終わればいいか計算しなくて良くて、今のところ使いやすいです。

練習問題3-6-3

function setup() {
  let i=0;
  while(i<5){
    print("こんにちは!");
    i++
  }
}
何方でも作る労力はあまり変わらないと思いました。
変えた意味もあまり感じませんでした。

練習問題3-6-5

練習問題3-4-4では、for文で「ガチャを100回引いて★5の排出数を表示する」プログラムを作りました。while文を使って、「★5が3個出るまでガチャを引き続ける」プログラムを作りなさい。何回引いたかも表示すること。

function setup() {
  let n = 0;    // 引いた回数
  let count = 0;
  while (count<3) { 
    n++;

    r = random();
    if (r < 0.03) {
      count=count+1
      print(n + "回目: ★★★★★");
    } else if (r < 0.03 + 0.07) {
      print(n + "回目: ★★★★");
    } else if (r < 0.03 + 0.07 + 0.15) {
      print(n + "回目: ★★★");
    } else if (r < 0.03 + 0.07 + 0.15 + 0.30) {
      print(n + "回目: ★★");
    } else {
      print(n + "回目: ★");
    }
  }
  print(n+"回で星五が"+count+"個でた")
}
いろいろwhileが関係ないところでミスって大変でした。
不等号の向きを間違えたり、問題文をわすれて出力例からかけ離れたプログラムができてしまい、いろいろ追加してりして、なかなか大変でした。

練習問題3-6-6

チケットが無くなるか、★5が2個出るまでガチャを引き続けるプログラムを作りなさい。

function setup() {
  let tickets = 100;
  let n = 0;
  let count=0

  while (tickets > 0&&count<2) {
    n++;

    r = random();
    if (r < 0.03) {
      count = count+1
      print(n + "回目: ★★★★★");
    } else if (r < 0.03 + 0.07) {
      print(n + "回目: ★★★★");
    } else if (r < 0.03 + 0.07 + 0.15) {
      print(n + "回目: ★★★");
    } else if (r < 0.03 + 0.07 + 0.15 + 0.30) {
      print(n + "回目: ★★");
    } else {
      print(n + "回目: ★");
    }

    tickets--;
  }
  if(count==2){
    print("星五が二回出ましたのでガチャを終了します。")
  }else{
    print("チケットがなくなったのでガチャを終了します。");
  }
}
例題をコピーしてきて改変しているので、大変ではなかったのですが、
チケットの枚数には困りました。指定がなかったので、なので一度はランダムにしようかと思いましたが、面倒くさくなってしまい100にしておきました。

練習問題3-6-7

次のプログラムには無限ループの危険があります。どこが問題か先生に説明しなさい。

function setup() {
  let x = 0;
  while (x < 100) {
    print(x);
    x += 10;
    if (x > 50) {
      x = 0;
    }
  }
}

今は教室にいないので、ここに書きます。
ifの中に変数xを0にするプログラムがあるので、いつまでたってもxは上がらないため、無限ループが起きると思います。

練習問題3-6-8

キャンバスの左端から右端に向かって、ランダムな長さの点線を描きなさい。
線の長さは0〜20pxの間で変化し、右端に達するまで線を描き続けます。

次の条件を満たすように、while文を使って完成させてください。

  • 変数xを作り 線の開始位置として使う
  • 変数lenを作り ランダムな長さを代入する
  • 線と線との間隔は10pxとする
function setup() {
  createCanvas(400, 400);
  strokeWeight(5);
  let x = 0;
  let len = 0
  
  while(x<width){
    len=random(0,20)
    line(x, height/2, x+len, height/2)
    x=x+10+len
    
  }
}
プロトタイプです。これから色を寄せます。
function setup() {
  createCanvas(400, 400);
  background(200, 240, 255);
  strokeWeight(5);
  stroke(150, 200, 230)
  let x = 0;
  let len = 0
  
  while(x<width){
    len=random(0,20)
    line(x, height/2, x+len, height/2)
    x=x+10+len
    
  }
}
プログラムのほうは予想通りに動いたので、すぐにできたのですが、色の比率を今まであまりいじっていなかったので結構試行錯誤しました。最初は水色を作るためには青を薄めたらいいだけだと思っていたので、(200,200,255)と言うふうに書きましたが、紫がかってしまったので赤を減らしたりしてできるだけ近づけたつもりなのですが、結構違うような気もします。

練習問題3-6-9

前の問題の点線を、10ピクセル間隔で上から下まで繰り返します。
while文を入れ子にして(ネストして)書いてください。

function setup() {
  createCanvas(400, 400);
  background(200, 240, 255);
  strokeWeight(5);
  stroke(150, 200, 230)
  let x = 0;
  let y = 0
  let len = 0;
  
  while(y<height){
    while(x<width){
      len=random(0,20)
      line(x,y , x+len, y)
      x=x+10+len
    }
  x=0
  y+=10
  }
}
最初はxを0にしてなくて、うまく動作しませんでしたが、それ以外の場所はちゃんと動いていたので、そこを修正したら動きました。
それとキャンバスの大きさが指定されていなかったので、最初から設定されている400×400で作ったら、キモイ模様になってしまいました。

コメントする