3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SRAAdvent Calendar 2024

Day 1

「C言語プログラミング演習」の課題をJavaでやってみた

Last updated at Posted at 2024-11-30

この記事はSRA Advent Calendar 2024の1日目の記事です。

こんにちは! SRA関西事業部の佐々木です。

ちょっと待って!!

タイトルに「C言語」とついてますが、C言語の話はしません!(Javaの記事です)
今回は本の紹介と、その本に載っている課題をJavaでやってみたことについて述べます。

本の紹介

古い本ですが、C言語プログラミング演習という本があります。
この本は「より良いプログラムの構造」について勉強できる本です。
と言ってもも堅苦しい本ではなく、架空の大学の「プログラミング同好会」を舞台とした物語調で書かれています。登場人物は1年生の白木君、3年生の青山君、4年生の赤石さんです。(あと講義をする先生もいます)
5章で構成されており、それぞれの章で1つの「例題」が示され、その例題に対して「討論」と「講義」という流れになっています。「討論」では登場人物たちが各々プログラミングを示したり指摘しあったりして、読んでいてなかなか面白いです。「講義」ではプログラムの構造についてわかりやすく説明されており、

  • プログラム構造が間違っているとフラグが必要になる
  • フラグを使ったプログラムはバグが発生しやすい

など実際のプログラミングで役に立つポイントがまとめられていたりします。
C言語を使った本ですが、内容は言語を問わずプログラミングを行う人全て(特に初心者)に読んでほしい本です。

Javaでやってみた

やってみた課題は第1章の例題です

image.png

※プログラミンが好きな人は続きを読む前に実際にプログラミングしてみることをお勧めします。
C言語とJava言語の違いもあり、書籍で示されている解答とは結構違うところもありますが、プログラムの構造は同じようにしています。構造について詳しく知りたい方はぜひ本を読んでみてください。

まずは「左上がり」「右下がり」を表す定数を定義します。

Direction.java
enum DIRECTION {
  //左上がり
  UPPER_LEFT,
  //右下がり
  LOWER_RIGHT
}

次に「移動する点」用のクラスをつくります。

MovingPoint.java
public static class MovingPoint {

  // x座標
  int x = 0;
  // y座標
  int y = 0;
  // 進む方向
  DIRECTION direction;
  // 今何ブロック目か(斜め移動を一つのブロックとして考える)
  int block = 0;

  public MovingPoint() {
    // 右下がりから始まる
    this.direction = DIRECTION.LOWER_RIGHT;
  }

  // 次の座標に移動
  public void next() {
    switch (direction) {
      case UPPER_LEFT -> upperLeft();
      case LOWER_RIGHT -> lowerRight();
    }
  }

  // 左上に移動
  private void upperLeft() {
    if (x != 0) {
      //xが0になるまでは左上に移動
      x--;
      y++;
    } else {
      //xがゼロになったら右下ブロックへ切り替え
      direction = DIRECTION.LOWER_RIGHT;
      y = ++block;
    }
  }

  // 右下に移動
  private void lowerRight() {
    if (y != 0) {
      //yが0になるまでは右下に移動
      x++;
      y--;
    } else {
      //yがゼロになったら左上ブロックへ切り替え
      direction = DIRECTION.UPPER_LEFT;
      x = ++block;
    }
  }

  // 座標表示用
  public String toString() {
    return "(" + x + ", " + y + ")";
  }
}

最後に実行用の処理です。
問題には「個数nは引数で受け取るようにせよ」とありますが、ここではmainメソッドで固定で書いています。
(諸事情によりクラス名がPopukoになっています)

Popuko.java
public class Popuko {

  public static void main(String... args) {
      int n = 8;
      loop(n);
  }

  private static void loop(int n) {

    MovingPoint p = new MovingPoint();

    for (int i = 1; i <= n; i++) {
      System.out.println(i + p.toString());
      p.next();
    }
  }

適度にクラス分けされてメソッドもシンプルな実装なのでわかりやすいプログラムだと思うのですがどうでしょうか?
もちろん、さらに改良することは可能だと思います。(コメントで教えてくれるとありがたいです)

蛇足

一時期SRAの新人研修の講師を担当していたのですが、コロナウイルスが流行した時に出張の制限などの事情により講師担当をしないようになりました。そのまま現在にいたるのですが、今年関西に配属された新入社員(新人研修は終了している)に課題を出す機会があったので、この例題を出してみました。
新人研修時代はNode-REDというツールを使ってたのですが、今回新入社員に出した時にはJavaで取り組んでもらいました。そこで私自身も一度Javaでやってみようとなった次第です。

参照・引用

若林糧 著「C言語プログラミング演習」(日経BP)

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?