Since i am going to have to learn Smalltalk well enough to convert it to .NET ( or so i have been told )
i decided to convert some of the C++ tutorials to Smalltalk.
Namely this one:
Write a program which performs addition, subtraction, multiplication of matrices. The dimensions of both the matrices would be specified by the user (dynamic memory allocation required). Use of structure or a class to define the matrix would be a good idea. (Expert)
Here is the output,
in its current state it can only add matrices but i will manage that later on.
I would have loved to uses classes and methods like in any modern language but since the version we are using here at work is about 12 years old and adding support for classes is cryptic at best i will simply hold out for now and submit my sad version :lol:
"
Adding matrices together
"
| matriceA matriceB matriceResult matriceHeight matriceWidth mCountH mCountW mMessage |
Transcript clear.
"setup the initial heights and widths"
matriceHeight := 0.
matriceWidth := 0.
[ ( ( matriceHeight > 0 ) & ( matriceWidth > 0 ) ) ] whileFalse: [
matriceHeight := ( Dialog request: 'Please enter the height of the matrices' initialAnswer: 2 ) asNumber.
matriceWidth := ( Dialog request: 'Please enter the width of the matrices' initialAnswer: 2 ) asNumber.
].
"Create a collection at MatriceA, this collection is matriceHeight in size with each item being matriceWidth in size"
matriceA := OrderedCollection new.
matriceB := OrderedCollection new.
matriceResult := OrderedCollection new.
"used to count through the array and build elements"
mCountH := 1.
mCountW := 1.
[ mCountW <= matriceWidth ] whileTrue: [
"declare the jagged array"
matriceA add: ( OrderedCollection new ).
matriceB add: ( OrderedCollection new ).
matriceResult add: ( OrderedCollection new ).
mCountW := mCountW + 1.
].
"reset counters for later use"
mCountW := 1.
"request users to fill in matrice A"
[mCountW <= matriceWidth ] whileTrue: [
[mCountH <= matriceHeight ] whileTrue: [
( matriceA at: mCountW ) add:
( (Dialog request: 'MATRICE A' cr, 'please fill in the value at ' cr, mCountW printString, ',', mCountH printString initialAnswer: 0) asNumber ).
mCountH := mCountH + 1.
].
mCountH := 1.
mCountW := mCountW + 1.
].
mCountW := 1.
"request users to fill in matrice B"
[mCountW <= matriceWidth ] whileTrue: [
[mCountH <= matriceHeight ] whileTrue: [
( matriceB at: mCountW ) add:
( (Dialog request: 'MATRICE B' cr, 'please fill in the value at ' cr, mCountW printString, ',', mCountH printString initialAnswer: 0) asNumber ).
mCountH := mCountH + 1.
].
mCountH := 1.
mCountW := mCountW + 1.
].
mCountW := 1.
mCountH := 1.
"do math to add matrices"
[ mCountW <= matriceWidth ] whileTrue: [
[ mCountH <= matriceHeight ] whileTrue: [
( matriceResult at: mCountW ) add: ( ( ( matriceA at: mCountW ) at: mCountH ) + ( ( matriceB at: mCountW ) at: mCountH ) ).
mCountH := mCountH + 1.
].
mCountH := 1.
mCountW := mCountW + 1.
].
mCountH :=1.
mCountW :=1.
"Build message to draw Matrice"
mMessage := 'The Matricies to be added:'cr.
[ mCountH <= matriceHeight ] whileTrue: [
[ mCountW <= matriceWidth ] whileTrue: [
( mCountW = 1 ) ifTrue: [
mMessage := mMessage, '| ', ( ( matriceA at: mCountW ) at: mCountH ) printString.
] ifFalse: [
( mCountW = matriceWidth ) ifTrue: [
mMessage := mMessage , ' , ', ( ( matriceA at: mCountW ) at: mCountH ) printString, ' |' tab.
] ifFalse: [
mMessage := mMessage , ' , ', ( ( matriceA at: mCountW ) at: mCountH ) printString.
].
].
mCountW := mCountW + 1.
].
mCountW := 1.
[ mCountW <= matriceWidth ] whileTrue: [
( mCountW = 1 ) ifTrue: [
mMessage := mMessage, '| ', ( ( matriceB at: mCountW ) at: mCountH ) printString.
] ifFalse: [
( mCountW = matriceWidth ) ifTrue: [
mMessage := mMessage , ' , ', ( ( matriceB at: mCountW ) at: mCountH ) printString, ' |' cr.
] ifFalse: [
mMessage := mMessage , ' , ', ( ( matriceB at: mCountW ) at: mCountH ) printString.
].
].
mCountW := mCountW + 1.
].
mCountW := 1.
mCountH := mCountH + 1.
].
Dialog warn: mMessage.
"reset the counters"
mCountW := 1.
mCountH := 1.
mMessage := 'And the Result is:'cr.
[ mCountH <= matriceHeight ] whileTrue: [
[ mCountW <= matriceWidth ] whileTrue: [
( mCountW = 1 ) ifTrue: [
mMessage := mMessage, '| ', ( ( matriceResult at: mCountW ) at: mCountH ) printString.
] ifFalse: [
( mCountW = matriceWidth ) ifTrue: [
mMessage := mMessage , ' , ', ( ( matriceResult at: mCountW ) at: mCountH ) printString, ' |' cr.
] ifFalse: [
mMessage := mMessage , ' , ', ( ( matriceResult at: mCountW ) at: mCountH ) printString.
].
].
mCountW := mCountW + 1.
].
mCountW := 1.
mCountH := mCountH + 1.
].
Dialog warn: mMessage.
The language does a good job at over complicating itself in it's current state.
To even save a file is a hassle.
One must copy what they are working on from their "workspace" open up the file browser, type in the location of the directory in which you wish to save the file, then you must paste the contents of your file into the browsers lower pane and middle+click save as and give the directory name / file name.st and save.