再起処理について

このQ&Aのポイント
  • クリティカルパス長の値が1以外の値になっているのが分かりません。
  • 後続タスクにはFFGGGIJJLLMPPPQQを入力してください。
  • 再起処理を使ってクリティカルパスの長さを求める関数が実装されています。
回答を見る
  • ベストアンサー

再起処理について

critical_pathの関数を実行したときにreturn (1);で最終的に処理が終わっているのにもかかわらず、クリティカルパス長の値が1以外の値になっているのが分かりません。 後続タスクは FFGGGIJJLLMPPPQQ@ を入力してください。 宜しくお願いいたします。 #include <stdio.h> #define TASK 17 /* タスクの個数 */ #define SELF 0 #define SUCC 1 #define PATH 2 /* クリティカルパスの長さを求める関数 */ int critical_path(int i, int ary[][TASK]); void main(void) { int tbl[3][TASK]; /* タスク情報 */ /* tbl[SELF] 自タスク (ソート後優先順位表になる) */ /* tbl[SUCC] 後続タスク */ /* tbl[PATH] クリティカルパスの長さ */ int succ; /* 後続タスク */ int i, j, k, t; /* 後続タスクの入力 */ printf("後続タスクの入力(ないものは'@')\n"); printf(" タスク : "); for(i = 0; i < TASK; i++){ tbl[SELF][i] = 'A' + i; /* 初期化 */ printf("%c", tbl[SELF][i]); } printf("\n後続タスク : "); for(i = 0; (succ = getchar()) != '\n'; i++) tbl[SUCC][i] = succ; for(i = 0; i < TASK; i++){ /*クリティカルパス長*/ tbl[PATH][i] = critical_path(i, tbl); printf("tbl[PATH][i] = %d\n", tbl[PATH][i]); } } int critical_path(int i, int ary[][TASK]) { if((char)ary[SUCC][i] == '@'){ return(1); } else{ return(critical_path(ary[SUCC][i] - 'A', ary) + 1); } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> printf("3?n"); > return(critical_path(ary[SUCC][i] - 'A', ary) + 1); > printf("4?n"); 再帰呼び出しの結果をそのまま返してるので、4番にいかないですね。 int ret; printf("3?n"); ret = (critical_path(ary[SUCC][i] - 'A', ary) + 1); printf("4 %d?n", ret); return ret; こうすれば、再帰呼び出しの結果が出力されるので、わかりやすいと思いますよ。

yukikundesuyo
質問者

お礼

どうもご親切にありがとうございます。 おかげでスッキリと理解することが出来ました。

その他の回答 (1)

回答No.1

>クリティカルパス長の値が1以外の値になっているのが分かりません。 elseのときに1以外の値を返しているからです。 もっとシンプルな例で動作をみるとわかりやすいんじゃないでしょうか。 #include <stdio.h> int recursive_call_test ( int x ) { int y; if ( x<=1 ) { return 1; } else { y = recursive_call_test(x-1) + x; printf(" %d %2d?n", x, y); return y; } } int main ( int argc, char** argv ) { int x; for ( x=1; x<10; x++ ) { printf("%d: %2d?n", x, recursive_call_test(x)); } return 0; }

yukikundesuyo
質問者

補足

回答ありがとうございます。 上記サンプルは理解できましたが、私のソースの方がまだ理解できない次第です。 上記サンプルを私が理解しやすいように変更しました。 下記ソース #include <stdio.h> int recursive_call_test ( int x ) { int y; printf("1\n"); if ( x<=1 ) { printf("return\n"); return 1; } else { printf("2\n"); y = recursive_call_test(x-1) + x; printf("%d:%d?a\n", x, y); return y; } } int main ( int argc, char** argv ) { int x; for ( x=1; x<10; x++ ) { printf("%d:%d?b\n", x, recursive_call_test(x)); } return 0; } (実行結果) 1 return 1:1?b 1 2 1 return 2:3?a 2:3?b この場合retrun yで返っている値が3ということが分かります。なので2:3?bの3という値は納得できます。 (私のソースです) int critical_path(int i, int ary[][TASK]) { printf("i = %d\n", i); printf("1\n"); if((char)ary[SUCC][i] == '@'){ printf("2\n"); printf("return \n"); return(1); } else{ printf("3\n"); return(critical_path(ary[SUCC][i] - 'A', ary) + 1); printf("4\n"); } } (実行結果) 後続タスクの入力(ないものは'@') タスク : ABCDEFGHIJKLMNOPQ 後続タスク : FFGGGIJJLLMPPPQQ@ i = 0 1 3 i = 5 1 3 i = 8 1 3 i = 11 1 3 i = 15 1 3 i = 16 1 2 return tbl[PATH][i] = 6 この場合return(1);で処理が終わっています。 なのでこの1が6に成るのが分からない次第です。 回答のほど宜しくお願いいたします。

関連するQ&A

  • break文の処理について。

    #include<stdio.h> #define MAX 1000 main(){ int i = 0; int sum = 0; int ary[MAX]; puts("整数を入力してください"); ----------------------------------------- while(i < MAX){ printf("No.%d:" , i+1); scanf("%d" , &ary[i]); if(ary[i] == 9999){ i++; break ; } sum += ary[i]; i++; } ------------------------------------------ if(i > 1){ printf("合計は%dで平均は%.2fです\n" , sum , (double)sum/(i-1)); } return; } -------で区切っている部分になりますが、 配列aryの値に9999が入ると、breakでifとwhileのループを抜けることになりますが、 ここのbreakについては、ifだけにかかるのではと思っております。 このソースが書いてある解説には「多重ループの繰り返し文の内側の繰り返し文の中で、 break文が使われるとその繰り返し文から抜け出ることになります。」と記載されており ます。 多分ですが、ifは繰り返し文ではないため、whileを抜け出すことができるのではと 思っているのですが、確認のためご教授の程お願い致します。

  • 引数で指定された配列の要素数の取得

    どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }

  • ポインタ配列のアドレスについて

    #include <stdio.h> int main() { int i; char *ary[] = { "a" , "b" , "c" }; for(i=0; i<3; i++) printf("%u\n" , &ary[i]); return 0; } /*実行結果 6618616 6618620 6618624 */ 上記のプログラムを実行したときポインタ配列*aryがchar型だろうがdouble型だろうがアドレスが4つとびになるのですがなぜなんでしょう?アドレスを求めるプログラム自体が間違っているのでしょうか?

  • 引数が配列のときの関数内でのsizeofについて

    こんにちは. Cを勉強している最中に疑問にあったことを質問させていただきます.以下のプログラムで配列myarrayの中の最大のメンバーを見つけるプログラムです.コメントアウトしてある //int ary_size = sizeof(myarray)/4; をグローバル変数で定義するとうまく最大の数を見つけてくれるのですが, 関数の中で int ary_size = sizeof(ary)/4; と定義するとうまくいきません.そこで,以下の printf("The size of the ary is %d\n",ary_size); という表示を追加したところ,ary_size = 1となっていることが分かりました. なぜそうなるのでしょう?関数の引数はint ary[]の配列なので,sizeof(ary)でaryがメモリ中で占めるバイト数が得られるんじゃないんですかね?ちなみに私の環境ではsizeof(int)は4バイトなので int ary_size = sizeof(ary)/4; と割る4で配列のメンバーの数を求めています. 初心者の質問ですみませんがよろしくお願いします. #include <stdio.h> #include <Windows.h> int myarray[] = {1,2,3,4,5,6,7,2}; int FindMax(int ary[]); //int ary_size = sizeof(myarray)/4; int main() { int max; max = FindMax(myarray); printf("The maximum value is %d\n",max); Sleep(2000); return(0); } int FindMax(int ary[]) { int ary_size = sizeof(ary)/4; int i; int max; max = ary[0]; for(i=1;i<ary_size;i++) { if(ary[i]>max) { max = ary[i]; } } printf("The size of the ary is %d\n",ary_size); return(max); }

  • C言語

    下のようにするだけでなぜ、画面上に数字が表示されるのでしょうか? #include <stdio.h> #include <stdlib.h> #define KOSU 100 void main(void) { int ary[KOSU]; int key; int i; for (i = 0; i < KOSU; i++){ ary[i] = rand(); printf("%8d", ary[i]); } }

  • 再起になってますか?[C++]

    再起を使って総和のプログラムをつくったのですが、ちゃんと再起に なってるのか自信がないので教えてください。 これはほんの一部のコードなんですが computeRecursiveSum()の中のreturn( computeSum() ); の部分があってるのかわかりません。 本やそこらのサイトをみてみるとこの部分は、 return(n+Sum(n-1)); という風になっているのですが 下のような書き方してもよろしいのでしょうか? 一応、正しい答えはでます。 int Summation::computeSum() const{   int a=0;   for (int i=0; i<=number; i++){     a = i*(i+1)/2;   }   return a; } int Summation::computeRecursiveSum() const {   int n = number;   if ( n < 0 )     return (-1);   else if ( n = 0 )     return (0);   else     return( computeSum() ); }

  • printfの挿入箇所

    #include <stdio.h> #include <stdlib.h> #define N 500 void bubblesort(int h, int k, int *A); void swap(int i, int j, int *A); int main(void) { int A[N]; int n, i; FILE *file; file=fopen("sortdata", "r"); /* データの読込み */ fscanf(file, "%d", &n); if(n>N) { printf("Illegal array size n = %d for N = %d\n", n, N); exit(1); } for(i=0; i<n; i++) fscanf(file, "%d", &A[i]); /**/ printf("A = "); /**/ printf("\n"); bubblesort(0, n-1, A); /* 配列A[0]からA[n-1]の整列 */ return(0); } /* A[k],...,A[h]の要素をバブルソートによって整列 */ void bubblesort(int h, int k, int *A) { int i, j, p; int no; int test; /* test==1; すでに整列済み */ for(i=h; i<k; i++) /* バブル操作の反復 */ { test=1; for(j=k; j>=i+1; j--) { for(no=0; no<j; no++) printf(" %d",A[no]); if(A[j]<A[j-1]) { printf(" > %d ",A[j]); swap(j, j-1, A); test=0; } else { printf(" < %d ",A[j]); } for(no=j+1; no<=k; no++) printf(" %d ",A[no]); printf("\n"); } printf("\n"); if(test==1) return; } return; } /* Swap A[i] and A[j]. */ void swap(int i, int j, int *A) { int temp; temp=A[i]; A[i]=A[j]; A[j]=temp; return; } 以上のプログラムを A = パス1: 7 5 1 2 8 > 3 7 5 1 2 < 3 8 7 5 1 < 2 3 8 7 5 > 1 2 3 8 7 > 1 5 2 3 8 1 7 5 2 3 8 パス2: 1 7 5 2 3 < 8 1 7 5 2 < 3 8 1 7 5 > 2 3 8 1 7 > 2 5 3 8 1 2 7 5 3 8 パス3: 1 2 7 5 3 < 8 1 2 7 5 > 3 8 1 2 7 > 3 5 8 1 2 3 7 5 8 パス4: 1 2 3 7 5 < 8 1 2 3 7 > 5 8 1 2 3 5 5 8 パス5: 1 2 3 5 7 < 8 1 2 3 5 7 8 比較は15回でした。 交換は8回でした。 と表示させたいのですがうまくいきません。 どなたかご指導よろしくお願いします

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }

  • 【C言語】関数へのポインタ渡し

    配列中の最大値を発見するプログラムとして, 下記のようなプロブラムが参考書にのっていましたが,よくわからない箇所があり,質問させてください。 findMaxという関数に渡されているのは,aryの先頭アドレスだと思いますが, findMax関数内では,pary[]を引数としていますが,これはどういう意味なのでしょうか? 実際にどのような処理が行われているのかよくわかりません。 ポインタ変数? でもそのあとにはpary[0],pary[1]として使っているしよくわかりません。 教えていただけると嬉しいです。宜しくお願いいたします。 最近Cを学び始めましたが,ポインタがまだなれません…。 ============================ #include <stdio.h> #define DATA_SIZE (12) int ary[] = {5,7,10,1,25,15,30,10,31,13,22,32}; int findMax(int *, int); int main(void) { int max; int i; max = findMax(ary,DATA_SIZE); printf("Maximum number is %d\n",max); return(0); } int findMax(int pary[],int size){     int max;       int i; max = pary[0]; for(i = 0; i < size; i++){ if(pary[i] > max){ max = pary[i]; } } return(max); }

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

専門家に質問してみよう