Soru: Bir öğrencinin okul numarası, ve aldığı dersler bulunur. Bir dersin ise kodu bulunur. Öğrencinin aldığı her dersin bir kodu ve öğrencinin bu dersten aldığı not bulunur. Buna göre bir öğrenci tanımlandığında aşağıda verilen not tablosuna göre bu öğrencinin ortalamasını hesaplayan bir kod yazınız.

Harf Notu (4 üzerinden)
A 4
A- 3.7
B+ 3
B- 2.7
C+ 2.3
C 2
C- 1.7
D+ 1.3
D 1

Çözen : Şadi Evren ŞEKER

Çözüm fonksiyonları:

Bu tip bir soruda verilerin tutulması ve işlenmesi önemli bir yer tutar. Verilerin tutulması için scheme dilinde bulunan struct özelliğinden faydalanacağız.

Öncelikle dersin yapısını tanımlayalım:

(define-struct course (name credit grade))

Ardından bir öğrencinin yapısını tanımlayalım:

(define-struct student (id listofcourses))

Yukarıda görüldüğü üzere bir ders, isim, kredi ve nottan; öğrenci ise bir numara ve aldığı derslerden oluşur. Şimdi fonksiyonları yazmaya başlayabiliriz:

Öncelikle bir harf notu verildiğinde sayısal karşılığını döndüren fonksiyonu yazalım:

(define (letter-grade grade)(cond [(eq? grade ‘A) 4][(eq? grade ‘A-) 3.70][(eq? grade ‘B+) 3.30][(eq? grade ‘B) 3][(eq? grade ‘B-) 2.70][(eq? grade ‘C+) 2.30][(eq? grade ‘C) 2][(eq? grade ‘C-) 1.70][(eq? grade ‘D+) 1.30][(eq? grade ‘D) 1][else 0]))

Ardından verilen bir listedeki dersler için ağırlıklı ortalama hesaplayan fonksiyonu yazalım:

(define (weightedaverage acourse) ( * (course-credit acourse)(letter-grade (course-grade acourse))))

(define (weightedaverage-sum acourselist)( cond [(null? acourselist) 0][else (+ (weightedaverage-sum (rest acourselist)) (weightedaverage (first acourselist)))]))

Yukarıdaki kodda derslerin bir liste olarak verildiği kabul edilmiştir. Buradaki weightedaverage-sum fonksiyonu özyineli (recursive) olarak listenin üzerinden geçer. Her geçişinde sıradaki elemanın değerini toplar ve sonuçta bütün elemanların toplam değerini döndürür.

Yukarıdaki toplamları alan fonksiyonlara ilave olarak derslerin kredilerinin toplamını veren bir fonksiyona ve nihayetinde bu not toplamını kredi toplamına bölen bir fonksiyona daha ihtiyaç vardır. Bunlar aşağıdaki şekilde yazılabilir:

(define (course-credits acourselist)( cond [(null? acourselist) 0][else (+ (course-credits (rest acourselist)) (cond[(eq? ‘Z (course-grade (first acourselist))) 0][else ( course-credit (first acourselist))]))]))

(define (calculated-gpa astudent)(/ ( weightedaverage-sum (student-listofcourses astudent))(course-credits (student-listofcourses astudent))))

Sonuçta bir öğrenci dersleri ile birlikte aşağıdaki şekilde verilince ortalama GPA değeri başarıyla hesaplanır:

Çözüm çalıştırması:

(calculated-gpa (make-student 10022021 (list (make-course ‘Comp111 3 ‘B+) (make-course ‘Comp112 3 ‘D+) (make-course ‘FM302 3 ‘C+)(make-course ‘EC232 3 ‘A-)(make-course ‘FM412 3 ‘C+)(make-course ‘FM496 4 ‘C+))))

Yukarıdaki örnek öğrenci için ortalama 2.52 olarak bulunmuştur.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir