Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Русский_Проект: Изучение Visual Basic C#. Учебный курс


C#. Учебный курс

Здравствуйте, программисты! Во первых с Наступающим Новым годом! Сегодня у нас последний выпуск рассылки в этом году. Это уже девятое занятие, на котором мы познакомимся с управляющим оператором for.

Цикл for

Если вам точно известно, сколько раз необходимо выполнить определенный блок кода, то цикл for — это то, что вам нужно. В C# этот цикл работает точно так же, как в C++ и Java. Самый простой синтаксис цикла for:

for (инициализатор; условие; итератор) оператор;

Оператор for начинается словом for, за которыми идут скобки. В скобках содержатся три выражения (инициализатор, условие, итератор), разделенные точками с запятой. Цикл for повторяется до тех пор, пока в результате проверки выражения условия будет возвращаться значение true. Если будет возвращено значение false, цикл завершится и управление перейдет к следующему оператору после цикла for. Следует отметить, что в цикле for выражение условия всегда проверяется в начале цикла. Таким образом, если выражение условия принимает значение false, то код внутри цикла не будет выполнен ни разу.

Инициализатор - здесь присваивается переменной цикла некоторое начальное значение цикла (инициализация). Далее мы задаем условие. Условие является булевым выражением, проверяющим переменную цикла. Если в результате проверки возвращается true, то цикл for продолжает свою работу, иначе цикл прекращает свою работу и передают управление следующему за циклом оператору. Итератор определяет, как изменяется переменная цикла при каждом выполнении цикла. Пора продемонстрировать это на примере.

Предположим вам надо вывести на экран числа от 1 до 10, увеличивая каждый раз число на единицу:

// Цикл for
class ForDemo 
{
     public static void Main() 
    {
        // выводим числа от 1 до 10
        for (int counter = 0; counter < 10; counter++)
        {
            System.Console.WriteLine(counter + 1);
        }
        System.Console.WriteLine("Цикл завершен");
    }
} 

Разберем цикл подробнее. Первое выражение (инициализатор) выполняется один раз до начала цикла. В нашем примере counter является переменной цикла. Первоначально ей задается значение 0. В начале каждого повторения цикла, включая первое, выполняется проверка условия counter < 10. Если условие истинно, то выполняется оператор WriteLine, а затем инициализируется третья часть цикла counter++. В большинстве случаев для переменной цикла используется простой оператор присваивания. В нашем случае это int counter = 0. Но можно использовать и несколько операторов присваивания, разделив их запятыми:

for (i = 0, j = 3; ...

Второе выражение цикла (условие) должно быть булевым. Это булево выражение вычисляется перед каждой итерацией цикла, включая самую первую. Напомним еще раз, что если это выражение равно true, то операторы внутри скобок выполняются. Соответственно, если равно false, то выполнение продолжится с оператора, расположенного за закрывающей фигурной скобкой цикла. Таким образом, если условие в цикле с самого начала будет равно false, операторы цикла for не будут выполнены никогда:

for(int i = 3; i < 1; i++)
{
    // этот оператор никогда не будет выполнен, т.к. 3 не может быть меньше 1
    System.Console.WriteLine(i + 1);
}

Третий оператор (итератор) обычно выполняется в конце каждой итерации (ИТЕРАЦИЯ — повторное применение какой-либо математической операции). Здесь также можно использовать несколько выражений, разделенных запятыми:

for(int i = 1, j = 30; i < j; i++, j -= 5)
{
    System.Console.WriteLine(i + " " + j);
}

В этом примере мы инициализируем две переменные, задаем условие и меняем значения этих переменных в конце каждой итерации цикла.

Впрочем, не обязательно пихать все выражения в один цикл. Например, предыдущий пример можно переписать по другому:

int j = 30;
        
for(int i = 1; i < j; i++)
{
    System.Console.WriteLine(i + " " + j);
    j -= 5;
}

Для большинства данный пример более понятен и нагляден.

А теперь внимание! Оператор for обязательно должен иметь точки с запятыми, а инициализатор, условие и итератор можно и не использовать!

for( ; ;)
{
    // ваши операторы
}

Теперь перейдем к небольшим хитростям. Во-первых, вы видели, что можно объявлять переменную прямо в инициализаторе. Однако, вы не сможете объявлять переменную с таким же именем в родительском контексте.

// работать не будет
int i = 30;
        
for(int i = 3; i < 10; i++)
{
    System.Console.WriteLine(i+1);
}

Но вы можете использовать это же имя в других циклах.

Следующая тонкость - вы можете инициализировать несколько переменных, но нельзя инициализировать одну переменную и объявлять другую:

for (i = 0, int j =1; ... //нельзя!!!

Также нельзя объявлять переменных разных типов.

Цикл for часто используют при работе с массивами. Предположим, что astr - это массив строк. Чтобы отобразить все элементы массива, используют следующую конструкцию:

string[] astr = {"c","a","t"};
        
for(int i = 0; i < astr.Length; i++)
{
    System.Console.WriteLine(astr[i]);
}

Вы можете ставить сложные условия на прерывание цикла, создавать бесконечные циклы и использовать ключевые слова goto, continue и break.

Пример для практики

Чтобы закрепить материал, давайте еще раз вспомним оператор if и напишем пример, использующий оба управляющих оператора. Суть примера - вывести на экран числа от 1 до 30, при этом после каждой десятой строки будем вставлять пустую строку.

// Циклы for и if
class ForAndIf 
{
     public static void Main() 
    {
        // выводим числа от 1 до 30
        for (int counter = 1; counter <= 30; counter++)
        {
            System.Console.WriteLine(counter);
            
            if(counter % 10 == 0)  // после каждой десятой строки выводим пустую 

строку
            {
                System.Console.WriteLine();
            } // конец if
        } // Конец for
    }
}

Можно не только увеличивать переменую цикла, но и уменьшать ее значение.

Циклы, не имеющие тела

Тело цикла for (или любого другого цикла) может быть пустым. Это возможно, потому что нулевой оператор синтаксически является действительным. Например, напишем программу суммирования чисел от 1 до 5

Листинг

В результате мы получим на экране строку

Сумма равна 15

Как видите, вычисление производится полностью в пределах оператора for. Особое внимание обратите на итерационное выражение

sum += i++

Данный оператор аналогичен последовательности операторов

sum = sum + i;
i++;

Бесконечный цикл

Можно написать бесконечный цикл

for(;;)

На практике такой цикл редко применяется, поэтому рассматривать не будем.

Замена обоев на Рабочем столе

Следующая информация предназначена в первую очередь для зарегистрированных пользователей справочника по функциям Windows API в .NET Framework. Как правило, описание каждой функции сопровождается простеньким примеров. Но вот подумал, а может иногда есть смысл не просто приводить пример, а написать небольшую статью, в которой описывается применение той или иной функции. На эту мысль меня натолкнула одна статься у Microsoft. Я решил попровать использовать этот же способ в справочнике. Вот предлагаю с небольшими сокращениями эту статью.

В этом примере показано, как выбрать любую картинку и установить ее в качестве обоев Рабочего стола.

Созданное приложение позволит нам выбрать картинку, просмотреть ее и выбрать стиль для Рабочего стола (замостить, растянуть, или расположить по центру), и установить картинку в качестве обоев. Пример доступен как для C# так и для VB.NET.

Расположите на форме содержит кнопку для выбора картинки (Button), кнопку для установки обоев (Button), выпадающий список для выбора настроек (ComboBox), а также графический контейнер PictureBox. Также необходимо поместить элементы SplitContainer (разделяющий кнопки и комбинированное окно от картинки) и диалоговое окно открытия файлов.

Немного теории: Обои Рабочего стола могут иметь три стиля отображения картинки. Стиль Замостить выводит картинку в реальном размере, при необходимости размножая ее по горизонтали или вертикали, чтобы заполнить весь экран. Стиль Растянуть растягивает изображение, если оно меньше размеров экрана. И, наконец, стиль По центру помещает картинку в центр экрана. Чтобы обеспечить в программе поддержку всех стилей мы создадим перечисляемый тип. Это позволит нам с легкостью использовать различные стили в программе.

C#
public enum Style : int
{
    Tiled, Centered, Stretched
}

VB Public Enum Style As Integer Tiled Centered Stretched End Enum

Теперь переходим к коду, который непосредственно устанавливает обои для Рабочего стола. Для этого нам необходимо установить путь к файлу с изображением и выбранный стиль. Два значения в реестре устанавливают необходимые параметры в разделе Control Panel\Desktop. Смотря какой стиль был выбран, устанавливается необходимое значение в параметрах WallpaperStyle и TileWallpaper. Используя перечисляемый тип для стилей, мы гарантировано устанавливаем любой из трех возможных стилей.

C#
RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);

switch( style )
{
    case Style.Stretched :
        key.SetValue(@"WallpaperStyle", "2") ; 
        key.SetValue(@"TileWallpaper", "0") ;
        break;

    case Style.Centered :
        key.SetValue(@"WallpaperStyle", "1") ; 
        key.SetValue(@"TileWallpaper", "0") ; 
        break;

    case Style.Tiled :
        key.SetValue(@"WallpaperStyle", "1") ; 
        key.SetValue(@"TileWallpaper", "1") ;
        break;
}

VB Dim key As RegistryKey = My.Computer.Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) Select Case selectedStyle Case Style.Stretched key.SetValue("WallpaperStyle", "2") key.SetValue("TileWallpaper", "0") Case Style.Centered key.SetValue("WallpaperStyle", "1") key.SetValue("TileWallpaper", "0") Case Style.Tiled key.SetValue("WallpaperStyle", "1") key.SetValue("TileWallpaper", "1") End Select

Мы выбрали необходимые настройки для стиля обоев, но нам нужно установить путь к файлу с изображением и вызвать функцию, которая установит выбранную картинку в качестве обоев. Для этого воспользуемся функцией SystemParametersInfo, которая позволяет устанавливать или получать многие параметры системы.

C#
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SystemParametersInfo(
    int uAction, int uParam, string lpvParam, int fuWinIni);

VB <DllImport("user32")> _ Public Shared Function SystemParametersInfo(ByVal uAction As Integer, _ ByVal uParam As Integer, _ ByVal lpvParam As String, _ ByVal fuWinIni As Integer) As Integer End Function

Также необходимо объявить несколько констант для работы с этой функцией.

C#
const int SPI_SETDESKWALLPAPER = 20;
const int SPIF_UPDATEINIFILE = 0x01;
const int SPIF_SENDWININICHANGE = 0x02;

VB Const SPI_SETDESKWALLPAPER As Integer = 20 Const SPIF_UPDATEINIFILE As Integer = &H1& Const SPIF_SENDWININICHANGE As Integer = &H2&

После объявления функции мы можем ее использовать в нашей программе. В нашем случае второй параметр нам не нужен и мы устанавливаем его равным 0. Третий параметр требует полнуть путь к файлу в формате BMP. Четвертый параметр определяет, как изменения должны подействовать на систему.

C#
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE | 

SPIF_SENDWININICHANGE);

VB SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

У нас все готово, чтобы менять обои на Рабочем столе. Пользователь щелкает на кнопке Обзор..., который открывает по умолчанию папку Windows с фильтром *.bmp. В этой папке есть несколько картинок, которые можно использовать в качестве обоев. Выпадающий список связывает перечисляемый тип Style с вызовом метода Enum.GetNames(), который возвращает массив строк, подходящий для списков и итерации.

C#
styleComboBox.DataSource = System.Enum.GetNames(typeof(Wallpaper.Style));

VB styleComboBox.DataSource = System.Enum.GetNames(GetType(Wallpaper.Style))

Когда пользователь щелкает на кнопке Установить, выбранный текст в комбинированном окне связывается с перечисляемым объектом:

C#
(Wallpaper.Style)Enum.Parse(typeof(Wallpaper.Style), styleComboBox.Text)

VB CType(System.Enum.Parse(GetType(Wallpaper.Style), styleComboBox.Text), Wallpaper.Style)

Вы можете улучшить программу. Например, вы можете воспользоваться методом Save() класса Bitmap, чтобы конвертировать картинку из формата JPEG или GIF.

Скачать пример для этой статьи - этой страницы в течении недели.

Удачного вам программирования в Новом 2007 году!


©2006 А.Климов
Русский_Проект

В избранное