This lab serves multiple goals:

  • To introduce you to the char datatype,
  • To introduce you to the different representations of characters,
  • To exemplify how to convert between representations of characters,
  • To introduce the order of characters,
  • (Optional) To illustrate the comparison of strings.

Warm Up

Characters are represented by integers: you can read on wikipedia a mapping between the glyphs (e.g., space, A, !, etc.) and decimal values, to be read as “integer code” (e.g., 32, 33, 34, etc.).

In the referenced table on wikipedia, each character’s integer code is given for different numeral systems:

  • Binary: base 2
  • Oct: octal, base 8
  • Dec: decimal, base 10
  • Hex: hexadecimal, base 16

The decimal system is what we use every day, but computer programs occasionally use other numerical systems. For that system, it gives (no need to memorize this information, this is simply for your general awareness):

Decimal representationGlyph (character)
32space
33!
34
35#
36$
37%
38&
39
40(
41)
42*
43+
44,
45-
46.
47/
480
491
502
513
524
535
546
557
568
579
58:
59;
60<
61=
62>
63?
64@
65A
66B
67C
68D
69E
70F
71G
72H
73I
74J
75K
76L
77M
78N
79O
80P
81Q
82R
83S
84T
85U
86V
87W
88X
89Y
90Z
91[
92\
93]
94^
95_
96`
97a
98b
99c
100d
101e
102f
103g
104h
105i
106j
107k
108l
109m
110n
111o
112p
113q
114r
115s
116t
117u
118v
119w
120x
121y
122z
123{
124|
125}
126~

Note that the characters are divided into groups and that there are 95 printable characters.

Converting Between Characters Representations

Copy the following snippet of code in a Main method:

int intVar = (int)'C';
char charVar = (char)84;
Console.WriteLine($"'C' is represented as {intVar}");
Console.WriteLine($"{charVar} corresponds to the value 84"); 

And note that we can explicitly convert int into char, and char into int, but the conversion from char to int could be done implicitly by C#; replace the previous first line with:

int intVar = 'C';

and note that your program still compiles.

Can you also convert implicitly int into char?

Next, write code to determine the int values for the following characters:

char valueint value
w119
A
5
#

Also determine what characters the following integers (in the decimal system) represent:

int valuechar value
49
104
89

Solution:

Your code could look like the following:

Console.WriteLine("int value | char value\n" +
  " | \n" +
  (int)'w' + "       | w\n" +
  (int)'A' + "        | A\n" +
  (int)'5' + "        | 5\n" +
  (int)'#' + "        | #\n" +
  " | \n" +
  "49        | " + (char)49 + "\n" +
  "104       | " + (char)104 + "\n" +
  "89        | " + (char)89 + "\n"
);

Testing for Equality

You can test if a character is equal to another by using ==, as for integer values. This is particularly useful when we want to ask the user for a “yes” / “no” decision.

Write a program that

  • Asks the user for a character. To read a single character (instead of a whole string), use the ReadKey() method: Console.ReadKey().KeyChar will return a char that you can then store into a variable and manipulate.
  • Displays on the screen “The user said yes” if the user entered 'Y' or 'y',
  • Displays on the screen “The user said no” if the user entered 'N' or 'n',
  • Displays on the screen “The user entered an incorrect value” if the user entered any other character.

Solution:

You can get started with this short program:

Console.WriteLine("Enter a character:");
// We ask the user for a character.
char input = Console.ReadKey().KeyChar;
// We read from the user.
Console.WriteLine();
// We are introducing a new line after the user input
if (input == 'Y')
{
    // The input is the letter Y, uppercase.
    Console.WriteLine("You entered 'Y'.");
}

It does not fit the description, though, as many elements are missing. Implement them all!

Comparing

Exactly as is less than , the character associated with , A, is less than the character associated with , a.

You can convince yourself by executing the following code:

if ('A' > 'a')
{
    Console.Write("'A' is greater than 'a'.");
}
else
{
    Console.Write("'A' is less than 'a'.");
}

that displays “‘A’ is less than ‘a’.“.

Implement the following short program to practice this concept.

  1. Ask the user to enter a lowercase character.

  2. Check that the character is within the a - z range (it is a lowercase character),

  3. When it is not in this range, display “The character ‘X’ is not a lowercase character”, where X is replaced by the character they entered,

  4. Otherwise, perform the following steps:

    • if the user enters character 'n', display “You entered ‘n’.”
    • if the character occurs before 'n', display “The character you entered is a lowercase letter before ‘n’.”
    • if the character occurs after 'n', display “The character you entered is a lowercase letter after ‘n’.”

Solution:

The following short program fits the description:

 Console.WriteLine("Enter a character:");
// We ask the user for a character.
char input = Console.ReadKey().KeyChar;
// We read from the user.
Console.WriteLine();
// We are introducing a new line after the user input
if (input >= 'a' && input <= 'z')
{
   // The input is a lowercase letter.
   if (input == 'n') { Console.WriteLine("You entered 'n'."); }
   else if (input < 'n') { Console.WriteLine("The character you entered is a lower case letter before 'n'."); }
   else { Console.WriteLine("The character you entered is a lower case letter after 'n'."); }
}
else
{
   // The input is not a lowercase letter.
   Console.WriteLine("The character '" + input + "' is not a lowercase character.");
}

Pushing Further (Optional)

String Comparison

Comparing strings cannot be done with > and < operators (we can use ==, however). To compare them, we have to use the CompareOrdinal method of the String class.

It works as follows:

if (String.CompareOrdinal("A", "a") > 0)
{
    Console.Write("\"A\" is greater than \"a\".");
}
else
{
    Console.Write("\"A\" is less than \"a\".");
}

Note that CompareOrdinal returns an integer, that we then compare with .

  • If the value returned is , then the strings are the same,
  • If the value returned is less than , then the first string is less than the second one,
  • If the value returned is greater than , then the first string is greater than the second one.

In the previous example, we tested a string made of only one character, but we can compare arbitrarily complex strings:

if (String.CompareOrdinal("Augusta", "August") > 0) {
  Console.Write("\"Augusta\" is greater than \"August\".");
} else {
  Console.Write("\"Augusta\" is less than \"August\".");
}

To conclude with this topic, note that the integer returned actually has a precise value.

Examine the following code to understand it.

if (String.CompareOrdinal("A", "a") == ((int)'A' - (int)'a'))
 Console.WriteLine("Ok, I get it now");
 
if (String.CompareOrdinal("Ab", "az") == (((int)'A' + (int)'b') - ((int)'a' + (int)'z')))
 Console.WriteLine("Yes, I really do.");
 
else if (String.CompareOrdinal("Ab", "az") == ((int)'A' - (int)'a'))
 Console.WriteLine("Or do I?");
 
if (String.CompareOrdinal("ABCDEf", "ABCDEF") == (int)'f' - (int)'F')
 Console.WriteLine("Ok, now I'm good.");

Do you understand how the returning value is computed for these strings?