Monthly Archives: June 2016
C exercises(8) Pointer Summary
ポインタのまとめ
- アドレス
- ポインタと使用手順
- ポインタ配列
過去のページを参照
演習
ポインタを使ったプログラムをグループで作成する。
7-3-4-3(P245)
大きさ10の整数型配列を用意し、下図のように初期設定しなさい。
この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入しなさい。
また、配列の中身と、何個格納したかを画面表示しなさい。
実行結果 15 45 9 71 37 格納個数 = 5
ヒント:
- 大きさ10の整数型配列を用意し、初期設定する。
- 別の大きさ10の整数型配列を用意。
- この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入。
- 配列の中身と、何個格納したかを画面表示。
#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 分割し、ランダムに混ぜます。
プレビューのイメージをフォーム上クリックして配置、すべて正しい場所に配置できればクリアです。
フォーム作成
サイズ:500 x 400
背景色:適当
PictureBox配置
- (Name) : PlayBox
- Size : 300 x 300
- BackColor : white
プレビュー用PictureBox配置
- (Name) : Preview
- Size : 100 x 100
- BackColor : white
メニュー作成
MenuStrip をフォームにドロップ、下記のようにメニュー追加
- File
- Load Image…
ダイアログ作成
openFileDialog をフォームにドロップ、フィルターを設定
- Image Files (*.png, *.jpg) | *.png; *.jpg
イベント設定
PlayBox
- MouseDown : PlayBox_MouseDown
- Paint : PlayBox_Paint
Preview
- Paint : Preview_Paint
LoadImage
- Click : LoadImage_Click
ソースコード
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); } } }
実行結果
参考
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より大きいです。