LoginSignup
2
0

More than 5 years have passed since last update.

プログラミング勉強2日目

Last updated at Posted at 2017-10-26

はじめに

2日目と言っても大した更新はできません。
まず初めに、前の記事ではたくさんのコメントありがとうございました。
あんなに反響を頂けるとは思っていなくて、とても驚いています。
はてなブログに記事を投稿したことがありますが、反応は皆無に等しいのでQiitaのオープンな感じはとてもいいと思いました。
まあ、part1の再生数だけ異常に多い動画みたいな感じなのかもしれませんね。
実は記事を書くときに「良い記事を書くには」というQiita公式からのメッセージが存在するのですがそこにはこう書かれてあります。

Qiitaは、プログラミングに関する知識を記録・共有するためのサービスです。Qiita上の記事は、投稿者以外の人にとっても価値のある記事であることが望まれます。
あなたの知識が他の誰かの役に立つようにするために、このガイドラインを参考にしてください。

役に立つ記事・・・!!!
あまり近況報告とかそういうのはしないほうがいいんでしょうか。たくさんの人が見てくれるということはつまりルールが守れないようであれば炎上する可能性もあるということですよね。いまいちルールがよくわかっていませんが、最近のことと言えば結城友奈は勇者であるの勇者の章がとても楽しみです。

今日書いたコード

今回は新しく書くというより、前回の復習が大きいです。

まずは結果に小数点を含む割り算(1/2とか)ですね。
「1.0 *」を前につけると結果が小数点を含むんでしたね。コメントで教えてくれた方ありがとうございました。
それで書いたコードが以下です。

warizan1.c
#include <stdio.h>
int main(void){
    int a, b, kekka;
    a = 1;
    b = 2;

    kekka = a / b;
    printf("(偽)a/bは%dです。\n", kekka);
    kekka = 1.0 * 1 / 2;
    printf("(真)a/bは%dです。\n", kekka);

    return 0;
}

結果
(偽)a/bは0です。
(真)a/bは0です。

どっちも偽じゃねーか!と思いましたがすぐに原因はわかりました。
kekkaがintになっているからですね。さすがに「1.0*」に頼りすぎました。
書き直したコードが次のコードです。

warizan2.c
#include <stdio.h>
int main(void){
    int a, b;
    float kekka;

    a = 1;
    b = 2;

    kekka = a / b;
    printf("(偽)a/bは%fです。\n", kekka);
    kekka = 1.0 * a / b;
    printf("(真)a/bは%fです。\n", kekka);

    return 0;
}

結果
(偽)a/bは0.000000です。
(真)a/bは0.500000です。

今回はきちんと結果が表示されていますね!
floatとdoubleについては調べてもどちらが良いとは言い切れない?(64bitのPCが増えたから?)らしく、私にはよくわかりませんでした。

次に直したコードは前回の記事でscanfをそのまま使っていたコードです。
確かにあのままでは普通の文字も入力を受け付けていました。試しに「a」を入力して実行してみましたがとんでもない数値が出てしまいましたね。
コメントに書いていただいたサイトで理解できればよかったのですが、私にはまだ理解できなかったので以下のサイトを参考にさせていただきました。
C > 数値を入力 > fgets() / sscanf()
(連絡を取らずに掲載しているので、問題があれば連絡をください。すぐに消させていただきます。)

#include <stdio.h>

int inputNumericValue() {
    int val;
    char buf[512];

    printf("[数値を入力してください]\n");
    fgets(buf, sizeof(buf), stdin);
    if (sscanf(buf, "%d", &val) > 0) {
        printf(">> %d\n", val);
    } else {
        printf(">> ERROR:数値ではありません。\n");
    }
}

int main(void) {
    inputNumericValue();
    inputNumericValue();
    inputNumericValue();
    return 0;
}

このコードが使えそうな気がします。
コードを参考にさせてもらいながら書いたコードが以下。

zikan3.c
#include <stdio.h>

int inputNumericValue() {
    int time, hour, minute, second;
    char buf[512];

    printf("時間(秒)の入力 >> ");
    fgets(buf, sizeof(buf), stdin);
    if (sscanf(buf, "%d", &time) > 0) {
        hour = time / 3600;
        minute = (time - hour * 3600 ) / 60;
        second = time - (hour * 3600 + minute * 60);

        printf("%d秒は%d時間%d分%d秒です。\n", time, hour, minute, second);
    } else {
        printf(">> ERROR:数値ではありません。\n");
    }
}
int main(void){
    inputNumericValue();
    return 0;
}

しかしこれではコンパイルでエラーが出ました

zikan3.c:18:1: warning: control reaches end of non-void function [-Wreturn-type]

調べてみたところ、returnがないときのエラー文とのことらしいです。int inputNumericValueのところにreturnないけど、元のコードもないんだけどなあ・・・そもそもreturn 0ってなんなんだと色々思いつつ書いたコードが以下。

zikan4.c
#include <stdio.h>

int inputNumericValue() {
    int time, hour, minute, second;
    char buf[512];

    printf("時間(秒)の入力 >> ");
    fgets(buf, sizeof(buf), stdin);
    if (sscanf(buf, "%d", &time) > 0) {
        hour = time / 3600;
        minute = (time - hour * 3600 ) / 60;
        second = time - (hour * 3600 + minute * 60);

        printf("%d秒は%d時間%d分%d秒です。\n", time, hour, minute, second);
    } else {
        printf(">> ERROR:数値ではありません。\n");
    }
    return 0;
}
int main(void){
    inputNumericValue();
    return 0;
}

今回は無事コンパイルできました。
結果も無事出力できていましたし、文字の入力を受け付けないようになっていました。
結果的には成功?ですが、実際のところあまり理解できていないのでまだ勉強が必要そうです。そもそも「inputNumericValue」や「char buf[512]」ってなんなんだろう。全体として見ればこのコードは「入力された値が0以上のとき実行しそれ以外ではERRORメッセージを吐く」ということでいいのでしょうか。
追記:試しに-2を入力してみたら普通に-2秒と表示されました。

他力本願すぎますが、おかしな点やもっとよくできる点があればコメントによろしくお願いします。閲覧ありがとうございました。

2
0
2

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
2
0