NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

配列で順位をつける方法

解決済み
解決策を見る

こんにちは。LabVIEW学習歴約半年のcsti22042です。新規のご質問失礼いたします。

 

生徒A,B,Cの試験のそれぞれ平均点を出力したVIが「添付」にございます。その平均点が高かった順に順位を1~3の数値が入った配列を出力させたいのですが、平均点と順位をどのように対応させればいいかわからず困っています。

 

問題文としては以下の通りです。

 

「試験の得点を要素にもつ3つの配列から、コース平均、成績、クラス内の順位を含むクラスタの配列を生成するVIを設計しましょう。一番成績の良い生徒の順位を1、悪い生徒の順位をクラスの学生数とするように順位を決めます。(今回はクラス数をわかりやすくするために3人としています。少し分かりづらい出力になってしまったので、不明点ございましたらご返信ください。)順位を決めるのに、ループ内で「1D配列ソート関数」と「1D配列検索関数」を用いるとよいでしょう。」

 

お手数をおかけしますが、ご回答いただけますと幸いです。よろしくお願いいたします。

すべてをダウンロード
0 件の賞賛
メッセージ1/10
2,682件の閲覧回数

csti22042さんこんにちは。
『順位を決めるのに、ループ内で「1D配列ソート関数」と「1D配列検索関数」を用いるとよいでしょう。」』➜この縛りは無視するとして(笑)、図のようにコース平均とループの指標(生徒番号)をバンドルしこの結果を平均1D配列ソートすると成績優秀順のクラスタ配列が出来上がります。

クラスタに生徒番号を付与してあるので、これに成績順位を付け生徒番号で並べ替えてあげると良いかと思います。

0 件の賞賛
メッセージ2/10
2,570件の閲覧回数

こんにちは、csti22042です。ご返答誠にありがとうございます。カウント数を含めて配列を行う発想はなかったので、わかりやすいです。

 

しかし、こちらですと2列の2次元配列となって、「soft 1D array」には入らないのでしょうか。実際に私も作成してみましたが、「次元が異なる」とエラーが出ます。

 

よろしくお願いいたします。

0 件の賞賛
メッセージ3/10
2,556件の閲覧回数

 

csti22042さん。

だいたい出来てますよ。

コース平均とループの指標(生徒番号)をバンドルてForループの指標付きトンネルから出た結果はクラスタの1次元配列です。

最後の「成績優秀順」表示器のクラスタにi32の数値表示器を追加する必要があります。

私が添付したpngファイルはスニペットですので、viのブロックダイアグラムにドラッグ&ドロップ出来ます。

新規viを作り、そのブロックダイアグラムにドラッグ&ドロップしてみて下さい。

取り急ぎ。

0 件の賞賛
メッセージ4/10
2,550件の閲覧回数

ご回答ありがとうございます。実際にやってみて添付した画像の通りになりました。きちんと平均が大きい順に1-4の数字も並べることができました。

 

ここで、1-4だけを逆にすること(クラスタから1-4だけを取り出して、平均だけ順番を並べ替える事)はできますでしょうか。

 

イメージとしては91.6667のところに1を、一番平均点が低いところを4としたいのですが、可能でしょうか。

 

ご迷惑をおかけいたします。よろしくお願いいたします。

0 件の賞賛
メッセージ5/10
2,545件の閲覧回数

横から失礼します。
ここでの4,3,2,1は出席番号です。これを取り出してもクラス内順位にはなりませんよ。
もう一度Forループでクラスタ配列(出席番号、平均点、クラス順位)を作って、出席番号順に並べ直す必要があります。

メッセージ6/10
2,536件の閲覧回数

コメントありがとうございます。

 

確認したら、確かに1-4は生徒の番号でしたね。でしたら順位は具体的にどうやって設計したらよろしいでしょうか。

 

forループと仰っておりましたが、平均点が良いもの順に1,2,3位とつけて2次元配列にすることは想像しました。しかし、そんなに都合よく平均点だけで順位を判別し、出席番号順に並べ直すことなんて可能なんでしょうか...?

 

ケースストラクチャを使えばできなくはなさそうですが、かなりややこしくなると予想しております。

具体的な設計方法をご教授頂きたいです。ご迷惑をおかけしますが、何卒よろしくお願いいたします。

0 件の賞賛
メッセージ7/10
2,507件の閲覧回数
解決策
トピック作成者csti22042が受理

並べ直しは「D6-2の疑問点_re_2.PNG」ですでにやっているので、まずはその動作を理解してください。

 

LabVIEWの決まりごとは以下の通りです。
・「クラスタ」はいくつかの要素をひとまとめにしたもので、各要素のデータタイプは違っても構いません。
・クラスタの1次元配列をソートすると、第一要素の昇順に並べ替えられます。

 

以上を踏まえたうえで、「成績順 array」をForループに入れてクラスタを一度分解し、成績順位を追加した新たなクラスタの1次元配列を作ります。新たなクラスタは出席番号を第一要素にします。

ケースストラクチャも2次元配列も必要ありません。

メッセージ8/10
2,503件の閲覧回数

ご回答ありがとうございます。先日まで日本にいなかったため、ご返信が遅くなりましたことをお詫び申し上げます。

只今仰っておりますことを意識してみましが、添付しましたVIのようになりました。

 

成績順と順位は当たり前ですが要素は同じであり、平均点を成績順に並べ替えれば、出席番号の一次元配列は順位としてみなせることに気が付きました。

 

そのため、新たな一次元配列は作らず、そのまま平均点と順位(出席番号)のそれぞれの配列を繋げちゃいました。

 

しかし、J.H.Watsonさんの助言が無ければできなかったと思います。心から感謝申し上げます。ありがとうございました。

0 件の賞賛
メッセージ9/10
2,373件の閲覧回数

解決済みをいただいた後で何ですが・・・
着眼点は間違っていませんが、結果は成績順の平均点であって、それぞれが誰だかわかりません。


最初の問題文で生成するよう指示されているのは「コース平均、成績、クラス内の順位を含むクラスタの配列」でした。この設問で学んでほしいのは「クラスタ配列」の作成と操作だと思われます。

 

hanamaruさんが出席番号(生徒の指標)を付けることでクラスタの操作方法を示してくれたので、同じ手法を使ってクラス順位を追加しましょう。目指せ100点!

0 件の賞賛
メッセージ10/10
2,367件の閲覧回数