乗り越えよう!初級プログラミング!2

乗り越えよう!初級プログラミング!の続きです。
※初心者が初心者に向けて書いていますので、色々ボロがあります。なんでも許せる人向けです

もうそろそろ初級プログラミング最初の難関、「4回目の必須課題の提出」が迫ってきてますね。ヤダー!!!!
問題文を見ただけで「は?わからんが」となっている方も多いのではないでしょうか。
そういう方のヒントになればいいなと思って記事を書いています。
そういう私も初級プログラミングIとIIを「なんとか乗り越えた」程度の人間です。私なりのやり方なので、もっといい方法はあると思います。もっといい方法ある人はもっといい方法書いてくれ。みんなでなんとか乗り越えましょう。


例題

たかしくんは息子のおさむくんに、公倍数について教えたいと思いました。
そこで、「数字を入力すると、その数字に掛け算をして、2と3の公倍数だったら印を付けてくれるプログラムを作ろう」と思い立ちました。なんでそんなこと思いついちゃったんでしょうね。不思議ですね。
そこで、以下のプログラムを作成してください。
標準入力に1~99の整数値を入力すると、入力された数字に3をかけた数値と7をかけた数値が1行ずつ出力されるようにしてください。
また、答えが「2と3の公倍数」の場合は、数字の後ろに「:2と3の公倍数」と表記されるようにしてください。
また、1~99以外の整数値が入力された場合は、標準出力に「計算できません」と表示してください。
※標準入力には必ず整数値が入力されることにしておいてください

【実行例】
標準入力に2と入力した場合
標準出力
6:2と3の公倍数
14

標準入力に100と入力した場合
標準出力
計算できません

なっげえな!
適当に課題作りました。これをなんやかんやしていきましょう。


どうやってなんやかんやするんじゃい

ポイントは2つ!

  1. 日本語を自分がプログラムとして処理できるレベルまでブレイクダウンする

  2. めちゃくちゃprintする

です。


仕方ないから作っていこう

じゃあ作るにあたって改めて問題文を見てみましょう。

標準入力に1~99の整数値を入力すると、入力された数字に3をかけた数値と7をかけた数値が1行ずつ出力されるようにしてください。また、答えが「2と3の公倍数」の場合は、数字の後ろに「:2と3の公倍数」と表記されるようにしてください。
また、1~99以外の整数値が入力された場合は、標準出力に「計算できません」と表示してください。
※標準入力には必ず整数値が入力されることにしておいてください

もうこれを見ただけでパニックになると思います。
最近togetterにもあったんですけど、果てしないものを処理しようとすると人間嫌気が差すんですよ。
大学だってそうじゃないですか。卒業まで130弱の単位をとらなきゃいけない、あー、先が遠いなあって嫌になりそうですけど、1年に35単位くらいとればいいかな、じゃあ1学期あたり8~9単位かな、じゃあ1日で授業2~3個進めていけばいいかな、授業は15分ごとくらいで休憩できるぞ。ってブレイクダウンしていくと不思議と「なんとかなるかもー!」ってなりませんか?なったことにしておいてください。
なので(なので?)課題の文章も自分で処理可能な単位にバラバラ死体にしていきます。死体じゃなくてもいいです。

まずここに注目してみましょう。

標準入力に1~99の整数値を入力すると、
答えが表示される
※標準入力には必ず整数値が入力される

もうちょっと自分ができそうな処理にしてみましょう。

標準入力に整数値を入力すると、
入れた数値が表示される

なんかできそうな気がしませんか?やってみましょう。
でも我々は初心者です。標準入力から整数値を読み込むのはちょっと気が早いかもしれません。
まずは、「整数値を標準出力に出す」に落とし込みましょう。これなら第1回の内容でできますね。やったね。
整数値を変数として設定する必要があるので、xとしておきましょう。整数値なのでint型にしておきましょう。

public class takashi {
    public static void main(String[] args) {
        int x = 3;
        System.out.println(x);

    }
}

できました。takashiというところはCODEROOMのファイル名に変えておいてください。
実行すると標準出力に3と出ました。やったね。
ここまでできたら、この内容をどこかに保存しておきます。
こういう感じでいいと思います。

なぜ保存しておくかというと、CODEROOM上でうにゃうにゃしてたらどこまでできててどこからできないのかわからなくなって、できてた部分まで消しちゃうとかよくあるからです。
じゃあ次に進みましょう。

標準入力に整数値を入力すると、入れた数値が表示される

↑の発展形ですね。標準入力から整数値を取得して、それをそのまま出力すれば良いです。
データを入力するわけですから、どこかでやったなって思い出しましょう。1学期と変わりがないなら第2回の第4講でやったと思います。
資料を見ながら↑のコードを書き換えていきましょう。

// 標準入力を読み込むための呪文
import java.util.Scanner;

public class takashi {
    public static void main(String[] args) {
        //標準入力を読みこんでくる
        Scanner scan = new Scanner(System.in);
        // xに読み込んだ内容を入れる
        int x = scan.nextInt();
        // xを出力する
        System.out.println(x);

    }
}

動いた!って確認できたらまたメモ帳に保存しておきます。

なんか「//」がついた日本語が増えましたね。これはコメント機能です。
乗り越えよう!初級プログラミング!ではプログラムの中で日本語書けませんと言いましたが、これはコメント機能なので日本語が使えます。嘘はついてないです。コメントです。
ええ~1行ごとにコメント書くのめんどくさくない~?って思うかもしれませんが、我々は初心者なのでことあるごとにに「これは何をしているのか」を書いておいたほうが後から混乱しにくくなります。書いておくのをおすすめします。
じゃあ次はどこを攻めましょうか。ここにしましょう。

また、1~99以外の整数値が入力された場合は、標準出力に「計算できません」と表示してください。

また、って出てきましたね。ということは条件分岐が発生します。条件分岐ということはif文です。掛け算をするのはまだ早いので、以下のようにしてみましょう。

標準入力の値が1~99の場合は、標準出力に入力された値を出力する。
それ以外の整数値の場合は、「計算できません」と出力する。

なんかできそうな気がしてきませんか?私はしてきました。if文は第3回でやったと思います。ちょっと高等技術になってきましたね、頑張りましょう。
1~99までの数値ということは、0より大きくて且つ100より小さいということです。論理演算子も第3回でやった気がします。資料をあちこち移らなくてていいからちょっと楽ですね。

// 標準入力を読み込むための呪文
import java.util.Scanner;

public class takashi {
    public static void main(String[] args) {
        //標準入力を読みこんでくる
        Scanner scan = new Scanner(System.in);
        // xに読み込んだ内容を入れる
        int x = scan.nextInt();
        // xが取得できている確認のprint
//        System.out.println(x);
        
        // ifスタート。
        // 1~99の間ならxを出力する、それ以外なら「計算できません」を出す
        if (x>0 && x <100){
            System.out.println(x);
        } else {
            System.out.println("計算できません");
        }
        // if終わり

    }
}

できました。メモ帳に保存していきましょう。

ここでたぶん

        // xが取得できている確認のprint
//        System.out.println(x);

ってなんじゃい?ってなる人もいると思います。これがポイントの2つ目、「めちゃくちゃprintする」です。
たとえばif文書いたらなんかおかしくなっちゃった。どこまでできてたっけ…という場合、この「// System.out.println(x);」からコメントを表す「//」を抜いてあげて実行します。
そうすると標準出力にifをかます前のxの値が出力されるので、「ここまではできてる」とわかるんですね。
最終的にコメントアウトしておけば問題ないです。初プロはコードの綺麗さは求められません。printの痕跡をいくら残しておいても実行結果が合っていれば怒られないです。私はしっちゃかめっちゃかな長文の設計コメントを載せたまま提出して合格になりました。大丈夫です。たぶん。
じゃあ次。

入力された数字に3をかけた数値と7をかけた数値が1行ずつ出力されるようにしてください

ここをやりましょう。if文の中に書いていけばいいんですね。

        if (x>0 && x <100){
            System.out.println(x);

の部分のSyetem…の部分を書き換えていきましょう。

// 標準入力を読み込むための呪文
import java.util.Scanner;

public class takashi {
    public static void main(String[] args) {
        //標準入力を読みこんでくる
        Scanner scan = new Scanner(System.in);
        // xに読み込んだ内容を入れる
        int x = scan.nextInt();
        // xが取得できている確認のprint
//        System.out.println(x);
        
        // ifスタート。
        // 1~99の間ならxを出力する、それ以外なら「計算できません」を出す
        if (x>0 && x <100){
            // 3でかけた結果を入れるint sanを定義
            int san = x *3;
            // 7でかけた結果を入れるint nanaを定義
            int nana = x*7;
            //sanとnanaを出力する
            System.out.println(san);
            System.out.println(nana);
        } else {
            System.out.println("計算できません");
        }
        // if終わり

    }
}

これで標準入力に2を入れて実行すると
6
14
が出ました。あと一歩じゃん!やったじゃん!記念にメモ帳へ保存しておきましょう。

では次の難関です。

答えが「2と3の公倍数」の場合は、数字の後ろに「:2と3の公倍数」と表記されるようにしてください。

アーハン?何いってんだお前頭かち割るぞたかしくん。ってなりますが、聡明な算数できるマンならお気づきになるでしょう。2と3の公倍数ということは、6の倍数です。なので以下のように書き換えます。

答えが「6の倍数」の場合は、数字の後ろに「:2と3の公倍数」と表記されるようにしてください。

なんかやったことがある気がしませんか?第3回第3講で奇数偶数判定の例題がありましたね。おんなじことです。やったことある感じへさらに書き換えましょう。だいぶ書けそうな気がしてきました。

答えを6で割ったあまりが0であれば、数字の後ろに「:2と3の公倍数」をつけたものを出力する。
答えを6で割ったあまりが0ではない場合は、答えだけを出力する。

これを変数sanと変数nanaに対してやっていきましょう。もっと良い書き方はあると思いますが、授業で習った内容でいくならこんな感じになるでしょう。

// 標準入力を読み込むための呪文
import java.util.Scanner;

public class takashi {
    public static void main(String[] args) {
        //標準入力を読みこんでくる
        Scanner scan = new Scanner(System.in);
        // xに読み込んだ内容を入れる
        int x = scan.nextInt();
        // xが取得できている確認のprint
//        System.out.println(x);
        
        // ifスタート。
        // 1~99の間ならxを出力する、それ以外なら「計算できません」を出す
        if (x>0 && x <100){
            // 3でかけた結果を入れるint sanを定義
            int san = x *3;
            // 7でかけた結果を入れるint nanaを定義
            int nana = x*7;
            
            // sanの公倍数判定if文スタート。
            // 6で割ったあまりが0であれば、数字の後ろに「:2と3の公倍数」をつけたものを出力する。
            // 答えを6で割ったあまりが0ではない場合は、答えだけを出力する。
            if (san%6 == 0){
                System.out.println(san + ":2と3の公倍数");
            } else {
                System.out.println(san);                
            }
            // sanの公倍数判定if文終わり。
            
            // nanaの公倍数判定if文スタート。
            // 6で割ったあまりが0であれば、数字の後ろに「:2と3の公倍数」をつけたものを出力する。
            // 答えを6で割ったあまりが0ではない場合は、答えだけを出力する。           
            if (nana%6 == 0){
                System.out.println(nana + ":2と3の公倍数");
            } else {
                System.out.println(nana);                
            }
            // nanaの公倍数判定if文終わり。            
        } else {
            System.out.println("計算できません");
        }
        // if終わり

    }
}

やったー書けたよー!実行してみましょう。
2を標準入力へ入れて実行した結果です。
6:2と3の公倍数
14

100を標準入力へ入れて実行した結果です。
計算できません

0を標準入力へ入れて実行した結果です。
計算できません

6を標準入力へ入れて実行した結果です。
18:2と3の公倍数
42:2と3の公倍数

できあがったので、記念にこれも保存しておきましょう。


こんな感じです。
コメントと書いているプログラムを読み合わせていただくとわかるかもなのですが、

  1. プログラムで1~3行程度で表記できるレベルの日本語へブレイクダウンして、部品ごとに作っていく

  2. 各段階での処理結果がわかるようにprintしていく

をすれば、だいぶ課題をこなしやすくなるんじゃないかと思います。問題文とともにバラバラにされたたかしくんとおさむくんの魂もきっと浮かばれます。


やっぱりわかんねーようわああああん!!って方は、毎週火曜日の夜開催されているプログラミングワークショップへ参加しましょう。
参加方法書くつもりが書けなかったわ。ごめんね。次の記事で書きました。


よろしければサポートをお願いします! あなたのサポートが私の筋肉になります(プロテイン代)。