質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • C

    3556questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

計算が正しく行われない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 220

hiky

score 11

ちょっとした数値比較ゲームを作ったのですが、ある一行を入れると正しい結果が求められません。

下にコードを載せました。
最後にコンピュータのポイントの合計と自分のポイントの合計を比較し、勝った負けたを表示しようとしたらu_pointの数字が正しく出力されません。
具体的には、合計4251873点などと出てしまいます。

check(u_point, c_point)を無くすと答えが正しく出力されます。
なぜなのでしょうか?

最後に、細かい設定などを説明するのを省略しているので質問のマナーがなっていなかったら申し訳ありません。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void suit(void);    /* カードの柄を決める関数 */
int card_number(void);    /* カードの数字を決める関数 */
int point(int);        /* カードのポイントを決める関数 */
void wait_enter(void);    /* エンターキーが押されるまで待つ関数 */
void check(int, int);    /* どちらのポイントの合計が多いか判定する */

int main(void){
    int c_hand1, c_hand2, c_point;     /* コンピュータの手とポイント合計(変数) */
    int u_hand1, u_hand2, u_point;    /* 自分の手とポイント合計(変数) */
    time_t timer = time(NULL);
    srand(timer);
    c_point = 0;

    printf("コンピュータのカードは");    /* 18行目から28行目までコンピュータの動作 */
    suit();
    c_hand1 = card_number();
    printf("%d ", c_hand1);
    c_point += point(c_hand1);

    suit();
    c_hand2 = card_number();
    printf("%d ", c_hand2);
    c_point += point(c_hand2);
    printf("合計%d点\n", c_point);

    wait_enter();                /* 30行目から43行目まで自分の動作 */
    printf("1枚目");
    suit();
    u_hand1 = card_number();
    printf("%d\n\n", u_hand1);
    u_point += point(u_hand1);

    wait_enter();
    printf("2枚目");
    suit();
    u_hand2 = card_number();
    printf("%d\n\n", u_hand2);
    u_point += point(u_hand2);
    printf("合計%d点\n", u_point);

    check(u_point, c_point);        /* ここでチェック 45行が無いと、43行目では正しい結果が出力される*/

    return 0;
}

void suit(void){
    int suit;
    suit = rand() % 4;

    switch(suit){
        case 0:
            printf("スペード");
            break;
        case 1:
            printf("ハート");
            break;
        case 2:
            printf("クローバー");
            break;
        case 3:
            printf("ダイヤ");
            break;
    }
}

int card_number(void){
    return (rand() % 13) + 1;
}

int point(int x){
    int point;

    if(x == 1)
        point = 11;
    else if(x >= 10)
        point = 10;
    else
        point = x;

    return point;
}

void wait_enter(void){
    char dummy;

    printf("カードを引くならエンター");
    scanf("%c", &dummy);
}

void check(int x, int y){
    if(x > y)
        printf("あなたの勝ちです!!\n");
    else if(x < y)
        printf("あなたの負けです・・・\n");
    else
        printf("引き分け\n");
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

u_pointが初期化されていないからだと思います。
私の環境では、45行目の有無に関係なくおかしな値が出ました。

int main(void){
    int c_hand1, c_hand2, c_point=0;     /* コンピュータの手とポイント合計(変数) */
    int u_hand1, u_hand2, u_point=0;    /* 自分の手とポイント合計(変数) */
    ...

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 00:10

    仰る通りです。もの凄く初歩的なミスですね、、、素早い指摘ありがとうございます。自分でも何度も上から下まで見直したつもりなのですが恥ずかしい限りです。

    あと、すいません。もう一つ質問なのですが。自分の環境ではu_pointの値を初期化しなくても45行目が無い場合計算がされました。
    LouiSO616さんは45行目の有無にかかわらずとのことですが、これは単に用意している環境の設定の問題ってことで理解しても良いのでしょうか?

    キャンセル

  • 2017/09/27 00:14

    値を初期化していない変数を使ったときの動作は不定です。
    何十回も試してそうなるのなら何らかの因果はあるのかもしれませんが、基本的には「たまたま」と説明してしまうことが多いです。

    キャンセル

  • 2017/09/27 00:15

    理解しました。本当にありがとうございました。

    キャンセル

0

上手くいかないときは大抵自分のミス。何度も何度もこれでもかと確認する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 00:20

    ある程度アタリを付けて確認できるといいですね。
    変な値が出るときは初期化ミス、オーバーフロー、アドレスを表示している... など。
    私も最初はセミコロンの付け忘れで数時間悩んだことがあります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3556questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。