%------------------------------------------------------------------------------
% CS100J, Spring 2000
% Lecture 25
% Tues 4/24
%------------------------------------------------------------------------------
% Notation:
clc
more on
echo on
% + menus: "->" means selecting a submenu
% example) File->Set Path means "click on File menu then click on Set Path
% submenu"
% + CW means "Command Window"
% + MF means "M-File"
%------------------------------------------------------------------------------
% Handy commands for programming
% pause % I am assuming you're trying to run this MATLAB
% $pause$ pauses processing of the MF until you hit any key
% no, there's no "Any" key :-)
% echo % repeat everything in the MF that was run
% the CW still evaluates everything in the MF
% more neat stuff:
% + miscellaneous: see $keyboard$, $pause(n)$, $waitforbuttontopress$
% + input: $input$
% + output: $disp$
%------------------------------------------------------------------------------
% Example1
% --------
% World's most common intro program

% Print Hello, World! to user
disp(['Hello, World!']) % display output
pause % pause for keystroke

% explanation: $disp$: display an array of strings
% - 'Hello, World!' is a string
% - ['Hello, World!'] is an array containing one string
% - disp(['Hello, World!']) tells MATLAB to display
% 'Hello, World!' in the Command Window
%------------------------------------------------------------------------------
% Example2
% --------
% Let's clean that up a bit for the MATLAB interface.
% "cleaning up" here means making the program a bit more user-friendly.
% Example 1 is called "bare-bones" because little is explained to the user.

% Print Hello, World! to user
clc % clear screen
disp(['Running a classic program....'])
disp(['Hello, World!'])
disp(['Hit any key when ready to continue'])
pause
%------------------------------------------------------------------------------
% Example3
% --------
% Now let's be a bit fancier.
% Calculator-type program
% Ex2 determines the percent error for a measured quantity
% compared to an ideal value.

% Determine percent error
clc
disp(['Hello, user. I am about to calculate a percent error.'])

% Get measured and ideal values
measured = 11; % a measured value
ideal = 10; % an ideal, or perfect) value

% Formula to determine percent error
% For absolute value, use ABS function: abs(value)
percenterror = 100*abs(measured-ideal)/ideal;

% Output to user
disp(['The percent error is ' num2str(percenterror)])
disp(['Hit any key when ready to continue'])
pause

% notes
% -----
% + MATLAB processes each statement one at a time
% (technically, MATLAB interprets each statement)
% + the code works left to right, top to bottom
% (known as control-flow or flow of control -> the fact that
% the software executes in a controlled fashion)
% + $num2str$ converts the numerical value of $percenterror$ to
% a string. $disp$ displays an ARRAY of strings, so I left a space
% between the first and second strings
%------------------------------------------------------------------------------
% Example4
% --------
% The last program involved a black box and output.
% It would be more fancy (and useful) if the user could choose the values
% used in evaluating percent error.
% Use $input$ command...demonstrated below, then explained more in Ex5

% Determine percent error
clc
disp(['Hello, user. I am about to calculate a percent error.'])

% Obtain input from user
measured = input('Enter a measured value: ');
ideal = input('Enter the ideal value: ');

% Formula to determine percent error
% For absolute value, use ABS function: abs(value)
percenterror = 100*abs(measured-ideal)/ideal;

% Output to user
disp(['The percent error is ' num2str(percenterror)])
disp(['Hit any key when ready to continue'])
pause

% notes
% -----
% How does $input$ work?
% $input(string)$ causes MATLAB to prompt the user for input
% + a prompt is text output that tells the user what to do
% + the $input$ command outputs the string as the prompt
% MATLAB then waits for the user to input a value or array
% (an array would be entered with brackets [])
% That input value is then stored in the variable on the left side.
% Try picturing that the input value from the user replaces the entire
% code on the right side of the assignment.

%------------------------------------------------------------------------------
% Example5
% --------
% More practice using $input$

clc
disp(['Now demonstrating more about input....'])

echo

% test1)
input('Enter it! ')

% In test1 MATLAB waits for the user input.
% The user types a value and presses Enter.
% MATLAB replaces "input('Enter it! ')" with the value you entered.
% So, MATLAB reports "ans = <the value you entered>"
% Notice how I put a space in the string because the input appears
% immediately to the right of the string.

pause
clc
'Next test...';

% test2)
L = input('R: ')
L

% In test2 I'm using variables L and R to remind you about what's on
% the left and right, respectively. I enter L AGAIN so MATLAB can prove
% to you that L is assigned

pause
clc
'Last test...';
% test3)
L = input('R: ');

% In test3, do you see the semicolon? Why on Earth did I do that?
% MATLAB evaluates the right-side as your input value.
% Any time you enter a value, what does MATLAB do? Evaluates it.
% So, the semicolon suppresses the output of assigning the input to
% the variable on the left.

echo
pause
%------------------------------------------------------------------------------
clc
% Conditional Statements
% + also known as selection statements
% + so far, programs seen as top-down sequence of instructions
% + often problems require choices
% + need to express situations as TRUE and FALSE
% + use tests to cause branches in the program
pause
%------------------------------------------------------------------------------
clc
% Logic
% + use to test situations
% + tests called RELATIONS
% value op value
% + MATLAB evaluates the statement for truth
% + answer is either 1 (true) or 0 (false)
% examples)
1 < 2 % less than
1 == 1 % equal (true)
1 == 2 % equal (false)
% source of confusion:
% $==$ is a comparison for equality
% $=$ is an assignment operator
pause
% logical operators: & (and), | (or), ~ (not), xor (exclusive or)
1==1 & 2==2
1 > 2 | 1 < 2
xor(1 < 2,1 < 3)
pause
%------------------------------------------------------------------------------
clc
% Branches
% + making choices
% + use $if$ (skip $switch$)
% + see $help if$
% General form of the $if$ statement is
%
% IF expression
% statements
% ELSEIF expression
% statements
% ELSE
% statements
% END
%
% + Must have $if$ and $end$
% + $else$ and $elseif$s are optional
pause
%------------------------------------------------------------------------------
clc
% Example 1
% Test if a number is positive
x = input('Enter a number: ');
if x > 0
disp(['Your number is positive.'])
end
pause
%------------------------------------------------------------------------------
clc
% Example 2
% Test if a number is positive
x = input('Enter a number: ');
if x > 0
disp(['Your number is positive.'])
else
disp(['Your number isn't positive.'])
end
pause
%------------------------------------------------------------------------------
clc
% Example 3
% Test sign of a number (see $help sign$ for built-in function)
x = input('Enter a number: ');
if x > 0
disp(['Your number is positive.'])
elseif x < 0
disp(['Your number is negative.'])
else
disp(['Your number is zero.']) % but can you guarantee that???
end
pause
%------------------------------------------------------------------------------
clc
% Example 4
% Test sign of a number (see $help sign$ for built-in function)
x = input('Enter a number: ');
if x > 0
disp(['Your number is positive.'])
elseif x < 0
disp(['Your number is negative.'])
elseif abs(x) < eps
disp(['Your number is zero.']) % but can you guarantee that???
else
disp(['I don't know what the hell your number is.'])
end
pause
%------------------------------------------------------------------------------
clc
% Example 5
% Test sign of a number
test = input('Enter the number to test: ');
if isnumeric(test)
if x > 0
disp(['Your number is positive.'])
elseif x < 0
disp(['Your number is negative.'])
elseif abs(x) < eps
disp(['Your number is zero.'])
else
disp(['I don't know what the hell your number is.'])
end
else
disp(['I said "Enter a number." Now look what you have done!'])
end
pause
%------------------------------------------------------------------------------
% more about selection statements
%
% example) swap values

disp(['swapping values'])
v1 = input('give me value1: ');
v2 = input('give me value2: ');

% swapping using a "temporary" variable
% $tmp$ acts as a placeholder
tmp = v1;
v1 = v2;
v2 = tmp;

disp(['v1 now has v2 value: ' num2str(v1)])
disp(['v2 now has v1 value: ' num2str(v2)])
disp(['press any key to continue'])

pause
clc

% now, apply to problem:
% Find the maximum of stored value and input value
% Keep the smaller value in variable called $min$

% input
disp(['finding a max value'])
max = input('give me a value: ');
val = input('give me another value: ');

% testing and swapping
if (val > max)
min = max;
max = val;
else
min = val;
end

% output
min
max

% curiosity
val % what happens to $v1$? nothing
clear val % if you want to erase $v1$
% val % now unassigned!

%------------------------------------------------------------------------------
% Loops
%------------------------------------------------------------------------------
% WHILE loop
% From $help while$
%
% WHILE Repeat statements an indefinite number of times.
% The general form of a WHILE statement is:
%
% WHILE expression
% statements
% END
%
% The statements are executed while the real part of the expression
% has all non-zero elements. The expression is usually the result of
% expr rop expr where rop is ==, <, >, <=, >=, or ~=.
%
% The BREAK statement can be used to terminate the loop prematurely.
%------------------------------------------------------------------------------
pause
clc
% example) count numbers from 1 to n

x = 0; % x "so far"
stop = input('enter stopping value n: ');

% note:
% variables that generalize a program $stop$ are called
% NAMED CONSTANTS -- use them in as many palces as you can

% output column of values from 1 to $stop$

while (x < stop)
x = x + 1 % increment x by 1
pause
end

x % what's x when loop ends?
%------------------------------------------------------------------------------
% example) count numbers from 1 to n
% this time, store the numbers in an array

x = 0; % x "so far"
stop = input('enter stopping value n: ');

% note:
% variables that generalize a program $stop$ are called
% NAMED CONSTANTS -- use them in as many palces as you can

% output column of values from 1 to $stop$

if stop>=0
y = zeros(1:stop-x) % what if x isn't zero?
else
disp(['evil x!'])
break % actually, you should avoid $break$s at all cost...
% For a taste of Java, think "System.exit(0)"
end

i = 1 % index for vector y
while (x < stop)
x = x + 1; % increment x by 1
y(i) = x
i = i + 1;
pause
end

x % what's x when loop ends?
y

% notes:
% -----
% boundary conditions -- I have loop possibly stopping for a count of
% zero. That's a kind of boundary condition, or limiting value
% Actually, the result isn't too pretty if you enter 0 for $stop$.
% MATLAB returns the empty matrix $[]$
%
% vectorizing -- overall my style is OK here, but there's some efficiency
% problems. You don't really need a loop to gather a count of values!
% Vectorizing code means finding a way for MATLAB's array to
% supercede a loop. Using built-in arrays generally works faster than
% processing a loop. Not all languages have this feature, though.
%
% other commands: $tic$, $toc$, $break$, $for$

%----------------------------------------------------------------------------
% FOR LOOP
% see $help for$:
%
% FOR Repeat statements a specific number of times.
% The general form of a FOR statement is:
%
% FOR variable = expr, statement, ..., statement END

% example) print list of numbers from 1 to 4, stepping by 1:
pause
clc
for ii=1:4
x
end

% example) print list of numbers from 1 to 4, stepping by 0.5:
pause
clc
for ii=1:0.5:4
x
end
%----------------------------------------------------------------------------
% So, what's the colon about? See $help colon$ and next lecture on arrays.
%----------------------------------------------------------------------------
% some more examples:
%
% repetition (well, a bit of updating)

% set up input
i=1
g = input('enter grade: ')

% perform repetitive task until
% user enters a negative value
while g > -eps
grades(i) = g
i = i+1
g = input('enter grade: ')
end
if i > 0
grades
else
disp(['no grades entered!'])
end

% conditional update

% set up input
i=1
g = input('enter grade: ')
max = g % max value "so far"

% find max from input grades
while g > -eps
grades(i) = g
i = i+1
g = input('enter grade: ')
if g > max
max = g
end
end
if i > 0
max
grades
else
disp(['no grades entered!'])
end