
毎回お世話になっています。課題でソート処理が出題されたのですが、フローチャートすら書けない状況なので、どなたか力を貸していただけないでしょうか?
【処理概要】
個人成績表からレコードを取得し、取得したレコードを点数の高い順にソートし、順位・氏名・点数を個人成績表に出力する
といったものです。
個人成績表は、氏名と点数の2項目で、レコード数は自由です。
とりあえず、私は10レコード作ったのですが、いろいろな個人成績表に対応できるように「レコード数は不明」の前提で、コーディんグするようにとのことです。
個人成績順意表は、「順位・氏名・点数」の順に出力とあり、
ソートの考え方として、【レコードを配列に取り込む→レコードを取り込む際に件数をカウントし、件数をn件とする】
とありました。
VBは全くの素人で、ソートに種類があることすら知らず、使い分けも知りませんでした。
どなたか力を貸していただけないでしょうか?
【自作個人成績表】
青木 076
井上 081
江藤 066
柏原 092
小林 087
斉藤 059
佐久間 076
関根 088
塚田 096
富田 083
となっています。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
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
この回答への補足
回答ありがとうございます。
プログラミングに関して、ずぶの素人なので論点がずれてしまうかもしれないのですが、
この課題以外を解く際に
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」などはまだ使ったことがないため、できることなら、
今まで使ってきたもので解けないかと考えています。
せっかくお答えいただいたのに、申し訳ありません。
よろしくお願いいたします。
No.3
- 回答日時:
何か、決まった、雛形があるのですか。
???後出しは、一番嫌われますよ。
そもそも、VBのバージョンは、何ですか???
この回答への補足
後出し?
すいません。どのように質問を書けばいいか分からず
課題をそのまま書いただけなので、不十分な点があり
ご迷惑をおかけしてしまいました。
申し訳ありません。
MSのAccessのでコマンドを作成して、イベントのビルドで
コーディングを作っていくというのがそもそもなのですが、
バージョンはどこを見れば確認できるのでしょうか?
これ以上質問ばかりしますと、お気に触るかと思いますので、
また改めて質問を投稿させていただきます。
ご迷惑をおかけしました。
No.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
この回答への補足
ご回答ありがとうございます。
教えていただいたのを実行してみたのですが
【ユーザー定義型は定義されていません】
と出てしまって実行できない状況です。
実行に時間がかかってかまわないので、
'変数の宣言
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を使わず、一つ一つ大小を比べていき
並べ替えることは可能でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
- Excel(エクセル) エクセルでキーリストからデータを取り出して1枚1枚印刷するには? 11 2022/06/27 09:52
- Excel(エクセル) 非表示にしたい行をグループ化して折り畳み 4 2022/09/17 20:17
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- 中学校 中3です。今回の期末テストで数学が36点でした。前回の中間は数学、14点です。 数学の提出物は出して 1 2022/11/17 17:48
- iPod・ウォークマン・音楽プレーヤー レコードの楽曲をPCに取り込みたい レコードを何枚か持っているのですが、再生機器がありません。スマー 4 2022/10/03 09:51
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS2000 SQL 最大レコード数
-
Access97 VBAにてレコードの検索
-
PHP+MySQLで同じIDの備考項目を
-
ACCESS VBA テキストボックス
-
ソート処理について
-
VBAで制御コード付きテキストフ...
-
DataGridViewの、選択されてい...
-
Access VBA フォームに表示したい
-
Visual C#でSQLのテーブルを読...
-
SQLiteで、ランダムにレコード...
-
updateメソッドで止まってしまう
-
サブフォームに新規レコードを...
-
DataGridViewにてセル以外をク...
-
HTA上データをExcelへ転記する...
-
SQLの重複選択について
-
DynamicSQL
-
末尾に空白を含む項目の扱い
-
助けてください!iPod touchの...
-
SQL・・・分かりません。
-
ビット演算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードが存在しなかった場合
-
DataGridViewの、選択されてい...
-
ADO VBA 実行時エラー3021
-
差し込み印刷のレコード数について
-
ACCESSで大量の更新を行うと「...
-
ファイル書込みで一行もしくは...
-
カレントレコードが無い事を判...
-
ワードの差込印刷で教えて下さ...
-
アクセスでレポートの1印刷内...
-
DataGridViewの内容をDBに反映...
-
[VBA] ADOの Clone と AddNew
-
固有レコード識別子の選択とは
-
JSPのNULLレコード表示について...
-
Access を×ボタンで閉じ...
-
サブフォームに新規レコードを...
-
データセットのレコード更新が...
-
サブレンジ分割されたNDB(富士...
-
レコードセット(ADO.Recordset)...
-
DataGridViewにてセル以外をク...
-
COBOLでのランダムアクセス
おすすめ情報