بخش ۴ - شبیه‌سازی شبکه‌های مرتب‌ساز

یک مطالعه موردی به هدف به‌کارگیری مؤثر توابع و تایپ‌های مبنایی. [صورت مسئله‌ی این مثال]

فهرست مثال‌ها

شبیه‌سازی شبکه‌های مرتب‌ساز

این برنامه به شبیه‌سازی عملکرد یک شبکه‌ی مرتب‌ساز روی یک دنباله ورودی از اعداد می‌پردازد. تأکید این مثال بر استفاده از تایپ‌های vector و string و همچنین تقسیم برنامه به توابع و ردکردن پارامترها قرار دارد. نکته‌ی قابل ذکر در مورد این مثال عدم استفاده از متغیرهای سراسری است به هدف بالا رفتن خوانایی، قابلیت نگهداری و آزمون‌پذیری (قابلیت تست اجزای برنامه).

01_SortingNet.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

vector<int> read_numbers(int count) {
    vector<int> result;
    for (int i = 0; i < count; i++) {
        int number;
        cin >> number;
        result.push_back(number);
    }
    return result;
}

vector<string> read_network(int num_of_inputs) {
    vector<string> result;
    for (int i = 0; i < num_of_inputs; ++i) {
        string line;
        cin >> line;        
        result.push_back(line);
    }
    return result;
}

void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

bool is_valid_network(vector<string> network, int num_of_stages) {
    for (int j = 0; j < num_of_stages; ++j) {
        for (int i = 0; i < network.size(); ++i) {
            if (network[i][j] == '-')
                continue;
            
            int count = 0;
            for (int k = 0; k < network.size(); k++)
                if (network[i][j] == network[k][j])
                    count++;

            if (count != 2) {
                return false;
            }
        }
    }
    return true;
}

void apply(vector<string> network, int j, vector<int>& numbers) {
    for (int i = 0; i < network.size() - 1; i++) {
        if (network[i][j] == '-')
            continue;

        for (int k = i + 1; k < network.size(); k++)
            if (network[i][j] == network[k][j])
                if (numbers[i] > numbers[k])
                    swap(numbers[i], numbers[k]);
    }
}

bool sorted(vector<int> numbers) {
    for (int i = 0; i < numbers.size() - 1; i++)
        if (numbers[i] > numbers[i+1])
            return false;
    return true;
}

void process_testcase(int num_of_inputs, int num_of_stages) {
    vector<string> network = read_network(num_of_inputs);
    vector<int> numbers = read_numbers(num_of_inputs);

    if (!is_valid_network(network, num_of_stages)) {
        cout << "Invalid network\n";
        return;
    }

    for (int j = 0; j < num_of_stages; j++)
        apply(network, j, numbers);

    if (sorted(numbers))
        cout << "Sorted";
    else
        cout << "Not sorted";
    cout << endl;
}

int main() {
    int num_of_inputs;
    int num_of_stages;

    cin >> num_of_inputs >> num_of_stages;
    while (num_of_inputs != 0 && num_of_stages != 0) {
        process_testcase(num_of_inputs, num_of_stages);
        cin >> num_of_inputs >> num_of_stages;
    }
}