こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ソート処理について

毎回お世話になっています。課題でソート処理が出題されたのですが、フローチャートすら書けない状況なので、どなたか力を貸していただけないでしょうか?

【処理概要】
個人成績表からレコードを取得し、取得したレコードを点数の高い順にソートし、順位・氏名・点数を個人成績表に出力する

といったものです。
個人成績表は、氏名と点数の2項目で、レコード数は自由です。
とりあえず、私は10レコード作ったのですが、いろいろな個人成績表に対応できるように「レコード数は不明」の前提で、コーディんグするようにとのことです。

個人成績順意表は、「順位・氏名・点数」の順に出力とあり、
ソートの考え方として、【レコードを配列に取り込む→レコードを取り込む際に件数をカウントし、件数をn件とする】
とありました。

VBは全くの素人で、ソートに種類があることすら知らず、使い分けも知りませんでした。

どなたか力を貸していただけないでしょうか?

【自作個人成績表】
青木        076
井上        081
江藤        066
柏原        092
小林        087
斉藤        059
佐久間       076
関根        088
塚田        096
富田        083

となっています。
よろしくお願いいたします。

投稿日時 - 2009-04-30 11:33:56

QNo.4920320

すぐに回答ほしいです

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

Option Explicit On
Option Compare Binary
Option Strict On
Option Infer Off

'シンプルにしようとしたら中級者以上向けのコードになった気がします

'>レコードを取り込む際に件数をカウントし
'そんな事はしない。Listに格納しておいてからCountを呼び出した方が簡単

Class Person
Private PersonName As String
Private PersonScore As Integer

Public Sub New(n As String,s As Integer)
PersonName = n
PersonScore = s
End Sub

'ReadOnlyにする必要はそれほどないかも
Public ReadOnly Property Name As String
Get
return PersonName
End Get
End Property

Public ReadOnly Property Score As Integer
Get
return PersonScore
End Get
End Property

End Class

Class PersonScoreComparer
Implements System.Collections.Generic.IComparer(Of Person)

Public Function Compare(p1 As Person,p2 As Person) As Integer Implements System.Collections.Generic.IComparer(Of Person).Compare
Return p1.Score - p2.Score
End Function

End Class

'分ける必要あったかな…

Class PersonsFileLoader
'ファイルのValidatorは別途必要
Shared Function Load(filename As String) As System.Collections.Generic.List(Of Person)
'UTF-16LE
'1.使いたい文字がないという状況を避けたい
'2.BOMがあるかないかで議論したくない
'3.UTF-32はバグがある実装が多いらしい
'4.Intel系のCPUはLittle Endianらしい
Dim x As System.IO.StreamReader = New System.IO.StreamReader(filename,System.Text.Encoding.GetEncoding(1200))
Dim Persons As System.Collections.Generic.List(Of Person) = New System.Collections.Generic.List(Of Person)
While Not x.EndOfStream
Dim s As String = ""
s = x.ReadLine()
Persons.Add(New Person(s.Substring(0,10).Trim(new Char(){" "C}),Integer.Parse(s.Substring(10,3))))
End While
Return Persons
End Function
End Class

Class Q4920320A
Shared Sub Main
Dim ps As System.Collections.Generic.List(Of Person) = PersonsFileLoader.Load("aaa.txt")
'場合によって大きいものにしたり小さいものにしたりすると混乱するので
'作るComparerは常に小さい順と心がけたいと思っているのでわざわざReverseしている。
ps.Sort(New PersonScoreComparer())
ps.Reverse()
For i As Integer = 0 To ps.Count - 1
System.Console.WriteLine((i + 1).ToString().PadLeft(3,"0"C) & ps(i).Name.PadRight(20," "C) & ps(i).Score.ToString().PadLeft(3,"0"C))
Next
System.Console.ReadKey(true)
End Sub
End Class

投稿日時 - 2009-04-30 16:45:12

補足

回答ありがとうございます。
プログラミングに関して、ずぶの素人なので論点がずれてしまうかもしれないのですが、

この課題以外を解く際に

Private Sub コマンド0_Click()
'変数の宣言
Dim INP_DATA As String
Dim OUT_STRINGS As String
Dim shohin As String
Dim kubun As String
Dim tanka As String

のような感じで始まり 「IF」や「DO…LOOP」などを使って
解いてきたのですが、今回の問題はそのようなステートメントを
用いて解くことはできないでしょうか?

「GET」などはまだ使ったことがないため、できることなら、
今まで使ってきたもので解けないかと考えています。

せっかくお答えいただいたのに、申し訳ありません。
よろしくお願いいたします。

投稿日時 - 2009-04-30 16:54:31

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

何か、決まった、雛形があるのですか。???
後出しは、一番嫌われますよ。

そもそも、VBのバージョンは、何ですか???

投稿日時 - 2009-05-01 09:36:54

補足

後出し?
すいません。どのように質問を書けばいいか分からず
課題をそのまま書いただけなので、不十分な点があり
ご迷惑をおかけしてしまいました。
申し訳ありません。

MSのAccessのでコマンドを作成して、イベントのビルドで
コーディングを作っていくというのがそもそもなのですが、
バージョンはどこを見れば確認できるのでしょうか?

これ以上質問ばかりしますと、お気に触るかと思いますので、
また改めて質問を投稿させていただきます。

ご迷惑をおかけしました。

投稿日時 - 2009-05-01 10:09:04

ANo.2

これでは、駄目なの???

Dim alist As New ArrayList

alist.Add("076/青木")
alist.Add("081/井上")
alist.Add("066/江藤")
alist.Add("092/柏原")
alist.Add("087/小林")
alist.Add("059/斉藤")
alist.Add("076/佐久間")
alist.Add("088/関根")
alist.Add("096/塚田")
alist.Add("083/富田")

alist.Sort()

For i As Integer = 0 To alist.Count - 1

Dim c() As String = alist.Item(alist.Count - i - 1).ToString.Split("/")

Debug.Print((i + 1).ToString + "番目  : 名前 " + c(1).ToString + " : 点数" + c(0).ToString)


Next

出力結果

1番目  : 名前 塚田 : 点数096
2番目  : 名前 柏原 : 点数092
3番目  : 名前 関根 : 点数088
4番目  : 名前 小林 : 点数087
5番目  : 名前 富田 : 点数083
6番目  : 名前 井上 : 点数081
7番目  : 名前 青木 : 点数076
8番目  : 名前 佐久間 : 点数076
9番目  : 名前 江藤 : 点数066
10番目  : 名前 斉藤 : 点数059

投稿日時 - 2009-04-30 19:34:20

補足

ご回答ありがとうございます。
教えていただいたのを実行してみたのですが
【ユーザー定義型は定義されていません】
と出てしまって実行できない状況です。

実行に時間がかかってかまわないので、

'変数の宣言
Dim INP_DATA As String
Dim jyuni_01 As Integer
Dim simei_01 As String
Dim ten_01 As String


'ファイルを開く
Open "C:\INFILE.txt" For Input As #1
Open "C:\05_OUTFILE.txt" For Output As #2

'ファイルの最後までループ
Do Until EOF(1)
Line Input #1, INP_DATA

simei(i) = Left(INP_DATA, 10)
tensu(i) = Right(INP_DATA, 3)

'順番に増やしていく
i = i + 1
Loop

といった感じでSortを使わず、一つ一つ大小を比べていき
並べ替えることは可能でしょうか?

投稿日時 - 2009-05-01 08:45:58

あなたにオススメの質問