Hi everyone,
We are to create a function using the editor to solve a quadratic formula. The hard part is the user is to be able to input just the equation ie: Ax^2+Bx+C=0 (not the values of ABC). (Below is what I have so far)
____***_*%The user input the formula they want solved_____
function [xpos, xneg] = Roots(equation)
%Quadratic equation format is = Ax^2 + Bx + C = 0
A = strtok(equation, 'x');
B =
C =
%This is the discriminant
D = B .^2 - 4 .* A .* C;
%These are the equation to find the positive and negative values of x
xpos = (-B + sqrt(D)) ./ (2 .* A)
xneg = (-B - sqrt(D)) ./ (2 .* A)
end

3 Kommentare

To clarify, your input is something like this following, correct?
equation = '3x^2 + 5x + 12=0'
Daniel Shub
Daniel Shub am 17 Sep. 2013
There are lots of parsers for quadratic equations based on regular expressions. This might be easier than using strtok
dpb
dpb am 17 Sep. 2013
Oh, indeed! The OPs instructor is, however, apparently not amenable to alternate solutions than those suggested based on his comments later on.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

dpb
dpb am 12 Sep. 2013

0 Stimmen

You showed enough I'll do more than normally would on first response...
s=inputdlg('Enter quadratic: ','Quadratic Solver Input',1,{'ax^2+bx+c'});

8 Kommentare

MAB
MAB am 16 Sep. 2013
Thanks for the help. Now, I am able to extract the first number usinf the strtok, but how do I get the the other 2 numbers?
dpb
dpb am 16 Sep. 2013
How carefully are you controlling the format of the input the user provides? If the structure of the equation can be assumed to match a given format it's possible to simply do something like
>> s='3x^2+5x+1';
>> c=sscanf(s,'%f x^2 + %f x + %f')'
c =
3 5 1
>>
If you need to or want to use strtok() to parse substrings, simply use the optional "remainder" output and a while loop to return subsequent tokens until it becomes the empty string.
[t,r]=strtok(s);
% process token appropriately here
while ~isempty(r)
[t,r]=strtok(s);
% process the next token appropriately here
end
MAB
MAB am 16 Sep. 2013
Bearbeitet: MAB am 17 Sep. 2013
I was able to talk to the instructor today and he gave a little more clarification for the problem.
he says the user is going to enter the string as follows as a string:
'4x^2+2x+3=0'
Then we are to use strtok() to pull the values for A B & C.
ie A = strtok(s , 'x') will pull out the 4 from the string. The above strtok example is the only way he has showed us and he normally doesn't want us to deviate far from that, but I do not see how using it in that format I can pull out B and C? Im sure I could use the [t,r]=strtok(s,...) but he says we are not allowed to use conditional statements like while and for loops.
dpb
dpb am 17 Sep. 2013
That's just evil imo... :)
I don't see any good way to actually parse any of the other numeric values after the first with strtok() only--it just doesn't parse regularly based on the rules strtok() uses.
You could do a two-step process of first separating the terms based on defining the delimiter string as '+=' as the first pass then delimiter "x" on that token for a and b. But c is still an oddball that then parses on the first pass owing to using += for the primary delimiter.
Sotoo,
delim='+=';
[a,r]=strtok(s,delim); a=strtok(a,'x');
[b,r]=strtok(r,delim); b=strtok(b,'x');
c=strtok(r,delim);
Of course, all are still strings, not numeric; you still need a str2num() around each or sscanf() or somesuch to get the actual numeric value.
All in all, I'm not impressed by the instructions received...
MAB
MAB am 17 Sep. 2013
Bearbeitet: MAB am 17 Sep. 2013
Below is the code I got but like you said I still have to use str2num() to get actually values for my ABC.
% The user input the formula they want solved
function [xpos, xneg] = Roots(s)
%Quadratic equation format is = Ax^2 + Bx + C = 0
M = strtok(s,'x');
[a,b] = strtok(s, '+-');
T = strtok(b,'x')
[c,d]=strtok(b, '+-');
H = strtok(d, '=');
A = str2num(M)
B = str2num(T)
C = str2num(H)
%This is the discriminant
D = ((B) .^2) - (4 .* A .* C)
%These are the equation to find the positive and negative values of x
xpos = (-B + sqrt(D)) ./ (2 .* A)
xneg = (-B - sqrt(D)) ./ (2 .* A)
end
This code works by the way. The str2num is what I was needing to change my string values to numeric values.
dpb
dpb am 17 Sep. 2013
Well, it'll be interesting to hear if the instructor actually can come up with a realistic parser under the given rules himself...keep us posted.
MAB
MAB am 17 Okt. 2013
OK, Im back again because I realized that if there is no number in front the x, my function will not work. So I am looking for a way to use the strtok without using an if statement to determine that there is a 1 whether it be negative or positive as the coefficient.
ie: -x^2 - x +10 = 0
I want to be able to pull out a -1 for A and B.
dpb
dpb am 17 Okt. 2013
The form doesn't fit the required input of an explicit constant.
Only way to deal with it will be to special-case it.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Historical Contests finden Sie in Hilfe-Center und File Exchange

Gefragt:

MAB
am 12 Sep. 2013

Kommentiert:

dpb
am 17 Okt. 2013

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by