
クリスマスパーティーのプレゼント交換のためにプログラムを書いているのですがなかなか上手くいきません。下に実装したい機能(僕の考えた解決策)と僕の書いたコードを載せておくのでアドバイスをお願いします。よろしくお願いします。
実装したい機能(僕の考えた解決策)
1.自分の持ってきたプレゼントが自分に当たらないようにする
(プレゼントの番号と配列に格納する順番を一致させれば解決できると 思うのですが…)
2.全員の手にプレゼントが渡るようにする
(全ての数字(例えば参加者が5人なら0~4)が割り振られたことを確認し満たしていなければやり直しにすれば解決できると思ったのですが…)
---コードここから---
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
char line[100]; /* キーボード入力用汎用変数 */
int participant; /* 参加者数 */
int flag = 0;
int i, j;
srand(time(NULL));
/* 参加者数を入力する */
printf("参加者数: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &participant);
int number[participant]; /* プレゼントの番号 */
char name[participant]; /* 参加者の名前 */
int check[participant]; /* チェック用配列 */
/* */
for(i = 0; i < participant; i++){
printf("参加者 %d 人目の名前: ", i + 1);
fgets(line, sizeof(line), stdin);
sscanf(line, "%s", &name[i]);
}
/* */
do{
for(i = 0; i < participant; i++){
number[i] = rand() % participant;
check[i] = number[i];
}
for(j = 0; j < participant; j++){
for(i = 0; i < participant; i++){
if(check[i] == j){
flag += 1;
}
}
}
}while(flag != participant);
/* */
for(i = 0; i < participant; i++){
printf(" %s ―\―\>プレゼント %d\n", name[i], number[i] + 1);
}
return 0;
}
---コードここまで---
No.2ベストアンサー
- 回答日時:
7人居たら、number配列を
number[0]=0
number[1]=1
number[2]=2
number[3]=3
number[4]=4
number[5]=5
number[6]=6
と、初期化します。
次に
number[0]と、number[1]~number[6]のどれかと入れ替え(乱数で選ぶ)
number[1]と、number[2]~number[6]のどれかと入れ替え(乱数で選ぶ)
number[2]と、number[3]~number[6]のどれかと入れ替え(乱数で選ぶ)
number[3]と、number[4]~number[6]のどれかと入れ替え(乱数で選ぶ)
number[4]と、number[5]~number[6]のどれかと入れ替え(乱数で選ぶ)
number[5]と、number[6]と入れ替え
を実行してみましょう。
あと
char name[participant]; /* 参加者の名前 */
では、7人たったら「charが7バイトあるだけ」で、7人分の名前を保持する事は出来ません。
上記の不具合を修正すると、以下のようになります。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
char line[100]; /* キーボード入力用汎用変数 */
int participant; /* 参加者数 */
int i, j, k;
srand(time(NULL));
/* 参加者数を入力する */
printf("参加者数: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &participant);
int *number = new int[participant]; /* プレゼントの番号 */
char **name = new char *[participant]; /* 参加者の名前 */
for(i = 0; i < participant; i++){
name[i] = new char[100]; /* 人数分、100バイトづつの名前用バッファ確保 */
}
/* */
for(i = 0; i < participant; i++){
printf("参加者 %d 人目の名前: ", i + 1);
fgets(line, sizeof(line), stdin);
sscanf(line, "%s", name[i]); /* &name[i]ではない事に注意 */
}
/* */
for(i = 0; i < participant; i++){
number[i] = i; /* 通し番号で初期化。重複しない事が保証される */
}
/* */
for(i = 0; i < participant - 1; i++){
j=(rand() % (participant - 1 - i)) + 1 + i;
/* 入れ替えを行う */
k = number[i];
number[i] = number[j];
number[j] = k;
}
/* */
for(i = 0; i < participant; i++){
printf(" %s ――>プレゼント %d\n", name[i], number[i] + 1);
}
/* */
for(i = 0; i < participant; i++){
delete name[i]; /* 確保したら解放する */
}
delete name; /* 確保したら解放する */
delete number; /* 確保したら解放する */
return 0;
}
No.1
- 回答日時:
あれ・・・どこかで聞いた事が有る話だね・・・
そのお話だと・・・
・全員のプレゼントに番号を振る(皆が固定位置なら振らなくても良い)
・「1」「+」「+1」などとかかれた要するに+1の紙を自分以外の人数分用意する
・「0」とかかれた紙を+1の紙より1少ない数用意する
・箱に入れてかき回す
・自分以外の全員に1枚引かせる
・総計分だけ箱の番号をずらす
とやると、全員が攪拌の権利を有し、かつ自分のプレゼントを自分で受け取る事は無くなるという方法。
(引く人数より0が1枚少ないので必ず1が1枚出て必ず1ずれ、自分は引かないので全員が1を引いても完全1周しない)
何番の質問だったかな・・・見つからないけどそんなやりかた。
原理が簡単だからプログラム化は 難しくないと思う。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
任意の数から人の数までの素数...
-
C言語 累乗の計算
-
条件演算子 ? :
-
Windows11のカメラで動画を撮り...
-
フォームを開くときに、コンボ...
-
Nullってどういう意味ですか?
-
<a href=…>がうまくいかない
-
足して100になるような乱数のア...
-
インクリメント演算子の前置(+...
-
計算機イプシロン
-
テキストボックスの値を変数に...
-
i++と++i ってどう違うのですか?
-
大きな数の乱数を作るには
-
GPIBの応答について
-
VBAのチェックボックス結果を集...
-
C言語 列挙型(enum型)変数について
-
ruby on railsのscaffoldで配列...
-
エラーの意味は? Lvalue req...
-
アンダーバーとバックスラッシュ
-
MATLABで配列をファイルへ書き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プレゼント交換プログラム
-
C言語初心者です。次の問題で質...
-
c言語の文字列について質問です...
-
c言語 プログラミング 等比数列...
-
c言語でランタイムエラーの処理...
-
VBAでダブルコーテーション入り...
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
excelの、ある数式内の{}の意...
-
EXCEL/VBA 変数の値をクリップ...
-
VB6.0-整数と余りを求める
-
配列の値を置換するにはどうす...
-
vbsでテキストファイル内の文字...
-
jsp~jspにhiddenを使って変数...
-
VBAのWorksheetFunctionの引数...
-
エクセル、この関数の意味は?
-
COLUMN(1:1)の意味を教え...
-
[VBS]変数を定数に変換する方法...
-
C#で動的にコントロールを取得...
おすすめ情報