<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-8%3Ahpan027</id>
	<title>SE250:lab-8:hpan027 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-8%3Ahpan027"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-8:hpan027&amp;action=history"/>
	<updated>2026-04-28T09:23:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.kram.nz/index.php?title=SE250:lab-8:hpan027&amp;diff=8187&amp;oldid=prev</id>
		<title>Mark: 24 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-8:hpan027&amp;diff=8187&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:28Z</updated>

		<summary type="html">&lt;p&gt;24 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Initial problems ==&lt;br /&gt;
&lt;br /&gt;
*The error function was called before it was defined and hence needed a prototype declaration.&lt;br /&gt;
*&amp;quot;strcmpi&amp;quot; was misspelled as &amp;quot;strcimp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task Two ==&lt;br /&gt;
&lt;br /&gt;
 mkNode(&amp;#039;-&amp;#039;,mkNode(&amp;#039;-&amp;#039;,mkNode(&amp;#039;a&amp;#039;,0),mkNode(&amp;#039;b&amp;#039;,0),0),0);&lt;br /&gt;
&lt;br /&gt;
*Took a while to figure out how to use mkNode&lt;br /&gt;
&lt;br /&gt;
http://studwww.cs.auckland.ac.nz/~hpan027/250-8-1.jpg&lt;br /&gt;
&lt;br /&gt;
*Still can&amp;#039;t get the converter to work internally. Had to convert the .dot file manually&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task Three ==&lt;br /&gt;
&lt;br /&gt;
 mkNode(&amp;#039;?&amp;#039;,mkNode(&amp;#039;&amp;gt;&amp;#039;,mkNode(&amp;#039;+&amp;#039;,mkNode(&amp;#039;a&amp;#039;,0),mkNode(&amp;#039;b&amp;#039;,0),0),mkNode(&amp;#039;c&amp;#039;,0),0),mkNode(&amp;#039;*&amp;#039;,&lt;br /&gt;
 mkNode(&amp;#039;z&amp;#039;,0),mkNode(&amp;#039;+&amp;#039;,mkNode(&amp;#039;y&amp;#039;,0),mkNode(&amp;#039;b&amp;#039;,0),0)),mkNode(&amp;#039;?&amp;#039;,mkNode(&amp;#039;=&amp;#039;,mkNode(&amp;#039;a&amp;#039;,0),&lt;br /&gt;
 mkNode(&amp;#039;2&amp;#039;,0),0),mkNode(&amp;#039;-&amp;#039;,mkNode(&amp;#039;x&amp;#039;,0),mkNode(&amp;#039;y&amp;#039;,0),0),mkNode(&amp;#039;-&amp;#039;,mkNode(&amp;#039;y&amp;#039;,0),mkNode(&amp;#039;x&amp;#039;,0),0),0),0);&lt;br /&gt;
&lt;br /&gt;
*Is it supposed to be this long?&lt;br /&gt;
&lt;br /&gt;
== Task Four ==&lt;br /&gt;
&lt;br /&gt;
*Cannot even begin to imagine what this would look like&lt;br /&gt;
&lt;br /&gt;
http://studwww.cs.auckland.ac.nz/~hpan027/250-8-2.jpg&lt;br /&gt;
&lt;br /&gt;
*Makes sense&lt;br /&gt;
*Horrible quality for some reason (&amp;#039;C&amp;#039;, some &amp;#039;-&amp;#039; and some &amp;#039;=&amp;#039; not drawn properly)&lt;br /&gt;
&lt;br /&gt;
== Task Five ==&lt;br /&gt;
&lt;br /&gt;
*Possibly because it expects two set of statements to follow the &amp;#039;?&amp;#039;&lt;br /&gt;
*Not really sure at this point&lt;br /&gt;
&lt;br /&gt;
== Task Six ==&lt;br /&gt;
&lt;br /&gt;
*Initial impression: could take a while&lt;br /&gt;
*Draft code&lt;br /&gt;
 int eval( ParseTree* pt ) {&lt;br /&gt;
 //base case: if + - * /&lt;br /&gt;
 //evalute number within brackets with the operator&lt;br /&gt;
 //else eval( subtree )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*Very basic code working for single operation between two single-digit integers&lt;br /&gt;
 int eval( ParseTree* pt ) {&lt;br /&gt;
     //base case: if + - * /&lt;br /&gt;
     if( pt-&amp;gt;arity == 2 )&lt;br /&gt;
 	switch(pt-&amp;gt;name){&lt;br /&gt;
 	case &amp;#039;+&amp;#039;: return atoi(&amp;amp;pt-&amp;gt;arg[0]-&amp;gt;name)+atoi(&amp;amp;pt-&amp;gt;arg[1]-&amp;gt;name); break;&lt;br /&gt;
 	case &amp;#039;-&amp;#039;: return atoi(&amp;amp;pt-&amp;gt;arg[0]-&amp;gt;name)-atoi(&amp;amp;pt-&amp;gt;arg[1]-&amp;gt;name); break;&lt;br /&gt;
 	case &amp;#039;*&amp;#039;: return atoi(&amp;amp;pt-&amp;gt;arg[0]-&amp;gt;name)*atoi(&amp;amp;pt-&amp;gt;arg[1]-&amp;gt;name); break;&lt;br /&gt;
 	case &amp;#039;/&amp;#039;: return atoi(&amp;amp;pt-&amp;gt;arg[0]-&amp;gt;name)/atoi(&amp;amp;pt-&amp;gt;arg[1]-&amp;gt;name); break;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
     //evalute number within brackets for with the operator&lt;br /&gt;
     //else eval( subtree )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*This won&amp;#039;t work for anything with one or three arguments&lt;br /&gt;
*Perhaps base case should be if it is a single integer leaf?&lt;br /&gt;
*Turned out to work fine&lt;br /&gt;
 int eval( ParseTree* pt ) {&lt;br /&gt;
     if( atoi(&amp;amp;pt-&amp;gt;name) &amp;gt; 0 ) //base case integer leaf&lt;br /&gt;
 	return atoi(&amp;amp;pt-&amp;gt;name);&lt;br /&gt;
     else&lt;br /&gt;
 	switch(pt-&amp;gt;name){&lt;br /&gt;
 	case &amp;#039;+&amp;#039;: return eval(pt-&amp;gt;arg[0])+eval(pt-&amp;gt;arg[1]); break;&lt;br /&gt;
 	case &amp;#039;-&amp;#039;: return eval(pt-&amp;gt;arg[0])-eval(pt-&amp;gt;arg[1]); break;&lt;br /&gt;
 	case &amp;#039;*&amp;#039;: return eval(pt-&amp;gt;arg[0])*eval(pt-&amp;gt;arg[1]); break;&lt;br /&gt;
 	case &amp;#039;/&amp;#039;: return eval(pt-&amp;gt;arg[0])/eval(pt-&amp;gt;arg[1]); break;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
*However screwed for anything that isn&amp;#039;t an operation with two numbers (e.g. -(1+2))&lt;br /&gt;
*Although single argument operations would only apply to &amp;quot;-&amp;quot; and &amp;quot;+&amp;quot; - i.e. *(2-3) or /(5) makes no sense&lt;br /&gt;
*Use if statements to catch single argument operations?&lt;br /&gt;
&lt;br /&gt;
 	case &amp;#039;+&amp;#039;: return ( pt-&amp;gt;arity&amp;gt;1 ? eval(pt-&amp;gt;arg[0])+eval(pt-&amp;gt;arg[1]) : eval(pt-&amp;gt;arg[0]) );&lt;br /&gt;
 	case &amp;#039;-&amp;#039;: return ( pt-&amp;gt;arity&amp;gt;1 ? eval(pt-&amp;gt;arg[0])-eval(pt-&amp;gt;arg[1]) : -1* eval(pt-&amp;gt;arg[0]) );&lt;br /&gt;
*Seems to work&lt;br /&gt;
*Now need to consider 2+ arguments &amp;amp; if statements?&lt;br /&gt;
*If statement would probably be a separate case&lt;br /&gt;
*For 2+ argument possibly loop through the whole arg array for values&lt;br /&gt;
*Each case statement would probably look something like&lt;br /&gt;
 case &amp;#039;+&amp;#039;: int i=0; int value = 0; for( i = 0; i &amp;lt; pt-&amp;gt;arity-1; i++ ) {&lt;br /&gt;
 	value+=eval(pt-&amp;gt;arg[i]);&lt;br /&gt;
 	return value;&lt;br /&gt;
&lt;br /&gt;
== After the lab ==&lt;br /&gt;
&lt;br /&gt;
Comment on what?&lt;br /&gt;
&lt;br /&gt;
Neat reports.&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>