Problem 1: Write a function coincount
that computes the dollar value of a number of quarters, dimes, and nickels. Use it to compute the dollar value of 18 quarters, 5 dimes, and 12 nickels.
function dollars = coincount(q, d, n) % return dollar value of q quarters, d dimes, and n nickels dollars = 0.25*q + 0.10*d + 0.05*n; end
>> coincount(18,5,12) ans = 5.6000
Note: It would be good programming practice to check that arguments q, d, n
all have integer values and emit and warning if not.
function dollars = coincount(q, d, n) % return dollar value of q quarters, d dimes, and n nickels if q != round(q) || d != round(d) || n != round(n) fprintf('error: arguments q,d,n should all have integer values'); dollars = 0.25*q + 0.10*d + 0.05*n; end
Problem 2: Write a function hms2decimal
that converts a time in hours, minutes, and seconds and converts it to hours in decimal. Use it to calculate the decimal equivalent of 6 hours, 27 minutes, and 18 seconds.
function d = hms2decimal(h,m,s) % compute decimal time from hours h, minutes m, and seconds s d = h + m/60 + s/3600; end
>> hms2decimal(6,27,18) ans = 6.4550
Problem 3: Write a function decimal2hms
that converts a time in decimal hours to hours, minutes, and seconds. Use it to compute the hours, minute, and seconds equivalent of 18.782 hours.
function [h,m,s] = decimal2hms(t) % compute hours h, minutes m, and seconds s from time t in decimal hours % change all times to positive for ease of conversion sig = sign(t); t = abs(t); % at this point t = xxx.xxxxx hours h = floor(t); % get # hours by rounding t down to next integer t = t - h; % remove integer hour part, so that t is 0.xxxxx hr t = t*60; % convert t to minutes: 0.xxxx hr * 60 min/hr = yy.yyy min m = floor(t); % get # minutes by rounding t down to next integer t = t - m; % remove integer hour part, so that t is 0.yyy min t = t*60; % convert t to seconds: 0.yyyy min * 60 sec/min = zz.zzz min s = t; % no further conversion, so keep decmial part of seconds end
First test decimal2hms
by inverting the decimal time we got from hms2decimal
for 6 hrs, 27 min, 18 sec.
>> [h,m,s] = decimal2hms(6.455) h = 6 m = 27 s = 18.0000
Hooray! We get the same answer. Now evaluate 18.782 hours as asked
>> [h,m,s] = decimal2hms(18.782) h = 18 m = 46 s = 55.2000
Problem 4: Write a function polar2cartesian
that converts polar coordinates r, theta
to Cartesian coordinates x,y
. Use it to compute the Cartesian coordinates of r=2, theta=pi/6
.
fucntion [x,y] = polar2cartesian(r, theta); % convert polar (r,theta) coordinates to Cartesian (x,y) x = r*cos(theta); y = r*sin(theta); end polar2cartesian
>> [x,y] = polar2cartesian(2,pi/6) x = 1.7321 y = 1.0000
Problem 5: Write a function cartesian2polar
that converts Cartesian coordinates x,y
to polar coordinates r, theta
. Use it to compute the polar coordinates of x=2, y=3
. Hint: use the arctangent function atan
to compute theta
from x
and y
.
function [r, theta] = cartesian2polar(x, y) % convert Cartesian coordinates (x,y) to polar (r, theta) r = sqrt(x^2 + y^2) theta = atan(y/x) end
Test this code by inverting x,y
answer from previous problem. Should give us r, theta = 2, pi/6
.
>> [r, theta] = cartesian2polar(1.7321,1) r = 2.0000 theta = 0.5236 >> pi/6 ans = 0.5236
Yay!
Problem 6: Are there any values of x,y
for which your function from problem 4 fails? Try these values of (x,y)
: (1,0), (-1,0), (0,0)
. Revise cartesian2polar
function to fix these the problems these examples point out using if-else
statements, so that your function gives correct r, theta
values for all x,y
values.
function [r, theta] = cartesian2polar(x, y) % convert Cartesian coordinates (x,y) to polar (r, theta) r = sqrt(x^2 + y^2); % the computation atan(y/x) is problematic for x == 0, so spell out % possible cases without doing this division if x == 0 if y == 0 % x,y is origin => theta is arbitray, set it to zero theta = 0.0; elseif y>0 % x,y is on positive y axis, set theta to pi/2 theta = pi/2; else % x,y is on negative y axis, set theta to -pi/2 theta = -pi/2; end % for x ~= 0, there are still possible problems with atan(y/x) since % x,y == -1,-1 in 3rd quadrant will produce the same theta as x,y == 1,1, % which is in the 1st quadrant!! Experimenting with Matlab's atan function % a bit shows it returns atan(theta) in the range -pi/2 to /pi/2 (4th and % 1st quadrants). So we have to adjust theta if x,y falls in the 2nd or % 3rd quadrant. else theta = atan(y/x); % produces theta in 1st or 2nd quadrant if x <= 0 & y>=0 % x,y is really in 2nd quadrant theta = theta + pi; % add pi to move theta from 4th to 2nd quadrant elseif x => 0 & y<=0 % x,y is really in 3rd quadrant theta = theta + pi; % subtract pi to move theta from 1st to 3rd quadrant end % theta will now fall in the range -pi to pi. end
Now test the code on the origin and (x,y) == (r cos theta, r sin theta) for theta ranging from -pi to pi
>> [r,theta] = cartesian2polar(0,0) r = 0 theta = 0 >> r=1; theta=-pi; [r,theta] = cartesian2polar(r*cos(theta),r*sin(theta)) r = 1 theta = -3.1416 >> r=1; theta=-3*pi/4; [r,theta] = cartesian2polar(r*cos(theta),r*sin(theta)) r = 1 theta = -2.3562
etc. Continuing around the unit circle in steps of delta theta = pi/4, it gets them all right.
Problem 7: Write a tempconvert
function that converts a temperature in any of C, F,or K units and converts it to any desired units. The function should take a single input argument t
. It should then prompt the user for the units of t
using an input
statement, prompt again for the desired units of the output, print a statement using fprintf
of the form 67 F is equivalent to 292.594 K
(where the numbers and units depend on the input values), and then return the numerical value of the temperature in the desired output units. If the input temperature is below absolute value, the program should print an error message and return absolute zero in the desired units.
function Tout = tempconvert2(Tin) % convert input temperature T from any of K,C,F units to any of same units. uin = input('Enter the current units of temperature, K, C, or F: ', 's'); % convert input temperature T to Celsius switch uin case 'C' T = Tin; case 'F' T = (Tin-32)*(5/9); case 'K' T = Tin-273.15; otherwise disp('Input unit is not valid. Returning NaN.') T = NaN; end if T < -273.15 disp('Warning: temperature is less than absolute zero') end uout = input('Enter the unit you want to convert to, K, C, or F: ', 's'); % convert T from Celsiss to output units switch uout case 'C' Tout = T; case 'F' Tout = (9/5)*T+32; case 'K' Tout = T + 273; otherwise disp('Output unit is not valid. Returning NaN.') Tout = NaN; end fprintf('%d %s is equivalent to %d %s\n', Tin, uin, Tout, uout) end
A few non-comprehensive tests:
>> T = tempconvert(0) Enter the current units of temperature, K, C, or F: C Enter the unit you want to convert to, K, C, or F: F 0 C is equivalent to 32 F T = 32 >> T = tempconvert(0) Enter the current units of temperature, K, C, or F: K Enter the unit you want to convert to, K, C, or F: C 0 K is equivalent to -2.731500e+02 C T = -273.1500