習題:向量、矩陣與多型

基礎篇

C# 簡介

開發環境

變數與運算

流程控制

陣列

函數

物件

例外處理

函式庫篇

檔案處理

資料結構

正規表達式

Thread

應用篇

視窗程式

媒體影音

網路程式

遊戲程式

手機程式

資料庫

雲端運算

特殊功能

委派

擴展方法

序列化

LinQ

WPF

網路資源

教學影片

投影片

教學文章

軟體下載

考題解答

101習題

1. 請設計一個向量物件 Vector,包含有向量的加法、減法函數,如下所示:

class Vector {
  Vector(double[] m) { ... }  // 建構函數
  Vector add(Vector v) { ... } // 加法函數
  Vector sub(Vector v) { ... } // 減法函數
  double mul(Vector v) { ... } // 乘法函數
}

2. 請設計一個矩陣物件 Matrix,包含有矩陣的加法、減法函數,如下所示:

class Matrix {
  Matrix(double[,] m) { ... }  // 建構函數
  Matrix add(Matrix m) { ... } // 加法函數
  Matrix sub(Matrix m) { ... } // 減法函數
  Matrix mul(Matrix m) { ... } // 乘法函數
}

3. 請設計一個介面 MathType,包含有加法、減法函數,如下所示。然後讓矩陣與向量繼承 MathType。

interface MathType {
  MathType add(Matrix m) { ... } // 加法函數
  MathType sub(Matrix m) { ... } // 減法函數
  MathType mul(MathType m) { ... } // 乘法函數
}

第一題解答

解答

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Vector
{
    public double[] m;

    static void Main(string[] args)
    {
        Vector v1 = new Vector(new double[] {3.0, 1.0, 2.0});
        Console.WriteLine("v1=" + v1.ToString());
        Vector v2 = new Vector(new double[] { 1.0, 1.0, 1.0 });
        Console.WriteLine("v2=" + v2.ToString());
        v1.sub(v2);
        Console.WriteLine("v1=v1-v2=" + v1.ToString());
        v1.add(v2);
        Console.WriteLine("v1=v1+v2=" + v1.ToString());
        Console.WriteLine("v1*v2=" + v1.mul(v2));
    }

    public Vector(double[] m) { // 建構函數 
        this.m = m;
    }

    public Vector add(Vector v) { // 加法函數
        for (int i = 0; i < m.Length; i++)
            m[i] += v.m[i];
        return this;
    }

    public Vector sub(Vector v) { // 減法函數
        for (int i = 0; i < m.Length; i++)
            m[i] -= v.m[i];
        return this;
    }

    public double mul(Vector v) { // 乘法函數
        double result = 0.0;
        for (int i = 0; i < m.Length; i++)
            result += m[i] * v.m[i];
        return result;
    }

    public override String ToString()
    {
        String rzStr = "";
        for (int i = 0; i < m.Length; i++)
            rzStr += " " + m[i];
        return "["+rzStr.Trim()+"]";
    }
}

執行結果:

v1=[3 1 2]
v2=[1 1 1]
v1=v1-v2=[2 0 1]
v1=v1+v2=[3 1 2]
v1*v2=6

第二題解答

using System;
using System.Text;

namespace CSMatrix
{
    class Matrix
    {
        double[,] mat;

        Matrix(double[,] m) // 建構函數
        {
            this.mat = m;
        }

        Matrix add(Matrix m2)  // 加法函數
        {
            double[,] r = new double[mat.GetLength(0), mat.GetLength(1)];

            for (int i = 0; i < mat.GetLength(0); i++)
            {
                for (int j = 0; j < mat.GetLength(1); j++)
                {
                    r[i, j] = mat[i, j] + m2.mat[i, j];
                }
            }
            return new Matrix(r);
        }

        Matrix sub(Matrix m2)  // 減法函數
        {
            double[,] r = new double[mat.GetLength(0), mat.GetLength(1)];

            for (int i = 0; i < mat.GetLength(0); i++)
            {
                for (int j = 0; j < mat.GetLength(1); j++)
                {
                    r[i, j] = mat[i, j] - m2.mat[i, j];
                }
            }
            return new Matrix(r);
        }

        Matrix mul(Matrix m2) // 乘法函數
        {
            double[,] r = new double[mat.GetLength(0), m2.mat.GetLength(1)];

            for (int i = 0; i < mat.GetLength(0); i++)
            {
                for (int j = 0; j < m2.mat.GetLength(1); j++)
                {
                    r[i, j] = 0.0;
                    for (int k = 0; k < mat.GetLength(1); k++)
                    {
                        r[i, j] += mat[i, k] * m2.mat[k, j];
                    }
                }
            }
            return new Matrix(r);
        }

        public override String ToString()
        {
            StringBuilder result = new StringBuilder();

            for (int i = 0; i < mat.GetLength(0); i++)
            {
                for (int j = 0; j < mat.GetLength(1); j++)
                {
                    result.Append(mat[i, j] + " ");
                }
                result.Append("\n");
            }
            return result.ToString();
        }

        public static void Main(String[] args)
        {
            Matrix m1 = new Matrix(new double[,] { { 1, 2, 3 }, { 4, 5, 6 } });
            Matrix m2 = new Matrix(new double[,] { { 1, 1, 1 }, { 1, 1, 1 } });
            Matrix m3 = new Matrix(new double[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } });
            Matrix madd = m1.add(m2);
            Matrix msub = m1.sub(m2);
            Matrix mmul = m1.mul(m3);
            Console.WriteLine("=======m1=======\n" + m1.ToString());
            Console.WriteLine("=======m2=======\n" + m2.ToString());
            Console.WriteLine("=======m3=======\n" + m3.ToString());
            Console.WriteLine("=======madd=======\n" + madd.ToString());
            Console.WriteLine("=======msub=======\n" + msub.ToString());
            Console.WriteLine("=======mmul=======\n" + mmul.ToString());
        }
    }
}

執行結果

=======m1=======
1 2 3
4 5 6

=======m2=======
1 1 1
1 1 1

=======m3=======
1 2
3 4
5 6

=======madd=======
2 3 4
5 6 7

=======msub=======
0 1 2
3 4 5

=======mmul=======
22 28
49 64
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License