### Instruction: You are a diligent grading assistant for a Computer Science teacher. Your task is to read and analyze the Python code between <code> and </code> tags. Evaluate the code according to the criteria provided between <criteria> and </criteria> tags. Before evaluating, carefully review the CodeDescription provided between <description> and </description> tags to understand the purpose and context of the project. For each criterion, always assess the logic of the code even if it does not run or contains errors, and provide a score. After addressing all criteria, conclude by listing all the individual scores in a summary. 

### CodeDescription: 
<description>
Build a program to encrypt and decrypt text using simple encryption algorithms like Caesar or Vigenre ciphers. You could explore the strengths and weaknesses of different encryption methods. Outputs would include the encrypted and decrypted messages.
</description>

### Criteria_1:
<criteria>
Description: Does the code contain branching statements and loops (as needed)? Branching using if-else and loops for repetitive execution of tasks are two of the most central elements of any Python code. So, all project code submissions must contain at least one if statement and one for / while statement.	
- 15 pts: Full points If the criteria is satisfied.
-10 pts: Partial points If the code contains only one of the two required components (if OR for/while)
-0 pts: No points
</criteria>

### Criteria_2:
<criteria>
Description: Does the Python code contain functions to create modular code? Functions are important to create modular tasks to reduce the redundancy in the code and for independent testing.	
- 10 pts: Full points If the code contains at least one function that is properly formatted and makes sense for the project.	
- 5 pts: Partial points If the code contains improper use of functions (or modular code is clear from files or other means).
- 0 pts: No points		
</criteria>

### Criteria_3:
<criteria>
Description: Data structures: Does the code use data structures as appropriate? Data structures discussed in the course are: strings, lists, and dictionaries. Grade whether the data structure that the code used is appropriate for that application. That is, if something has a key and a value, a dictionary is more appropriate than managing two lists. Similarly, if many variables are created instead of using a list, then it's improper code writing.
- 5 pts: Full points
- 0: pts No points
</criteria>

### Criteria_4:
<criteria>
Description: Does the code use files for reading or writing or any other advanced feature? If files are not applicable for the project, this criteria may be satisfied by graph generation, modules, python files, or other advanced features too.	
- 10 pts: Full points If file reading or other alternative advanced feature (like multiple modules, graphing, data analysis) is used appropriately in the code.
- 5 pts: Partial points Attempted to use files or other advanced feature but improper use/did not succeed fully.
- 0 pts: No points	
</criteria>

### Criteria_5:
<criteria>
Description: Is the code properly documented? Comments on key lines in the code and/or docstrings for functions.
- 5 pts: Full points if at least 5 commented lines or other text is present in the code
- 0 pts: No points If no comments or docstrings are provided.	
</criteria>

### Criteria_6:
<criteria>
Description: Did the code demonstrate most of the proposed features as written in the project ideas document? If most of the features are not demonstrated, check whether other equivalent (or new) features were implemented.	
- 25 pts: Full points If most of the features are successfully demonstrated (as seen from the code and its execution)
- 20 pts: Almost all features Almost all of the features for the project are demonstrated successfully.
- 15 pts: Half partial points Half of the proposed features are demonstrated successfully or some features are incorrectly implemented. The code implements a very basic set of features of the project.
- 10 pts: Partial points If only one feature is implemented and/or project is not significant work.
- 0 pts: No Marks
</criteria>

### Criteria_7:
<criteria>
Description: User-friendly interface Does the code create an interface for the user that is easy to use and friendly.	
- 10 pts: Full points
- 5 pts: Partial points If some user-messages are unhelpful
- 0 pts: No Marks
</criteria>

### MainPythonFileCode
<code>
#ME 021 Python Project
print('          Welcome to my Simple Encryption Algorithm')
print()
print('The objective of this program is to encrypt and decrypt text using simple encryption algorithms like Caesar or Vigenre ciphers')
print()
print()
print('To quit the program write "q" or "quit"')
print()

number= 0
while number >= 0:
    number= input('\nPlease enter the shift number (The number must be between 1 and 25): ')
    if (number == 'q') or (number== 'quit'):   #Check if the user wants to quit the program
        break                                  #Break the program by skiping the rest of the code inside the while loop
    number= int(number)                        #Converts the user string input to an integer used as shift number
    while (25 < number) or (number < 1):       #Check if the user number input is between the range, it is a loop until the given value is valid (between the range)
        print('\nThe given number is not valid, please enter a valid number.')  #If the value is not between the range then it prints and statement asking for a valid number
        number=input('\nPlease enter the shift number (The number must be between 1 and 25):') #Gives the user opportunity to enter a new number between the range
        number= int(number)                    #Converts the given string into a integer

    func= input('\nDo you want to encrypt or dencrypt? (enc or den) ')         #Ask user if wants to encrypt or dencrypt. It is used to determine which function will be used.
    while (func != 'enc') and (func != 'den'):                               #Checks if the user given input is valid, it is a loop until the given input is valid (enc or den)
        print('\nThe given option is not valid, please enter a valid option.')  #Let the user know that the given input value is not valid and ask for a valid input
        func= input('\nDo you want to encrypt or dencrypt? (enc or den) ')     #Gives the user opportunity to enter a new valid input
    
    original= input('\nEnter the text you want to encrypt or dencrypt: ')       #Ask the user for the text to encrypt or dencrypt
    option= input('\nWant to see the original text after encrypt or dencrypt? (yes or no) ') #Ask the user if wants to see the original text input

    firstLetter= ord('A')   #Is the number for the first alphabet capital letter in ASCII
    lastLetter= ord('Z')    #Is the number for the last alphabet capital letter in the ASCII
    letterRange= 26         #Number of letters in alphabet


    def encrypt_message(original, number):   #Function for encrypt
        encrypt= ''                          #Placeholder for message
        if 0 < number < 26: 
            for letter in original.upper():  #Reading letter by letter the text given by the user
                if letter.isalpha():         #Only change the code number of letters, no special characters
                    letter_num= ord(letter)      #Analize the code number of each letter using ASCII code
                    new_num= letter_num + number #Creates the new code number for each letter adding the given shift number

                    if new_num >lastLetter:     #If the new code number is out of the letters section then it start again giving us a code number inside the alphabet
                        new_num -=letterRange   

                    if new_num < firstLetter:
                        new_num += letterRange

                    new_letter= chr(new_num)     #Convert from code number to letter 
                    encrypt+= new_letter         #Stores the new letters in the encrypt placeholder

                else:
                    encrypt+= letter             #Add especial characters to the encrypt message as spaces and symbols
        return encrypt

    def decrypt_message(original, number):   #Function for decrypt 
        decrypt= ''                          #Placeholder for message
        if 0 < number < 26:
            for letter in original.upper():  #Reading letter by letter the text given by the user
                if letter.isalpha():         #Only change the code number of letters, no special characters
                    letter_num= ord(letter)      #Analize the code number of each letter using ASCII code
                    new_num= letter_num - number #Creates the new code number for each letter substracting the given shift number

                    if new_num > lastLetter:     #if the new number is out of the letters section then it start again giving us a code number inside the alphabet
                        new_num -= letterRange   

                    if new_num < firstLetter:
                        new_num += letterRange

                    
                    new_letter= chr(new_num)     #Convert from code number to letter 
                    decrypt+= new_letter         #Stores the new letters in the dencrypt placeholder
                else:
                    decrypt+= letter             #Add the special characters to the decrypt place holder
        return decrypt

    if func == 'enc' or func == 'encrypt':      #If statement to use and print the encrypt function
        print('\nEncryption number:', number)   #Print the shift number
        enc = encrypt_message(original, number) #Call the encrypt function
        print('Encrypted message:', enc)        #Print the encrypt message

    elif func == 'den' or func == 'decrypt':    #If statement to use and print the decrypt function
        print('\nDecryption number:', number)   #Print the shift number
        dec = decrypt_message(original, number) #Call the decrypt function
        print('Decrypted message:', dec)        #Print the decrypt message

    if option == 'yes' or option =='y':         #Check if user wants to see original message
        print('Original message:', original)    #If true prints original message

print('\nThank you for trying my program!')       #Prints a sentence that thanks the user after enter q or quit value to end the loop
</code>

### Response: