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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2519閲覧

c言語 配列に数字を代入する

kelt22

総合スコア46

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/03/30 15:03

前提・実現したいこと

c言語で配列 number[10][2]にnumber[n][0]には0~2の数字をnumber[n][1]には0~9の数字をnumber[n][0]とnumber[n][1]の組み合わせがすべて異なるように格納したいです。
(nは、0<=n<=9の整数)

発生している問題・エラーメッセージ

下記の様にプログラムを組みましたが動きません。おかしい所やプログラムとして汚いところ詳しく解説していただけるとありがたいです。

該当のソースコード

c

1int main( void ) 2{ 3 int i,j,k; 4 int count=0; 5 int retry; 6 int number[10][2]; 7 srand(time(NULL)); 8 while(count<10){ 9 retry=0; 10 do{ 11 i=rand()%3; 12 j=rand()%10; 13 number[count][0]=i; 14 number[count][1]=j; 15 for(k=0;k<count;k++){ 16 if(number[count][0]==number[k][0]&&number[count][1]==number[k][1]) 17 retry=1; 18 } 19 }while(retry==1); 20 count++; 21 } 22 for(i=0;i<10;i++){ 23 printf("%d %d\n",number[i][0],number[i][1]); 24 } 25 return 0; 26} 27 28

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/03/30 16:34

>動きません とはどういうことでしょう. 何も表示もされないのでしょうか.
guest

回答3

0

ベストアンサー

0~2 と 0~9 の組み合わせというのは, つまり 0~29 の値ということです.
ひとまず 2 次元配列というのを(面倒なので)無視すれば, 0~29 の 30 個の数値の中から 10 個出すということになります.

c

1#include <stdio.h> 2void suffle(int a[],int size) { 3 int i, j, t; 4 srand(time(NULL)); 5 for(i=size-1; i>0; i--){ 6 j = rand() % (i+1); 7 t = a[i]; a[i] = a[j]; a[j] = t; /* a[i]<->a[j] 交換*/ 8 } 9} 10#define COUNT 30 11#define SIZE 10 12int main(void) { 13 int i, values[COUNT]; 14 for(i=0; i<COUNT; i++) values[i] = i; /*0~29*/ 15 suffle(values, COUNT); /*ランダムに並び替え*/ 16 for(i=0; i<SIZE; i++) printf("%02d\n", values[i]); /*10の位=0~2, 1の位=0~9*/ 17 return 0; 18}

オリジナルに近くするとこんな感じ...ちょっと収まりが良くない感じがします.

c

1#include <stdio.h> 2#define COUNT 30 3#define SIZE 10 4int main(void){ 5 int i,j,v; 6 int retry; 7 int number[SIZE][2]; 8 srand(time(NULL)); 9 for(i=0;i<SIZE;i++){ 10 do{ 11 v=rand()%COUNT; 12 for(j=0,retry=0;j<i&&!retry;j++) retry=(number[j][0]==v); 13 }while(retry); 14 number[i][0]=v; 15 } 16 for(i=0;i<SIZE;i++){ 17 number[i][1]=number[i][0]%10; number[i][0]/=10; 18 printf("%d %d\n",number[i][0],number[i][1]); 19 } 20 return 0; 21}

投稿2020/03/30 17:34

編集2020/03/30 18:04
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kelt22

2020/03/31 11:36

この発想はなかったです。ありがとうございます。
guest

0

retry = 0; を do の中に書けばよいのではありませんか?

rand() を 10回しか呼び出さないようにすると、

C

1#include <stdio.h> // printf 2#include <stdlib.h> // srand, rand 3#include <time.h> // time 4 5int main(void) 6{ 7 #define T(x) x, x+1, x+2, x+3, x+4 8 static int a[] = { T(0), T(5), T(10), T(15), T(20), T(25) }; 9 int number[10][2], n = 30; 10 srand(time(0)); 11 for (int i = 0; i < 10; i++) { 12 int j = rand() % n; 13 printf("%d %d\n", number[i][0] = a[j] / 10, number[i][1] = a[j] % 10); 14 a[j] = a[--n]; 15 } 16}

投稿2020/03/30 16:34

編集2020/03/30 20:15
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

動かす方の回答はあるようなので・・・

number[count][0]=rand()%30;
として同じ数値を撥ねて、あとで、
number[count][1] = number[count][0] % 10;
number[count][0] /= 10;
とした方が、わかりやすくないですか?

配列の2次元目が2個だけなら、numberを div_t 型の構造体の1次元配列にしておいて、
そのまま div 関数の返却値を使うという手もありそうです。

投稿2020/03/30 17:49

PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問