A-level Computing/AQA/Paper 1/Skeleton program/AS2018

From Wikibooks, open books for an open world
< A-level Computing‎ | AQA‎ | Paper 1‎ | Skeleton program
Jump to: navigation, search

This is for the AQA AS Computer Science Specification.

This is where suggestions can be made about what some of the questions might be and how we can solve them.

Please be respectful and do not vandalise or tamper with the page, as this would affect students' preparation for their exams!

Substitution Cipher[edit]

This question refers to the subroutines GetTransmission and ReceiveMorseCode. The question requires the creation of subroutines GetKey and DecryptTransmission.

The Skeleton Program is to be adapted so that messages encrypted with a substitution cipher can be received and decrypted. The method of decryption will be to apply a decryption key to the message.

In a substitution cipher, every character is replaced with another character. For example, every letter A could be substituted with the number 7.

The decryption key will be stored in a text file, consisting of 36 characters. The first 26 characters will represent the letters A – Z and the next 10 will represent the numbers from 0 – 9. 

A new subroutine GetKey needs to be created, which will read and return the key from a file specified by the user. If no key is specified, the subroutine should return the key: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789. This key should be interpreted to mean that every character represents itself.

A new subroutine DecryptTransmission needs to be created, which will apply the decryption key to the transmission. It will be called by a new line in ReceiveMorseCode, to be inserted before print(PlainText):

PlainText = DecryptTransmission(PlainText).

Validation of a menu option[edit]

The program currently just prints the menu again when an incorrect option is input; add validation so the program prints a message when an invalid option is input.

C#:

switch (MenuOption)
{
    case "R":
        ReceiveMorseCode(Dash, Letter, Dot);
        break;
    case "S":
        SendMorseCode(MorseCode);
        break;
    case "X":
        ProgramEnd = true;
        break;
    default:
        Console.WriteLine("You have made an invalid selection. Try again");
        break;
}

Delphi/Pascal:

Procedure SendReceiveMessages();
const
  Dash: array[0..26] of Integer = (20,23,0,0,24,1,0,17,0,21,0,25,0,15,11,0,0,0,0,22,13,0,0,10,0,0,0);
  Dot : array[0..26] of Integer = (5,18,0,0,2,9,0,26,0,19,0,3,0,7,4,0,0,0,12,8,14,6,0,16,0,0,0);
  Letter : array[0..26] of Char= (' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  MorseCode : array[0..26] of String= (' ','.-','-...','-.-.','-..','.','..-.','--.','....','..','.---','-.-','.-..','--','-.','---','.--.','--.-','.-.','...','-','..-','...-','.--','-..-','-.--','--..');
var
  ProgramEnd : Boolean;
  MenuOption : String;
begin
  ProgramEnd := False;
  while not(ProgramEnd) do
    begin
      DisplayMenu();
      MenuOption := GetMenuOption();
      if (MenuOption = 'R') or (MenuOption ='r') then
        ReceiveMorseCode(Dash, Letter, Dot)
      else if (MenuOption = 'S') or (MenuOption='s') then
        SendMorseCode(MorseCode)
      else if (MenuOption = 'X') or (menuOption='x') then
        ProgramEnd := True
      else
        writeln('you did not enter a valid option.');
        readln;
    end;
end

Java:

Python:

def GetMenuOption():
  MenuOption = EMPTYSTRING
  Correct = False
  while len(MenuOption) != 1:
    MenuOption = input("Enter your choice: ")
    if MenuOption == 'R' or MenuOption == 'S' or MenuOption == 'X':
      Correct = True
    else:
{{CPTAnswerTab|C#}}

      MenuOption = input("Invalid choice. Re-Enter your choice: ")
  return MenuOption

## Change from lower to upper case with ascii incase they lead you up to it or tell you to use ascii instead of .upper()
def GetMenuOption():
  MenuOption = EMPTYSTRING
  while len(MenuOption) != 1:
    MenuOption = raw_input("Enter your choice: ")
    Ascii = ord(MenuOption)
    if Ascii>=97:
      Ascii=Ascii-32
    MenuOption=chr(Ascii)
  return MenuOption

VB.NET:

Translate transmission directly to English (bypass file)[edit]

Update receive signal to allow direct input rather than txt file.

C#:

private static string GetTransmission()
        {
            string choice = EMPTYSTRING;//declares to empty
            Console.WriteLine ("Would you like to load a fie (Y/N)");//outputs the line
            choice = Console.ReadLine().ToUpper();//assigns the value
            string Transmission;//declares
            if (choice == "Y")
            {
                string FileName = EMPTYSTRING; //declare
                Console.Write("Enter file name: ");//outputty
                FileName = (Console.ReadLine() + ".txt");//assigns
                try//error handling
                {
                    Transmission = File.ReadAllText(FileName);//assings varaible to text from the file in bin
                    Transmission = StripLeadingSpaces(Transmission);//removes spaces at the start of the transmission
                    if (Transmission.Length > 0)//chekcs length
                    {
                        Transmission = StripTrailingSpaces(Transmission);//strips spaces from the end of the text
                        Transmission = Transmission + EOL; //adds the global to it
                    }
                }
                catch
                {
                    ReportError("No transmission found"); //catches if the try errors calling sub
                    //give instructions
                    Console.WriteLine("Please enter a valid text file name that is in the bin/debug");
                    Transmission = EMPTYSTRING;//assigns it to empty
                }
            }
            else
            {
                Console.WriteLine("Please enter your transmission");//outputs
                Transmission = Console.ReadLine();//assigns
                Transmission = StripLeadingSpaces(Transmission);//strips spaces at the start
                if (Transmission.Length > 0)//chekcs length
                {
                    Transmission = StripTrailingSpaces(Transmission);//strips spaces from the end of the text
                    Transmission = Transmission + EOL; //adds the global to it
                }
            }
            return Transmission;//returns transmission
        }
THIS REQUIRES AN INPUT OF TRANSMISSION RATHER THAN DIRECT MORSE

Delphi/Pascal:

Function GetTransmissionFromFile() : String;
var
  FileName : String;
  FileHandle : Textfile;
  Transmission : String;
begin
  write('Enter file name: ');
  readln(FileName);
  try
    assign(FileHandle,FileName);
    reset(FileHandle);
    readln(FileHandle, Transmission);
    close(FileHandle);
    Transmission := StripLeadingSpaces(Transmission);
    if length(Transmission) > 0 then
      begin
        Transmission := StripTrailingSpaces(Transmission);
        Transmission := Transmission + EOL;
      end;
  except
    on E: exception do
      begin
        ReportError('No transmission found');
        Transmission := EMPTYSTRING;
      end;
  end ;
  GetTransmissionFromFile := Transmission;
end;

Function GetTransmissionFromInput() : String;
var
  transmission : String;
begin
  writeln('please enter your transmission (using = to signify on and a space to represent off) ');
  readln(transmission);
  Transmission :=StripLeadingSpaces(Transmission);
  if length(Transmission) > 0 then
    begin
      Transmission := StripTrailingSpaces(Transmission);
      Transmission := Transmission + EOL;
    end;
  GetTransmissionFromInput := Transmission;
end;

Function GetAnyTransmission() : string;
var
  choice: string;
  valid: integer;
begin
  repeat
    begin
      writeln('Do you want t recieve tranmission from a file?(Y/N) ');
      readln (choice);
      if (Choice = 'Y') or (Choice = 'y') or (Choice = 'yes') or (Choice= 'YES') or (Choice= 'Yes') then
        begin
          valid := 1;
          GetAnyTransmission := GetTransmissionFromFile();
        end
      else if (Choice ='N') or (Choice = 'n') or (Choice = 'no') or (Choice= 'NO') or (Choice ='No') then
        begin
          valid := 1;
          GetAnyTransmission := GetTransmissionFromInput();
        end
      else
        begin
          valid := 0;
          writeln('You have not entered a valid response');
        end;
      end;
    until Valid = 1;
end;

Java:

Python:

def GetTransmission():
  choice = input("Would you like to load a file? (Y/N): ")

  if choice == "Y":
    FileName = input("Enter file name: ")

    try:
      FileHandle = open(FileName, 'r')
      Transmission = FileHandle.readline()
      FileHandle.close()
      Transmission = StripLeadingSpaces(Transmission)
      if len(Transmission) > 0:
        Transmission = StripTrailingSpaces(Transmission)
        Transmission = Transmission + EOL
    except:
      ReportError("No transmission found")
      Transmission = EMPTYSTRING
  else:
    Transmission = input("Enter your transmission String: ")
    Transmission = StripLeadingSpaces(Transmission)
    if len(Transmission) > 0:
      Transmission = StripTrailingSpaces(Transmission)
      Transmission = Transmission + EOL
      
  return Transmission

VB.NET:

Function GetTransmission() As String
        Dim Filename As String
        Dim Transmission As String
        Dim choice As String
        Console.WriteLine("Do you wish to load a file?")
        choice = Console.ReadLine
        If choice = "yes " Then
            Console.Write("Enter file name: ")
            Try
                Filename = Console.ReadLine()
                Dim Reader As New StreamReader(Filename)
                Transmission = Reader.ReadLine
                Reader.Close()
                Transmission = StripLeadingSpaces(Transmission)
                If Transmission.Length() > 0 Then
                    Transmission = StripTrailingSpaces(Transmission)
                    Transmission = Transmission + EOL
                End If
            Catch
                ReportError("No transmission found")
                Transmission = EMPTYSTRING
            End Try
        Else
            Console.WriteLine("please enter the morse code string")
            Transmission = Console.ReadLine
            Transmission = StripLeadingSpaces(Transmission)
            If Transmission.Length() > 0 Then
                Transmission = StripTrailingSpaces(Transmission)
                Transmission = Transmission + EOL
            End If
        End If
        Return Transmission
    End Function


Save a .txt file when sending Morse Code[edit]

-Convert generated Morse into transmission signal.

-Write the transmission signal into txt file.

C#:

    // Add SaveToFile(MorseCodeString) to last line of the SendMorseCode() subroutine, and also define the following subroutines:
    private static void SaveToFile(string MorseCodeString)     // ADDED - SAVE TO FILE
    {
        Console.WriteLine("Would You like to save the message to a file (Y/N)?");
        string SaveChoice = Console.ReadLine();                 // Check whether user wants to save to file
        if (SaveChoice[0] == 'y' || SaveChoice[0] == 'Y')       // [0] to only account for first character of input (both cases checked)
        {
            try
            {
                Console.WriteLine("Enter the name of the file to save the message to: ");
                string FileName = Console.ReadLine();                   // User input file name

                if (!FileName.Contains(".txt"))     // If it doesn't contain '.txt' then add the ".txt" to FileName
                {
                    FileName += ".txt";             // Append .txt if not present
                }                

                StreamWriter FileSaver = new StreamWriter(FileName);    // Open file in write mode (new StreamWriter)
                FileSaver.Write(MorseCodeString);                       // Write the MorseCodeString to the File chosen

                FileSaver.Close();
            }
            catch
            {
                ReportError("Error when writing to file.");     // Error handling message
            }
            Console.WriteLine("File successfully written");
        }
    }

Delphi/Pascal:

Java:

Python:

  #SBaker May 18 4.	Save a text file when sending Morse Code
  #we need to format MorseCodeString into the output format
  outputString = ''
  for letter in MorseCodeString:
    if letter == '.':
      outputString = outputString + "= "
    elif letter == '-':
      outputString = outputString + "=== "
    elif letter == ' ':
      outputString = outputString + "  "
  FileName = input("Enter file name: ")
  try:
    FileHandle = open(FileName, 'w')
    FileHandle.write(outputString)
    FileHandle.close()
  except:
    ReportError("No file found")

VB.NET:

Create and save transmission signal when sending[edit]

-Convert generated Morse into transmission signal.

-Write the transmission signal into txt file.

C#:

    // Add EncodeMorseCode(MorseCodeString) to last line of the SendMorseCode() subroutine, and also define the following subroutines:
    private static void EncodeMorseCode(string MorseCode)        // Function to convert MorseCodeString to the '=' and (Space) format in Preliminary Material
    {
        Console.WriteLine("Would You like to save the message to a file (Y/N)?");
        string ShouldSave = Console.ReadLine();                 // Check whether user wants to save to file
        if (ShouldSave[0] == 'y' || ShouldSave[0] == 'Y')       // [0] to only account for first character of input (both cases checked)
        {
            try
            {
                Console.WriteLine("Enter the name of the file to save the message to: ");
                string FileName = Console.ReadLine();       // User input file name

                if (!FileName.Contains(".txt"))             // If it doesn't contain '.txt' then add the ".txt" to FileName
                {
                    FileName += ".txt";                     // Append .txt if not present
                }
                                                        
                StreamWriter CodedFileSaver = new StreamWriter(FileName);    // Open file in write mode (new StreamWriter)

                // Use the built-in .Replace(old, new) method to swap out the relevant characters in C#.
                string CodedOutput = MorseCode.Replace("-", "=== ").Replace(".", "= ").Replace("  ", "   ").Replace("      ", "       ");
                // This now effectively formats the MorseCodeString message to the '=' and ' ' format

                CodedFileSaver.Write(CodedOutput);

                CodedFileSaver.Close();
            }
            catch
            {
                ReportError("Error when writing to file.");     // Error handling
            }
            Console.WriteLine("Coded File successfully written");
        }
     }

// S Wood - Teach

Delphi/Pascal:

Procedure SaveTransmission(Transmission : string);
var
  FileHandle : TextFile;
begin
  AssignFile(FileHandle, 'Message.txt');
  try
    rewrite (FileHandle);
    writeln (FileHandle, Transmission);
    CloseFile (FileHandle);
  except
    on E: exception do
      writeln ('Exception: ', E.Message);
  end;
end;

Procedure SendMorseCode(MorseCode : Array of String);
var
  PlainText, MorseCodeString, CodedLetter, TransmissionString : String;
  PlainTextLength, i, Index, k : Integer;
  PlainTextLetter : Char;
begin
  write('Enter your message (uppercase letters and spaces only): ');
  readln(PlainText);
  PlainTextLength := length(PlainText);
  MorseCodeString := EMPTYSTRING;
  TransmissionString := EMPTYSTRING;
  for i := 1 to PlainTextLength do
    begin
      PlainTextLetter := PlainText[i];
      if PlainTextLetter = SPACE then
        Index := 0
      else
        Index := ord(PlainTextLetter) - ord('A') + 1;
      CodedLetter := MorseCode[Index];
      for k := 1 to length(CodedLetter) do
      begin
        case CodedLetter[k] of
          ' ': TransmissionString += ' ';
          '.': TransmissionString += '=';
          '-': TransmissionString += '==='
        end;
      TransmissionString += ' ';
      end;
      MorseCodeString := MorseCodeString + CodedLetter + SPACE;
      if i <> PlainTextLength then
        TransmissionString += '  ';
    end;
  writeln(MorseCodeString);
  SaveTransmission(TransmissionString);
  writeln ('Message encoded and saved in Message.txt');
end;

Java:

for (int i = 0; i < morseCodeString.length(); i++) {
            char c = morseCodeString.charAt(i);
            if (c == '-') {
                morseCodeTransmission = morseCodeTransmission + " ===";
            }
            if (c == '.') {
                morseCodeTransmission = morseCodeTransmission + " =";
            }
            if (c == ' ') {
                morseCodeTransmission = morseCodeTransmission + "  ";
            }
        }

        System.out.println("Name the file you would like to save this too");

        String fileName = Console.readLine();
        if (!fileName.contains(".txt")) {
            fileName = fileName + ".txt";
        }
        try {
            BufferedWriter fileHandle = new BufferedWriter(new FileWriter(fileName));
            fileHandle.write(morseCodeTransmission);
            fileHandle.close();
        } catch (IOException e) {
        }

Python:

# Add SaveToFile(MorseCodeString) to last line of the SendMorseCode() subroutine, and also define the following subroutines:

def SaveToFile(MorseCodeString): # ADDED - SAVE TO FILE
  ShouldSave = input("Would You like to save the message to a file (Y/N)?") # Check whether user wants to save to file
  if ShouldSave[0].lower() == 'y': # .lower to make casing irrelevant, [0] to only account for first character (e.g. yes will also be accepted)
    try: 
      FileName = input("Enter the name of the file to save the message to: ") # User input file name

      if '    '+FileName[-4].lower() != '.txt': # Check if file extension is .txt. The '    ' at start is 4 spaces in order to prevent error from index not existing (if file name was under 4 characters)
        FileName += '.txt' # Append .txt if not present
      FileHandle = open(FileName, 'w') # Open file in write mode
      FileHandle.write(EncodeMorseCode(MorseCodeString)) # Write the encoded message to file
      FileHandle.close() 
    except:
      ReportError("Error when writing to file.") # Error handling
    

def EncodeMorseCode(MorseCode): # Function to convert morse code to format saved in file
  Output = MorseCode.replace('-', '=== ').replace('.', '= ').replace('  ', '   ').replace('      ', '       ') # Format message to required format
  return Output # Return message to be saved to file

VB.NET:

 Sub SendMorseCode(ByVal MorseCode() As String)
        Dim PlainText As String
        Dim PlainTextLength As Integer
        Dim MorseCodeString As String
        Dim PlainTextLetter As Char
        Dim CodedLetter As String
        Dim Index As Integer
        Dim save As Integer
        Dim file As StreamWriter
        Dim file2 As String
        Dim morsecodesymbol As String
        Dim morsecodesymbolR As String
        Dim morsecodemessage As String




        Console.Write("Enter your message (uppercase letters and spaces only): ")
        PlainText = Console.ReadLine()
        PlainTextLength = PlainText.Length()
        MorseCodeString = EMPTYSTRING
        For i = 0 To PlainTextLength - 1
            PlainTextLetter = PlainText(i)
            If PlainTextLetter = SPACE Then
                Index = 0
            Else

                If Asc(PlainTextLetter) < 65 Then
                    Index = Asc(PlainTextLetter) - 21
                Else
                    Index = Asc(PlainTextLetter) - Asc("A") + 1
                End If
            End If





            CodedLetter = MorseCode(Index)
            MorseCodeString = MorseCodeString + CodedLetter + SPACE + SPACE + SPACE


        Next
        Console.WriteLine(MorseCodeString)
        Console.WriteLine("would you like to save your message in a document? If so then please press 1 if not press 2")
        Try
            save = Console.ReadLine
        Catch ex As Exception
            Console.WriteLine("you have messed up the saving program, please do as asked")
        End Try
        If save = 1 Then
            Console.WriteLine("your file will be saved please choose a name")
            file2 = Console.ReadLine & ".txt"
            For i = 0 To MorseCodeString.Length - 1
                morsecodesymbol = MorseCodeString(i)
                If morsecodesymbol = "-" Then
                    morsecodesymbolR = "==="
                ElseIf morsecodesymbol = "." Then
                    morsecodesymbolR = "="
                ElseIf morsecodesymbol = SPACE Then
                    morsecodesymbolR = " "
                ElseIf morsecodesymbol = SPACE And morsecodesymbol = SPACE Then
                    morsecodesymbolR = "     "
                End If
                morsecodemessage = morsecodemessage & " " & morsecodesymbolR
            Next
            File = New StreamWriter(file2)
            File.Write(morsecodemessage)
            File.Close()
        End If

Add Morse code for numbers/symbols[edit]

Allow the user to convert numbers and punctuation (for which there is Morse code available) into Morse code.

C#:

Delphi/Pascal:

Java:

Python:

def SendReceiveMessages(): # All lists here have been modified to support numbers & some punctuation ( .,?! ) by adding indexes 27 onwards. This has been modified so that sending & receiving (if only sending required, only the MorseCode list requires changing) works.
  Dash = [20,23,0,45,24,1,0,17,31,21,28,25,0,15,11,42,0,0,46,22,13,48,30,10,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,38,40,37,0,29] 
  Dot = [5,18,33,0,2,9,0,26,32,19,0,3,0,7,4,43,0,0,12,8,14,6,0,16,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,35,0,0,46,39,47] 
  Letter = [' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '?', '!'] 
  MorseCode = [' ','.-','-...','-.-.','-..','.','..-.','--.','....','..','.---','-.-','.-..','--','-.','---','.--.','--.-','.-.','...','-','..-','...-','.--','-..-','-.--','--..', '-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...', '---..', '----.', '.-.-.-', '--..--', '..--..', '-.-.--'] 
  ProgramEnd = False
  while not ProgramEnd:
    DisplayMenu() 
    MenuOption = GetMenuOption()
    if MenuOption == 'R':
      ReceiveMorseCode(Dash, Letter, Dot)
    elif MenuOption == 'S':
      SendMorseCode(MorseCode) 
    elif MenuOption == 'X':
      ProgramEnd = True


def SendMorseCode(MorseCode):
  PlainText = input("Enter your message (uppercase letters and spaces only): ")
  PlainTextLength = len(PlainText)
  MorseCodeString = EMPTYSTRING
  for i in range(PlainTextLength):
    PlainTextLetter = PlainText[i]
    if PlainTextLetter == SPACE:
        Index = 0
    elif PlainTextLetter.isalpha(): # Character in position is a letter
      Index = ord(PlainTextLetter.upper()) - ord('A') + 1
    elif PlainTextLetter.isnumeric(): # Character in position is a number
      # 0 needs to be at index 27, so subtract unicode value of 0 and add 27 to get index of all numbers
      Index = ord(PlainTextLetter) - ord('0') + 27 
    else: # Is not a number / letter / space, assume it is a symbol. If statements for all supported symbols, setting index to position in MorseCode list
      if PlainTextLetter == '.':
        Index = 37 
      elif PlainTextLetter == ',': 
        Index = 38
      elif PlainTextLetter == '?':
        Index = 39
      elif PlainTextLetter == '!':
        Index = 40
      else: # Unsupported character, replace with space (could also output error here if needed)
        Index = 0 
    CodedLetter = MorseCode[Index]
    MorseCodeString = MorseCodeString + CodedLetter + SPACE
  print(MorseCodeString)

VB.NET:

 Sub SendReceiveMessages()
        Dim Dash = {20, 23, 0, 0, 24, 1, 0, 17, 31, 21, 28, 25, 0, 15, 11, 37, 45, 0, 40, 22, 13, 341, 30, 10, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0}
        Dim Letter = {" ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "OT", "ö", "/", "Ä", "ü", "+", "üe", "ZT", "Á", ",", "@", ".", "?"}
        Dim Dot = {5, 18, 33, 0, 2, 9, 0, 26, 32, 19, 0, 3, 0, 7, 4, 38, 0, 0, 12, 8, 14, 6, 0, 16, 39, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 48, 49, 0, 47}
        Dim MorseCode = {" ", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--....", "---...", "----..", "-----.", "----", "---.", "-··-·", ".-.-", "..--", ".-.-.", "..--.", "--..-", ".--.-", "--..--", ".--.-.", ".-.-..", "..--.."} 

- Symbols work in progress numbers work!

Validation of a message to send[edit]

Currently lowercase characters crash the program, add functionality to translate lowercase letters and correctly translate numbers/symbols

C#:

Delphi/Pascal:

Java:

Python:

# Currently only supports lowercase letters & prevents invalid characters. Needs modifying to support numbers.
def SendMorseCode(MorseCode):
  Error = True # Input validation
  while Error: # Repeat the code in this section until input is valid
    Error = False # Assume no errors until one is detected
    PlainText = input("Enter your message (uppercase letters and spaces only): ")
    PlainTextLength = len(PlainText)
    MorseCodeString = EMPTYSTRING
    for i in range(PlainTextLength):
      PlainTextLetter = PlainText[i]
      if PlainTextLetter == SPACE:
        Index = 0
      else: 
        Index = ord(PlainTextLetter.upper()) - ord('A') + 1 # .upper() added to support lowercase characters
      try: # Attempt to find morse code for current character
        CodedLetter = MorseCode[Index]
        MorseCodeString = MorseCodeString + CodedLetter + SPACE
      except: # Has been an issue finding morse code for character - inform user of this & re-run loop to allow a new input
        print("Invalid character in message.")
        Error = True # Set error to true so loop re-runs
        break # Break for loop to go back to start of Error loop (and ask for a new input)
  print(MorseCodeString)

VB.NET:

Automatically append '.txt' to file.[edit]

Code that makes it obsolete for the user to add the '.txt' extension to their file name

C#:

FileName = FileName.Contains(".txt") ? FileName : FileName + ".txt";

Delphi/Pascal:

Function GetTransmission(): String;
var
  FileName, FileNameOriginal: String;
  FileHandle: Textfile;
  Transmission: String;
begin
  write('Enter file name: ');
  readln(FileNameOriginal);    {Variable was originally set as FileName but was changed for Concentrate}
  FileName := Concat(FileNameOriginal,'.txt');

Java:

Python:

def GetTransmission():
  FileName = input("Enter file name: ")
  if FileName[-4:] != '.txt': # If last 4 characters match .txt - the 4 spaces appended to the start of string are to prevent the string being shorted than the indexes being checked
        FileName += '.txt' # Append .txt to end of file name
  try:
    FileHandle = open(FileName, 'r')
    Transmission = FileHandle.readline()
    FileHandle.close()
    Transmission = StripLeadingSpaces(Transmission)
    if len(Transmission) > 0:
      Transmission = StripTrailingSpaces(Transmission)
      Transmission = Transmission + EOL
  except:
    ReportError("No transmission found")
    Transmission = EMPTYSTRING
  return Transmission

VB.NET:

Save message in a text file[edit]

Code that save the translated code in a text file

C#:

// Add SaveToFile(MorseCodeString) to last line of the SendMorseCode() subroutine, and also define the following subroutines:
    private static void SaveToFile(string MorseCodeString)     // ADDED - SAVE TO FILE
    {
        Console.WriteLine("Would You like to save the message to a file (Y/N)?");
        string SaveChoice = Console.ReadLine();                 // Check whether user wants to save to file
        if (SaveChoice[0] == 'y' || SaveChoice[0] == 'Y')       // [0] to only account for first character of input (both cases checked)
        {
            try
            {
                Console.WriteLine("Enter the name of the file to save the message to: ");
                string FileName = Console.ReadLine();                   // User input file name

                if (!FileName.Contains(".txt"))     // If it doesn't contain '.txt' then add the ".txt" to FileName
                {
                    FileName += ".txt";             // Append .txt if not present
                }                

                StreamWriter FileSaver = new StreamWriter(FileName);    // Open file in write mode (new StreamWriter)
                FileSaver.Write(MorseCodeString);                       // Write the MorseCodeString to the File chosen

                FileSaver.Close();
            }
            catch
            {
                ReportError("Error when writing to file.");     // Error handling message
            }
            Console.WriteLine("File successfully written");
        }
    }

Delphi/Pascal:

Procedure SaveMorseToFile(MorseString : string);   //added to save morse
var
  FileMorse:TextFile;
begin
  AssignFile(FileMorse, 'MorseFile.txt');
  try
    rewrite(FileMorse);
    writeln(FileMorse, MorseString);
    CloseFile(FileMorse);
  except
    on E: exception do
      writeln ('Exception: ', E.Message);
  end;
end;


Procedure SendMorseCode(MorseCode : Array of String);
var
  PlainText, MorseCodeString, CodedLetter : String;
  PlainTextLength, i, Index : Integer;
  PlainTextLetter : Char;
begin
  write('Enter your message (uppercase letters and spaces only): ');
  readln(PlainText);
  PlainTextLength := length(PlainText);
  MorseCodeString := EMPTYSTRING;
  for i := 1 to PlainTextLength do
    begin
      PlainTextLetter := PlainText[i];
      if PlainTextLetter = SPACE then
        Index := 0
      else
        Index := ord(PlainTextLetter) - ord('A') + 1;
      CodedLetter := MorseCode[Index];
      MorseCodeString := MorseCodeString + CodedLetter + SPACE;
    end;
  writeln(MorseCodeString);
  SaveMorseToFile(MorseCodeString);//Saves it to a file
  writeln('Saved to MorseFile.txt');
end;

Java:

Python:

# Add SaveToFile(MorseCodeString) to last line of the SendMorseCode() subroutine, and also define the following subroutines:

def SaveToFile(MorseCodeString): # ADDED - SAVE TO FILE
  ShouldSave = input("Would You like to save the message to a file (Y/N)?") # Check whether user wants to save to file
  if ShouldSave[0].lower() == 'y': # .lower to make casing irrelevant, [0] to only account for first character (e.g. yes will also be accepted)
    try: 
      FileName = input("Enter the name of the file to save the message to: ") # User input file name

      if FileName[-4:].lower() != '.txt': # Check if file extension is .txt. The '    ' at start is 4 spaces in order to prevent error from index not existing (if file name was under 4 characters)
        FileName += '.txt' # Append .txt if not present
      FileHandle = open(FileName, 'w') # Open file in write mode
      FileHandle.write(EncodeMorseCode(MorseCodeString)) # Write the encoded message to file
      FileHandle.close() 
    except:
      ReportError("Error when writing to file.") # Error handling
    

def EncodeMorseCode(MorseCode): # Function to convert morse code to format saved in file
  Output = MorseCode.replace('-', '=== ').replace('.', '= ').replace('  ', '   ').replace('      ', '       ') # Format message to required format
  return Output # Return message to be saved to file

VB.NET:

List Characters[edit]

Output a list of all of the characters from the list next to their Morse code representation.

C#:

// NEW SUBROUTINE- Letter and MorseCode lists are passed as parameters/arguments
private static void ListMorseCode(char[] Letter, string[] MorseCode)
{
    for (int index = 0; index < Letter.Length; index++)      // for loop - loops through all elements in the Letter Array
    {
        Console.WriteLine(Letter[index] + "   " + MorseCode[index]);     // Output the text character, followed by a few spaces, and then the Morse code representation
    }
}

// AMENDED SUBROUTINE
private static void DisplayMenu()
{
    Console.WriteLine();
    Console.WriteLine("Main Menu");
    Console.WriteLine("=========");
    Console.WriteLine("R - Receive Morse code");
    Console.WriteLine("S - Send Morse code");
    Console.WriteLine("L - List Morse code characters");         // Added - display menu option for this modification
    Console.WriteLine("X - Exit program");
    Console.WriteLine();
}

// AMENDED SUBROUTINE
private static void SendReceiveMessages()
{
    int[] Dash = new int[] { 20, 23, 0, 0, 24, 1, 0, 17, 0, 21, 0, 25, 0, 15, 11, 0, 0, 0, 0, 22, 13, 0, 0, 10, 0, 0, 0 };
    int[] Dot = new int[] { 5, 18, 0, 0, 2, 9, 0, 26, 0, 19, 0, 3, 0, 7, 4, 0, 0, 0, 12, 8, 14, 6, 0, 16, 0, 0, 0 };
    char[] Letter = new char[] { ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
    string[] MorseCode = new string[] { " ", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." };
    bool ProgramEnd = false;
    string MenuOption = EMPTYSTRING;
    while (!ProgramEnd)
    {
        DisplayMenu();
        MenuOption = GetMenuOption();
        if (MenuOption == "R")
        {
            ReceiveMorseCode(Dash, Letter, Dot);
        }
        else if (MenuOption == "S")
        {
            SendMorseCode(MorseCode);
        }
        else if (MenuOption == "X")
        {
            ProgramEnd = true;
        }
        else if (MenuOption == "L")             // Added - if menu option selected is the 'L' (list Morse code)
        {
            ListMorseCode(Letter, MorseCode);   // Run ListMorseCode subroutine, passing lists Letter and MorseCode
        }
    }
}

Delphi/Pascal:

Procedure DisplayMenu();
begin
  writeln;
  writeln('Main Menu');
  writeln('=========');
  writeln('R - Receive Morse code');
  writeln('S - Send Morse code');
  writeln('L - List Morse code characters');//Added menu option for this
  writeln('X - Exit program');
  writeln;
end;

Procedure ListCharacters(Letter:Array of char; MorseCode:Array of String);   //new procedure for listing
var
  z : integer;
begin
  for z:=0 to 26 do
    writeln(Letter[z],'   ',MorseCode[z]);
end;

Procedure SendReceiveMessages();
const
  Dash: array[0..26] of Integer = (20,23,0,0,24,1,0,17,0,21,0,25,0,15,11,0,0,0,0,22,13,0,0,10,0,0,0);
  Dot : array[0..26] of Integer = (5,18,0,0,2,9,0,26,0,19,0,3,0,7,4,0,0,0,12,8,14,6,0,16,0,0,0);
  Letter : array[0..26] of Char= (' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  MorseCode : array[0..26] of String= (' ','.-','-...','-.-.','-..','.','..-.','--.','....','..','.---','-.-','.-..','--','-.','---','.--.','--.-','.-.','...','-','..-','...-','.--','-..-','-.--','--..');
var
  ProgramEnd : Boolean;
  MenuOption : String;
begin
  ProgramEnd := False;
  while not(ProgramEnd) do
    begin
      DisplayMenu();
      MenuOption := GetMenuOption();
      if MenuOption = 'R' then
        ReceiveMorseCode(Dash, Letter, Dot)
      else if MenuOption = 'S' then
        SendMorseCode(MorseCode)
      else if MenuOption = 'X' then
        ProgramEnd := True
      else if MenuOption = 'L' then
        ListCharacters(Letter, MorseCode); //Added to lead to new procedure
    end;
end;

Java:

Python:

# Added subroutines

def ListMorseCode(Letter, MorseCode): # New subroutine - Letter and MorseCode lists are passed as parameters
  for Pos in range(len(Letter)): # Loop through all positions in the length of the list
    print(Letter[Pos]+"   "+MorseCode[Pos]) # Output the text character, followed by a few spaces, and then the Morse code representation

# Existing modified subroutines

def DisplayMenu():
  print()
  print("Main Menu")
  print("=========")
  print("R - Receive Morse code")
  print("S - Send Morse code")
  print("L - List Morse code characters") # Added - display menu option for this modification
  print("X - Exit program")
  print()

def SendReceiveMessages():
  Dash = [20,23,0,0,24,1,0,17,0,21,0,25,0,15,11,0,0,0,0,22,13,0,0,10,0,0,0]
  Dot = [5,18,0,0,2,9,0,26,0,19,0,3,0,7,4,0,0,0,12,8,14,6,0,16,0,0,0]
  Letter = [' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

  MorseCode = [' ','.-','-...','-.-.','-..','.','..-.','--.','....','..','.---','-.-','.-..','--','-.','---','.--.','--.-','.-.','...','-','..-','...-','.--','-..-','-.--','--..']

  ProgramEnd = False
  while not ProgramEnd:
    DisplayMenu() 
    MenuOption = GetMenuOption()
    if MenuOption == 'R':
      ReceiveMorseCode(Dash, Letter, Dot)
    elif MenuOption == 'S':
      SendMorseCode(MorseCode) 
    elif MenuOption == 'X':
      ProgramEnd = True
    elif MenuOption == 'L': # Added - if menu option selected is the 'L' (list Morse code)
      ListMorseCode(Letter, MorseCode) # Run ListMorseCode subroutine, passing lists Letter and MorseCode

VB.NET:

Accept multiple lines of text to convert to Morse code[edit]

Description of question

C#:

Delphi/Pascal:

Procedure SendMorseCode(MorseCode : Array of String);
var
  PlainText, MorseCodeString, CodedLetter,x : String;
  PlainTextLength, i, Index : Integer;
  PlainTextLetter : Char;
  continue : integer;
begin
  continue:= 0;
  repeat
    write('Enter your message (uppercase letters and spaces only): ');
    readln(PlainText);
    PlainTextLength := length(PlainText);
    MorseCodeString := EMPTYSTRING;
    for i := 1 to PlainTextLength do
      begin
        PlainTextLetter := PlainText[i];
        if PlainTextLetter = SPACE then
          Index := 0
        else
          Index := ord(PlainTextLetter) - ord('A') + 1;
        CodedLetter := MorseCode[Index];
        MorseCodeString := MorseCodeString + CodedLetter + SPACE;
      end;
    writeln(MorseCodeString);
    write('Continue (Y or N): ');
    readln(x);
    if (x = 'Y') or (X ='y') then //start of continue
        continue:= 0
      else if (x = 'N') or (x = 'n') then
        continue:= 1
      else
        begin
          writeln('Interpreting answer as no');//could be made to loop if needed
          continue:=1;
        end;
  until continue = 1;
end;

Java:

Python:

VB.NET:

Accept lowercase letters[edit]

This will accept the input of lowercase characters

C#:

// AMENDED SUBROUTINE - Allows Lowercase values in Send string now. (ASCII values used)
private static void SendMorseCode(string[] MorseCode)
{
    Console.Write("Enter your message (uppercase letters and spaces only): ");
    string PlainText = Console.ReadLine();
    int PlainTextLength = PlainText.Length;
    string MorseCodeString = EMPTYSTRING;
    char PlainTextLetter = SPACE;
    int Index = 0;

    int ascii;              // declare new value 'ascii' to store that value.

    for (int i = 0; i < PlainTextLength; i++)
    {
        PlainTextLetter = PlainText[i];
        if (PlainTextLetter == SPACE)
        {
            Index = 0;
        }
        else
        {
            if ((int)PlainTextLetter >= 97)             // if ASCII Value of that letter is 97 or above, it is assumed to be lowercase.
                ascii = (int)PlainTextLetter - 32;      // if lowercase then subtract 32 from its ASCII value
            else
                ascii = (int)PlainTextLetter;           // else it is uppercase, then use that ASCII value.

            Index = ascii - (int)'A' + 1;               // use the 'ascii' value to calculate, just incase lowercase has been used.
        }
        string CodedLetter = MorseCode[Index];
        MorseCodeString = MorseCodeString + CodedLetter + SPACE;
    }
    Console.WriteLine(MorseCodeString);
}

Delphi/Pascal:

Procedure SendMorseCode(MorseCode : Array of String);
var
  PlainText, MorseCodeString, CodedLetter : String;
  PlainTextLength, i, Index, assci : Integer;
  PlainTextLetter : Char;
begin
  write('Enter your message (uppercase letters and spaces only): ');
  readln(PlainText);
  PlainTextLength := length(PlainText);
  MorseCodeString := EMPTYSTRING;
  for i := 1 to PlainTextLength do
    begin
      PlainTextLetter := PlainText[i];
      if PlainTextLetter = SPACE then
        Index := 0
      else
        begin   //added to allow lower case letters
          if ord(PlainTextLetter) >= 97 then
            assci:= ord(PlainTextLetter) - 32
          else
            assci:=  ord(PlainTextLetter);
          Index := assci - ord('A') + 1;
        end;                             //should work
      CodedLetter := MorseCode[Index];
      MorseCodeString := MorseCodeString + CodedLetter + SPACE;
    end;
  writeln(MorseCodeString);
end;

Delphi/Pascal:

write ('This is a question: ');
readln(Variable);
Variable := AnsiUpperCase(Variable);
{This can be added for the MenuOption (in GetMenuOption) and Plaintext (in SendMorseCode)}

Java:

Python:

VB.NET: