; File: expert.scm ; Author: -Your name- ; Expert on advising what courses you should take ; Calculate your own gpa(grade point average). List courses with different criteria. ; Type (start) to start the program. ;> (start) ; > (substring "emily" 0 2) -> "em" (define grade2number '((A 4.0)(A- 3.67)(B+ 3.0)(B 3.0)(B- 2.67)(C+ 2.33)(C 2.0)(C- 1.67)(D+ 1.33)(D 1) (D- 0.67)(E 0)(F 0)) ) (define mygrades '((CS111 A)(CS112 A-) (CS343 C)(CS325 B))) (define mycourses '((CS111 Fall 2009)(CS112 Fall 2010) (CS343 Spring 2011)(MA Fall 2010) (EN12 Spring 2010) (EN20 Fall 2011)(CJ111 Fall 2009))) (define (start) (let ((option 0)) (display "\n0.Exit\n1.Find gpa\n2.Find Grades\n3.Courses per topic\n4.Courses per year") (display " option? ") (set! option (read)) (cond ((equal? option 0) 'bye) ((equal? option 1) (display (mygpa)) (start)) ((equal? option 2) (display (findGrades)) (start)) ((equal? option 3) (display (findCoursesPerTopic))(start)) ((equal? option 4) (display(findCoursesPerYear))(start)) (#t (display " bad Input") (start)) ))) (define (findCoursesPerYear) (let((year 0)) (display "Enter Year(ex: 2011)? ") (set! year (read)) (apply append (map (lambda(z)(if (equal? year (caddr z)) (list z) ())) mycourses) ) )) (define (findCoursesPerTopic) (let((topic ())) (display "Enter Course index-EX: CS, CJ, MA, ENG...? ") (set! topic (read)) (apply append (map (lambda(z)(if (beginsWith topic (car z)) (list z) ())) mycourses) ) )) (define (beginsWith topic course); > (beginsWith 'CS 'CS343)->#t (equal? (symbol->string topic) ; or (search (symbol->string topic) (symbol->string course)) (substring (symbol->string course) 0 2) )) (define (mygpa) (let ((L (listgrades))) ;declare gpa as local and compute once all the grades (/ (apply + (map (lambda(z)(letter2number z)) L)) (length L) ) )) (define (letter2number letter) ; (letter2number 'A) -> 4.0 (cadr (assoc letter grade2number)) ) (define (listgrades); (listgrades) -> (A A- B C-) (map (lambda(z)(cadr z)) mygrades) ) (define (findGrades) (display " What grade you are looking for?") (let ((G (read))) (apply append (map (lambda(z)(if (equal? G (cadr z)) (list z) ())) mygrades)) )) (start)