C exercises(8) Pointer Summary

ポインタのまとめ

  1. アドレス
  2. ポインタと使用手順
  3. ポインタ配列

過去のページを参照

演習

ポインタを使ったプログラムをグループで作成する。

7-3-4-3(P245)

大きさ10の整数型配列を用意し、下図のように初期設定しなさい。

この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入しなさい。

また、配列の中身と、何個格納したかを画面表示しなさい。

zu10-12

実行結果

15
45
9
71
37
格納個数 = 5

ヒント:

  1. 大きさ10の整数型配列を用意し、初期設定する。
  2. 別の大きさ10の整数型配列を用意。
  3. この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入。
  4. 配列の中身と、何個格納したかを画面表示。
#include <stdio.h>

int main( void )
{
  int data1[10] = { 10, 15, 22, 45, 9, 66, 71, 4, 37, 82 };
  int data2[10], i, cnt;
  int *p1, *p2;

  cnt = 0;
  p1 = data1;          /* 配列data1のアドレスをp1に設定 */
  p2 = data2;          /* 配列data2のアドレスをp2に設定 */
  for ( i = 0; i < 10; i++ ) {
    if ( ( ( *p1 )%2 ) == 1 ) { /* p1の指す内容が奇数なら */
      ;                /* p2の指す中身に代入 */
      ;
      ;                /* ポインタp2の更新 */
      ;
    }
    p1++;	/* ポインタp1の更新 */
  }
  printf( "格納個数 = %d\n", cnt );

  return 0;
}

 

C# exercises (7) Puzzle Game

今回作るのは、イメージを読み込んで利用するパズルゲームです。イメージファイルを読み込むとそれを 9 分割し、ランダムに混ぜます。

プレビューのイメージをフォーム上クリックして配置、すべて正しい場所に配置できればクリアです。

PuzzleGame3x3

 

フォーム作成

サイズ:500 x 400

背景色:適当

スクリーンショット 2016-06-03 10.47.38

PictureBox配置

  • (Name) : PlayBox
  • Size :        300 x 300
  • BackColor :  white

プレビュー用PictureBox配置

  • (Name) : Preview
  • Size :        100 x 100
  • BackColor :  white

スクリーンショット 2016-06-03 10.56.11

 

 

メニュー作成

MenuStrip をフォームにドロップ、下記のようにメニュー追加

  • File
    • Load Image…

 

スクリーンショット 2016-06-03 10.59.28

 

ダイアログ作成

openFileDialog をフォームにドロップ、フィルターを設定

  • Image Files (*.png, *.jpg) | *.png; *.jpg

スクリーンショット 2016-06-03 11.09.08

 

イベント設定

PlayBox

  • MouseDown : PlayBox_MouseDown
  • Paint : PlayBox_Paint

Preview

  • Paint : Preview_Paint

LoadImage

  • Click : LoadImage_Click

スクリーンショット 2016-06-03 11.15.29

 

ソースコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace PuzzleApp
{
    public partial class Form1 : Form
    {
        // ゲームで使う変数(フィールド)
        Image img = null;
        bool[] flg = new bool[9];
        int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
        int[] answer = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
        int current = 0;
        bool playflg = false;
        bool clearflg = false;


        public Form1()
        {
            InitializeComponent();
        }


        // 変数関係の初期化処理
        private void initialData()
        {
            flg = new bool[9];
            data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
            answer = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1 };
            Random r = new Random(Environment.TickCount);
            for (int i = 0; i < 100; i++)
            {
                int a = r.Next(9);
                int b = r.Next(9);
                int n = data[a];
                data[a] = data[b];
                data[b] = n;
            }
            current = 0;
            playflg = true;
            clearflg = false;
        }


        // クリアしたかどうかをチェック
        private void checkClear()
        {
            bool flg = true;
            for (int i = 0; i < 9; i++)
            {
                if (answer[i] != i) { flg = false; }
            }
            clearflg = flg;
        }


        // ゲームが終わったかどうかチェック
        private void checkGameEnd()
        {
            bool flg = false;
            for (int i = 0; i < 9; i++)
            {
                if (answer[i] == -1) { flg = true; }
            }
            playflg = flg;
            if (playflg == false)
            {
                this.checkClear();
            }
        }


        // オープンダイアログを開いてイメージファイルをロードする
        private void LoadImage_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
            {
                img = Image.FromFile(openFileDialog1.FileName);
                this.initialData();
                this.Refresh();
            }
        }


        // PlayBoxの表示
        private void PlayBox_Paint(object sender, PaintEventArgs e)
        {
            if (img == null) { return; }
            Graphics g = e.Graphics;
            for (int i = 0; i < 9; i++)
            {
                if (flg[i] == false) { continue; }
                if (answer[i] == -1) { continue; }
                int x1 = i % 3;
                int y1 = i / 3;
                int x2 = answer[i] % 3;
                int y2 = answer[i] / 3;
                Rectangle r1 = new Rectangle(100 * x1, 100 * y1, 100, 100);
                Rectangle r2 = new Rectangle(100 * x2, 100 * y2, 100, 100);
                g.DrawImage(img, r1, r2, GraphicsUnit.Pixel);
            }
            if (playflg == false)
            {
                if (clearflg)
                {
                    g.DrawString("CLEAR!!",
                        new Font("Impact", 48, FontStyle.Bold),
                        new SolidBrush(Color.Red),
                        new Point(40, 100));
                }
                else
                {
                    g.DrawString("GAMEOVER...",
                        new Font("Impact", 36, FontStyle.Bold),
                        new SolidBrush(Color.Blue),
                        new Point(20, 200));
                }
            }
        }


        // PlayBoxをクリックした時の処理
        private void PlayBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (playflg == false) { return; }
            if (img == null) { return; }
            if (current > 8) { return; }
            int x = e.X / 100;
            int y = e.Y / 100;
            if (x < 0) { return; }
            if (y < 0) { return; }
            if (x >= 3) { return; }
            if (y >= 3) { return; }


            int n = x + y * 3;
            flg[n] = true;
            answer[n] = data[current];
            current++;
            this.checkGameEnd();
            this.Refresh();
        }


        // previewの表示
        private void Preview_Paint(object sender, PaintEventArgs e)
        {
            if (img == null) { return; }
            if (current > 8) { return; }
            int x = data[current] % 3;
            int y = data[current] / 3;
            Graphics g = e.Graphics;
            Rectangle r1 = new Rectangle(0, 0, 100, 100);
            Rectangle r2 = new Rectangle(x * 100, y * 100, 100, 100);
            g.DrawImage(img, r1, r2, GraphicsUnit.Pixel);
        }
    }
}

 

実行結果

 

スクリーンショット 2016-06-03 11.30.31

 

スクリーンショット 2016-06-03 11.29.42

参考

http://www18.big.or.jp/~neon2/bunkatu/tips9.shtml

C programming (8) if statement

 

制御構文は、上から下へ流れるプログラムを途中で流れを分岐させたり、流れを繰り返したりすることができる構文を表します。

制御構文の主な種類としてif文for文while文switch文の4パターンあります。

if文を使うと、分岐構造を作ることができます。

条件式の真偽

状態 真偽
条件が満たされた場合 true(真) 1(0以外)
条件が満たされなかった場合 false(偽) 0

 関係演算子

2つの値の大小を比較します。
条件を満たせば「真(true)」、条件を満たさなければ「偽(false)」となります。
関係演算子の形式は以下の通りです。

演算子 意味
< a < b aはbよりも小さい
> a > b aはbよりも大きい
<= a <= b aはbよりも小さい(a == bの条件も含む)
>= a >= b aはbよりも大きい(a == bの条件も含む)
== a == b aとbは等しい
!= a != b aとbは等しくない

if 文

if文の基本形

条件式には真、又は偽を表す値(すなわち、最終的には数値型)を指定します。if 文は条件式の結果が真の場合のみ実行され、そうでなければ実行されません。より単純にいえば、条件式に 0 以外の値が指定されたときのみ実行されるのです。

if(条件式) {
    文1;
}

 

if  ~ else ~

if(条件式) {
    文1;
} else {
    文2;
}

実例: 偶数奇数判定

/* a5-1-4.c */
#include <stdio.h>

int main(void)
{
  int n;
  printf("整数値を入力してください。> ");
  scanf("%d", &n);
  if (n % 2 == 0) { 
      printf("入力値は偶数です。\n");  
  } else {
      printf("入力値は奇数です。\n");
  }

  printf("プログラムのおわり\n");
  getch();
  return 0;
}

 

if文の多分岐構造

if(条件式1) {
    文1;
} else if(条件式2) {
    文2;
} else if(条件...
:
(中略)
:
} else if(条件式n) {
    文n;
} else {
    文x;
}

実例:成績判定

/* 成績判定プログラム */
#include <stdio.h>
// C判定:ten 60以上69以下  不合格:ten 59以下 

int main(void)
{
  int ten;
 while (1) //ブロック
 {
  printf("点数を入力してください。> ");
  scanf("%d", &ten);
  if ( ten == 0 ) break;
             // OR 
  if (ten < 0 || ten > 100) {  // ペアー
    printf("点数の入力エラーです。\n");
  }
  else 
  if (ten >= 80) {  // block ブロック
    printf("成績はA判定です。\n"); 
  }
  else if (ten >= 70) {
    printf("成績はB判定です。\n");
  }
  else {
    printf("成績はC判定です。\n");
  }
 }
    getch();
  return 0;
}

 

if文のネスト

if(条件文1) {
    if(条件文2) {
        文1;
    } else {
        文2;
    }
} else {
    文3;
}

実例:出席率と点数から成績を判定

/* 出席率と点数から成績を判定するプログラム */
#include <stdio.h>
// nest 入れ子
int main(void)
{
  int ten, percent;
while (1)   // ブロック block
{
  printf("授業の出席率は何%ですか。> ");
  scanf("%d", &percent);
     
  if (percent >= 80) 
  {
    printf("点数は何点ですか。> ");
    scanf("%d", &ten);    // 入れ子 nest
    if (ten >= 60)  
    {
      printf("合格です。\n");
    }
    else 
    {
      printf("再試験です。\n");
    }
  }  //ペアー 
  else {
    printf("補習です。\n");
     }
}		 

  return 0;
}

 演習問題

演習3-4 (教科書P51)

二つの整数値を読み込んで、値の関係を表示するプログラムを作成

  • 「AとBは等しいです。」
  • 「AはBより大きいです。」
  • 「AはBより小さいです。」

実行例

二つの整数を入力してください。
整数A:12
整数B:6
AはBより大きいです。