アプリ版:「スタンプのみでお礼する」機能のリリースについて

c言語の自分で数字を入力してサイコロのこの結果を出すプログラムで
#include <stdlio.h>のみで 配列の[] [] 二つ使ってやるプログラムはどうなりますか?

「c言語の自分で数字を入力してサイコロのこ」の質問画像

質問者からの補足コメント

  • 上の二行は誤字なので無視してください

      補足日時:2016/06/24 14:32
  • 全然読めるじゃないですか

      補足日時:2016/06/24 14:36
  • #include <stdlio.h>のみでプログラムする方法がわからないのです。

      補足日時:2016/06/24 17:49

A 回答 (12件中1~10件)

> 配列二つ使うとどうなりますか!?



殆ど変わらんでしょ。

// ここから
#include <stdio.h>

int main(void) {
 int result[][7] = {{0}};
 int i;
 for (i = 1; i < 7; i++)
  scanf("%d", &result[0][i]);
 printf("サイコロを 100回振った場合の結果\n");
 for (i = 1; i < 7; i++)
  printf("%dの目 : %d回\n", i, result[0][i]);
 return 0;
}
// ここまで
「c言語の自分で数字を入力してサイコロのこ」の回答画像11
    • good
    • 0
この回答へのお礼

なるほど!
ちなみにその画像のはなんのサイトですか?

お礼日時:2016/06/25 22:15

サイト?


いや、サイトじゃなくってEmacsってテキストエディタです。

Emacs:
https://www.gnu.org/software/emacs/

UNIX/Linuxだと有名なテキストエディタですね。
Windowsじゃあんま有名じゃないですが、一応Windows版もあります。

NTEmacs:
http://cha.la.coocan.jp/doc/NTEmacs.html

画面上部がCのプログラムを編集する部分(バッファとか呼びますが)、下がWindowsで言うDOS窓(コマンドプロンプト)で、eshellと言う端末プログラム(ターミナル等と言いますが)を走らせて、上で書かれたソースコードをコンパイル->実行->入力->結果表示、とやってます。
    • good
    • 0

> 自分でキーボードから入力して下に画像の結果が表示れるやつです



自分で実際にサイコロ振って、結果を入力して表示させるだけ、なら要するに次のコードでイイんじゃないですかね?

#include <stdio.h>

int main(void) {
 int result[7] = {0};
 int i;
 for (i = 1; i < 7; i++)
  scanf("%d", &result[i]);
 printf("サイコロを 100回振った場合の結果\n");
 for (i = 1; i < 7; i++)
  printf("%dの目 : %d回\n", i, result[i]);
 return 0;
}
「c言語の自分で数字を入力してサイコロのこ」の回答画像10
    • good
    • 0
この回答へのお礼

配列二つ使うとどうなりますか!?

お礼日時:2016/06/25 20:58

> #8



多分GCCのヴァージョンが違うんでしょう。
    • good
    • 0

> 質問者様



100回分の結果の入力は、どうやって行うのでしょうか?
手入力?
ファイル等から読み込み? その場合のフォーマットは?




> 配列の[] [] 二つ使ってやる

これは質問者様の最初の補足コメントで無視して下さいとあります。


> GCC:
> と言うコンパイラでは、
> と問題なくコンパイルしてくれるんですが

gccでもちゃんとwarningになりましたよ?
----------
$ gcc test.c
test.c: In function 'roll_dice':
test.c:4:9: warning: implicit declaration of function 'rand' [-Wimplicit-function-declaration]
return rand() % 6;

test.c: In function 'main':
test.c:19:2: warning: implicit declaration of function 'srand' [-Wimplicit-function-declaration]
srand(time(0));

test.c:19:8: warning: implicit declaration of function 'time' [-Wimplicit-function-declaration]
srand(time(0));

test.c:24:14: warning: passing argument 1 of 'print_array' from incompatible pointer type [-Wincompatible-pointer-types]
print_array(count_roll_of_dice, sizeof(count_roll_of_dice) / sizeof(unsigned int));

test.c:7:6: note: expected 'unsigned int *' but argument is of type 'unsigned int (*)[6]'
void print_array(unsigned int* arr, int size) {
----------
    • good
    • 0
この回答へのお礼

自分でキーボードから入力して下に画像の結果が表示れるやつです

お礼日時:2016/06/25 20:21

うん、そうですね。

#6氏の言う通り、だと思います。

#5の解のstdlib.hとtime.hが要らない、ってのはあくまで実装依存で、コンパイラによっては「コンパイラが気を使って」(笑)、自然にstdlib.hとtime.hを呼び出してくれるから、って事なだけで「要らない」って事はありえません。
実は試してみたんですが、 #5のプログラムにはちとバグがあって(多分コンパイラを通してないんでしょう)、そこを修正してコンパイルさせてみると、GCC

GCC:
https://gcc.gnu.org

と言うコンパイラでは、

~/project/Oshiete goo/utakata $ gcc 0509.c -o 0509
~/project/Oshiete goo/utakata $

と問題なくコンパイルしてくれるんですが、一方、最近人気があるClang

Clang:
http://clang.llvm.org

と言うコンパイラでは

~/project/Oshiete goo/utakata $ clang 0509.c -o 0509
0509.c:4:10: warning: implicit declaration of function 'rand' is invalid in C99
[-Wimplicit-function-declaration]
return rand() % 6;
^
0509.c:19:3: warning: implicit declaration of function 'srand' is invalid in C99
[-Wimplicit-function-declaration]
srand(time(0));
^
0509.c:19:9: warning: implicit declaration of function 'time' is invalid in C99
[-Wimplicit-function-declaration]
srand(time(0));
^
3 warnings generated.
~/project/Oshiete goo/utakata $

と3箇所警告が出ます。
ものの見事にrand()、srand()、time(0)の三箇所が引っかかってますね。これらはstdlib.hとtime.hを#includeしてないから、です。
もっとも、ClangはC99と言う国際基準を基本動作としてるみたいで、

C99:
https://ja.wikipedia.org/wiki/C99

オプションでそれ以前の古いCの国際規格、C89を指定すればコンパイルが通ると言えば通るのですが。

~/project/Oshiete goo/utakata $ clang -std=c89 0509.c -o 0509
~/project/Oshiete goo/utakata $

もし、これらの意味が分からない、なら要するに

・Cに付属している疑似乱数発生関数rand()を使いたい
・乱数の初期値を上手い具合に変えたい

のならstdlib.hとtime.hは、#5の回答でも「#includeした方が間違いない」と言う事です。
そっちの方が手間が省ける、余計な警告は受けない、と言う事です。
(ちなみに、WindowsのVisual C++辺りは試してないんですが、恐らくC99以降は国際規格には準拠していない、って話なんで、ひょっとしたらそのままでも「コンパイラが気を使って」(笑)コンパイルを通してくれるかもしれません)

あと、 #6氏の言う通り、写真の問題文見るとヘンなんですよね〜。
ひょっとしたら #6氏の言う通り、

「実際手元でサイコロを振って」

その記録を入力するだけのプログラムを作れ、って事なのかしらん。
100回「実際に」サイコロを振ってその結果をチマチマと入力していく・・・。
良く分からん問題ですね(笑)。それなら確かにstdio.hだけで済むと言えば済む問題ですが・・・・・・。
「c言語の自分で数字を入力してサイコロのこ」の回答画像7
    • good
    • 0

元の問題に


「サイコロを100振って(サイコロの目を100回入力し)」
とあります。これを素直に受けとると

(1)現実世界で、サイコロを振る
(2)出た目をコンピュータに入力する
(3)以上を100回繰り返す
(4)コンピュータが、入力された目のヒストグラムを出力する

ということになります。

作るプログラムは
「100個の数値(1〜6)を受け取り、各数値の個数を数え、結果を出力する」
となります。
これなら、#include <stdio.h> だけ事足りるのでは?


サイコロを振る=コンピュータで乱数を発生させる
という意味で使われているなら、
https://oshiete.goo.ne.jp/qa/9316738.html
の#2の通りです。

補足すると。
C言語には、「宣言されていない関数が使われたら、『任意引数で戻り値intの関数』として宣言されたことにする」というルールが有ります(有りました)
ここの#5にあるプログラムでは、 rand(),srand(),time()に「暗黙の関数宣言」を使っているので、stdlib.h,time.hを#includeしなくても動作します。
ですが、C言語の新しい規格では、暗黙の関数宣言が禁止されたので、このような使い方はできません。
stdlib.h,time.hを#includeするのが行儀のよいプログラムです。


> 配列の[] [] 二つ使ってやる

こちらは、意図がわかりません。
なぜ、「配列の[] [] 二つ使ってや」らなければならないのでしょうか?
問題の文章からは、その必要性が読み取れません。

int a[N][M] ;
のような二次元配列を使うのは、 データをN*M の格子状に扱うといろいろと便利になるときです。
 例) 画像の各座標の色を img[Y][X] の記憶させる。

この問題の場合、そのような「格子状にして扱うと便利になるようなデータ」というのが有りません。

#5のように、二次元配列を無理矢理使うこともできます。
ですが、そんな無茶をするよりは、一次元配列を使うのが自然です。
    • good
    • 0

#include <stdio.h>



unsigned int roll_dice() {
return rand() % 6;
}

void print_array(unsigned int* arr, int size) {
int i;
puts("サイコロを100回振った場合の結果");
for (i = 0; i < size; i++) {
printf("%dの目:%d回\n", i + 1, arr[i]);
}
}

int main(void) {
unsigned int count_roll_of_dice[][6] = { {0, 0, 0, 0, 0, 0} };
int i;

srand(time(0));

for (i = 0; i < 100; i++) {
count_roll_of_dice[0][roll_dice()]++;
}
print_array(count_roll_of_dice, sizeof(count_roll_of_dice) / sizeof(unsigned int));

return 0;
}
---
>#include <stdlio.h>のみでプログラムする方法がわからないのです。

#include <stdlib.h>も#include <time.h>も必要ありません。
22年後あたりにどうなるかは分かりませんが。
    • good
    • 0

そもそもstdlio.hと言うライブラリ自体がC言語には標準では付いてこないんですが。


間違ってませんか?
    • good
    • 0

何度も同じ問題投稿してるみたいですが、



https://oshiete.goo.ne.jp/qa/9312396.html
https://oshiete.goo.ne.jp/qa/9316738.html

一体どうしたんでしょうねぇ。

一体自分でどこまでプログラムして何が分からなかったんでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!