0

私はタイムテーブルのコードに取り組んでいます。私は大学のモジュールとそれらのモジュールに関連するイベントのシステムを使用しています。

モジュール CSC3039 Event1 - 講義 Event2 - 講義 Event3 - 実習など

モジュール内の各イベントの時間を相互にチェックし、衝突を比較する必要があります。衝突は修正する必要はなく、強調表示するだけです。私が使用するテーブルには、ここでは関係のない他のフィールドがEvents含まれています。Event_ID (PK), Module_code (FK), Start_Date_Time, End_Date_Timeステートメントを実装する必要があることがわかりましたFor Each。最終的には、次のような if ステートメントになります。

if (startTime1 <= endTime2 または endTime1 >= startTime2) CLASH

私の問題は、ここで実際の for ループを理解しようとすることです。開始時刻と終了時刻を宣言するために何を書けばよいかわかりません。event1 を取得し、その開始と終了を取得してから、イベント 2、3、または 4 が上記の if ステートメントに適合するかどうかを確認する場合だと思います。私はこれを取得しようとしていますが、実際にはいくつかのガイダンスを使用できます。

編集...以下の提案に基づいて、次のコードを実装しました:

    'return all relevant tables from the Modules database, based on the module code entered by the user.
    Dim eventTime = (From mods In db.Modules
                    Join evnt In db.Events On mods.Module_code Equals evnt.Module_code
                    Join rm In db.Rooms On rm.Room_ID Equals evnt.Room_ID
                    Join build In db.Buildings On build.Building_code Equals rm.Building_code
                    Where ((mods.Module_code = initialModCode) And (evnt.Room_ID = rm.Room_ID))
                    Select evnt.Event_ID, evnt.Module_code, evnt.Event_type, evnt.Start_Date_Time, evnt.End_Date_Time, build.Building_code, rm.Room_Number)


    'use the gridview to display the result returned by the above query
    gdvEventsTable.DataSource = eventTime
    gdvEventsTable.DataBind()

    Dim listClashes As New List(Of Array)

    For i As Integer = 0 To eventTime.Count - 1
        For j As Integer = i + 1 To eventTime.Count - 1
            If (eventTime.ToList(i).Start_Date_Time < eventTime.ToList(j).End_Date_Time) And (eventTime.ToList(i).End_Date_Time > eventTime.ToList(j).Start_Date_Time) Then
                MsgBox("Clash", MsgBoxStyle.MsgBoxSetForeground, "")
                listClashes.Add(eventTime)
            Else
                MsgBox("No Clash", MsgBoxStyle.MsgBoxSetForeground, "")
            End If
        Next
    Next

配列リストにイベントを追加しようとすると、デバッグ中にリストにイベントが送信されないことに気付きました。

4

3 に答える 3

0

コードを書く前に、まずアルゴリズムをどうするかを決める必要があります。たとえば、単純な方法を使用する場合、コードは確かに単純ですが (基本的に 2 つのネストされたループ)、O(n²) の場合は複雑になります。

所有しているデータの量、データベース内にあるかどうか、クラッシュが予想される可能性はどれくらいか、開始時にイベントの完全なリストを常に持っているか、クラッシュを段階的に見つける必要があるかなどに応じて、さまざまな解決策が考えられます。優先されます。考慮事項の 1 つは、リストを衝突しない一連のイベントに分割する必要があるか、衝突があるかどうかを示す yes/no の回答 (イベントごとに 1 つ) を生成する必要があるかどうかです。

代わりに、比較を開始する前にリストを開始時間でソートするなど、別のことを検討することもできます。これにより、リストを一度だけ歩くことができます。

于 2013-04-27T23:29:13.247 に答える
0

私の比較はデータベースから来ています。Events以下のコードの前に、ユーザーの入力に基づいて、テーブルからすべてのレコードを返すクエリがありますModule_Code。このコードは、msgbox を介して衝突を表示します。リストに入力するように変更します。それは最もきれいではなく、おそらく多くの重複につながるでしょうが、それは私の主な目的を達成します.

For Each evnt In eventTime


        Dim startTime1 = evnt.Start_Date_Time

        Dim endTime1 = evnt.End_Date_Time

        For Each evat In eventTime
            Dim startTime2 = evat.Start_Date_Time


            Dim endTime2 = evat.End_Date_Time



            If (startTime1 < endTime2) And (endTime1 > startTime2) Then
                MsgBox("Clash")
            Else
                MsgBox("No Clash")
            End If

        Next

    Next
于 2013-04-27T23:55:23.733 に答える