Линк къ for цикъл - • For и foreach цикъл за...
линк към while цикъл - • While цикъл за 15 мину...
Да си представим, че гледаме влак, който пренасся въглища. Той има един или повече вагони. Да се концентрираме върху вагоните. Може да имаме 2, може да 10, а може и да са 20.
Ако искаме да видим какво държи конкретен вагон - в случая бройката въглища, трябва да сме наясно с номерацията му (индексацията му). Тоест винаги първия вагон започва с номер 0, втория е с номер 1, третия с номер 2.
Ако имаме 20 вагона до колко ще стигне номерацията на 20-тия. n-1, където n е бройката на вагоните. И сега ако исаме да кажем бройката на елементите в във влак с 4 вагона с въглища в третия вагон (от ляво на дясно) в C# ще го изразим така:
int[] carriages = { 5, 7, 98, 803 };
Console.WriteLine(carriages[2]);
Защо казваме carriages[2]? Защото искаме 3-тия вагон от ляво надясно и неговата номерация е 2, защото номерациите на вагоните започва от 0.
Ако искаме първоначално вагоните да са празни и ние да сипваме въглища как би станало това?
int[] carriages = new int[4];
В примера заделяме масив с размер 4 елемента от тип int. Това означава, че в динамичната памет се заделя участък от 4 последователни цели числа, които се инициализират със стойност 0
Как можем да ги напълним. Ами един по един, както бихме го направили и в живота. Започваме от първия, който е с номерация 0 (индекс), втория и т.н:
int[] carriages = new int[4];
carriages[0] = 10;
carriages[1] = 5;
carriages[2] = 506;
carriages[3] = 123;
Ако искаме да видим какво има в целия масив - нека пробваме да го изпечатаме на конзолата
int[] carriages = new int[4];
carriages[0] = 10;
carriages[1] = 5;
carriages[2] = 506;
carriages[3] = 123;
Console.WriteLine(carriages);
Отговорът на конзолата е:
System.Int32[]
Press any key to continue . . .
в първия момент не сме на ясно, но ако прочетем по внимателно виждаме, че ни връща типа на променливата - инт 32 и то масив (масива се обозначава с [] скоби)
Можем да изпечатаме елементите на масива по няколко начина:
1. с обхождане на елементите с цикъл
for (int i = 0; i < carriages.Length; i++)
{
Console.Write($"{carriages[i]} ");
}
Тук завъртаме от 0 (стартиращия индекс на вагоните) и завършваме до дължината на вагоните -1 т.е. 4-1=3 (минус едно е, защото само когато е по малко стига до цифрата -1)
2. втория начин да ги изпечатаме е по-кратък:
Console.WriteLine(string.Join(", ", carriages));
тук викаме метода join на стринга и му подаваме два аргумента - първия е по какво да раздели елементите, а втория е елементите на коя колекция, т.е. самата колекция (carriages).
Първия начин има още една уловка:
for (int i = 0; i < = carriages.Length; i++)
{
Console.Write($"{carriages[i]} ");
}
Изписано по този начин ще изпечата следното на конолата:
10 5 506 123
Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Program.Main(String[] args) in \demo_version_2\demo_version_2\Program.cs:line 17
Започва цикъла и минава през 0,1,2 и 3 индекс и печата бройката вътре, но тъйкато сме казали до дължината на масива (4) включително (заради равното) то се опитва да намери вагон с номерация 4 но не може тъй като те са само до 3 и гърми с System.IndexOutOfRangeException: Index was outside the bounds of the array. което ще рече - извън границите на масива си.
Можем ли да обходим вече напълнени вагони и да добавим или махнем от тях бройка въглища?
int[] carriages = { 10, 8, 15, 6};
for (int i = 0; i < carriages.Length; i++)
{
carriages[i] += 10;
}
Console.WriteLine(string.Join(" ", carriages));
Има и друг начин за обхождане на масив:
int[] carriages = { 10, 8, 15, 6};
foreach (int item in carriages)
{
Console.WriteLine(item);
}
Проблема тук, обаче е ако искаме да добавяме:
int[] carriages = { 10, 8, 15, 6};
foreach (int item in carriages)
{
item += 2;
}
Този пример е невалиден, тъй като във foreach не можем да променяме елементите, можем само да ги четем.
Ако искаме да четем от конзола елементи на масива например разделени със разстояние ще кажем така
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int[] carriages = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
Console.WriteLine(string.Join(" ", carriages));
}
}
задължително трябва да импортнем using System.Linq; защото методите .ToArray() и Select() ще ни се подчертават от конзолата.
23 авг 2024