1. 程式人生 > >資料結構——課程設計之~安排教學計劃

資料結構——課程設計之~安排教學計劃

1. 問題描述

大學的每個專業都要制訂教學計劃。假設任何專業都有固定的學習年限,每學年含兩個學期,每學期的時間長度和學分上限值均相等。每個專業開設的課程都是確定的,而且課程在開設時間的安排必須滿足先修關係。每門課程有哪些先修課程是確定的,可以有任意多門,也可以沒有。每門課恰好佔一個學期。試在這樣的前提下設計一個教學計劃編制程式。

要求實現的基本功能如下:

(1)錄入課程目錄。

(2)可以編輯課程目錄,如課程增加、刪除、資訊修改等。

(3)滿足一定條件的教學計劃的輸出。

2. 設計要求

(1)基本要求:輸入引數包括:學期總數、一學期的學分上限、每門課的課程號(固定為佔3為的字母和數字串)、學分和直接先修課程的課程號。

(2)允許使用者指定下列兩種編排策略之一:一是使學生在各學期中的學習負擔儘量均勻;二是使課程儘量地集中在前幾個學期中。

(3)若根據給定的條件無解,則報告適當的資訊;否則將教學計劃輸出到使用者指定的檔案中。教學計劃的表格格式自行設計。

3. 測試資料

學期總數:8;學分上限:10;該專業共開設16門課,課程號從C01~C16,學分順序為2,3,4,3,2,3,4,4,4,5,4,4,2,3,2,3;先修關係自定義(畫圖)。

4. 實現提示

可設學期總數不超過10,課程總數不超過60。如果輸入的先修課程號不在該專業開設的課程式列中,則作為錯誤處理。應建立內部課程式號與課程號之間的對應關係。

程式碼(已由codeblocks編譯通過):

#include<bits/stdc++.h>
using namespace std;

struct node
{
    char name[33];
    int xf;
};

int all_terms, t_max_xf, t_V, t_E;
vector<node> G[1009];
map<string, int> mp;

void create_graph()
{
    int i;
    printf("\t\t\t歡迎使用教學計劃編制系統\n");
    printf("輸入學期總數: ");
    scanf("%d", &all_terms);
    printf("請輸入學期的學分上限: ");
    scanf("%d",&t_max_xf);
    printf("請輸入教學計劃的課程數: " );
    scanf("%d", &t_V);
    printf( "請輸入各個課程的先修課程的總和(邊總數): ");
    scanf("%d",&t_E);
    printf( "請輸入%d個課程的課程號(最多30個字元,小寫字母c+數字如c10)\n", t_V);
    node data;
    for(i = 1; i <= t_V; i++)
    {
        printf ("請輸入第%d個: ",i);
        scanf(" %s", data.name);
        G[i].push_back(data);
        mp[G[i][0].name] = i;
    }
    printf("請輸入%d個課程分別對應的學分值:\n", t_V);
    for(i = 1; i <= t_V; i++) scanf("%d", &G[i][0].xf);
    printf("請輸入下列課程的先修課程(輸入以#結束)\n");
    char s[33];
    for(i = 1; i <= t_V; i++)
    {
         printf(" %s的先修課程: ", G[i][0].name);
         while(true)
         {
             scanf(" %s", s);
             if(s[0] == '#') break;
             G[i].push_back(G[mp[s]][0]);
         }
    }
    printf("\t\t\t錄入資料成功\n");
}

void display()
{
    int i, j;
    printf("有向圖\n");
    printf("%d個頂點", t_V);
    for(i = 1; i <= t_V; ++i) printf("%s%c", G[i][0].name, i == t_V ? '\n' : ' ');
    printf("%d條弧邊:\n", t_E);
    for(i = 1; i <= t_V; i++)
    {
        int k = G[i].size();
        for(j = 0; j < k; j++)
            printf("%s---->%s\n", G[i][0].name, G[i][j].name);
    }
}

void solve1(int ans[])
{
    int q = 1, cnt = 0;
    while (q <= all_terms)
    {
        int num = t_V / all_terms;
        printf("\n第%d個學期應學課程: ", q);
        while(num--)
        {
            printf("%s%c", G[ans[cnt++]][0].name, num != 0 ? ' ' : '\n');
        }
        if (q == all_terms) printf("OK Over!\n");
        q++;
    }
}

void solve2(int ans[])
{
    int q = 1, cnt = 0;
    while (q <= all_terms)
    {
        int C = G[ans[cnt]][0].xf;
        printf("\n第%d個學期應學課程: ", q);
        while(cnt < t_V && C <= t_max_xf)
        {
            printf("%s ", G[ans[cnt]][0].name);
            if(cnt+1 < t_V) C = C + G[ans[cnt+1]][0].xf;
            cnt++;
        }
        if(cnt >= t_V || q == all_terms)
        {
            cout << endl;
            printf("OK Over!\n");
            break;
        }
        q++;
    }
}

void topo_sort()
{
    int i, j, vis[1009];
    memset(vis, 0, sizeof(vis));
    for(i = 1; i <= t_V; i++)
    {
        int k = G[i].size();
        for(j = 1; j < k; j++)
            vis[mp[G[i][j].name]]++;
    }
    int ans[1009], cnt = 0;
    memset(ans, 0, sizeof(ans));
    stack<int> s;
    for(i = 1; i <= t_V; i++)
    {
        if(!vis[i]) s.push(i);
    }
    while(!s.empty())
    {
       int cur = s.top(); s.pop();
       ans[cnt++] = cur;
       int k = G[cur].size();
       for(j = 1; j < k; j++)
       {
           int num = mp[G[cur][j].name];
           vis[num]--;
           if(!vis[num]) s.push(num);
       }
    }
    if(cnt != t_V) puts("Error!");
    else
    {
        puts("OK!");
        while(true)
        {
            printf("\n\t\t\t請選擇功能:\n");
            printf("\t\t\t1.平均分配\n");
            printf("\t\t\t2.靠前分配\n");
            printf("\t\t\t3.退出\n");
            int sel;
            scanf("%d", &sel);
            switch(sel)
            {
                case 1: solve1(ans); break;
                case 2: solve2(ans); break;
            }
            if(sel == 3) break;
        }
    }
}

int main()
{
    create_graph();
    display();
    topo_sort();
    return 0;
}


/*

6
10
12
16
c1
c2
c3
c4
c5
c6
c7
c8
c9
c10
c11
c12
2 3 4 3 2 3 4 4 7 5 2 3
#
c1 #
c1 c2 #
c1 #
c3 #
c11 #
c5 c3 #
c3 c6 #
#
c9 #
c9 #
c9 c10 c1 #

*/


相關推薦

資料結構——課程設計~安排教學計劃

1. 問題描述 大學的每個專業都要制訂教學計劃。假設任何專業都有固定的學習年限,每學年含兩個學期,每學期的時間長度和學分上限值均相等。每個專業開設的課程都是確定的,而且課程在開設時間的安排必須滿足先修關係。每門課程有哪些先修課程是確定的,可以有任意多門,也可以沒有。每門課恰

資料結構課程設計銀行活期儲存系統(設計報告)

 C作為系統描述語言,既可以用來編寫系統軟體,也可以用來編寫應用軟體。C語言誕生後,許多原來用匯編語言編寫的軟體,現在都可以用C語言編寫;C++是一種靜態資料型別檢查的,支援多重程式設計正規化的通用程式設計語言。它支援過程化程式設計、資料

資料結構課程設計農夫過河

此部落格是隻是為了演示程式碼的執行結果 下面是一個程式執行的結果(實現了兩種過河方案)    部分程式碼截圖 原始碼下載地址 https:

資料結構課程設計-檢查網路(並查集)

檢查網路 給定一個計算機網路以及機器間的雙向連線列表,每一條連線與允許兩端的計算機進行直接的檔案傳輸,其他計算機間若存在一條連通路徑,也可以進行間接的檔案傳輸。 要求實現功能: 任意指定兩臺計算機,判斷整個網路中是否任意兩臺機器間都可以檔案傳輸?若不可以,請給出當前網路

資料結構課程設計——學生資訊管理系統

/*Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年12月20日 *版本號:v1.0 *問題描述:設計一個管理學生資訊的

學生成績管理系統(資料結構課程設計

學生成績管理問題  問題描述:建立兩個學生成績資訊表1、2,以檔案的形式分別進行儲存命名為1.txt和2.txt,然後實現將兩個檔案合併成一個新的檔案3.txt。 新檔案中有補考的學生查詢到,儲存到另一個檔案4.txt中。     基本要求:    

資料結構課程設計-哈夫曼編碼譯碼

//******************************************** //程式功能:哈夫曼編碼及譯碼 // //日期:2014年11月18 // //******************************************** #incl

資料結構課程設計-哈夫曼樹及其應用

題目:假設用於通訊的電文由字符集{a,b,c,d,e,f,g,h,}中的字母構成,這8個字母在電文中出現的 頻率分別為: {0.19, 0.21, 0.02, 0.03, 0.06, 0.07, 0.1, 0.32}. 要求:畫出哈夫曼樹。 我從課本上面摘抄了一個題

內部排序演算法的實現與比較-資料結構課程設計

內部排序演算法的實現與比較 1) 問題描述 在教科書中,各種內部排序演算法的時間複雜度分析結果只給出了演算法執行時間的階,或大概執行時間。試通過隨機資料比較各演算法的關鍵字比較次數和關鍵字移動次數,以取得直觀感受。 2)基本要求 (1) 對常用的內部排序演算法進行比較:直接

資料結構課程設計~校園導航問題

校園導航問題 下邊發一下資料結構的課程設計:校園導航問題。 設計內容 (1)設計學校的平面圖(至少包括10個以上的場所)。每兩個場所間可以有不同的路徑,且路長也可能不同(圖形結構要求通過鍵盤輸入資料後採用建立圖的演算法生成圖形); (2)提供起始點與終點能自動找出從任意場所到達另

資料結構課程設計實驗報告

《演算法與資料結構》課程設計報告                                        資料結構課程設計是在學完資料結構課程之後的實踐教學環節。本實踐教學是培養學生資料抽象能力,進行復雜程式設計的訓練過程。要求學生能對所涉及問題選擇合適的資料結構

資料結構課程設計—學生資訊管理系統

問題描述: /* * Copyright (c)2015,煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:aaaa.cbp * 作 者:張芸嘉 * 完成日期:2015年12月24日 * 版 本

資料結構課程設計-學生資訊管理系統

/* * 煙臺大學計算機與控制工程學院 *檔名稱:mian.cpp *作 者:王旭 *完成日期:2015年12月25日 *版 本 號:v1.0 *

資料結構課程設計---------用棧來實現表示式求值

1、需求分析 設計一個程式,演示用算符優先法對算術表示式求值的過程。利用算符優先關係,實現對算術四則混合運算表示式的求值。 (1)輸入的形式:表示式,例如2*(3+4)      包含的運算子只能有'+' 、'-' 、'*' 、'/' 、'('、 ')'; (2)輸出的形式

資料結構課程設計《銀行存取款系統》

/*********標頭檔案**********/ #include <iostream.h> #include <Cstring> #include <string.h> #include <stdio.h> #includ

資料結構課程設計---------最少換車次數問題

        問題描述: 設某城市有n個車站,並有m條公交線路連線這些車站。設這些公交車都是單向的,這n個車站被順序編號為0~n-1。編號程式,輸入該城市的公交線路數,車站個數,以及各公交線路上的各站編號。        實現要求:求得從站0出發乘公交車至站n一1的最少換

資料結構課程設計--圖書館管理系統原始碼

#include <iostream> #include <iomanip> #include <string.h> #include <string> #include <fstream>//輸入/輸出檔案流類

運動會分數統計(資料結構課程設計)

參加運動會有n個學校,學校編號為1……n。比賽分成m個男子專案,和w個女子專案。專案編號為男子1……m,女子m+1……m+w。不同的專案取前五名或前三名積分;取前五名的積分分別為:7、5、3、2、1,前三名的積分分別為:5、3、2;哪些取前五名或前三名由學生自己設定。(m&l

資料結構課程設計原始碼

主程式main()#include "ds.h" #include <iostream> #include <string.h> #include <stdlib.h> #include <conio.h> using nam

資料結構課程設計(約瑟夫環)

課程設計題三:約瑟夫(Joseph)環  設計目的:  1.掌握單向迴圈連結串列的建立。 2.掌握單向迴圈連結串列的操作。 設計內容:   編號是1,2,……,n的n個人按照順時針方向圍坐一圈,每個人只有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個仍開