ACIT 1515辅导、讲解Python编程语言、辅导D2L留学生、讲解Python设计

- 首页 >> Python编程

ACIT 1515 Midterm Exam

This exam has three questions.  Marks will be assigned for each question by testing with the instructors test data.

Part marks are awarded.

Marks will be deducted for:

incorrect output and/or return values: function does not meet specification

incorrect or unnecessarily complex function design strategies (your algorithm)

inappropriate use of data structures and variables

inappropriate length and/or use of functions

poor commenting, variable names, and program layout

code that is clearly cut/paste from internet, where the code does not reflect techniques learned in class or techniques that can’t be easily explained by the student

Question 1: Bug Fixing

/ 6


Question 2: Code Completion

/ 16


Question 3: Program Creation

/ 20


Save and upload a single file for each of the questions, named as specified.

Save your programs as you finish them, as you will be required to upload your final copies to D2L at the end of the exam. It is your responsibility to keep track of your files, and to upload the correct versions. Only the last version of each copy will be checked.

Rules:

1.Turn off your phone. Yes, off

2.Place your phone on your desk in front of you, where the instructor can see it.

3.No phones, no talking, no getting help from anyone else – which means no email, text, chat etc..

4.You CAN use your textbook, previous assignments, and code.

5.You CAN use any websites as long as you do not post a question anywhere or otherwise communicate anyone.

6.The test is timed: 2 hours max – at this point the D2L dropbox is closed


Question 1: Bug Fixing

Using the following source code to create a file named reverse.py. Repair the errors that it generates so it is able to match the Example Usage below when run.

Filename

reverse.py

Source Code

#! /usr/bin/env python3


def reverse(phrase):

   num_letters = len(phrase)

   letter_count = 0


   while letter_count < num_letters:

       reversed_phrase += phrase[num_letters - letter_count]

       letter_count += 1


   return reversed_phrase



def main():


   phrases = []

   phrases.append("Exams are not the most authentic of assessments")

   phrases.append("Loops need to end")

   phrases.append("Exams are not the most authentic of assessments")


   for phrase in phrases:

       print(reverse(phrase))



if __name__ == '__main__':

   main()

Example Usage

PS>.\reverse.py

stnemssessa fo citnehtua tsom eht ton era smax

dne ot deen spoo

stnemssessa fo citnehtua tsom eht ton era smax


Question 2: Code Completion

Using the source code below as a starting point create a file shuffle.py that meets the requirements outlined in the comments of source code and the matches the outputs in the Example Usage.

FILENAME

shuffle.py

Source Code

'''

This module builds a deck of cards, shuffles them, and deals out a list of hands

of a specified number of cards for the specified number of players

'''

import pprint

import random


suits = ['Hearts', 'Diamonds', 'Spades', 'Clubs']


card_names = {

   2: 2,

   3: 3,

   4: 4,

   5: 5,

   6: 6,

   7: 7,

   8: 8,

   9: 9,

   10: 10,

   11: 'Jack',

   12: 'Queen',

   13: 'King',

   14: 'Ace'

}



def make_suit(suit):

   '''

   Generates a list containing all of the cards in a single suit


   Use the card_names dictionary to generate each card "name" based

   on its "value" from 2 to 14 combined with its suit.


   For example a card with value of 11 would have a name of 'Jack'


   Args:

       suit (str): the suit for which to generate the cards one of:

                   Hearts, Diamonds, Spades, or Clubs.


   Returns:

       List[str]: a list containing all the cards in the suit.

                  each card is a string with the card value

                  followed by the suit in the format:


                  <Value> of <Suit>


                  Examples:

                       4 of Hearts

                       8 of Diamonds

                       10 of Clubs

                       Queen of Hearts

                       Ace of Spades

   '''

   suit_cards = []


   # your code goes here


   return suit_cards



def make_deck():

   '''

   Generates a list containing a string for each of the cards in a standard

   playing deck


   A "standard" deck of playing cards consists of 52 Cards in each of the 4

   suits of Spades, Hearts, Diamonds, and Clubs. Each suit contains 13 cards:

   2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, and Ace


   The deck is created by creating the cards for each suit in a loop.


   Returns:

       List[str]: List containing a string for each of the cards in a standard

                  deck. See make_suit() for string format

   '''

   deck = []


   # your code goes here


   return deck



def shuffle_deck(deck):

   '''

   Shuffles deck of cards in place, i.e. modifies the passed deck parameter

   but doesn't return a new value


   Args:

       deck (List[str]): List containing strings, each representing cards in a

                       standard deck

   '''

   random.shuffle(deck)



def deal(num_of_players, cards_per_player, deck):

   '''

   Creates a nested list of hands for the requested number of players.

   Each hand is a list holding the requested number of cards.


   The cards will be 'dealt' from the start of the deck (which is a list)


   The size of the deck slice given to each player is the number specified in

   the cards_per_player parameter


   Each hand will be dealt starting with the first card after the

   last card assigned to the previous players hand.


   After dealing the deck will no longer include the cards that have been

   dealt to the players.



   Args:

       num_of_players (int): Number of players in the game,

                             ie the number of hands to create


       cards_per_player (int): The number of cards each player should receive


       deck (List[str]): the deck of cards from which to deal out hands


   Returns:

       List[List[str]]: a nested list of cards.  One list for each player,

                        with each list containing the number of requested

                        cards

   '''

   hands = []


   # your code goes here


   # Remove the dealt cards from the deck

   del deck[0:(num_of_players * cards_per_player)]


   return hands



def main():

   '''

   This function performs the following operations:

       - Create a new card deck and store it in the variable deck

       - print the deck

       - shuffle the deck

       - create a nested list of hands - by invoking the deal function, store

         this list in the variable hands

       - print the list of hands

       - print the remaining deck

   '''

   # Create a card deck named deck

   # your code goes here


   # Print the previously created deck

   print('\nDeck:')

   pprint.pprint(deck)


   # Shuffle the deck

   # your code goes here


   # create a list of hands for 4 players with 5 cards per player

   # your code goes here


   # Print the list of hands

   print('\nHands:')

   pprint.pprint(hands)


   # Print the deck list

   print('\nDeck after Dealing Cards:')

   pprint.pprint(deck)



if __name__ == '__main__':

   main()



Example Usage

Note: that the exact hands and order of the cards remaining in the deck will vary due to the random nature of the shuffling.

PS>.\shuffle.py


Deck:

['2 of Hearts',

'3 of Hearts',

'4 of Hearts',

'5 of Hearts',

'6 of Hearts',

'7 of Hearts',

'8 of Hearts',

'9 of Hearts',

'10 of Hearts',

'Jack of Hearts',

'Queen of Hearts',

'King of Hearts',

'Ace of Hearts',

'2 of Diamonds',

'3 of Diamonds',

'4 of Diamonds',

'5 of Diamonds',

'6 of Diamonds',

'7 of Diamonds',

'8 of Diamonds',

'9 of Diamonds',

'10 of Diamonds',

'Jack of Diamonds',

'Queen of Diamonds',

'King of Diamonds',

'Ace of Diamonds',

'2 of Spades',

'3 of Spades',

'4 of Spades',

'5 of Spades',

'6 of Spades',

'7 of Spades',

'8 of Spades',

'9 of Spades',

'10 of Spades',

'Jack of Spades',

'Queen of Spades',

'King of Spades',

'Ace of Spades',

'2 of Clubs',

'3 of Clubs',

'4 of Clubs',

'5 of Clubs',

'6 of Clubs',

'7 of Clubs',

'8 of Clubs',

'9 of Clubs',

'10 of Clubs',

'Jack of Clubs',

'Queen of Clubs',

'King of Clubs',

'Ace of Clubs']


Hands:

[['2 of Spades',

 '7 of Diamonds',

 'Queen of Hearts',

 '10 of Clubs',

 'Jack of Clubs'],

['2 of Hearts',

 '8 of Diamonds',

 'King of Clubs',

 '10 of Spades',

 '8 of Hearts'],

['King of Spades',

 '8 of Clubs',

 '6 of Clubs',

 '9 of Diamonds',

 '5 of Diamonds'],

['3 of Spades',

 '7 of Clubs',

 '5 of Clubs',

 'King of Diamonds',

 'King of Hearts']]


Deck after Dealing Cards:

['4 of Diamonds',

'Queen of Diamonds',

'Ace of Clubs',

'Ace of Diamonds',

'6 of Spades',

'Queen of Clubs',

'4 of Spades',

'3 of Hearts',

'4 of Hearts',

'9 of Spades',

'6 of Hearts',

'4 of Clubs',

'Jack of Hearts',

'7 of Spades',

'2 of Clubs',

'3 of Clubs',

'7 of Hearts',

'9 of Hearts',

'10 of Hearts',

'Queen of Spades',

'5 of Hearts',

'5 of Spades',

'Jack of Spades',

'Ace of Spades',

'Jack of Diamonds',

'10 of Diamonds',

'9 of Clubs',

'2 of Diamonds',

'6 of Diamonds',

'8 of Spades',

'3 of Diamonds',

'Ace of Hearts']


Question 3: Program Creation

You will create a script: message_encryptor.py, that encrypts a series of messages by swapping individual letters based on an encryption cipher.

Your code will be based on the source code supplied below, please read the comments. You will complete your program by finishing the supplied source code.

DO NOT change any function signatures, all of the parameters for all functions must remain untouched from the supplied source code.

FILENAME

message_encryptor.py

DESCRIPTION

This module has a main function that creates a list of messages (this is done for you).

The main function then creates a cipher, in this case a dictionary that maps every ASCII letter to a different ASCII letter.

The main function will print out this encryption cipher.

The main function will create the corresponding decryption cipher using gen_rev_cipher (this is supplied)

Use the encryption cipher (i.e.?dictionary) to transform the supplied messages so that they are encrypted (scrambled).

Print the encrypted messages.

Use the decryption cipher (i.e.?dictionary) to transform the encrypted messages so that they are plain text (unscrambled).

Source Code

#! /usr/bin/env python3

import random

import string



def generate_cipher():

   '''

   Generates a dictionary that maps each ASCII letter (upper and lower case)i

   to its scambled equivalent.


   Necessary steps:

       1. Create list of ASCII letters


       2. Create scrambled list of ASCII letters


       3. Create dictionary using the ASCII letter list for the keys and the

          scrambled list as the values. This should be done in a loop with

          a counter. This way you can retrieve the item at a particular

          position from two lists in the same loop.


          i.e. list1[counter]

               list2[counter]


          can be used to get the value from each list for the same position.


       4. Return the dictionary that maps the ASCII letters to the scrambled

          letters


   Notes:

       1. The statement:

               list(string.ascii_letters)

          generates a list of a the ASCII letter characters.


       1. The expression:

               random.shuffle(list1)

          will shuffle list1 in place, i.e. scramble its order


   Returns:

       Dict[str, str]: cipher dictionary (original letter: transformed letter)

                       with one item per ASCII letter

   '''


   # your code goes here



def generate_rev_cypher(cipher):

   '''

   Returns and reverse cipher to map from encrypted cipher text back to plain

   text. It creates the reverse cipher by looping over the passed cipher and

   creating a new dictionary that maps uses the value of the cipher parameter

   as the reverse cipher key and the key of the original as the reverse cipher

   value.


   Args:

       cipher (Dict[str,str]): encryption cipher to be reversed


   Returns:

       Dict[str,str]: decryption cipher that preforms the reverse mapping of

                      the input cipher

   '''

   rev_cipher = {}

   for orig, trans in cipher.items():

       rev_cipher[trans] = orig


   return rev_cipher



def encode_message(cipher, message):

   '''

   This function converts each letter in the message to the one specified in

   the cipher dictionary.  It then returns the transformed message. It leaves

   non-letter characters unchanged.


   Args:

       cipher (Dict[str,str]): a dictionary that maps an input character to

                               its transformed equivalent


       message (str): A string to be transformed using the cipher


   Returns:

       str: the transformed string

   '''


   # your code goes here



def main():

   '''

   Creates an encryption cipher dictionary using generate_cipher()

   Creates an decryption cipher dictionary using generate_rev_cipher()


   For each of the individual messages in messages:

       - encrypt the message using encode_message()

       - print the encrypted message

       - decrypt the message using encode_message()

       - print the decrypted original message.

   '''

   messages = ["Tests aren't easy",

               "Documentation makes programming easier",

               "This is the last message"]


   # your code goes here



if __name__ == '__main__':

   main()



Example Usage

Note: since your encryption cipher has been randomized, it and the decryption cipher will vary from the example. The encrypted messages will also not match those in the example.

PS>.\message_encryptor.py


Cipher:

{'A': 'j',

'B': 'x',

'C': 'i',

'D': 'q',

'E': 'f',

'F': 'X',

'G': 'V',

'H': 'I',

'I': 'U',

'J': 'w',

'K': 'Z',

'L': 'R',

'M': 'M',

'N': 'e',

'O': 'L',

'P': 'F',

'Q': 'E',

'R': 'P',

'S': 'z',

'T': 'Y',

'U': 'N',

'V': 'o',

'W': 'C',

'X': 'K',

'Y': 'J',

'Z': 'k',

'a': 'l',

'b': 'T',

'c': 'b',

'd': 'g',

'e': 'a',

'f': 'h',

'g': 'S',

'h': 'm',

'i': 'u',

'j': 'n',

'k': 'H',

'l': 'v',

'm': 'c',

'n': 'y',

'o': 'r',

'p': 'A',

'q': 's',

'r': 'p',

's': 'd',

't': 'O',

'u': 'G',

'v': 'W',

'w': 'B',

'x': 'D',

'y': 'Q',

'z': 't'}


Reverse Cipher:

{'A': 'p',

'B': 'w',

'C': 'W',

'D': 'x',

'E': 'Q',

'F': 'P',

'G': 'u',

'H': 'k',

'I': 'H',

'J': 'Y',

'K': 'X',

'L': 'O',

'M': 'M',

'N': 'U',

'O': 't',

'P': 'R',

'Q': 'y',

'R': 'L',

'S': 'g',

'T': 'b',

'U': 'I',

'V': 'G',

'W': 'v',

'X': 'F',

'Y': 'T',

'Z': 'K',

'a': 'e',

'b': 'c',

'c': 'm',

'd': 's',

'e': 'N',

'f': 'E',

'g': 'd',

'h': 'f',

'i': 'C',

'j': 'A',

'k': 'Z',

'l': 'a',

'm': 'h',

'n': 'j',

'o': 'V',

'p': 'r',

'q': 'D',

'r': 'o',

's': 'q',

't': 'z',

'u': 'i',

'v': 'l',

'w': 'J',

'x': 'B',

'y': 'n',

'z': 'S'}


Scrambled Message: YadOd lpay'O aldQ

Original Message: Tests aren't easy

Scrambled Message: qrbGcayOlOury clHad AprSplccuyS alduap

Original Message: Documentation makes programming easier

Scrambled Message: Ymud ud Oma vldO caddlSa

Original Message: This is the last message


站长地图