• 締切済み

アルゴリズムの流れ図

いつもお世話になってます。アルゴリズムの流れ図の中でいくつかどう処理されているのか分からない箇所がありますので、どなたか教えて頂きたいです。 (1)ループの中で、値が0とかマイナスになるときは増分にあたる所はやらないでいいのですか。 (2)入力文字(入力位置+2)→文字数と書いてあって、その後に文字数-1→文字数ってなっている時、入力文字(入力位置+2)が5(4)だったら文字数に入る値は何になりますか。またそのアルゴリズムの書いてある参考書の隣のページのアルゴリズムの様子が書いてあるのから察すると文字数=4みたいですが、じゃあなんで入力文字(入力位置+2)→文字数を入力位置+2→文字数にしないのですか。 (3)定義済み処理(サブルーチン)Xの中にまたサブルーチンXが入っているときはその値を持ってまた最初に戻ればいいんですか。アルゴリズムの様子の所に書いてある入口、出口とはなんですか。 以上1つでも構いませんので宜しくお願いします。

みんなの回答

  • Eririka
  • ベストアンサー率33% (2/6)
回答No.5

配列番号と中の値との間には、 関連が御座いません。

noname#50176
noname#50176
回答No.4

(QSORT(始,終))  ・・・・弐     |     ・------Aへ(Bへ)     ・       ∥QSORT(始,終)∥  ・・・・参  (B) |  C  ・       ・←-----A     ・            (同上処理) ∥QSORT(始,終)∥       ・・・・四 貴方説ですと、“戻っている”のではなく“飛んでる”んですね。 Aに抜けた時に抜ける前の結果値が反映されてますか? 処理が抜けた(戻った)時にまず (B)へ移動しここでたとえば 1.格納配列変数[インデックス]=データ (戻り値は整列済みデータと対応インデックス値)  2.ネストカウンタ=ネストカウンタ-1 3.カウンタ>0 なら 1へ、それ以外は通常処理のCに続く 四でも同要領処理をします。

noname#50176
noname#50176
回答No.3

<追記> >2個目のサブルーチンの出力値はどこに返すのですか? ネスト毎、最終ネスト(つまりネスティングクリア)いずれも QSORT の次の処理の時点で返されてることになります。 抽象図なため割愛されているかもしれませんが、 サブルーチンは戻り値を取りませんから、おそらく呼び出し先の ルーチンでポインタ変数等を使い代入し呼び出し元では返り後に データポインタ(結果が格納)を参照するという処理概念が 妥当だと思いますよ。

noname#50176
noname#50176
回答No.2

なるほど!、図で把握できました!!  (はじめ)    | |  1→始  | | 件数→終 |    | ∥QSORT(始,終)∥ ←サブルーチンのつもり・・・壱    |  (おわり)  の隣に (QSORT(始,終))  ・・・・弐     |     ・  ←いろいろ書いてある     ・   初期化:始=ピボット値-1,終=ピボット値+1     ・   比較 <始=1、終=ソートデータ数> となったら         サブルーチンを1ネスト分、返す。         ・・・のような処理かと思います。 ∥QSORT(始,終)∥  ・・・・参      |     ・       ・  ←いろいろ書いてある     ・    (同上処理) ∥QSORT(始,終)∥ つまり未整列データのソートを弐のスコープで処理します。 参からがピボットの左辺、右辺のそれぞれをピボット打ちして 同処理のソート、つまり弐のルーチンを呼び出します。 四、五があったとしてもデータ数に整合させているだけですから 同じことです。 結果として参が終わったらそのまま1つ下の次の QSORT を 呼び出せばいい訳です。 流れとしては、 1.壱から弐を呼び出す 2.弐のスコープで始めの全体のソート開始 3.弐のスコープから弐を呼び出す。 ※ソート分繰り返し 4.比較データがなくなったら弐から以前の呼び出し元の弐の   QSORT の次へ戻りますがネストしているのでネスティングを   クリア(3回ネストしたらスタックを3つインクリメント)   して通常通り次の参へいきます。 5.参で切り詰めたデータにピボットを打ちソート対象を 3 と   同じ要領で参スコープから弐を呼び出します。 6.4と同じ要領でネストから帰ると参の QSOURT の次の命令へ   続きます・ 7.5,6の要領であとに続く QSORT を呼び出します。 私見寄りですみません!!

yoshikon
質問者

補足

う゜~言葉が難しいのか、文章読解力がないのかいまいち理解できてないようです。同じところでつまづいています。 (QSORT(始,終))  ・・・・弐     |     ・------|       ・      | ∥QSORT(始,終)∥   |  ・・・・参      |      |     ・      |       ・←ーーーーーー     ・            (同上処理) ∥QSORT(始,終)∥       ・・・・四 何回か参弐参弐参弐・・とやってるうちに分岐して参をとばして、下にいってから参考書と値が合わなくなるのですが、これだけで分かりますか。

noname#50176
noname#50176
回答No.1

(1) やってはいけないのではなくブレイクポイントの便宜上で やる必要がないのです。 これはアセンブラをやれば解りますが、比較では ゼロフラグ、キャリーフラグを参照するスタイルがスマートなため C言語でも適用されているものと思われます。 (2) Cアルゴリズムは関数が依存するものです。 f(x)=y 形式の数学的概念が適用されているのではないですか? つまり“入力文字(入力位置+2)→文字数” とは、シソーラスのよるもので 入力文字と言う目的対象における、入力位置+2 の実体を参照して 文字数に反映させているのではないでしょうか? (3) 第2層サブルーチンに入るコール直前、ここが入り口です。 第2層サブルーチンが出力値を返しコール直前ポイントの 次が出口です。 最初に戻る必要はありません、と言うよりしてはいけません。

yoshikon
質問者

補足

ありがとうございます。情報処理を独学で勉強していて、この間初級シスアドとったばかりなので、言葉が難しかったのですが(1)(2)は結論だけ分かったので解決です。 (3)なのですが、第2層は2個目のって思ってよいのですよね?2個目のサブルーチンの出力値はどこに返すのですか?ちなみに参考書ではクイックソートのアルゴリズムが書いてあり、  (はじめ)    | |  1→始  | | 件数→終 |    | ∥QSORT(始,終)∥ ←サブルーチンのつもり・・・壱    |  (おわり)  の隣に (QSORT(始,終))  ・・・・弐     |     ・  ←いろいろ書いてある     ・     ・ ∥QSORT(始,終)∥  ・・・・参      |     ・       ・  ←いろいろ書いてある     ・ ∥QSORT(始,終)∥     ・ となっていて壱から弐にいって参まできたらどうすればいいか分からないので、教えてもらえると非常にありがたいです。よろしくお願いします。  

関連するQ&A

  • アルゴリズムのトレースについて

    閲覧ありがとうございます。 アルゴリズムのトレースの問題を解いていて、分からないところがあったため質問させていただきました。 先日からアルゴリズムについての授業が始まり、今日はトレースを習いました。 トレースについてはとりあえず基礎は問題なかったのですが、そのトレースについての問題で、「入力データ(入力された値)」という言葉がでてきました。 この言葉が、トレースの中のどの値を指しているのかを私は流れ図の「Aを読む」などと読み込んだ値だと解釈しました。 読み込む値は1つしかありませんでしたし、その他の流れ図の「B+2→B」などは"処理"だと考えたからです。 授業中問題の解説があったのですが、私の解釈とは違っており難しくて理解できませんでした。 教え方の上手な先生に聞こうと思ったのですが今日はおりませんでした。 授業で解いた問題は私の考え方で解けたのですが、この解釈は合っていますか? 違っていましたら、考え方を教えて頂きたいです。 お願い致します。

  • アルゴリズムのある質問に流れ図をどう書けばいいのかを教えてください

    * 列結果をもとにトップ10(上位10件)を表示する。 ただし、要素数が10件以下の時は全要素を表示、 10件を超えるときは10件全て表示後、11件目以後にも にも件目と同点のものがあれば、同点のものを全てを表示する このアルゴリズムの流れ図をどう書いたらいいのかどうしても分かりません。  開始  ↓ 処理:xxx  ↓  ・   ・  ・ フローチャートまではかけないと思うのでよければ分かる人教えてください

  • 流れ図からプログラムに直してください!【C言語】

    その流れ図をC言語のプログラムに直してくれませんか? 処理2はscanf(..);って感じの内容です。 入口 処理1 for(処理2; 判断; 処理4){ 処理3 } 出口 って感じかなって思ったんですが、for文の中にscanfの文を入れてもいいのかわからずに悩んでます。 ループ文なのでwhile文、for文、do..while文のどれかかな?って思ったんですが違う気もして、わかるかたいらっしゃいませんか?

  • このアルゴリズムを何回繰り返せばよいのか。

    次のようなアルゴリズムAがある。 P(x)=1であるような入力xに対しては必ず正しい答え1を出すが、 P(x)=0であるような入力xに対しては確率0.001で正しい答えを出し、 確率0.999で間違った答えを出す。 この時、どんな入力に対しても確率0.99以上で正しい答えを出すアルゴリズムを構成せよ。 という問題なのです。 答えは  0.01 > (0.999)**n   ( (0.999)**nは0.999のn乗の意味 ) が成り立つ最小のn回アルゴリズムを繰り返せばよいと考えたのですが、 この式を解くとnが2000以上になると思います。 難しくてきちんとしたnの値は出てきませんでした。 何かこの式を簡単に解く式変形の仕方ってありますか?? それともこの問題をこの式で解くのが間違っているのでしょうか??? よろしくお願いします!!!

  • 逆行列を求めるアルゴリズムとコード化

    正則な正方行列Aの逆行列A^(-1)を求めるための数値計算のアルゴリズムを考えています。 AX=Bの場合、Xを求めるプログラムはガウスの消去法等でコード化することはできます。理論的にはA^(-1)があるとそれを左からかけるとXが求まりますが、そうなるとXとA^(-1)は同じ立ち位置なのかなと思ったのですが。XがわかってもA^(-1)はすぐには求まらないのでしょうか。未知数の数が違う(A^(-1)は3x3で、Xは3)のでそういうことになるのかと思いますが。逆行列は小行列で展開して求めていくという方向もあります。コンピュータで逆行列を求める計算アルゴリズムについてよろしくお願いします。行列のサイズとしては100x100程度まではいきたいのですが。

  • アルゴリズム

    教えてください。 フローチャート作成 入力された10進の自然数xを2進数yに変換し出力するプログラムのフローチャートをサブルーチンも含めて全て書け。ただし、整数型の変数aから第iビット目(最初を下位ビットとして第0ビットとせよ)を取り出す整数型関数(メソッド)get_bit( a,i )を作成すること。 プログラム作成 上で設計したプログラムを作成する。 実行結果 上で作成したプログラムの実行し、その実行結果を示す。

  • 探索アルゴリズム

    aという対象の位置は(x,y) その周辺10の距離内にいるモノを見つけたい このモノというのはたくさんあるとします。モノの座標は一覧としてもっています。 x+10, x-10,y+10,y-10を境界にifで処理するとモノ一つに対して4度処理を必要として、モノの数だけ処理をする必要があり非効率だと思ったのですが他の効率的な方法が思い浮かびません なにかいい方法はありますか?

    • ベストアンサー
    • CGI
  • 遺伝的アルゴリズム

    遺伝的アルゴリズムをCで組み、Cygwinのgccコマンドでコンパイルしたのですが、実行するとエラーが出てしまいます。 gsb内で実行しwhereコマンドで異常箇所を探した場合のメッセージは以下の通りです。 #0 0x61016525 in stack_info::walk () from /usr/bin/cygwin1.dll #1 0x7c859dcc in OutputDebugStringsA () from /cygdrive/c/WINDOWS/system32/kernel32.dll #2 0x40010006 in ?? () #3 0x00000000 in ?? () プログラムは長いので載せられませんが、アルゴリズム中の染色体は二次元配列の遺伝子を含む構造体です。 遺伝子の配列に関わるノード数(chromo[timeslot][NODE]←このNODEです。プログラム冒頭で値をdefineで宣言しています)が30位なら世代数が比較的多くても動くのですが、これが50あたりになると世代数が低くてもエラーが出てしまいます。 printf関数で交叉や突然変異の結果を表示しているのですがちゃんと動作しているようです。 二台のパソコンどちらでやってもこのようなメッセージが出るので困っています。何が起こっているか見当がつく方、いらっしゃいましたら助言願います。 よろしくお願いいたします。

  • うるう年判定のアルゴリズム

    javaでうるう年判定のプログラムを作成しています。 プログラム自体はサーバにアップするときに実行結果が正しいかどうかテストされます。 仕様としては、 1.時間に関するAPIなどは一切使わずに完全に自作 2.入力される値はLong型の"秒"数(APIで提供されているのはミリ秒ですが) 3.60537895631062456L などの入力値に対して、年/月/日 (曜日) 時:分:秒 yday=元旦からの経過日数 を出力 最初は以下の関数を使用してループをかけていたのですが、仕様3の入力値に対して50秒近くかかってしまい、上手くいきませんでした。 public static int isLeap(int year){ if(year%4==0 && (year%100!=0 || year%400==0)) return 1; return 0; } 問題点はループ回数が多いことで、作る時点で分かってはいたのですが、ここまで遅くなるとは思っても見ませんでした。 これを使わない方法としては、一回だけうるう年(=n)を見つけ、その後は「(n+4)との比較+100で割り切れず400で割り切れる場合は別」という処理を行うことによって、処理時間を30秒付近にまで短縮することができたのですが、どうも10~15秒以内で終わらせなければテストにパスすることができないようです。 なんとか色々考えてはみたものの、上手いアルゴリズムは思いつきませんでした。 うるう年を処理するための"高速な"アルゴリズムはないのでしょうか。 お知恵を貸してください。よろしくお願いします。

    • ベストアンサー
    • Java
  • うるう年判定のアルゴリズム

    javaでうるう年判定のプログラムを作成しています。 プログラム自体はサーバにアップするときに実行結果が正しいかどうかテストされます。 仕様としては、 1.時間に関するAPIなどは一切使わずに完全に自作 2.入力される値はLong型の"秒"数(APIで提供されているのはミリ秒ですが) 3.60537895631062456(Long値) などの入力値に対して、年/月/日 (曜日) 時:分:秒 yday=元旦からの経過日数 を出力 最初は以下の関数を使用してループをかけていたのですが、仕様3の入力値に対して50秒近くかかってしまい、上手くいきませんでした。 public static int isLeap(int year){ if(year%4==0 && (year%100!=0 || year%400==0)) return 1; return 0; } 問題点はループ回数が多いことで、作る時点で分かってはいたのですが、ここまで遅くなるとは思っても見ませんでした。 これを使わない方法としては、一回だけうるう年(=n)を見つけ、その後は「(n+4)との比較+100で割り切れず400で割り切れる場合は別」という処理を行うことによって、処理時間を30秒付近にまで短縮することができたのですが、どうも10~15秒以内で終わらせなければテストにパスすることができないようです。 なんとか色々考えてはみたものの、上手いアルゴリズムは思いつきませんでした。 うるう年を処理するための"高速な"アルゴリズムはないのでしょうか。 お知恵を貸してください。よろしくお願いします。

専門家に質問してみよう