- 締切済み
プログラミングにご助力下さい
下図のような状態で0から各番号全ての番号当てに情報を届けるプログラムソースを書きたいと考えています。 Visual Studioを扱いプログラムソースを書いていますが、デバッグ無しで実行(コンパイル)した時に、 送信した回数を出力するプログラムを書きたいです。 前提条件として ・0番で情報を生成し、情報数は10とする。 ・各番号は次にどの番号に情報を届ければいいか予め把握している。 (図の矢印で示した通りで、例えば1番は8、4に対してのみ情報を伝える) 全体の動作の一例を書き上げます。 0番で情報生成 0番から1,2、3にその情報を伝える(3回送信したとカウント) 次に1番が8番と4番に(既に3回送信していて、新たに2回で5回送信したとカウント) 2番が4番と5番に(同様に既に5回送信、新たに2回送信で合計7回送信) 3番が5番に(既に7回送信、新たに1回送信、合計8回送信) 8番が7(既に8回送信、新たに1回送信、合計9回送信) 4番が7(既に9回送信、新たに1回送信、合計10回送信) 1つめの情報の送信終了 0番で2つめの情報生成。 以下繰り返し 10個の情報を届け終わったら終了。 出力結果;送信した回数は100回です。 (1つの情報を全てに届けるのに10回送信、情報が10個なので10*10=100回) 自分のプログラム知識では上手くまとめ切れません。 C言語を軽く学び基本的な文法や変数,配列,構造体,関数が理解できる知識です。 この例題は自分で考えだしたものですが、これのプログラムソースを把握できれば自分がこの後に行おうとしていることに活かせるため何としても理解したいと考えています。ご助力お願い致します。 先ほど、同様な質問内容で質問を投稿させて頂きましたが、伝わりにくかった部分が多かったため、送信回数の定義や、動作の一例を書き上げるなど補足し、改めて投稿させて頂きました。 よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
既に指摘がありますが、まずは、動作の仕様を決めることです。 プログラムはその後です。 必要なのは、「その図の動作の説明」ではありません。 どの図でも、説明通りにやったら答えが求められる(あるいは、条件を満す解が無い、ということが判かる)、そういう一般化された説明です。 今の説明では、単純に「送信回数」=「矢印の本数」*「情報数」」です。 プログラム書くほどのものではありません。 ・「情報が10個」というのは意味があるのか? 現行では、単に定数倍するだけです。 1個として考えても同じことです。 ・経路が重複したときの扱いは? 今回の 例では 0-1-4 0-2-4 と重複して届いた、のべ20個の情報を、4からは10個だけ送信してます。 このルールが曖昧です。「同時に受け取った」から1回分なのか、「同じデータを受け取った」から1回分なのか。 例えば 0-A-B 0-C-D-B とあったら、Bが送信するのは10個ですか20個ですか? あと、ここでは「同様の質問をするなら、古い質問は一旦締め切る」のがルールです。
- maiko0318
- ベストアンサー率21% (1483/6969)
>4 は 1 と 2 から 2回情報をもらうけど, 「1 から情報を受け取っている」ことを知っているから「2 から情報をもらった」ときにはなにもしないという解釈なんじゃないかな>#2. ならば、2→4の矢印は意味がなく、消していただくことになります。>#3様
- Glory_777
- ベストアンサー率50% (105/208)
C言語のイメージでよければ。 勉強と言う事でしたので、構造体のタイプデフ宣言。スタティック配列等を使いました。 再帰処理を使ってみました。 ここに直に書いたので、試験していません。コンパイルも通るか怪しいので、 意図を汲み取って、コンパイル含めて、デバッグしてみてください。 出題を見て思ったのですが、各ノードは受信したデータの中継をするのですか? 不明な点もあったので、固定的なデータを定められたリンクに従って送信する仕様にしました。 ---------------------------------------------------------- #incluce <stdio.h> /**************************************/ /* 各種宣言 /**************************************/ #define MAXDATANUM 10 // 今回送信するデータの最大数 #define MAXSENDNODE 10 // ノードの最大数 // 送信数と送信先テーブルの構造体 typedef struct { int maxSendNode; int sendId[MAXSENDNODE]; } SendRoot; /**************************************/ /* プロトタイプ宣言 /**************************************/ int SendInf( int *cu , int id , int dat ); void SendDo ( int cu , int src , int dst , int dat ); /**************************************/ /* メイン関数 /**************************************/ void main( ing argc , char **argv) { // 仮データ整数で10個 static int dat[MAXDATANUM] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }; int i, id, cu=0; // 10個のデータを送信 for( i=0 ; i<MAXDATANUM ; i++ ) { // 10ノードの送信処理を促す SendInf( &cu , 0 , dat[i] ); } printf( " Total Send Count = %d \n" , cu ); } /**************************************/ /* データ同報ノード番号idがdatをマルチキャスト /**************************************/ int SendInf( int *cu , int id , int dat) { static SendRoot sendRoot[MAXSENDNODE] = { { 3 , { 1 , 2 , 3} }, { 2 , { 8 , 4 } } , { 2 , { 4, 5 } }, { 1 , { 5 } } , { 2 , { 7 , 6 } } , { 0 , { 0 }}, { 0 , { 0 } } , { 0 , { 0 } } , { 1 , { 7 } } }; int i; if( id < 0 || id >= MAXSENDNODE ) return( 0 ); for( i=0; i<sendRoot[id].maxSendNode ; i++ ) { SendDo( *cu , id , sendRoot[id].sendId[i] , dat ); *cu += 1; SendInf( cu , sendRoot[id].sendId[i] , dat ); } return( i ); } /**************************************/ /* データ個報 ノード番号srcがdstにdatを送信 /**************************************/ void SendDo( int cu , int src , int dst , int dat ) { printf( "%03d: [%03d]->(%03d)->[%03d]\n", cu , src , dat , dst ); }
- Tacosan
- ベストアンサー率23% (3656/15482)
4 は 1 と 2 から 2回情報をもらうけど, 「1 から情報を受け取っている」ことを知っているから「2 から情報をもらった」ときにはなにもしないという解釈なんじゃないかな>#2. http://okwave.jp/qa/q8451289.html でもいわれてるけど, 「プログラムを組む」以前の問題としてアルゴリズムがわかっていないんだと思う.
- maiko0318
- ベストアンサー率21% (1483/6969)
1と2から4に送りますが、 1-4-7経路と 2-4-7経路を通りますので、4-7は2回カウントではないのでしょうか? #include<stdio.h> int sum=0; int main(void){ call(1,0); call(2,0); call(3,0); call(4,0); call(5,0); call(6,0); call(7,0); call(8,0); call(9,0); call(10,0); printf("\n合計カウント=%d",sum); } call(int jyohou, int a) { sum++; printf("情報=%d,番号=%d,カウント=%d\n",jyohou,a,sum); //デバッグ用 if(a==0) { call(jyohou, 1); call(jyohou, 2); call(jyohou, 3); } if(a==1) { call(jyohou, 8); call(jyohou, 4); } if(a==2) { call(jyohou, 4); call(jyohou, 5); } if(a==3) { call(jyohou, 5); call(jyohou, 6); } if(a==4) { call(jyohou, 7); } if(a==8) { call(jyohou, 7); } } こんなのでどうでしょう?
- Tacosan
- ベストアンサー率23% (3656/15482)
4番は 6番に情報を送らなくてもいいんですか? もしそうだとしたら, 「送るか送らないか」はどのように区別するのですか?
補足
すいません書き漏らしです。 矢印でつながっている部分は全て送信すると考えてください。 4番は6番に送信します。 よって送信回数は1つの情報につき11回 10通で110回の送信を行うが正しいです。