
重複なく4つの領域を持つ配列に数字を代入したい(先頭は0以外の
数字)と思って書いたプログラムです。
しかし、コンパイルしてみると重複が発生してしまいます。
これはなぜ発生してしまうのでしょうか?
よろしくお願いします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int num,val,i,j;
int comp[4];
srand(time(NULL));
puts("4桁の数字を記憶して逆向きに入力しましょう。");
val=rand()%10;
do{
comp[0]=val;
}while(comp[0]==0);
for(i=1;i<4;i++)
{
do{
val=rand()%10;
for(j=0;j<i;j++)
{
if(comp[j]==val)
{
break;
}
}
}while(i<j);
comp[i]=val;
}
for(i=0;i<4;i++)
{
printf("%d",comp[i]);
}
return 0;
}
No.1ベストアンサー
- 回答日時:
まず、このプログラムで本当に結果が出力できたんでしょうか?
気づいた点で・・・
>val=rand()%10;
>do{
>comp[0]=val;
>}while(comp[0]==0);
これってvalが0だったら無限ループになりませんか?
あと、
>do{
>val=rand()%10;
>for(j=0;j<i;j++)
>{
>if(comp[j]==val)
>{
>break;
>}
>}
>}while(i<j);
これも無限ループになりませんか?
回答ありがとうございました。
そうですね。上のループはcomp[0]=0だったら
無限ループになってしまいますね。
下は私の環境では無限ループにならないようなのですが、
iとjが逆であることに気付きました。

No.4
- 回答日時:
}while(i<j);
comp[i]=val;
}
上記の}while(i<j);を
}while(j<i);に変えて下さい。(iとjを入れ替える)
あと、#2のかたが言っているように
val=rand()%10;
do{
comp[0]=val;
}while(comp[0]==0);
の部分を
do{
val=rand()%10;//ここに移動
comp[0]=val;
}while(comp[0]==0);
のようにして下さい。
No.3
- 回答日時:
重複した項目を選択したくないのであれば 乱数によって選ぶもの自体の重複を避けたほうがいいでしょう
ベースとなるデータを配列にとっておいてそこの何番目かを選択するようにしてみましょう
int nBase[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
としておいて
第一項の選択は
int val = rand() % 9;
comp[0] = nBase[ val ];
として 決定します
第二項目は 第一項で使った部分を細工します
// 使用済みのベースデータを排除
nBase[val] = nBase[9];
nBase[9] = 0;
val = rand() % 9;
comp[1] = nBase[ val ];
第三項も同様に
nBase[val] = nBase[8];
nBase[8] = 0;
val = rand() % 8;
comp[2] = nBase[val];
第四項も同様に
nBase[val] = nBase[7];
nBase[7] = 0;
val = rand() % 7;
comp[3] = nBase[val];
といった具合にしてやればいいように思いますよ
No.2
- 回答日時:
重複以前に
val=rand()%10;
do{
comp[0]=val;
}while(comp[0]==0);
val=0のとき、無限ループする。
rand()をdoループの中に。
do{
val=rand()%10;
comp[0]=val;
}while(comp[0]==0);
フロー
A・comp[0]に1~9の値を入れる
B・i = 0
C・0~9の値を決める
D・comp[0]~comp[i]にその値があれば、Bに戻る
E・その値をcomp[i+1]に入れる
F・i++
G・i<4ならCに戻る
H・comp[0]~comp[3]を出力する
かな。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
CPUが16bitでも32bitOSでコンパ...
-
最初に聞かれたこと
-
c言語の問題の説明、各所ごとに
-
Cのオブジェクトファイルの逆ア...
-
C言語 関数、変数の宣言について
-
C言語について。
-
C言語でファクト関数を使わずに...
-
プログラミング 素数か素数では...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
int16_t の _t は何?
-
DLLファイルの逆コンパイラにつ...
-
visual studio 2022でのC#プロ...
-
プログラミングc++を全く分か...
-
DNCL(共テ用プログラミング言語...
-
C言語 配列と関数の練習問題
-
gccを行ってもexeファイルが生...
-
C言語 列挙型(enum型)変数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
超難問 Scripting.Dictionary ...
-
Dictionary(連想配列?)の使い方
-
foreachとかの勝手な省略?
-
PHPの構文で間違えが分からない
-
PHPでこのコード自体に意味は無...
-
VB.NET で 二次元のハッシュは...
-
ftokが動かない?
-
Excel VBAでフィルター後の対象...
-
PHPで連想配列のプルダウンメニ...
-
PHP:ツリー構造をulとli要素に...
-
PHP、{}記号の意味
-
smartyでtplファイルでの2次元配列
-
配列の値によって条件分岐がし...
-
POSTで渡されるデータの数がわ...
-
pdfファイルの複数添付 引数の型
-
ulのネストをタブ区切りに変換...
-
リストボックス複数選択抽出方法
-
多次元配列の中で条件に合う要...
おすすめ情報