=========================preview======================
(COMP251)midterm96F_sol.pdf
Back to COMP251 Login to download
======================================================
COMP2511996-97FallSemesterExam#2
Friday,Nov15,1996
SuggestedSolutions
Important.
.Pleasetakealookattheproblemsnow,andaskforclari.cationsifyoudon'tunder-standthem.Afterthe.rst30minutes,noclari.cationswillbegiven.

.Spendyourtimeswisely,andtrytosolveeveryproblembecausepartialcreditsmay begivenforincompleteorevenwronganswers.
Problem1.(10%)WhatvaluewillthefollowingSchemeexpressionreturn.
]..'(a'(b))


Answer:(a'(b))
Problem2.(15%)Thefollowingprocedure,namedmystery,takesasitsargumentalistthatcontains atleasttwotop-levelitems:
(definemystery (lambda(ls)
(if(null.(cddrls))
(cons(carls)'())
(cons(carls)(mystery(cdrls))))))


(a)(5%)Whatisthevalueof(mystery'(12345)).
Answer:(1234)
(b)(10%)Describethegeneralbehaviorofmystery,thatis,foranylist(item1item2...itemk),

k1,whatisthevalueof(mystery'(item1item2...itemk))
Answer:(item1item2...item(k-1))
Problem3.(20%)De.neaprocedureremove-lastthatremovesthelasttop-leveloccurrenceofa

givenelementiteminalistls.Forexample:
(remove-last'a'())...() (remove-last'a'(bana))...(ban) (remove-last'a'(ban(a)))...(bn(a))

Useequal.totestforsameness.NoticethatyoucanonlyusethestandardSchemeproceduresin de.ningthisprocedure.Butyoucanintroduceanynecessaryhelperfunctionsasyouwish.


Answer:
...member.function--seelecture25note (definemember. (lambda(itemls)
(cond
((null.ls)#f)
(else(or(equal.(carls)item)

(member.item(cdrls)))))))
1
(defineremove-last(lambda(itemls)
(cond
((null.ls)'()) .basecase
((and(equal.(carls)item) .inductivecase--onlywhen

(not(member.item(cdrls)))).itemis(carls)anddoesnotappear (cdrls)) .in(cdrls)dowedeleteitfromls (else(cons(carls) (remove-lastitem(cdrls)))))))
ThefollowingaresomeSchemeconstructsandstandardproceduresthatyoumightneedforsolvingthe aboveproblems.
'datumisashorthandfor(quotedatum)
(cddrls)isashorthandfor(cdr(cdrls))
(equal..obj1..obj2.)
(if.cond..expr1..expr2.)
(define.var..expr.)
(lambda(.var1..var2.....vark.).expr.)
(let((.var1..init1.)(.var2..init2.)...(.vark..initk.)).expr.)
(letrec((.var1..init1.)(.var2..init2.)...(.vark..initk.)).expr.)
(or.expr1..expr2.).returns#fiffboth.expr1.and.expr2.evaluateto#f
(and.expr1..expr2.).returns#fiffeither.expr1.or.expr2.evaluatesto#f
(not.expr.).returns#tiff.expr.evaluatesto#f

2

Problem4.(15%)WhataretheproblemswiththefollowingC++program.
#include.iostream.h. #include.string.h. #include.assert.h.
classString{ public: char*str. String(char*). ~String().
private: intlen. }
String::String(char*s){ len.strlen(s).//strlen(s)returnsthelengthofthestrings str.newchar[len+1]. assert(str!.0). strcpy(str,s).
} .----``.''MISSING
String::~String(){deletestr.}
main(){ Stringsearch(``Rose''). {String*p.&search. p-.str.``Rosebud''. .---STRINGTOOLONG--MAYOVERWRITE THECONTENTSOFSOMELOCATIONSTHAT HAVEBEENUSEDFOROTHERPURPOSES p-.len.strlen(``Rosebud'')..---len:PRIVATEDATAMEMBER deletep. } cout..search.len..``''..search.str..endl..---THEOBJECTTHAT WASASSIGNEDTO searchHASBEEN DE