## Description

CENG 242

Programming Language Concepts

Programming Exam 1

1 Problem Definition

In this programming exam, you will help your friends who work in the IT department of a bank by

implementing some Haskell functions. Each function will correspond to an independent, small feature

which is useful for their customers or themselves in some certain calculations.

1.1 General Specifications

• The signatures of the functions, their explanations and specifications are given in the following

section. Read them carefully.

• Make sure that your implementations comply with the function signatures.

• You may define helper function(s) as you needed.

• Importing any modules is not allowed for this exam. All you need is already available in the

standard Prelude module.

• Whenever you need to output a Double value (included in a list or by itself). You MUST use the

following function to round it to 2 decimal places:

getRounded :: Double – Double

getRounded x = read s :: Double

where s = printf “%.2f” x

This tricky implementation uses printf function from Text.Printf module. This import and

the implementation itself is already included in the template file. You can use it directly, while

outputting Double values. The whole purpose of using this function is the simplification of the

output, which will be useful in both debugging and evaluation processes.

1

2 Functions

2.1 convertTL (15 points)

You will implement a function named convertTL which takes a Double value and a String representing

the name of currency which the given money in Turkish Liras will be converted to. Here is the signature

of this function:

convertTL :: Double – String – Double

The abbreviations as representing Strings and the exchange rates 1

for the currencies are given in Table

1. No other currency will be tested.

Currency Abbreviation Exchange Rate

US Dollar “USD” 8.18

Euro “EUR” 9.62

Bitcoin “BTC” 473497.31

Table 1: Exchange Rates with TL for Currencies

The function must convert the money in TL to the given currency using the proper exchange rate and

return it as a Double.

SAMPLE I/O:

* PE1 convertTL 8180 “USD”

1000.0

* PE1 convertTL 12500 “EUR”

1299.38

* PE1 convertTL 1500000 “BTC”

3.17

2.2 countOnWatch (15 points)

As someone must monitor the servers of the bank at each night, some schedule is arranged for your

friends. Your task is to implement a function named countOnWatch which takes a list of Strings as

the schedule of the turns, a String representing the name of a certain employee and an Int representing

the some number of days. This function shall calculate the number of watches assigned to this employee

up to given days according to the arranged schedule. The function must return the calculated number as

an Int.

Here is the signature of this function:

countOnWatch :: [ String ] – String – Int – Int

1

I know that they look a little over-detailed, but let’s keep them in their realistic values for the time being. After

all we have the ability of copy/paste for such a burden.

2

SAMPLE I/O:

* PE1 countOnWatch [“Ali”, ” Huseyin “, ” Ahmet “, ” Derya “, “Ali”, ” Fatma “,

“Ali”, ” Ahmet “] ” Ahmet ” 5

1

* PE1 countOnWatch [“Ali”, ” Huseyin “, ” Ahmet “, ” Derya “, “Ali”, ” Fatma “,

“Ali”, ” Ahmet “] “Ali” 5

2

* PE1 countOnWatch [“Ali”, ” Huseyin “, ” Ahmet “, ” Derya “, “Ali”, ” Fatma “,

“Ali”, ” Ahmet “] “Ali” 8

3

2.3 encrypt (35 points)

You will implement a function named encrypt which takes an Int with 4 digits as the password of the

customer and returns an Int as the encrypted password by processing the digits in the original one.

Here is the signature of this function:

encrypt :: Int – Int

We will assume that the customers are not allowed to use a zero in any place for their password. Here

are the rules to encrypt the rest of the digits:

• If the digit is divisible by 3, you will subtract 1 from the digit.

• If the digit is divisible by 4, you will multiply the digit by 2.

• If the digit is divisible by 5, you will add 3 to the digit.

• For the rest of the cases, you will add 4 to the digit.

• If any of the above operation results in a double digit number, you will take the number in the

ones place (e.g. 6 for 16.).

SAMPLE I/O:

* PE1 encrypt 6475

5818

* PE1 encrypt 9812

8656

* PE1 encrypt 3597

2881

3

2.4 compoundInterests (35 points)

You will implement a function named compoundInterests which calculates the money the customers

would have after the compound interests are applied according to their initial money and how many years

they want to invest their money to the bank.

Rules for the calculation of the total money that each customer would get will be given below. Let’s look

at the signature of this function first:

compoundInterests :: [( Double , Int ) ] – [ Double ]

This function takes a list of (Double, Int) pairs as the money and number of years for the investment of each customer. The function returns a list of Double as the total money that each customer

would have for their investment. We will assume that there will be always at least one customer, when

this function is called.

As the bank has the policy to compound the money monthly, here is the formula for the calculation of

total money with compound interest:

T = P × (1 + R

12

)

12×N (1)

where T is the total money, P is the initial money, R is the annual interest rate and N is the number of

years. We will use Table 2 to calculate annual interest rate (R) for the given initial money (P).

Money ≥ 10000 Money < 10000

Years ≥ 2 11.5% 9.5%

Years < 2 10.5% 9.0%

Table 2: Annual Interest Rates

Let’s say that a customer initially has 15000 TL, and wants to keep their money for 1 year to get the

interest. Then we must use the annual interest rate as 10.5%. Hence, the calculation is done as below:

15000 × (1 + 0.105

12

)

12×1

(2)

By rounding the result to 2 decimal places, we get 16653.05 as the total money that customer would have

after 1 year.

SAMPLE I/O:

* PE1 compoundInterests [(15000 , 1) ]

[16653.05]

* PE1 compoundInterests [(17557.5 , 2) , (9800 , 1) ]

[22073.68 ,10719.31]

* PE1 compoundInterests [(1575.25 , 3) , (12500 , 1) , (100000 , 2) ]

[2092.36 ,13877.54 ,125722.25]

4

3 Regulations

1. Implementation and Submission: The template file named “pe1.hs” is available in the Virtual

Programming Lab (VPL) activity called “PE1” on OdtuClass. At this point, you have two options:

• You can download the template file, complete the implementation and test it with the given

sample I/O on your local machine. Then submit the same file through this activity.

• You can directly use the editor of VPL environment by using the auto-evaluation feature of

this activity interactively. Saving the code is equivalent to submit a file.

The second one is recommended. However, if you’re more comfortable with working on your local

machine, feel free to do it. Just make sure that your implementation can be compiled and tested

in the VPL environment after you submit it.

There is no limitation on online trials or submitted files through OdtuClass. The last one you

submitted will be graded.

2. Evaluation: Your program will be evaluated automatically using “black-box” technique so make

sure to obey the specifications. No erroneous input will be used. Therefore, you don’t have to

consider the invalid expressions.

Important Note: The given sample I/O’s are only to ease your debugging process and NOT

official. Furthermore, it is not guaranteed that they cover all the cases of required functions. As

a programmer, it is your responsibility to consider such extreme cases for the functions. Your

implementations will be evaluated by the official testcases to determine your actual grade after

the deadline.

5