Skip to content
wannacode

Tasks

All the tasks of the course in one place. First 50 standalone tasks from "Hello, World" to the shortest path in a grid, each with an example and a solution in C# checked with a real compiler. Then the tasks from the lessons, by module: each one leads to the lesson that explains what you need.

50 tasks to practise

  1. 1. Hello World

    Print the text Hello, World! to the console; the program takes no input.

    No input.

    Output
    Hello, World!

    What you need is in the lesson: Your first program

    Solution
    class Program
    {
    static void Main()
    {
    Console.WriteLine("Hello, World!");
    }
    }
  2. 2. Greet the user

    Read a name from one line and greet the person by name as "Hello, <name>!".

    Input
    Maria
    Output
    Hello, Maria!

    What you need is in the lesson: Input and output

    Solution
    class Program
    {
    static void Main()
    {
    string name = Console.ReadLine();
    Console.WriteLine("Hello, " + name + "!");
    }
    }
  3. 3. Print the age

    Read the user's age (a whole number), store it in a variable and print it in a sentence.

    Input
    17
    Output
    You are 17 years old.

    What you need is in the lesson: Variables and types

    Solution
    class Program
    {
    static void Main()
    {
    int age = int.Parse(Console.ReadLine());
    Console.WriteLine("You are " + age + " years old.");
    }
    }
  4. 4. Unit converter

    Read a length in inches (it may be a decimal) and convert it to centimetres: 1 inch = 2.54 cm. Print the result with 2 decimal places.

    Input
    12.5
    Output
    31.75 cm

    What you need is in the lesson: Operators and arithmetic

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    double inches = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    Console.WriteLine((inches * 2.54).ToString("F2", CultureInfo.InvariantCulture) + " cm");
    }
    }
  5. 5. Even or odd

    Read a whole number and print whether it is even or odd.

    Input
    7
    Output
    7 is odd.

    What you need is in the lesson: Conditions

    Solution
    class Program
    {
    static void Main()
    {
    int number = int.Parse(Console.ReadLine());
    if (number % 2 == 0)
    {
    Console.WriteLine(number + " is even.");
    }
    else
    {
    Console.WriteLine(number + " is odd.");
    }
    }
    }
  6. 6. Sum of two numbers

    Read two whole numbers, each on its own line, and print their sum.

    Input
    12
    30
    Output
    The sum is 42.

    What you need is in the lesson: Operators and arithmetic

    Solution
    class Program
    {
    static void Main()
    {
    int first = int.Parse(Console.ReadLine());
    int second = int.Parse(Console.ReadLine());
    Console.WriteLine("The sum is " + (first + second) + ".");
    }
    }
  7. 7. Area of a square

    Read the side of a square (a whole number) and print its area.

    Input
    5
    Output
    The area is 25.

    What you need is in the lesson: Operators and arithmetic

    Solution
    class Program
    {
    static void Main()
    {
    int side = int.Parse(Console.ReadLine());
    Console.WriteLine("The area is " + side * side + ".");
    }
    }
  8. 8. Volume of a sphere

    Read the radius r (it may be a decimal) and print the volume of the sphere V = 4/3 · π · r³ with 2 decimal places.

    Input
    3
    Output
    The volume is 113.10.

    What you need is in the lesson: Operators and arithmetic

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    double r = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    double volume = 4.0 / 3 * Math.PI * r * r * r;
    Console.WriteLine("The volume is " + volume.ToString("F2", CultureInfo.InvariantCulture) + ".");
    }
    }
  9. 9. Compare two numbers

    Read two whole numbers, each on its own line, and print the larger one (if they are equal, either will do).

    Input
    8
    15
    Output
    The larger one is 15.

    What you need is in the lesson: Conditions

    Solution
    class Program
    {
    static void Main()
    {
    int a = int.Parse(Console.ReadLine());
    int b = int.Parse(Console.ReadLine());
    if (a > b)
    {
    Console.WriteLine("The larger one is " + a + ".");
    }
    else
    {
    Console.WriteLine("The larger one is " + b + ".");
    }
    }
    }
  10. 10. Triangle check

    Read three whole numbers, each on its own line, and check whether they can be the sides of a triangle: any two of them must add up to more than the third.

    Input
    3
    4
    5
    Output
    They can form a triangle.

    What you need is in the lesson: Conditions

    Solution
    class Program
    {
    static void Main()
    {
    int a = int.Parse(Console.ReadLine());
    int b = int.Parse(Console.ReadLine());
    int c = int.Parse(Console.ReadLine());
    if (a + b > c && a + c > b && b + c > a)
    {
    Console.WriteLine("They can form a triangle.");
    }
    else
    {
    Console.WriteLine("They cannot form a triangle.");
    }
    }
    }
  11. 11. Grade to words

    Read a mark on the Bulgarian scale from 2 to 6 (it may be a decimal) and print it in words: 5.50 and up is Excellent, 4.50 and up Very good, 3.50 and up Good, 3.00 and up Average, below 3.00 Poor.

    Input
    4.75
    Output
    Very good

    What you need is in the lesson: Conditions

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    double grade = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    if (grade >= 5.5)
    {
    Console.WriteLine("Excellent");
    }
    else if (grade >= 4.5)
    {
    Console.WriteLine("Very good");
    }
    else if (grade >= 3.5)
    {
    Console.WriteLine("Good");
    }
    else if (grade >= 3)
    {
    Console.WriteLine("Average");
    }
    else
    {
    Console.WriteLine("Poor");
    }
    }
    }
  12. 12. Hours to seconds

    Read a number of hours (a whole number) and print how many seconds that is.

    Input
    2
    Output
    7200 seconds

    What you need is in the lesson: Operators and arithmetic

    Solution
    class Program
    {
    static void Main()
    {
    int hours = int.Parse(Console.ReadLine());
    Console.WriteLine(hours * 3600 + " seconds");
    }
    }
  13. 13. Count to N

    Read a whole number N and print the numbers from 1 to N, each on a new line.

    Input
    5
    Output
    1
    2
    3
    4
    5

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    for (int i = 1; i <= n; i++)
    {
    Console.WriteLine(i);
    }
    }
    }
  14. 14. ASCII value

    Read one character (the first character of the line) and print its ASCII code, the number the computer stores it as.

    Input
    A
    Output
    The code of A is 65.

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    char symbol = Console.ReadLine()[0];
    Console.WriteLine("The code of " + symbol + " is " + (int)symbol + ".");
    }
    }
  15. 15. Quadratic equation

    Read a, b and c, each on its own line, and solve ax² + bx + c = 0. With two roots print "x1 = …, x2 = …" (x1 uses +√D), with one root "x = …", with 2 decimal places; if there are no real roots or a is 0, say so.

    Input
    1
    -3
    2
    Output
    x1 = 2.00, x2 = 1.00

    What you need is in the lesson: Conditions

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    double a = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    double b = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    double c = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    if (a == 0)
    {
    Console.WriteLine("This is not a quadratic equation");
    }
    else
    {
    double d = b * b - 4 * a * c;
    if (d > 0)
    {
    double x1 = (-b + Math.Sqrt(d)) / (2 * a);
    double x2 = (-b - Math.Sqrt(d)) / (2 * a);
    Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "x1 = {0:F2}, x2 = {1:F2}", x1, x2));
    }
    else if (d == 0)
    {
    Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "x = {0:F2}", -b / (2 * a)));
    }
    else
    {
    Console.WriteLine("No real roots");
    }
    }
    }
    }
  16. 16. Positive or negative

    Read a whole number and print whether it is positive, negative or zero.

    Input
    -4
    Output
    Negative

    What you need is in the lesson: Conditions

    Solution
    class Program
    {
    static void Main()
    {
    int number = int.Parse(Console.ReadLine());
    if (number > 0)
    {
    Console.WriteLine("Positive");
    }
    else if (number < 0)
    {
    Console.WriteLine("Negative");
    }
    else
    {
    Console.WriteLine("Zero");
    }
    }
    }
  17. 17. Seasons

    Read a month number (1–12) and print its season: 12, 1, 2 are Winter, 3–5 Spring, 6–8 Summer, 9–11 Autumn. For any other number print "Invalid month".

    Input
    4
    Output
    Spring

    What you need is in the lesson: Conditions

    Solution
    class Program
    {
    static void Main()
    {
    int month = int.Parse(Console.ReadLine());
    if (month < 1 || month > 12)
    {
    Console.WriteLine("Invalid month");
    }
    else if (month == 12 || month <= 2)
    {
    Console.WriteLine("Winter");
    }
    else if (month <= 5)
    {
    Console.WriteLine("Spring");
    }
    else if (month <= 8)
    {
    Console.WriteLine("Summer");
    }
    else
    {
    Console.WriteLine("Autumn");
    }
    }
    }
  18. 18. Reverse a number

    Read a positive whole number and print the number with its digits in reverse order: 123 becomes 321. Zeros that end up in front disappear (1200 becomes 21). Take the last digit with % 10 and drop it by dividing by 10.

    Input
    9071
    Output
    1709

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    int reversed = 0;
    while (n > 0)
    {
    reversed = reversed * 10 + n % 10;
    n /= 10;
    }
    Console.WriteLine(reversed);
    }
    }
  19. 19. Temperature converter

    Read a temperature in degrees Celsius (it may have a decimal point) and print it in Fahrenheit with two decimal places. The formula is F = C * 9 / 5 + 32.

    Input
    36.6
    Output
    97.88 °F

    What you need is in the lesson: Operators and arithmetic

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    double celsius = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
    double fahrenheit = celsius * 9 / 5 + 32;
    Console.WriteLine(fahrenheit.ToString("F2", CultureInfo.InvariantCulture) + " °F");
    }
    }
  20. 20. Longest name

    The first line holds the number of names n, and each of the next n lines holds one name. Print the name with the most letters and their count in brackets; if two names are equally long, print the first of them.

    Input
    4
    Mia
    Alexandra
    John
    Charlotte
    Output
    Alexandra (9 letters)

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    string longest = "";
    for (int i = 0; i < n; i++)
    {
    string name = Console.ReadLine();
    if (name.Length > longest.Length)
    {
    longest = name;
    }
    }
    Console.WriteLine($"{longest} ({longest.Length} letters)");
    }
    }
  21. 21. Word counter

    Read one line of text and print how many words it has. Words are separated by one or more spaces, so the empty pieces between two spaces are not words.

    Input
    I write code every day and get better
    Output
    8

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    string line = Console.ReadLine();
    string[] words = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    Console.WriteLine(words.Length);
    }
    }
  22. 22. Prime number

    Read a whole number n and check whether it is prime: greater than 1 and divisible only by 1 and itself. It is enough to try the divisors i for which i * i <= n.

    Input
    91
    Output
    91 is not prime

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    bool prime = n > 1;
    for (int i = 2; i * i <= n; i++)
    {
    if (n % i == 0)
    {
    prime = false;
    break;
    }
    }
    if (prime)
    {
    Console.WriteLine(n + " is prime");
    }
    else
    {
    Console.WriteLine(n + " is not prime");
    }
    }
    }
  23. 23. Day of the week

    Read a number from 1 to 7 and print the name of that day of the week, where 1 is Monday. Keep the names in an array; for any other number print "No such day".

    Input
    5
    Output
    Friday

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    int day = int.Parse(Console.ReadLine());
    string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
    if (day >= 1 && day <= 7)
    {
    Console.WriteLine(days[day - 1]);
    }
    else
    {
    Console.WriteLine("No such day");
    }
    }
    }
  24. 24. Factorial

    Read a whole number n from 0 to 15 and print n! = 1 * 2 * ... * n (0! is 1). Already 13! does not fit in an int, so in Java and C# keep the product in a long.

    Input
    15
    Output
    15! = 1307674368000

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    long factorial = 1;
    for (int i = 2; i <= n; i++)
    {
    factorial *= i;
    }
    Console.WriteLine($"{n}! = {factorial}");
    }
    }
  25. 25. Valid date

    Read a day, a month and a year, each on its own line, and print "Valid date" or "Invalid date". The year is at least 1, the month is from 1 to 12 and the day from 1 to the number of days in that month; February has 29 days in a leap year (divisible by 4 but not by 100, unless it is divisible by 400).

    Input
    29
    2
    2100
    Output
    Invalid date

    What you need is in the lesson: Conditions

    Solution
    class Program
    {
    static void Main()
    {
    int day = int.Parse(Console.ReadLine());
    int month = int.Parse(Console.ReadLine());
    int year = int.Parse(Console.ReadLine());
    bool leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    int days;
    if (month == 2)
    {
    days = leap ? 29 : 28;
    }
    else if (month == 4 || month == 6 || month == 9 || month == 11)
    {
    days = 30;
    }
    else
    {
    days = 31;
    }
    if (year >= 1 && month >= 1 && month <= 12 && day >= 1 && day <= days)
    {
    Console.WriteLine("Valid date");
    }
    else
    {
    Console.WriteLine("Invalid date");
    }
    }
    }
  26. 26. Letter frequency

    Read one line of text and print how many times each letter appears in it, ignoring upper and lower case. Print the letters in alphabetical order, one per line, as "a: 5"; spaces and punctuation are not counted.

    Input
    Hello, World!
    Output
    d: 1
    e: 1
    h: 1
    l: 3
    o: 2
    r: 1
    w: 1

    What you need is in the lesson: Dictionary and HashSet

    Solution
    class Program
    {
    static void Main()
    {
    string text = Console.ReadLine().ToLower();
    SortedDictionary<char, int> counts = new SortedDictionary<char, int>();
    foreach (char c in text)
    {
    if (char.IsLetter(c))
    {
    counts[c] = counts.GetValueOrDefault(c, 0) + 1;
    }
    }
    foreach (KeyValuePair<char, int> pair in counts)
    {
    Console.WriteLine($"{pair.Key}: {pair.Value}");
    }
    }
    }
  27. 27. Minimum and maximum in an array

    The first line holds the count n, and each of the next n lines holds one whole number. Read them into an array and print the smallest and the largest, starting from the first element and comparing it with the rest.

    Input
    5
    7
    -3
    12
    0
    4
    Output
    Smallest: -3
    Largest: 12

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++)
    {
    numbers[i] = int.Parse(Console.ReadLine());
    }
    int min = numbers[0];
    int max = numbers[0];
    for (int i = 1; i < n; i++)
    {
    if (numbers[i] < min)
    {
    min = numbers[i];
    }
    if (numbers[i] > max)
    {
    max = numbers[i];
    }
    }
    Console.WriteLine("Smallest: " + min);
    Console.WriteLine("Largest: " + max);
    }
    }
  28. 28. Sort an array

    The first line holds the count n, and each of the next n lines holds one whole number. Sort them yourself in ascending order with bubble sort (n - 1 passes, each swapping neighbours that are in the wrong order) and print them on one line, separated by spaces.

    Input
    6
    5
    2
    9
    1
    5
    6
    Output
    1 2 5 5 6 9

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++)
    {
    numbers[i] = int.Parse(Console.ReadLine());
    }
    for (int pass = 0; pass < n - 1; pass++)
    {
    for (int i = 0; i < n - 1 - pass; i++)
    {
    if (numbers[i] > numbers[i + 1])
    {
    int temp = numbers[i];
    numbers[i] = numbers[i + 1];
    numbers[i + 1] = temp;
    }
    }
    }
    Console.WriteLine(string.Join(" ", numbers));
    }
    }
  29. 29. Replace the vowels

    Read one line of text and print it with every vowel, upper or lower case, replaced by the character *. The vowels are a, e, i, o, u.

    Input
    I love programming
    Output
    * l*v* pr*gr*mm*ng

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    string text = Console.ReadLine();
    string vowels = "aeiou";
    string result = "";
    foreach (char c in text)
    {
    if (vowels.Contains(char.ToLower(c)))
    {
    result += "*";
    }
    else
    {
    result += c;
    }
    }
    Console.WriteLine(result);
    }
    }
  30. 30. Sum of the digits

    Read a whole non-negative number and print the sum of its digits. The last digit is n % 10, and n / 10 drops it (n // 10 in Python).

    Input
    9875
    Output
    29

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    int sum = 0;
    while (n > 0)
    {
    sum += n % 10;
    n /= 10;
    }
    Console.WriteLine(sum);
    }
    }
  31. 31. Palindrome

    Read one line of text and check whether it is a palindrome, that is, it reads the same backwards. Upper and lower case count as the same and spaces are skipped. Print "Palindrome" or "Not a palindrome".

    Input
    Never odd or even
    Output
    Palindrome

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    string text = Console.ReadLine().ToLower().Replace(" ", "");
    bool palindrome = true;
    for (int i = 0; i < text.Length / 2; i++)
    {
    if (text[i] != text[text.Length - 1 - i])
    {
    palindrome = false;
    break;
    }
    }
    if (palindrome)
    {
    Console.WriteLine("Palindrome");
    }
    else
    {
    Console.WriteLine("Not a palindrome");
    }
    }
    }
  32. 32. Strong password

    Read passwords, one per line, until a strong one arrives: at least 8 characters, at least one digit, one uppercase and one lowercase letter. For each weak one print the first rule it breaks, in this order ("Too short", "No digit", "No uppercase letter", "No lowercase letter"); for the strong one print "Password accepted" and stop.

    Input
    kotka
    kotkamiau
    kotkamiau7
    Kotkamiau7
    Output
    Too short
    No digit
    No uppercase letter
    Password accepted

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    while (true)
    {
    string password = Console.ReadLine();
    bool digit = false;
    bool upper = false;
    bool lower = false;
    foreach (char c in password)
    {
    if (char.IsDigit(c))
    {
    digit = true;
    }
    else if (char.IsUpper(c))
    {
    upper = true;
    }
    else if (char.IsLower(c))
    {
    lower = true;
    }
    }
    if (password.Length < 8)
    {
    Console.WriteLine("Too short");
    }
    else if (!digit)
    {
    Console.WriteLine("No digit");
    }
    else if (!upper)
    {
    Console.WriteLine("No uppercase letter");
    }
    else if (!lower)
    {
    Console.WriteLine("No lowercase letter");
    }
    else
    {
    Console.WriteLine("Password accepted");
    break;
    }
    }
    }
    }
  33. 33. Reverse an array

    The first line holds the count n, and each of the next n lines holds one whole number. Read them into an array and print them in reverse order on one line, separated by spaces: walk the array from the last index down to zero.

    Input
    4
    10
    -2
    7
    3
    Output
    3 7 -2 10

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++)
    {
    numbers[i] = int.Parse(Console.ReadLine());
    }
    for (int i = n - 1; i >= 0; i--)
    {
    Console.Write(numbers[i]);
    if (i > 0)
    {
    Console.Write(" ");
    }
    }
    Console.WriteLine();
    }
    }
  34. 34. Count the elements

    Read one line of words separated by single spaces and print how many times each word appears, as "word: count". The words come out in the order in which they first appeared.

    Input
    apple pear apple plum pear apple
    Output
    apple: 3
    pear: 2
    plum: 1

    What you need is in the lesson: Dictionary and HashSet

    Solution
    class Program
    {
    static void Main()
    {
    string line = Console.ReadLine();
    Dictionary<string, int> counts = new Dictionary<string, int>();
    foreach (string word in line.Split(' '))
    {
    counts[word] = counts.GetValueOrDefault(word, 0) + 1;
    }
    foreach (KeyValuePair<string, int> pair in counts)
    {
    Console.WriteLine($"{pair.Key}: {pair.Value}");
    }
    }
    }
  35. 35. Prime numbers

    Read a number N and print all prime numbers from 2 to N on one line, separated by spaces.

    Input
    30
    Output
    2 3 5 7 11 13 17 19 23 29

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    string result = "";
    for (int i = 2; i <= n; i++)
    {
    bool prime = true;
    for (int d = 2; d * d <= i; d++)
    {
    if (i % d == 0)
    {
    prime = false;
    break;
    }
    }
    if (prime)
    {
    result += i + " ";
    }
    }
    Console.WriteLine(result.Trim());
    }
    }
  36. 36. Average

    One line holds whole numbers separated by spaces. Print their average with two digits after the decimal point.

    Input
    5 8 12 6
    Output
    Average: 7.75

    What you need is in the lesson: Arrays

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    string[] parts = Console.ReadLine().Split(' ');
    int sum = 0;
    for (int i = 0; i < parts.Length; i++)
    {
    sum += int.Parse(parts[i]);
    }
    double average = (double)sum / parts.Length;
    Console.WriteLine("Average: " + average.ToString("F2", CultureInfo.InvariantCulture));
    }
    }
  37. 37. Sort by length

    One line holds words separated by spaces. Sort them by length from shortest to longest (words of equal length keep their input order) and print them on one line.

    Input
    cherry fig banana kiwi plum
    Output
    fig kiwi plum cherry banana

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    string[] words = Console.ReadLine().Split(' ');
    for (int i = 0; i < words.Length - 1; i++)
    {
    for (int j = 0; j < words.Length - 1 - i; j++)
    {
    if (words[j].Length > words[j + 1].Length)
    {
    string temp = words[j];
    words[j] = words[j + 1];
    words[j + 1] = temp;
    }
    }
    }
    Console.WriteLine(string.Join(" ", words));
    }
    }
  38. 38. Sentence counter

    Read one line of text and print how many sentences it has. A sentence ends with a full stop, an exclamation mark or a question mark; a run of such marks (like "..." or "?!") is a single ending.

    Input
    Hi! How are you? I am fine... And you?!
    Output
    Sentences: 4

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    string text = Console.ReadLine();
    string ends = ".!?";
    int count = 0;
    for (int i = 0; i < text.Length; i++)
    {
    bool isEnd = ends.Contains(text[i]);
    bool nextIsEnd = i + 1 < text.Length && ends.Contains(text[i + 1]);
    if (isEnd && !nextIsEnd)
    {
    count++;
    }
    }
    Console.WriteLine("Sentences: " + count);
    }
    }
  39. 39. Fibonacci numbers

    The Fibonacci sequence starts with 1, 1, and every next number is the sum of the previous two. Read N (from 1 to 50) and print the N-th number of the sequence.

    Input
    40
    Output
    102334155

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    int n = int.Parse(Console.ReadLine());
    long previous = 0;
    long current = 1;
    for (int i = 1; i < n; i++)
    {
    long next = previous + current;
    previous = current;
    current = next;
    }
    Console.WriteLine(current);
    }
    }
  40. 40. Finding the median

    One line holds whole numbers separated by spaces. Print their median with one digit after the decimal point: the middle number once they are sorted, or the mean of the two middle ones when the count is even.

    Input
    12 3 7 9 1 8
    Output
    Median: 7.5

    What you need is in the lesson: Lists

    Solution
    using System.Globalization;
    class Program
    {
    static void Main()
    {
    List<int> numbers = new List<int>();
    foreach (string part in Console.ReadLine().Split(' '))
    {
    numbers.Add(int.Parse(part));
    }
    numbers.Sort();
    int n = numbers.Count;
    double median;
    if (n % 2 == 1)
    {
    median = numbers[n / 2];
    }
    else
    {
    median = (numbers[n / 2 - 1] + numbers[n / 2]) / 2.0;
    }
    Console.WriteLine("Median: " + median.ToString("F1", CultureInfo.InvariantCulture));
    }
    }
  41. 41. Character chart

    Read one line of text. For every character except the space, in order of first appearance, print a line "character | stars" with one star for each time it occurs in the text.

    Input
    banana bread
    Output
    b | **
    a | ****
    n | **
    r | *
    e | *
    d | *

    What you need is in the lesson: Strings: working with text

    Solution
    class Program
    {
    static void Main()
    {
    string text = Console.ReadLine();
    for (int i = 0; i < text.Length; i++)
    {
    char c = text[i];
    if (c != ' ' && text.IndexOf(c) == i)
    {
    int count = 0;
    for (int j = 0; j < text.Length; j++)
    {
    if (text[j] == c)
    {
    count++;
    }
    }
    Console.WriteLine(c + " | " + new string('*', count));
    }
    }
    }
    }
  42. 42. Transposing a matrix

    The first line holds the number of rows R and columns C, followed by R lines of C numbers separated by spaces. Print the transposed matrix: C lines of R numbers, where rows become columns.

    Input
    2 3
    1 2 3
    4 5 6
    Output
    1 4
    2 5
    3 6

    What you need is in the lesson: Two-dimensional arrays

    Solution
    class Program
    {
    static void Main()
    {
    string[] size = Console.ReadLine().Split(' ');
    int rows = int.Parse(size[0]);
    int cols = int.Parse(size[1]);
    int[,] matrix = new int[rows, cols];
    for (int r = 0; r < rows; r++)
    {
    string[] parts = Console.ReadLine().Split(' ');
    for (int c = 0; c < cols; c++)
    {
    matrix[r, c] = int.Parse(parts[c]);
    }
    }
    for (int c = 0; c < cols; c++)
    {
    string line = "";
    for (int r = 0; r < rows; r++)
    {
    line += matrix[r, c] + " ";
    }
    Console.WriteLine(line.Trim());
    }
    }
    }
  43. 43. Paths in a maze

    The first line holds R and C, followed by R lines of C characters: "." is a free cell and "#" is a wall. Moving only right or down and never stepping on a wall, print the number of all paths from the top-left to the bottom-right corner.

    Input
    4 5
    .....
    .#.#.
    ...#.
    #....
    Output
    Paths: 4

    What you need is in the lesson: Recursion

    Solution
    class Program
    {
    static int CountPaths(string[] maze, int r, int c)
    {
    if (r >= maze.Length || c >= maze[0].Length || maze[r][c] == '#')
    {
    return 0;
    }
    if (r == maze.Length - 1 && c == maze[0].Length - 1)
    {
    return 1;
    }
    return CountPaths(maze, r + 1, c) + CountPaths(maze, r, c + 1);
    }
    static void Main()
    {
    string[] size = Console.ReadLine().Split(' ');
    int rows = int.Parse(size[0]);
    string[] maze = new string[rows];
    for (int r = 0; r < rows; r++)
    {
    maze[r] = Console.ReadLine();
    }
    Console.WriteLine("Paths: " + CountPaths(maze, 0, 0));
    }
    }
  44. 44. Grade statistics

    One line holds grades from 2 to 6 (the Bulgarian school scale, 6 is best), separated by spaces. Print how many are excellent, very good, good, satisfactory and poor, each category on its own line.

    Input
    6 4 5 6 3 5 2 6 5 4
    Output
    Excellent (6): 3
    Very good (5): 3
    Good (4): 2
    Satisfactory (3): 1
    Poor (2): 1

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    string[] names = { "", "", "Poor", "Satisfactory", "Good", "Very good", "Excellent" };
    int[] counts = new int[7];
    string[] parts = Console.ReadLine().Split(' ');
    for (int i = 0; i < parts.Length; i++)
    {
    counts[int.Parse(parts[i])]++;
    }
    for (int grade = 6; grade >= 2; grade--)
    {
    Console.WriteLine(names[grade] + " (" + grade + "): " + counts[grade]);
    }
    }
    }
  45. 45. Roman numerals

    Read a whole number from 1 to 3999 and print it in Roman numerals (I, V, X, L, C, D, M, where 4 is IV, 9 is IX, 40 is XL and so on).

    Input
    1994
    Output
    MCMXCIV

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    int number = int.Parse(Console.ReadLine());
    int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
    string[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
    string roman = "";
    for (int i = 0; i < values.Length; i++)
    {
    while (number >= values[i])
    {
    roman += symbols[i];
    number -= values[i];
    }
    }
    Console.WriteLine(roman);
    }
    }
  46. 46. Coin toss simulation

    Read a seed x (from 1 to 2147483646) and a number of tosses N, each on its own line. On every toss set x = x * 16807 % 2147483647; an even x is heads (H), an odd x is tails (T). Print the tosses on one line, then how many heads and how many tails came up.

    Input
    42
    10
    Output
    HTTTHTTHHT
    Heads: 4
    Tails: 6

    What you need is in the lesson: Loops

    Solution
    class Program
    {
    static void Main()
    {
    long x = long.Parse(Console.ReadLine());
    int n = int.Parse(Console.ReadLine());
    string tosses = "";
    int heads = 0;
    for (int i = 0; i < n; i++)
    {
    x = x * 16807 % 2147483647;
    if (x % 2 == 0)
    {
    tosses += "H";
    heads++;
    }
    else
    {
    tosses += "T";
    }
    }
    Console.WriteLine(tosses);
    Console.WriteLine("Heads: " + heads);
    Console.WriteLine("Tails: " + (n - heads));
    }
    }
  47. 47. Symmetric array

    One line holds whole numbers separated by spaces. Check whether the array is symmetric, that is, it reads the same from left to right and from right to left.

    Input
    1 2 3 2 1
    Output
    Symmetric

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    string[] parts = Console.ReadLine().Split(' ');
    int[] numbers = new int[parts.Length];
    for (int i = 0; i < parts.Length; i++)
    {
    numbers[i] = int.Parse(parts[i]);
    }
    bool symmetric = true;
    for (int i = 0; i < numbers.Length / 2; i++)
    {
    if (numbers[i] != numbers[numbers.Length - 1 - i])
    {
    symmetric = false;
    break;
    }
    }
    Console.WriteLine(symmetric ? "Symmetric" : "Not symmetric");
    }
    }
  48. 48. Balanced brackets

    Read one line of text and check whether its brackets (), [] and {} are balanced: every opening bracket has a closing one of the same kind and the pairs do not cross. Other characters are ignored.

    Input
    (a + [b) * c]
    Output
    Not balanced

    What you need is in the lesson: Stack, queue and linked list

    Solution
    class Program
    {
    static void Main()
    {
    string text = Console.ReadLine();
    string opening = "([{";
    string closing = ")]}";
    Stack<char> stack = new Stack<char>();
    bool balanced = true;
    foreach (char c in text)
    {
    if (opening.Contains(c))
    {
    stack.Push(c);
    }
    else if (closing.Contains(c))
    {
    if (stack.Count == 0 || opening.IndexOf(stack.Pop()) != closing.IndexOf(c))
    {
    balanced = false;
    break;
    }
    }
    }
    if (balanced && stack.Count == 0)
    {
    Console.WriteLine("Balanced");
    }
    else
    {
    Console.WriteLine("Not balanced");
    }
    }
    }
  49. 49. Run of equal elements

    One line holds whole numbers separated by spaces. Find the longest run of equal neighbouring numbers and print it on one line; if several runs have the same length, print the first one.

    Input
    2 1 1 3 3 3 2 2 2 5
    Output
    3 3 3

    What you need is in the lesson: Arrays

    Solution
    class Program
    {
    static void Main()
    {
    string[] parts = Console.ReadLine().Split(' ');
    int[] numbers = new int[parts.Length];
    for (int i = 0; i < parts.Length; i++)
    {
    numbers[i] = int.Parse(parts[i]);
    }
    int bestValue = numbers[0];
    int bestLength = 1;
    int length = 1;
    for (int i = 1; i < numbers.Length; i++)
    {
    if (numbers[i] == numbers[i - 1])
    {
    length++;
    }
    else
    {
    length = 1;
    }
    if (length > bestLength)
    {
    bestLength = length;
    bestValue = numbers[i];
    }
    }
    string result = "";
    for (int i = 0; i < bestLength; i++)
    {
    result += bestValue + " ";
    }
    Console.WriteLine(result.Trim());
    }
    }
  50. 50. Shortest path in a grid

    The first line holds R and C, followed by R lines of C characters: "." is a free cell, "#" is a wall, "S" is the start and "E" is the goal. Moving up, down, left and right, print the smallest number of moves from S to E, or "No path" if E cannot be reached.

    Input
    5 6
    S.#...
    .##.#.
    ...#..
    #.#..#
    ...E.#
    Output
    7

    What you need is in the lesson: Stack, queue and linked list

    Solution
    class Program
    {
    static void Main()
    {
    string[] size = Console.ReadLine().Split(' ');
    int rows = int.Parse(size[0]);
    int cols = int.Parse(size[1]);
    string[] grid = new string[rows];
    for (int r = 0; r < rows; r++)
    {
    grid[r] = Console.ReadLine();
    }
    int[,] dist = new int[rows, cols];
    Queue<int[]> queue = new Queue<int[]>();
    for (int r = 0; r < rows; r++)
    {
    for (int c = 0; c < cols; c++)
    {
    dist[r, c] = -1;
    if (grid[r][c] == 'S')
    {
    dist[r, c] = 0;
    queue.Enqueue(new int[] { r, c });
    }
    }
    }
    int[] dr = { -1, 1, 0, 0 };
    int[] dc = { 0, 0, -1, 1 };
    string answer = "No path";
    while (queue.Count > 0)
    {
    int[] cell = queue.Dequeue();
    int r = cell[0];
    int c = cell[1];
    if (grid[r][c] == 'E')
    {
    answer = dist[r, c].ToString();
    break;
    }
    for (int d = 0; d < 4; d++)
    {
    int nr = r + dr[d];
    int nc = c + dc[d];
    if (nr >= 0 && nr < rows && nc >= 0 && nc < cols && grid[nr][nc] != '#' && dist[nr, nc] == -1)
    {
    dist[nr, nc] = dist[r, c] + 1;
    queue.Enqueue(new int[] { nr, nc });
    }
    }
    }
    Console.WriteLine(answer);
    }
    }

Language basics

Methods

Classes and objects

Inheritance and polymorphism

Errors and exceptions

Collections

Modern C#

  • Lambdas and delegates: Sorting by several fields · Filtering orders · Discounts one after another
  • LINQ: Sales by category · Top 3 products · Average grade · The words in a text
  • record, switch and patterns: Shapes · Delivery price · A point as a key
  • Design patterns: Discounts as strategies · "Notify me when it is in stock" · A notification factory · An old thermometer

Real-world programs

  • Tests with xUnit: The discount calculator · The account · The bug in the average grade
  • Threads: Parallel sum · Downloading with a pool · A counter without losses
  • Network programming: Echo server · A server with commands · A chat for two
  • Databases: Catalog · Search by part of the name · A transfer that fails halfway
  • Reflection and attributes: All the properties · Mini JSON · Your own test runner

Web and desktop

Let's make a game

Chronicles of Arcanum

Epic Cosmos: the empire

Project

Made by Ivo Gergov as part of Evo Tech's campaign for accessible programming education ·