Compare commits

..

No commits in common. "a51029284c35d8d2df52457c5152501baa1f7a1a" and "e9d4f763e053676d5380ad835b54e9744d50c652" have entirely different histories.

2 changed files with 23 additions and 80 deletions

View file

@ -1,4 +1,4 @@
import strutils, os, procedures, terminal
import strutils, os, procedures
var argument: string
@ -11,17 +11,12 @@ if "dot" in args or "d" in args:
dot()
elif "cross" in args or "c" in args:
cross()
elif "scalar" in args or "s" in args:
scalar()
else:
styledEcho resetStyle, "Would you like to preform the ", styleBright, "dot", resetStyle, ", ", styleBright, "cross ", resetStyle, "or ", styleBright, "scalar ", resetStyle, "product?"
echo "Would you like to preform the dot or cross product?"
case toLowerAscii(readLine(stdin)):
of "dot", "d", "1":
of "dot", "d":
dot()
of "cross", "c", "2":
of "cross", "c":
cross()
of "scalar", "s", "3":
scalar()
else:
styledEcho fgRed, "Invalid operation!"
quit QuitFailure
quit "Invalid operation!", QuitFailure

View file

@ -1,4 +1,4 @@
import strutils, sequtils, terminal
import strutils, sequtils
#? validate if user input is of correct type
proc getInt: int =
@ -6,7 +6,7 @@ proc getInt: int =
try:
return parseInt(readline(stdin))
except:
styledEcho resetStyle, "Please enter an ", styleBright, "integer, " , resetStyle, "try again."
echo "Please enter an integer, try again."
#? validate if user input is of correct type
proc getFloat: float =
@ -14,7 +14,7 @@ proc getFloat: float =
try:
return parseFloat(readline(stdin))
except:
styledEcho resetStyle, "Please enter a ", styleBright, "number, " , resetStyle, "try again."
echo "Please enter a number, try again."
#? prints a matrix to the standard output
proc printMatrix*(matrix: seq[seq[float]]) =
@ -31,20 +31,6 @@ proc fillMatrix*(matrix: var seq[seq[float]], row, col: int) =
matrix[i-1].delete(0)
echo matrix[i-1]
#? calculate scalar product
proc calcScalar(factor: float, matrix: seq[seq[float]]): seq[seq[float]] =
let col: int = matrix[0].len
let row: int = matrix.len
var newMatrix = newSeqWith(row, newSeq[float](col))
if col == row and col == 1:
styledEcho fgRed, "\nPure scalar multiplication detected!"
return @[@[ factor * matrix[0][0]]]
for i in countup(0, row-1):
for j in countup(0, col-1):
newMatrix[i][j] = factor * matrix[i][j]
return newMatrix
#? calculate dot product
proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]] =
let col1: int = matrix1[0].len
@ -53,31 +39,11 @@ proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]
let row2: int = matrix2.len
var col, row: int
#? check if both matrics are actually scalars
if (col1 == row1 and col1 == 1) and (col2 == row2 and col2 == 1):
styledEcho fgRed, "\nPure scalar multiplication detected!"
return @[@[matrix1[0][0] * matrix2[0][0]]]
#? check if the first matrix is actually a scalar
elif col1 == row1 and col1 == 1:
styledEcho fgRed, "\nMatrix scalar multiplication detected!"
var matrix = newSeqWith(row2, newSeq[float](col2))
matrix = calcScalar(matrix1[0][0], matrix2)
return matrix
#? check if the second matrix is actually a scalar
elif col2 == row2 and col2 == 1:
styledEcho fgRed, "\nMatrix scalar multiplication detected!"
var matrix = newSeqWith(row1, newSeq[float](col1))
matrix = calcScalar(matrix2[0][0], matrix1)
return matrix
elif col1 == row2:
if col1 == row2:
col = col2
row = row1
else:
styledEcho fgRed, "Matrix dimensions mismatched!"
quit QuitFailure
quit "Matrix dimensions mismatched, operation invalid!", QuitFailure
var matrix = newSeqWith(row, newSeq[float](col))
@ -95,28 +61,29 @@ proc calcCross(vector1: array[3, float], vector2: array[3, float]): array[3, flo
result = [i, j, k]
proc dot* =
styledEcho styleBright, "Matrix Dot Product"
echo "MATRIX DOT PRODUCT"
#? record first matrix
styledEcho "Enter number of ", styleBright, "rows ", resetStyle, "in the first matrix:"
echo "Enter number of rows in the first matrix:"
let r1: int = getInt()
styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the first matrix:"
echo "Enter number of columns in the first matrix:"
let c1: int = getInt()
var m1 = newSeqWith(r1, newSeq[float](c1))
fillMatrix(m1, r1, c1)
procedures.fillMatrix(m1, r1, c1)
echo ""
#? record second matrix
styledEcho "Enter number of ", styleBright, "rows ", resetStyle, "in the second matrix:"
echo "Enter number of rows in the second matrix:"
let r2: int = getInt()
styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the second matrix:"
echo "Enter number of columns in the second matrix:"
let c2: int = getInt()
var m2 = newSeqWith(r2, newSeq[float](c2))
fillMatrix(m2, r2, c2)
procedures.fillMatrix(m2, r2, c2)
#? resultent matrix
let m: seq[seq[float]] = calcDot(m1, m2)
var m: seq[seq[float]]
m = calcDot(m1, m2)
echo "\nFirst matrix is:"
printMatrix(m1)
@ -126,46 +93,27 @@ proc dot* =
printMatrix(m)
proc cross* =
styledEcho styleBright, "Vector Cross Product"
echo "VECTOR CROSS PRODUCT"
type
VECTOR = array[3, float]
var
v1: VECTOR
v2: VECTOR
v: VECTOR
styledEcho "Enter numbers in the ", styleBright, "first ", resetStyle, "vector:"
echo "Enter numbers in the first vector:"
for i in 0..2:
echo "Enter item:"
v1[i] = getFloat()
styledEcho "Enter numbers in the ", styleBright, "second ", resetStyle, "vector:"
echo "Enter numbers in the second vector:"
for i in 0..2:
echo "Enter item:"
v2[i] = getFloat()
#? resultent vector
v = calcCross(v1, v2)
let v = calcCross(v1, v2)
echo v1, " \u2A2F ", v2
echo "\nResult vector is:"
echo v
proc scalar* =
styledEcho styleBright, "Matrix Scalar Multiplication"
styledEcho "Enter the " ,styleBright, "scale factor", resetStyle, ":"
let f: float = getFloat()
styledEcho "Enter number of ", styleBright, "rows ", resetStyle, "in the matrix:"
let r: int = getInt()
styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the matrix:"
let c: int = getInt()
var m = newSeqWith(r, newSeq[float](c))
fillMatrix(m, r, c)
let M = calcScalar(f, m)
echo "\nResult matrix is:"
printMatrix(M)