アルゴリズムについての質問

このQ&Aのポイント
  • アルゴリズムのフローチャートについて質問です。50個の文字データが入った配列hai[]の要素を順番に参照し、英字bの個数を数えていくフローチャートが分かりません。
  • 具体的なフローチャートの手順は以下の通りです。まず、I(haiの添え字)を0、shukeiを0で初期化します。次に、hai[I]がbかどうかを判定します。もしbでなければ、Iを1増やして次の配列に移動します。bであれば、shukeiを1増やしてカウントします。最後に、Iが50を超えたら終了です。
  • 具体的なフローチャートの手順で、shukeiがshukei+1ではなくshukeiになる理由は、初めてbが出現したときにカウントするためです。たとえば、hai[1]がbであり、初めてbが出現したときはshukeiは1です。shukeiにshukei+1を代入することで、カウントを増やしています。
回答を見る
  • ベストアンサー

アルゴリズム

文字をカウントするフローチャートが分かりません。50この文字データが入っているhai[ ]があって配列要素にはアルファベットが入っています。配列の要素を順番に参照し、英字bの個数をshukeiに数えていくフロ-チャートが分かりません。 まず、(1)I(haiの添え字)←0、shukei←0の初期化     (2)hai[I]はbか? (3)bじゃないなら、I=I+1(次の配列に移動),bならshukei←shukei+1(カウントする)     (4)I>50なら終了 (3)のshukei←shukei+1の部分が分かりません。shukei←shukeiじゃないんですか?? 例えば、hai[1]=bで、初めてbが出できたらbの個数って1ですよね。でも、shukei←shukei+1に流れると個数は2個になってしまいますよね?? 分かりません。 宜しくお願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

えぇっと.... 「例えば、hai[1]=bで、初めてbが出できたらbの個数って1ですよね。でも、shukei←shukei+1に流れると個数は2個になってしまいますよね??」 というのは, どうしてそのように思ったのでしょうか? 「個数は2個になってしまう」とはどういうことでしょうか?

その他の回答 (2)

  • Ginlou
  • ベストアンサー率38% (5/13)
回答No.2

まず、実際に文字bの個数をカウントしているのは、shukei = shukei + 1 の部分です。 shukei = shukei では、ありません。 以下に、例を示します。 仮に、 shukei = 0 とします。 1.hai[I] が "b" の場合  shukei = shukei + 1 (←ここで、shukeiに1を足して、shukeiに突っ込んでいる。)              (すなわち、 shukei の値は 1 になります。)  2.hai[I] が "b" でない場合  shukei = shukei  (←これは、shukei に shukei の値を突っ込んでいるだけです。)             (よって、 shukei の値は 0 のままです。) 以上で、よろしいでしょうか?

回答No.1

shukeiは単なる箱ですからhai[I]が'b' であろうとなかろうと変化しません。 'b'の個数をカウントする動作が(3)の後半shukei←shukei+1です。 初めて出てきたときはshukeiは0ですからそれに1を足して1になります。

y6411y
質問者

補足

shukeiは単なる箱ですからhai[I]が'b' であろうとなかろうと変化しません。 初めて出てきたときはshukeiは0ですからそれに1を足して1になります。 って部分がよく分からないのですが、初めて出てきたときはshukeiは0は何でですか?あと、箱というのは?? くどくてすみません。 宜しくお願いします。

関連するQ&A

  • 疑似言語で表現されたアルゴリズムについて…

    次の疑似言語で表現されたアルゴリズムを処理の概要の条件を満たしかたについて教えてください。 途中までは求められるのですが、(1)~(5)を教えてください。- (処理の概要) 配列Aには学生番号、配列Bには成績が格納されている。同じ添字の位置に対応する学生番号と成績が格納されている。配列の大きさは10件分である。成績の良い順(降順)に学生番号、成績とも並べ替える。 (配列のイメージ(例)) 添字  配列A  配列B      配列A  配列B 1   1001   50      1004  100   2   1002   75      1002  75 3   1003   25      1005  70 4   1004  100      1001  50 5   1005   70      1003  25 ・     ・     ・        ・    ・ ・     ・     ・        ・    ・ (擬似言語)   ・i←1    (1)   ■i<n   |   ・j←i+1   |   ■j≦n   |   |  ↑  (2)   |   |  |・w1←A(j)   |   |  |  (3)   |   |  |・A(j)←A(i)   |   |  |  (4)    |   |  |・A(i)←w1   |   |  |  (5)   |   |  ↓   |   |  ・j←j+1   |   ■   |  ・i←i+1   ■

  • データ構造とアルゴリズムの問題です

    要素数がnである配列aの要素の合計を求めるアルゴリズムのループ端によるフローチャートを完成せよ(後判定繰返し) sum =a[0] i=1; do{sum=sum+a[i]; i++; }while i<n; a[0] → sum 1 → i 後判定繰返し | □→sum; i+1 → i | □ 後判定繰返し □の中を埋めるんですが教えてください

  • データ構造とアルゴリズムの問題です

    要素数がnである配列aの要素の最大値を求めるアルゴリズムのループ端によるフローチャートを完成せよ(前判定繰返し) max =a[0] i=1; while i<n do{ if(a[i]>max)max=a[i]; i++; } a[0] → max 1 → i 前判定繰返し □ | yes a[i]□max-----| |        □      NO i+1 → i 前判定繰返し □の中を埋めるんですが教えてください

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • [C言語] 配列が添字の意味を失う理由

    はじめまして。こんばんは。 早速ですが、下記のソースコードは、 配列aの各要素の内容を先頭から順に調べ、最初に0であった要素の添字番号を表示する。 という内容の、C言語のプログラムです。(C++でコンパイルするためmain()はint型に指定) そこで、このプログラムを実行していて腑に落ちない点として、 プログラムの挙動を見る限り、 タイトルに書いたとおり、 「配列が添字の意味を失っている」という事なんです。 普通に配列の添字と考えれば、 while文の条件式は、 int i=0; while(a[i]) { i++; } なので、a[0]になるはずなので、 普通に考えれば 条件式の中身としては  配列a[0] が 配列a[0] になるまでi++をするとなるはずです。 しかしながら、このプログラムは、 初期値に「0」が入っている要素まで探し続けます。 なぜ、 「配列が添字の意味を失うのか?」 どなたか、この疑問にお答えしていただけますと幸いです。 「プログラムの内容」 配列aの各要素の内容を先頭から順に調べ、最初に0であった要素の添字番号を表示する。 「表示結果」 a[2]= 0 「ソースコード」 #include<stdio.h> int main() { int a[]={3,0,7,8,5,5,8}; int i=0; while(a[i]) { i++; } printf("a[%2d]=%2d \n",i,a[i]); }

  • アルゴリズムの問題です

    以下のフローチャートは、基本選択法でデータを昇順(小→大)にソートしたものなのですが、整数の一次元配列に格納されているデータ(100個)を降順(大→小)にソートするフローチャートを作成するには、どこの部分を変化させればいいのか教えていただけませんか? 手書きなので見にくいですがよろしくお願いします。        開始        l 整数配列A(100)と整数変数I,J,N,P,MIN,TEMPを宣言        l   データの個数N の値を読む        l     ループ1の開始     I = 1,2,3, ・・・,N        l      A(I)の値を読む        l      ループ1の終了        l      ループ2の開始      I = 1,2,3, ・・・,N        l      A(I)の値を出力        l      ループ2の終了        l      ループ3の開始      I = 1,2,3, ・・・,N-1        l      MIN = A(I)        l       P = I        l      ループ4の開始     J = I+1,I+2,I+3, ・・・,N        l        l     yes      A(J) < MIN  ーーーーーー MIN = A(J)         l no               l        l                P = J        l                 l              l←ーーーーーーーーーーー          l                  ループ4の終了        l       TEMP = A(I)        l       A(I) = A(P)        l       A(P) = TEMP        l      ループ3の終了        l      ループ5の開始      I = 1,2,3, ・・・,N        l      A(I)の値を出力        l      ループ5の終了        l        終了

  • フローチャートの書き方

    要素数がnである配列aの要素の最大値を求めるアルゴリズムのループ端によるフローチャートを完成せよ(前判定繰返し) max =a[0] i=1; while i<n do{ if(a[i]>max)max=a[i]; i++; } フローチャートでかくとどうなりますか?

  • 一致する要素が格納されている添え字番号を返す

    例えばある配列内に @moji = (ak, df, gc); などという値でも文字でもが格納されていたとして、 $x = "ak"; といったある変数に格納されている値・文字(この場合はak)と一致する要素が配列@mojiに格納されていた場合に、その格納されている要素の添え字番号(配列の添え字番号)を返すような関数はないでしょうか? イメージとして $res = mch($x); とすると、0が返されて$resに格納されるというものです。 ちなみにRという言語では > a <- c("ljj", "B0", "op199") # 変数aに3つの文字列要素を代入する > res <- which(a == "op199") # which()は引数に指定された論理に一致する要素番号を返す > res # aについて,a == "op199"がTRUEとなるのは要素番号3であるから,3を返す [1] 3 というものがあるのですが、これと同じような関数が欲しいのです(泣)

    • ベストアンサー
    • Perl
  • 基数変換のアルゴリズムの問題

    アルゴリズムの問題の回答に納得がいきません。 変換対象をDEC、基数をBASEに格納し、基数変換を行うというものです。 配列Bの添え字は「1」から始まり、DECをBASEで割った余りを 求める関数MODはあらかじめ用意されているものとする。 1.変数Iに1を格納、変数DECに変換対象を格納、変数BASEに基数を格納。 2.MOD(DEC,BASE)の結果を変数Nに格納。 3.NをB(I)に格納。 4.I + 1 をIに格納。 5.「 」の結果を変数DECに格納。 6.DEC=0なら処理終了、それ以外は(2) の処理へ戻る。 「  」内を埋める問題です。 私の答えは「(DEC - N) / BASE」だったのですが、正解は「DEC / BASE」でした。 DECからN(余り)を引いてからBASEで割らないと、 割り切れない場合、最悪いつまで経っても「DEC=0」にはならなくなってしまうと思うのですが、そうではないのでしょうか? 正解は「DEC / BASE」で、あっているのでしょうか? Perlでプログラムを書いて(配列Bの添え字は0からにして、whileの条件式を「DEC != 0」にしました)試してみましたが、 「DEC / BASE」だと、割り切れない場合、結果の0の数がえらいことになってしまいました(^^;) ちゃんと勉強し始めたのがつい最近なので説明がうまくできませんが、どなたか解るかた教えてくださいm(_ _)m

  • 関数の引数として配列を渡す方法

    初めて質問させていただきます。 現在下記のように関数に配列の引数を渡して、配列の個数を表示しているのですが、必ず0件になってしまいます。 <html> <head> <title>連続して関数を呼び出す</title> <script language="JavaScript"> <!-- function aaa (est) { alert(est.length); return; } // --> </script> </head> <body> <script language="JavaScript"> <!-- var hai = new Array(); hai["a"] = true; hai["b"] = false; aaa(hai); // --> </script> </body> </html> もしかしたら、受け渡し方が悪いのかもしれないのですが、色々調べても分からなかったので質問させていただきました。 argumentsというものを使うのかもしれませんがうまくいきませんでした。 分かる方がいらっしゃいましたら、ご教授ください。