Модул 1. Увод в програмирането

Mатериали | Задачи | Решения

Съдържание

1. Въведение в програмирането

Какво означава "да програмираме"?

  • Да програмираме означава да даваме команди на компютъра какво да прави

  • Командите се подреждат една след друга

  • Така те образуват компютърна програма

  • Компютърната програма е поредица от команди

  • Програмите се пишат на език за програмиране (Например C#, Java, JavaScript, Python, PHP, C, C++)

  • Използва се среда за програмиране (Например Visual Studio)

Компютърни програми

  • Програма = последователност от команди

  • Съдържа команди, пресмятания, проверки, повторения

  • Програмите се пишат в текстов формат

  • Текстът на програмата се нарича сорс код

  • Сорс кодът се компилира до изпълним файл (Например Program.cs се компилира до Program.exe)

Среда за разработка

  • За да програмирате, ви трябва среда за разработка

  • Integrated Development Environment (IDE)

  • За C# => Visual Studio за Windows или MonoDevelop за Linux и Max OS X

  • за Java => IntelliJ IDEA

  • за PHP => PHP Storm

Инсталирайте си Microsoft Visual Studio Community

  • https://visualstudio.microsoft.com/vs/community/

Алтернативни среди за разработка (online)

  • https://dotnetfiddle.net/

  • https://repl.it/repls/CostlyMonstrousAss

Създаване на конзолна програма

  • Стартирайте Visual Studio

  • Създайте нов конзолен проект

  • [File] > [New] > [Project] > [Visual C#] > [Windows] > [Console Application]

Писане на програмен код

  • Сорс кодът на програма се пише в секцията Main(string[] args)

  • Между отварящата и затварящата скоба { ... }

  • Натиснете [Enter] след отварящата скоба {

  • Кодът на програмата се пише отместен навътре

  • Напишете следния код: Console.WriteLine("Hello World");

  • За стартиране на програмата натиснете [Ctrl + F5]

  • Ако няма грешки, програмата ще се изпълни

  • Резултатът ще се изпише на конзолата

Тестване на програмата

Тествайте кода си онлайн: https://judge.softuni.bg/Contests/Practice/Index/600#0

Типични грешки в програмите

  • Писане извън тялото на Main() метода

  • Бъркане на малки и главни букви

  • Липса на ; в края на всяка команда

  • Липсваща кавичка " или липсваща скоба ( или )

2. Пресмятания, оператори, изрази

Четене на числа от конзолата

Четене на цяло число:

var num = int.Parse(Console.ReadLine());

Пример: пресмятане на лице на квадрат със страна а:

Console.Write("a = ");              
var a = int.Parse(Console.ReadLine());
var area = a * a;
Console.Write("Square = ");
Console.WriteLine(area);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/609#0

Пресмятания в програмирането

  • Компютрите са машини, които обработват данни

  • Данните се записват в компютърната памет в променливи

  • Променливите имат име, тип и стойност

  • Дефиниране на променлива и присвояване на стойност:

var count = 5;
  • След обработка данните се записват отново в променливи

Типове данни и променливи

Променливите съхраняват стойност от даден тип: Число, буква, текст (стринг), дата, цвят, картинка, списък

Типове данни:

  • Тип цяло число: 1, 2, 3, 4, 5, ...

  • Тип дробно число: 0.5, 3.14, -1.5, ...

  • Тип буква от азбуката (символ): 'a', 'b', 'c', ...

  • Тип текст (стринг): "Здрасти", "Hi", "Beer", ...

  • Тип ден от седмицата: понеделник, вторник, ...

Четене на дробно число

Четене на дробно число от конзолата:

var num = double.Parse(Console.ReadLine());

Пример: прехвърляне от инчове в сантиметри:

Console.Write("Inches = ");              
var inches = double.Parse(Console.ReadLine());
var centimeters = inches * 2.54;
Console.Write("Centimeters = ");
Console.WriteLine(centimeters);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/609#1

Четене и печатане на текст

Четене на текст (стринг) от конзолата:

var str = Console.ReadLine();

Пример: поздрав по име:

Console.Write("Enter your name: ");              
var name = Console.ReadLine();
Console.WriteLine("Hello, {0}!",name);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/609#2

Съединяване на текст и числа

При печат на текст, числа и други данни, можем да ги съединим, използвайки шаблони {0}, {1}, {2}, ...

var firstName = Console.ReadLine();
var lastName = Console.ReadLine();
var age = int.Parse(Console.ReadLine());
var town = Console.ReadLine();
Console.WriteLine("You are {0} {1}, a {2}-years old person from {3}.",firstName, lastName, age, town);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/609#3

Аритметични операции: +, -, * и /

Събиране на числа (оператор +):

var a = 5;
var b = 7;
var sum = a + b; // 12

Изваждане на числа (оператор -):

var a = int.Parse(Console.ReadLine());
var b = int.Parse(Console.ReadLine());
var result = a - b;
Console.WriteLine(result);

Умножение на числа (оператор *):

var a = 5;
var b = 7;
var product = a * b; // 35

Деление на числа (оператор /):

var a = 25;
var i = a / 4;      // 6 – дробната част се отрязва
var f = a / 4.0;    // 6.25 – дробно делене
var error = a / 0;  // Грешка: деление на 0

Особености при деление на числа в C#

При деление на цели числа резултатът е цяло число:

var a = 25;
Console.WriteLine(a / 4);  // Целочислен резултат: 6
Console.WriteLine(a / 0);  // Грешка: деление на 0

При деление на дробни числа резултатът е дробно число:

var a = 15;
Console.WriteLine(a / 2.0);  // Дробен резултат: 7.5
Console.WriteLine(a / 0.0);  // Резултат: Infinity
Console.WriteLine(0.0 / 0.0); // Резултат: NaN

Съединяване на текст и число

Съединяване на текст и число (оператор +):

var firstName = "Maria";
var lastName = "Ivanova";
var age = 19;
var str = firstName + " " + lastName + " @ " + age;
Console.WriteLine(str);  // Maria Ivanova @ 19

Друг пример:

var a = 1.5;
var b = 2.5;
var sum = "The sum is: " + a + b;
Console.WriteLine(sum);  // The sum is 1.52.5

Числени изрази

В програмирането можем да пресмятаме числени изрази:

var expr = (3 + 5) * (4 – 2);

Изчисляване на лице на трапец:

var b1 = double.Parse(Console.ReadLine());
var b2 = double.Parse(Console.ReadLine());
var h = double.Parse(Console.ReadLine());
var area = (b1 + b2) * h / 2.0;
Console.WriteLine("Trapezoid area = " + area);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/151#5

Закръгляне на числа

В програмирането можем да закръгляме дробни числа.

Закръгляне до следващо (по-голямо) цяло число:

var up = Math.Ceiling(23.45);		// up = 24

Закръгляне до предишно (по-малко) цяло число:

var down = Math.Floor(45.67);		// down = 45

Закръгляне до най-близко число:

var one = Math.Round(112.345, 1);	// 112.3
var two = Math.Round(123.456, 2);	// 123.46
var three = Math.Round(566.7899, 3);	// 566.79

Задача: Периметър и лице на кръг

Напишете програма, която въвежда радиуса r на кръг и изчислява лицето и периметъра на кръга.

Console.Write("Enter circle radius. r = ");
var r = double.Parse(Console.ReadLine());
var area = Math.Round(Math.PI * r * r, 2);
var perimeter = Math.Round(2 * Math.PI * r, 2);
Console.WriteLine("Area = " + area);
Console.WriteLine("Perimeter = " + perimeter);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/151#5

Задача: Лице на правоъгълник в равнината

Правоъгълник е зададен с координатите на два от своите срещуположни ъгъла. Да се пресметнат площта и периметъра му.

double x1 = double.Parse(Console.ReadLine());
double y1 = double.Parse(Console.ReadLine());
double x2 = double.Parse(Console.ReadLine());
double y2 = double.Parse(Console.ReadLine());
double width = Math.Max(x1, x2) - Math.Min(x1, x2);
double height = Math.Max(y1, y2) - Math.Min(y1, y2);
Console.WriteLine("Area = {0}", width * height);
Console.WriteLine("Perimeter = {0}", 2 * (width + height));

3. Проверки (условни конструкции)

Сравняване на числа

В програмирането можем да сравняваме стойности:

var a = 5;
var b = 10;
Console.WriteLine(a < b);      // True
Console.WriteLine(a > 0);      // True
Console.WriteLine(a > 100);    // False
Console.WriteLine(a < a);      // False
Console.WriteLine(a <= 5);     // True
Console.WriteLine(b == 2 * a); // True

Оператори за сравнение

Оператор
Означение

Проверка за равенство

==

Проверка за различно

!=

По-голямо

>

По-голямо или равно

>=

По-малко

<

По-малко или равно

<=

Пример:

var result = (5 <= 6);
Console.WriteLine(result); // True

Прости проверки

В програмирането често проверяваме условия и да извършване различни действия според резултата от проверката.

Пример: въвеждаме оценка и проверяваме дали е отлична (≤ 5.50)

var grade = double.Parse(Console.ReadLine());
if (grade >= 5.50)
{
   Console.WriteLine("Excellent!");
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/613#0

Проверки с if-else конструкция

Въвеждаме оценка, проверяваме дали е отлична или не е:

var grade = double.Parse(Console.ReadLine());
if (grade >= 5.50)
{
   Console.WriteLine("Excellent!");
}
else
{
   Console.WriteLine("Not excellent.");
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/613#1

За къдравите скоби { } след if / else

Къдравите скоби { } въвеждат блок (група команди).

var color = "red";
if (color == "red")
{
  Console.WriteLine("tomato");
}
else
{
  Console.WriteLine("banana");
  Console.WriteLine("bye");
}

Задача: Четно или нечетно

Проверка дали цяло число е четно (even) или нечетно (odd)

var num = int.Parse(Console.ReadLine());
if (num % 2 == 0)
{
   Console.WriteLine("even");
}
else
{
   Console.WriteLine("odd");
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/613#2

Задача: По-голямото число

Да се напише програма, която чете две цели числа и извежда по-голямото от тях

Console.WriteLine("Enter two integers:");
var num1 = int.Parse(Console.ReadLine());
var num2 = int.Parse(Console.ReadLine());
if (num1 > num2) { Console.WriteLine("Greater number: " + num1); }
else { Console.WriteLine("Greater number: " + num2); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/613#3

Живот на променлива

Обхват, в който дадена променлива може да бъде използвана:

var myBankAccount = Bank.GetMyBankAccount();
if (DateTime.Now().Day >= PayDay)
{
    var salary = Job.GetMyMonthlySalary();
    myBankAccount = myBankAccount + salary;
}

Console.WriteLine(myBankAccount);
// Console.WriteLine(salary) Error!

Серия от проверки

Конструкцията if-else-if-else може да е в серия. Пример: да се изпише с английски текст дадено число (от 0 до 10).

var num = int.Parse(Console.ReadLine());
if (num == 1) { Console.WriteLine("one"); }
else if (num == 2) { Console.WriteLine("two"); }
else if (num == 3) { Console.WriteLine("three"); } // TODO: add more checks
else { Console.WriteLine("number too big"); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/614#0

Задача: Бонус точки

Дадено е цяло число – брой точки:

  • Ако числото е до 100 включително, бонус точките са 5

  • Ако числото е по-голямо от 100, бонус точките са 20%

  • Ако числото е по-голямо от 1000, бонус точките са 10%

Допълнителни бонус точки:

  • За четно число -> 1 т.

  • За число, което завършва на 5 -> 2 т.

Да се напише програма, която пресмята бонус точките и общия брой точки след прилагане на бонусите.

Console.Write("Enter score: ");
var num = int.Parse(Console.ReadLine());
var bonusScore = 0.0;
if (num > 1000)
  { bonusScore = num * 0.10; }
else // TODO: write more logic here … 
if (num % 10 == 5)
  { bonusScore += 2; }
else // TODO: write more logic here …
Console.WriteLine("Bonus score: {0}", bonusScore);
Console.WriteLine("Total score: {0}", num + bonusScore);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/614#1

Задача: Сумиране на секунди

Трима спортни състезатели финишират за някакъв брой секунди (между 1 и 50). Да се пресметне сумарното им време във формат "минути:секунди". Секундите да се изведат с водеща нула (2 -> "02", 7 -> "07", 35 -> "35").

var sec1 = int.Parse(Console.ReadLine());
// TODO: Read also sec2 and sec3 …
var secs = sec1 + sec2 + sec3;
var mins = 0;
if (secs >= 120)   // TODO: Repeat this…
{ mins+=2; secs = secs - 120; }
if (secs < 10) { Console.WriteLine(mins + ":" + "0" + secs); }
else { Console.WriteLine(mins + ":" + secs); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/614#2

Задача: Конвертор за мерни единици

Да се напише програма, която преобразува разстояние между посочените в таблицата мерни единици:

var size = double.Parse(Console.ReadLine());
var sourceMetric = Console.ReadLine().ToLower();
var destMetric = Console.ReadLine().ToUpper();
if (sourceMetric == "km") { size = size / 0.001; }
// Check the other metrics: mm, cm, ft, yd, ...
if (destMetric == "ft") { size = size * 3.2808399; }
// Check the other metrics: mm, cm, ft, yd, ...
Console.WriteLine(size + " " + destMetric);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/614#3

Дебъгване

Процес на закачане към изпълнението на програмата, което ни позволява да проследи процеса на изпълнение . Това ни позволява да откриваме грешки (бъгове).

Дебъгване във Visual Studio

  • Натискане на [F10] ще стартира програмата в debug режим.

  • Можем да преминем към следващата стъпка отново [F10]

  • Можем да създаваме [F9] стопери – breakpoints

  • До тях можем директно да стигнем изпозлвайки [F5]

Вложени проверки

Конструкциите if-else могат да се влагат една в друга:

if(condition1)
{
  if(conditio2)
  {
     Console.WriteLine("condition2 is valid");
  }
  else
  {
     Console.WriteLine("condition2 is NOT valid");
  }
  Console.WriteLine("condition1 is valid");
}

Задача: Обръщение според възраст и пол

Според въведени възраст и пол (m / f) да се отпечата обръщение:

  • Mr. – мъж (пол m) на 16 или повече години

  • Master – момче (пол m) под 16 години

  • Ms. – жена (пол f) на 16 или повече години

  • Miss – момиче (пол f) под 16 години

var age = double.Parse(Console.ReadLine());
var gender = Console.ReadLine();
if (gender == "f")
{
   if (age < 16) { Console.WriteLine("Miss"); }
   else { Console.WriteLine("Ms."); }
}
else
{
   if (age < 16) { Console.WriteLine("Master"); }
   else { Console.WriteLine("Mr."); }
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#0

Задача: Квартално магазинче

Предприемчив българин отваря по едно квартално магазинче в няколко града с различни цени за следните продукти:

city / product
coffee
water
beer
sweets
peanuts

Sofia

0.5

0.8

1.2

1.45

1.6

Plovdiv

0.4

0.7

1.15

1.3

1.5

Varna

0.45

0.7

1.1

1.35

1.55

var product = Console.ReadLine().ToLower();
var town = Console.ReadLine().ToLower();
var quantity = double.Parse(Console.ReadLine());
if (town == "sofia")
{
   if (product == "coffee") 
      { Console.WriteLine(0.50 * quantity); }
  // TODO: finish this ...
}
if (town == "varna") {}   // TODO: finish this …
if (town == "plovdiv") {} // TODO: finish this …

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#1

Логическо "И"

Логическо "И" (оператор &&) означава няколко условия да са изпълнени едновременно:

if (x >= x1 && x <= x2 && y >= y1 && y <= y2) …
  • Пример: проверка дали точка {x, y} се намира вътре в правоъгълника {x1, y1} – {x2, y2}

  • Необходимо е точката {x, y} да е: надясно от x1 и наляво от x2 и надолу от y1 и нагоре от y2

Задача: Точка в правоъгълник

Точка е вътрешна за даден правоъгълник, ако е: надясно от лявата му страна, наляво то дясната му страна, надолу от горната му страна и нагоре от долната му страна:

var x1 = double.Parse(Console.ReadLine());
var y1 = double.Parse(Console.ReadLine());
// TODO: finish this for x2,y2,x,y
if (x >= x1 && x <= x2 && y >= y1 && y <= y2) { Console.WriteLine("Inside"); }
else { Console.WriteLine("Outside"); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#2

Логическо "ИЛИ"

Логическо "ИЛИ" (оператор ||) означава да е изпълнено поне едно измежду няколко условия:

if (s == "banana" || s == "apple" || s == "kiwi") Console.WriteLine("fruit");

Задача: плод или зеленчук?

  • Плодовете "fruit" са: banana, apple, kiwi, cherry, lemon, grapes

  • Зеленчуците "vegetable" са: tomato, cucumber, pepper, carrot

  • Всички останали са "unknown"

var s = Console.ReadLine();
if (s == "banana" || s == "apple" || s == "kiwi" || s == "cherry" || s == "lemon" || s == "grapes") { Console.WriteLine("fruit"); }
else if (s == "tomato" || s == "cucumber" || s == "pepper" || s == "carrot") { Console.WriteLine("vegetable"); }
else  { Console.WriteLine("unknown"); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#3

Логическо отрицание

Логическо отрицание (оператор !) означава да не е изпълнено дадено условиe.

Пример: Дадено число е валидно, ако е в диапазона [100 ... 200] или е 0. Да се направи проверка за невалидно число.

var inRange = (num >= 100 && num <= 200) || num == 0;
if (!inRange) { Console.WriteLine("invalid"); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#4

По-сложни логически условия

Точка лежи върху някоя от страните на правоъгълник, ако:

  • x съвпада с x1 или x2 и същевременно y е между y1 и y2 или

  • y съвпада с y1 или y2 и същевременно x е между x1 и x2

if (((x == x1 || x == x2) && (y >= y1) && (y <= y2)) || ((y == y1 || y == y2) && (x >= x1) && (x <= x2))) { Console.WriteLine("Border"); }
else { Console.WriteLine("Inside / Outside"); }

Опростяване на логически условия

Предходното условие може да се опрости ето така:

var onLeftSide = (x == x1) && (y >= y1) && (y <= y2);
var onRightSide = (x == x2) && (y >= y1) && (y <= y2);
var onUpSide = (y == y1) && (x >= x1) && (x <= x2);
var onDownSide = (y == y2) && (x >= x1) && (x <= x2);
if (onLeftSide || onRightSide || onUpSide || onDownSide) { Console.WriteLine("Border"); }
else { Console.WriteLine("Inside / Outside"); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#5

Условна конструкция switch-case

Switch-case работи като поредица if-else-if-else

Пример: Принтирайте деня от седмицата (на английски) според въведеното число (1 ... 7)

int day = int.Parse(Console.ReadLine());
switch (day)
{
  case 1: Console.WriteLine("Monday"); break;
  case 2: Console.WriteLine("Tuesday"); break;
  ...
  case 7: Console.WriteLine("Sunday"); break;
  default: Console.WriteLine("Error"); break;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#6

Множество етикети в switch-case

Напишете програма, която принтира вида на животно според името му: dog -> mammal; crocodile, tortoise, snake -> reptile; others -> unknown

switch (animal)
{
  case "dog": Console.WriteLine("mammal"); break;
  case "crocodile":
  case "tortoise":
  case "snake": Console.WriteLine("reptile"); break;
  default: Console.WriteLine("unknown"); break;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/615#7

4. Повторения (цикли)

Повторения (цикли)

В програмирането често пъти се налага да изпълним блок с команди няколко пъти. За целта използваме for цикъл:

for (var i = 1; i <= 10; i++)
{
    Console.WriteLine("i = " + i);
}

Пример: числа от 1 до 100

Да се напише програма, която печата числата от 1 до 100:

for (var i = 1; i <= 100; i++)
{
   Console.WriteLine(i);
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#0

Пример: числа до 1000, завършващи на 7

Да се напише програма, която намира всички числа в интервала [1 ... 1000], които завършват на 7:

for (var i = 0; i <= 1000; i++)
{
   if (i % 10 == 7)
   {
      Console.Write(i + " ");
   }
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#1

Пример: всички латински букви

Да се напише програма, която отпечатва буквите от латинската азбука: a ... z. For-циклите работят не само с числа, може и с букви:

Console.Write("Latin alphabet:");
for (var letter = 'a'; letter <= 'z'; letter++)
{
   Console.Write(" " + letter);
}
Console.WriteLine();

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#2

Пример: сумиране на числа

Да се напише програма, която въвежда n числа и ги сумира. От първия ред на входа се въвежда броят числа n. От следващите n реда се въвежда по едно число. Числата се сумират и накрая се отпечатва резултатът.

Console.Write("n = ");
var n = int.Parse(Console.ReadLine());
Console.WriteLine("Enter the numbers:");
var sum = 0;
for (var i = 0; i < n; i++)
{
   var num = int.Parse(Console.ReadLine());
   sum = sum + num;
}
Console.WriteLine("sum = " + sum);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#3

Пример: най-голямо число

Да се напише програма, която въвежда n числа и намира най-голямото измежду тях. От първия ред на входа въвежда броя числа n. От следващите n реда се въвежда по едно число.

Console.Write("n = ");
var n = int.Parse(Console.ReadLine());
var max = -10000000000000;
for (var i = 1; i <= n; i++)
{
   var num = int.Parse(Console.ReadLine());
   if (num > max)
      max = num;
}
Console.WriteLine("max = " + max);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#4

Пример: най-малко число

Да се напише програма, която въвежда n числа и намира най-малкото измежду тях. Въвежда първо броя числа n, след тях още n числа.

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#5

Задача: лява и дясна сума

Да се напише програма, която въвежда 2*n числа. Проверява дали сумите на левите n и десните n числа са равни. При равенство печата "Yes" + сумата; иначе печата "No" + разликата (изчислена като положително число).

var n = int.Parse(Console.ReadLine());
var leftSum = 0;
for (var i = 0; i < n; i++)
  { leftSum = leftSum + int.Parse(Console.ReadLine()); }
// TODO: read and calculate the rightSum
if (leftSum == rightSum)
  { Console.WriteLine("Yes, sum = " + leftSum); }
else
  { Console.WriteLine("No, diff = " + 
    			Math.Abs(rightSum - leftSum)); }

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#6

Задача: четна / нечетна сума

Да се напише програма, която въвежда n числа. Проверява дали сумата на числата на четни позиции е равна на сумата на числата на нечетни позиции. При равенство печата "Yes" + сумата; иначе печата "No" + разликата (положително число).

var n = int.Parse(Console.ReadLine());
var oddSum = 0;
var evenSum = 0;
for (var i = 0; i < n; i++)
{
  var element = int.Parse(Console.ReadLine());
  if (i % 2 == 0) oddSum += element;
  else evenSum += element;
}
// TODO: print the sum / difference

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/616#7

Правоъгълник от 10 x 10 звездички

Да се начертае на конзолата правоъгълник от 10 x 10 звездички:

for (var i = 1; i <= 10; i++)
{
   Console.WriteLine(new string('*', 10));
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/617#0

Правоъгълник от N x N звездички

Да се начертае на конзолата правоъгълник от N x N звездички:

int n = int.Parse(Console.ReadLine());
for (var i = 1; i <= n; i++)
{
   Console.WriteLine(new string('*', n));
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/617#1

Вложени цикли

Вложени цикли = цикъл съдържа в себе си друг цикъл. Двата цикъла въртят различни променливи. Пример: външен цикъл (по row) и вътрешен цикъл (по col).

for (var row = 1; row <= n; row++)
{
   for (var col = 1; col <= n; col++)
      Console.Write("*");
   Console.WriteLine();
}

Квадрат от звездички

Да се начертае на конзолата квадрат от N x N звездички:

var n = int.Parse(Console.ReadLine());
for (var r = 1; r <= n; r++)
{
   Console.Write("*");
   for (var c = 1; c < n; c++) Console.Write(" *");
   Console.WriteLine();
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/617#2

Триъгълник от долари

Да се начертае триъгълник от долари с размер n:

var n = int.Parse(Console.ReadLine());
for (var row = 1; row <= n; row++)
{
   Console.Write("$");
   for (var col = 1; col < row; col++)
      Console.Write(" $");
   Console.WriteLine();
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/617#3

Квадратна рамка

Да се начертае на конзолата квадратна рамка с размер n:

// Print the top row: + - - - +
Console.Write("+");
for (int i = 0; i < n-2; i++)
   Console.Write(" -");
Console.WriteLine(" +");
for (int row = 0; row < n - 2; row++)
   // TODO: print the mid rows: | - - - |
// TODO: print the bottom row: + - - - +

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/617#4

Ромбче от звездички

Да се начертае ромбче от звездички с размер n:

for (var row = 1; row <= n; row++)
{
    for (var col = 1; col <= n-row; col++)  Console.Write(" ");
    Console.Write("*");
    for (var col = 1; col < row; col++) Console.Write(" *");
    Console.WriteLine();
}
// TODO: print the down side of the rhomb

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/617#5

Коледна елха

Напишете програма, която въвежда число n (1 ≤ n ≤ 100) и печата коледна елха с размер n:

var n = int.Parse(Console.ReadLine());
for (int i = 0; i <= n; i++)
{
   var stars = new string('*', i);
   var spaces = new string(' ', n - i);
   Console.Write(spaces);
   Console.Write(stars);
   Console.Write(" | ");
   Console.Write(stars);
   Console.WriteLine(spaces);
}

Пращане на решения: https://judge.softuni.bg/Contests/Practice/Index/617#6

Слънчеви очила

Напишете програма, която въвежда цяло число n (3 ≤ n ≤ 100) и печата слънчеви очила с размер 5*n x n :

// Print the top part
Console.Write(new string('*', 2 * n));
Console.Write(new string(' ', n));
Console.WriteLine(new string('*', 2 * n));
for (int i = 0; i < n - 2; i++)
{
   // TODO: print the middle part
}
// Print the bottom part
Console.Write(new string('*', 2 * n));
Console.Write(new string(' ', n));
Console.WriteLine(new string('*', 2 * n));
// Print the middle part
for (int i = 0; i < n - 2; i++)
{
   // TODO: print *///////*
   if (i == (n-1) / 2 - 1) Console.Write(new string('|', n));
   else Console.Write(new string(' ', n));
   // TODO: print *///////*
   Console.WriteLine();
}

Пращане на решения: https://judge.softuni.bg/Contests/Practice/Index/617#7

Къщичка

Напишете програма, която въвежда число n (2 ≤ n ≤ 100) и печата къщичка с размер n x n:

var stars = 1;
if (n % 2 == 0) stars++;
for (int i = 0; i < (n+1) / 2; i++)
{ // Draw the roof
  var padding = (n - stars) / 2);
  Console.Write(new string('-', padding);
  Console.Write(new string('*', stars));
  Console.WriteLine(new string('-', padding);
  stars = stars + 2;
}
for (int i = 0; i < n / 2; i++)
{ // Draw the house body: |*****| }

Пращане на решения: https://judge.softuni.bg/Contests/Practice/Index/617#8

Диамант

Напишете програма, която въвежда цяло число n (1 ≤ n ≤ 100) и печата диамант с размер n:

var leftRight = (n - 1) / 2;
for (int i = 1; i <= (n-1) / 2; i++)
{ // Draw the top part
  Console.Write(new string('-', leftRight));
  Console.Write("*");
  var mid = n - 2 * leftRight - 2;
  if (mid >= 0)
  {
    Console.Write(new string('-', mid));
    Console.Write("*");
  }
  Console.WriteLine(new string('-', leftRight));
  leftRight--;
} // TODO: Draw the bottom part

Пращане на решения: https://judge.softuni.bg/Contests/Practice/Index/617#9

Числата от 1 до N през 3

Да се отпечатат числата от 1 до n със стъпка 3

var n = int.Parse(Console.ReadLine());
for (var i = 1; i <= n; i+=3)
{
   Console.WriteLine(i);
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#0

Числата от N до 1 в обратен ред

Да се отпечатат числата от n до 1 в обратен ред (стъпка -1)

var n = int.Parse(Console.ReadLine());
for (var i = n; i >= 1; i-=1)
{
  Console.WriteLine(i);
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#1

Числата от 1 до 2^n с for-цикъл

Да се отпечатат числата от 1 до 2^n

var num = 1;
for (var i = 0; i <= n; i++)
{
   Console.WriteLine(num);
   num = num * 2;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#2

Четни степени на 2

Да се отпечатат четните степени на 2 до 2^n

var num = 1;
for (var i = 0; i <= n; i+=2)
{
   Console.WriteLine(num);
   num = num * 2 * 2;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#3

Редица числа 2k+1

Да се отпечатат всички числа ≤ n от редицата: 1, 3, 7, 15, 31, ...

var num = 1;
while (num <= n)
{
   Console.WriteLine(num);
   num = 2 * num + 1;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#4

Число в диапазона [1 ... 100]

Да се въведе число в диапазона [1 ... 100]

var num = int.Parse(Console.ReadLine());
while (num < 1 || num > 100)
{
   Console.WriteLine("Invalid number!");
   num = int.Parse(Console.ReadLine());
}
Console.WriteLine("The number is: {0}", num);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#5

Най-голям общ делител (НОД)

Най-голям общ делител (НОД) на две естествени числа a и b е най-голямото число, което дели едновременно a и b без остатък.

Да се въведат цели числа a и b и да се намери НОД(a, b):

var a = int.Parse(Console.ReadLine());
var b = int.Parse(Console.ReadLine());
while (b != 0)
{
   var oldB = b;
   b = a % b;
   a = oldB;
}
Console.WriteLine("GCD = {0}", a);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/619#6

Изчисляване на факториел

За естествено число n да се изчисли n! = 1 * 2 * 3 * ... * n

var n = int.Parse(Console.ReadLine());
var fact = 1;
do
{
   fact = fact * n;
   n--;
} while (n > 1);
Console.WriteLine(fact);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#0

Сумиране на цифрите на число

Да се сумират цифрите на цяло положително число n.

var n = int.Parse(Console.ReadLine());
var sum = 0;
do
{
   sum = sum + (n % 10);
   n = n / 10;
} while (n > 0);
Console.WriteLine("Sum of digits: {0}", sum);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#1

Безкраен цикъл

Безкраен цикъл е когато повтаряме нещо до безкрайност:

while(true)
{
   Console.WriteLine("Infinite loop");
}

Пример:

for (;;)
{
   Console.WriteLine("Infinite loop");
}

Прости числа

  • Едно число n е просто, ако се дели единствено на 1 и n

  • Едно число n е просто, ако се дели на число между 2 и n-1

Алгоритъм за проверка дали число е просто:

  • Проверяваме дали n се дели на 2, 3, ..., n-1

  • Ако се раздели, значи е композитно

  • Ако не се раздели, значи е просто

Проверка за просто число. Оператор break

var n = int.Parse(Console.ReadLine());
var prime = true;
for (var i = 2; i <= Math.Sqrt(n); i++)
{
   if (n % i == 0) 
   {
      prime = false;
      break;
   }
}
if (prime) Console.WriteLine("Prime");
else Console.WriteLine("Not prime");

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#2

Оператор break в безкраен цикъл

Да се напише програма, която въвежда четно число. При невалидно число да връща към повторно въвеждане.

var n = 0;
while (true)
{
   Console.Write("Enter even number: ");
   n = int.Parse(Console.ReadLine());
   if (n % 2 == 0) break; // even number -> exit from the loop
   Console.WriteLine("The number is not even.");
}
Console.WriteLine("Even number entered: {0}", n);

Справяне с грешни числа: try … catch

try
{
   Console.Write("Enter even number: ");
   n = int.Parse(Console.ReadLine());
   if (n % 2 == 0) break;
   Console.WriteLine("The number is not even.");
}
catch
{
   Console.WriteLine("Invalid number.");
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#3

Числа на Фибоначи

Числата на Фибоначи са следните: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... F(n) = F(n-2) + F(n-1). Да се въведе n и да се пресметна n-тото число на Фибоначи

var n = int.Parse(Console.ReadLine());
var f0 = 1;
var f1 = 1;
for (var i = 0; i < n-1; i++)
{
   var fNext = f0 + f1;
   f0 = f1;
   f1 = fNext;
}
Console.WriteLine(f1);

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#4

Пирамида от числа

Да се отпечатат числата 1 ... n в пирамида:

var n = int.Parse(Console.ReadLine());
var num = 1;
for (var row = 1; row <= n; row++)
{
    for (var col = 1; col <= row; col++)
    {
        if (col > 1) Console.Write(" ");
        Console.Write(num);
        num++;
        if (num > n) break;
    }
    Console.WriteLine();
    if (num > n) break;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#5

Таблица с числа

Да се отпечатат числата 1 ... n в таблица:

var n = int.Parse(Console.ReadLine());
for (int row = 0; row < n; row++)
{
   for (int col = 0; col < n; col++)
   {
      var num = row + col + 1;
      if (num > n) num = 2 * n - num;
      Console.Write(num + " ");
   }
   Console.WriteLine();
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/620#6

5. Подпрограми (функции и методи)

Прости Методи

Методите са именувано парче код, което може да се извика. Деклариране на прост метод:

static void PrintHeader()
{
   Console.WriteLine("----------");
}

Извикване на метода няколко пъти:

PrintHeader();
PrintHeader();

Защо да използваме методи?

Управляваме процеса на програмиране

  • Разделяме големи програми на малки части

  • По-добра организация на програмата ни

  • Подобрява четимостта на кода

  • Подобрява разбираемостта на кода

Избягваме повторението на програмен код

  • Подобрява поддръжката на кода

Преизползваемост на кода

  • Използване на съществуващи методи няколко пъти

Деклариране на методи

  • В C#, методите се декларират вътре в клас

  • Main() също е метод

  • Декларираните променливи са локални

Извикване на метод

Методите могат да бъдат извикани чрез името им

static void PrintHeader()
{
   Console.WriteLine("----------");
}

Извикване на метод:

static void Main()
{
    PrintHeader();
}

Метод може да бъде извикан от:

  • Главният метод – Main()

  • Някой друг метод

  • Собственото си тяло – Рекурсия

Задача: Празна касова бележка

Да се напише метод, който печата празна касова бележка:

  • Направете 3 метода които принтират всяка част

  • Копирайте съдържанието от предишния слайд

  • Използвайте знака "\u00A9" за символът ©

  • Направете метод PrintReceipt(), който вика трита метода

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/621#0

Използване на параметри

Параметрите могат да бъдат всеки тип данни

static void PrintNumbers(int start, int end)
{
    for (int i = start; i <= end; i++)
    {
        Console.Write("{0} ", i);
    }
}

Извикване на метод с конкретни стойности

static void Main()
{
    PrintNumbers(5, 10);
}
  • Можем да подаваме нула или няколко параметъра

  • Параметрите могат да бъдат от различни типове

  • Всеки параметър има име и тип

static void PrintStudent(string name, int age, double grade)
{
    Console.Write("Student: {0}; Age: {1}, Grade: {2}", name, age, grade);
}

Задача: Знак на цяло число

Да се създаде метод, който печата знака на цяло число n:

static void PrintSign(int number)
{
    if (number > 0)  Console.WriteLine("The number {0} is positive", number);
    else if (number < 0) Console.WriteLine("The number {0} is negative.", number);
    else Console.WriteLine("The number {0} is zero.", number);
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/621#1

Задача: Принтиране на триъгълник

Да се създаде метод, който принтира триъгълник.

Първо създайте метод, който принтира един ред, състоящ се от числа в диапазон от определено начало до определен край:

static void PrintLine(int start, int end)
{
    for (int i = start; i <= end; i++)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();
}

После създайте метод, който принтира първата и после втората половина на триъгълника:

static void PrintTriangle(int n)
{
    for (int line = 1; line <= n; line++)
    {
        PrintLine(1, line);
    }
 
    for (int line = n - 1; line >= 1; line--)
    {
        PrintLine(1, line);
    }
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/621#2

Задача: Рисуване на запълнен квадрат

Нарисувайте на конзолата запълнен квадрат със страна n

static void PrintHeaderRow(int n)
{  
   Console.WriteLine(  new string('-', 2 * n)); 
}
static void PrintMiddleRow(int n)
{
   Console.Write('-');
   for (int i = 1; i < n; i++) Console.Write("\\/");
  Console.WriteLine('-');
}
static void Main() 
{
  int n = // TODO: read n
  PrintHeaderRow(n);
  for (int i = 0; i < n - 2; i++) PrintMiddleRow(n);
  PrintHeaderRow(n);
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/621#3

Типове на връщаната от метода стойност

Тип void – не връща никаква стойност (само изпълнява кода)

static void AddOne(int n) 
{
    n += 1;
    Console.WriteLine(n);
}

Други типове – връщат стойност от тип,съвместим с типа на метода

static int PlusOne(int n) 
{
    return n + 1;
}

Оператор Return

  • Веднага спира изпълнението на метода

  • Връща определената стойност

static string ReadFullName() 
{
    string firstName = Console.ReadLine();
    string lastName = Console.ReadLine();
    return firstName + " " + lastName;
}

void методите могат да бъдат спрени с използване на return;

Употреба на връщаната стойност

Стойностите могат да се:

Присвояват на променлива:

int max = GetMax(5, 10);

Използват в изрази:

decimal total = GetPrice() * quantity * 1.20m;

Предават директно на друг метод:

int age = int.Parse(Console.ReadLine());

Пример: превръщане на температура

Превърнете температурата от Фаренхайт в Целзий

static double FahrenheitToCelsius(double degrees)
{
    double celsius = (degrees - 32) * 5 / 9;
    return celsius;
}
static void Main()
{
    Console.Write("Temperature in Fahrenheit: ");
    double t = Double.Parse(Console.ReadLine());
    t = FahrenheitToCelsius(t);
    Console.Write("Temperature in Celsius: {0}", t);
}

Задача: Лице на триъгълник

Да се напише метод, който изчислява лицето на триъгълник по дадени основа и височина и връща стойността му.

static double GetTriangleArea(double width, double height)
{
    return width * height / 2;
}
static void Main()
{
    double width = double.Parse(Console.ReadLine());
    double height = double.Parse(Console.ReadLine());
    Console.WriteLine(GetTriangleArea(width, height));
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/622#0

Задача: Степен на число

Да се напише метод, който изчислява и връща резултата от повдигането на число на дадена степен:

static double RaiseToPower(double number, int power)
{
    double result = 1;
    for (int i = 0; i < power; i++)
    {
        result *= number;
    }
    return result;
}

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/622#1

Сигнатура на метода

  • Комбинацията от име и параметри се нарича сигнатура на метод.

  • Сигнатурата се използва за разграничаване между методи с едно и също име.

  • Методи с едно и също име, но различна сигнатура се наричат варианти на метод.

Варианти на методи

Можем да използваме едно име на няколко метода с различни сигнатури (име и параметри на метод)

static void Print(string text);
static void Print(int number);
static void Print(string text, int number);

Сигнатура и тип на връщаната стойност

Типът на връщаната стойност не е част от сигнатурата

static void Print(string text)
{
    Console.WriteLine(text);
}
static string Print(string text)
{
    return text;
}

Компилаторът не би могъл да прецени кой от двата метода да изпълни.

Изпълнение на програма

Изпълнението се продължава след извикване на метод:

static void Main()
{
	Console.WriteLine("before method executes");
	PrintLogo();
	Console.WriteLine("after method executes")
}
static void PrintLogo()
{
    Console.WriteLine("Company Logo");
	Console.WriteLine("http://wwww.companywebsite.com")
}

Задача: Умножение на четна и нечетна сума

Да се напише програма, която умножава сумата от всички четни цифри на число и сумата на всички нечетни цифри на същото число:

  • Направете метод GetMultipleOfEvensAndOdds()

  • Направете методи GetSumOfEvenDigits() и GetSumOfOddDigits()

  • Използвайте Math.Abs() за негативните числа

Тестване на решението: https://judge.softuni.bg/Contests/Practice/Index/622#3

Last updated

Was this helpful?