Архив за месяц: Март 2012

Занятие 9.Циклические конструкции.Циклы WHILE и DO-WHILE. Уроки программирования для чайников.Язык Си.

Добрый день дорогие друзья.
После долгого перерыва,я снова с вами.
Сегодняшнее занятие будет продолжением занятия номер 7.Циклические конструкции 
Сегодня поговорим о еще двух циклических конструкциях. 
Как уже говорилось ранее,цикл for используется,когда известно сколько раз надо выполнить тело цикла. А что же делать если количество повторений заранее не известно, а есть только условие которое после которого нужно прекратить выполнять цикл. Для этих целей используют циклические конструкции while и do-while. Остановимся на каждом из них поподробнее. 

Цикл while.
Цикл  while называют еще циклом с предусловием. Чаще всего он используется когда неизвестно конкретно сколько раз нужно выполнить тело цикла.
Вот его синтаксис:

Листинг 9.1
while (условие)
    оператор;

Работает эта конструкция следующим образом.

1.Сначала проверяется условие в скобках.
1.1 Если оно истинно, то выполняется тело цикла. (Оператор). И программа снова переходит к проверке условия.  
Напомню,что тело цикла всегда состоит из одного оператора. И если нам нужно использовать несколько операторов, то как и в случае с конструкцией if-else или циклом for, применяется составной оператор {...}.
1.2 Если условие ложно, то выполнение циклической конструкции заканчивается  и программа выполняется дальше.

Заметим, что цикл может не выполниться ни одного раза,если изначально условие будет ложным.
Например:
Листинг 9.2
while (0)
{   ...   }


Цикл do-while.
Цикл do-while называют еще циклом с постусловием. И в этом состоит его основное отличие от цикла while. Сейчас мы разберем его синтаксис, поймем как он работает и увидим как раз в чем разница.

Синтаксис:


Листинг 9.3
do //заголовок цикла
оператор;} // тело цикла 
while (условие); //условие


как видите цикл do-while состоит из 3 частей. Заголовка цикла, тела цикла и условия. 
Работает эта конструкция следующим образом.
1)После того как программа встречает ключевое слово do,она понимает, что имеет дело с циклом do-while. 
2)выполняется тело цикла.
3) Проверяется условие.
3.1) Если условие истинно,то снова выполняется тело цикла.
3.2) Если условие ложно, то работа циклической конструкции заканчивается и программа выполняется дальше.

Обратите внимание, что при использовании цикла do-while, тело цикла выполнится всегда хотя бы один раз! Это очень важная особенность и иногда её очень удобно использовать.


Зацикливание.
Теперь поговорим немного о такой пренеприятнейшей вещи как зацикливание. Зацикливание - это когда программа постоянно выполняет тело цикла и не может из него выйти. Причиной зацикливания всегда является программист. Надо всегда внимательно следить за тем, чтобы работа операторов как-то влияла на условие. 

Напоследок напишем одну маленькую программку.С использованием циклов do-while и while.
Пусть требуется написать программу которая принимает на входе положительное натуральное число, а на выходе выдает сумму цифр этого числа. При этом, надо запретить пользователю вводить отрицательные числа. (защита от дурака). 
Сначала напишем основную часть программы.
Считаем число и  посчитаем сумму его цифр.
Листинг 9.4

#include <stdio.h>

int main()
{
      int A, sum=0;
      printf("Vvedite chislo:");
      scanf("%d",&A); //считываем число

//начинаем последовательно получать каждую последнюю цифру числа. 
      while (A>0)
      {
            sum=sum+A%10;
            A= A/10;
      }
      printf("summa chifr etogo chisla: %dn", sum);

return(0);
}


Эта программа работает. Теперь добавим в неё так называемую "защиту от дурка". Чтобы пока не введешь правильные данные,программа не будет работать. Для этого используем цикл do-while.И будем повторить ввести ввод до тех пор, пока не будет введено положительное число.
Получим следующий код.
Листинг9.5

#include <stdio.h>

int main()
{
int A, sum=0;
do {
    printf("Vvedite chislo:");
    scanf("%d",&A); //считываем число
} while(A<=0);

while (A>0){
    sum=sum+A%10;
    A= A/10;
}    

printf("summa chifr etogo chisla: %dn", sum);
return(0);
}


На этом сегодня всё. Домашнего задания к этому уроку не будет. Так как мне надо разобраться с той кучей вопросов, которые накопились за это время в комментариях. 


Задание для практической работы.




  1. Дано целое число N (вводится с клавиатуры), причем N<30000. По заданному N вывести через пробел все (натуральные, т.е. 0, 1, 2, 3, ... ) степени числа 2, которые меньше N.
  2. Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. до Хкон.с шагом dх.  Функция F должна принимать действительное значение, если выражение (Ац^Вц)|(Ац^Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц и Сц обозначены целые части значений a,b,c. Значения a,b,c, Хнач., Хкон., dx ввести с клавиатуры. Пока что не обязательно к выполнению.!
  3. Дано натуральное число N. Напишите программу которая считает сумму цифр этого числа.
  4. Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.

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

ошибка 1C 7.7 SQL: База данных не может быть открыта в однопользовательском режиме

Возникла такая ошибка в тот момент, когда я добавил в документ один реквизит.

При сохранении конфигурации появляется окно:



Ответив утвердительно, База начинает реорганизацию данных и выдается ошибка:  База данных не может быть открыта в однопользовательском режиме.


Обычно это возникает, в том случае, если какой либо пользователь завершил работу с 1с с ошибкой . Процесс запущенный пользователем на SQL сервере не может завершиться. Нужно принудительно его удалить. При этом изменения в конфигураторе можно сохранить, если они не требуют реорганизации данных (т.е, табличка,что выше изображена, не появляется). Это, могут быть исправление какого либо модуля в базе.

В моем случае, все пользователи корректно вышли из базы,просто, оказалось, что администратор на сервере запустил процесс копирования рабочей SQL базы в фоновом режиме.

Доп. информацию можно прочитать здесь

Асинхронное программирование на C# в Visual Studio 11

На днях я побывал на конференции Windows 8 Camp и увидел немало интересных вещей. Среди них была продемонстрирована новая концепция асинхронного программирования на C#.
Для написания примеров этой статьи я использовал Visual Studio 11 Developer Preview.
Итак, в C#, входящем в состав Visual Studio 11, появились два новых ключевых слова: async и await. Хотелось бы продемонстрировать их работу сразу на примере.
using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncDemo {
class Program {
const string url = "http://download.mozilla.org/?product=firefox-10.0.2&os=win&lang=en-US";
const string filename = "C:\\firefix.exe";

static void Main(string[] args) {
Test();
while(true) {
Console.Write("-");
Console.Out.Flush();
Thread.Sleep(20);
}
}

static async void Test() {
using(WebClient webClient = new WebClient()) {
Task<byte[]> downloadTask = webClient.DownloadDataTaskAsync(url);
byte[] file = await downloadTask;
Console.WriteLine("Downloaded");
using(FileStream stream = File.OpenWrite(filename)) {
Task writeTask = stream.WriteAsync(file, 0, file.Length);
await writeTask;
Console.WriteLine("Written");
}
}
}
}
}
Как видно из примера, кроме новых ключевых слов, в .NET 4.5 появились новые методы. Все методы, поддерживающие асинхронное выполнение, в .NET 4.5 оканчиваются на Async.
Метод, содержащий асинхронное выполнение, должен быть помечен ключевым словом async и делится на две части: до ключевого слова await и после него.
Методы, поддерживающие асинхронное выполнение, должны возвращать значение типа Task или Task<TResult>. Применение операции awiat к объекту Task будет отложено до тех пор, пока задача не будет выполнена. После начала ожидания управление возвращается в рабочий поток, а обработчик будет вызван в другом потоке. Вторая часть метода (после ключевого слова await) и является, по сути, обработчиком события завершения асинхронной операции.
Вывод примера будет следующим:
Как видите, вывод основного потока вклинился между окончанием операции загрузки и завершением сохранения файла.
Нет ничего сложного в написании асинхронных методов самостоятельно. Для этого Вам всего лишь нужно вернуть из Вашего метода значение типа Task или Task<TResult>.  В конструктор такого объекта следует передать делегат, который будет выполняться. Далее, нужно запустить задачу вызовом метода Start и вернуть созданный объект.
using System;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncDemo {
class Program {
static void Main(string[] args) {
Test2();
while(true) {
Console.Write("-");
Console.Out.Flush();
Thread.Sleep(20);
}
}

static async void Test2() {
Task<string> task = new AsyncWorker().WorkAsync();
string message = await task;
Console.WriteLine(message);
}
}

class AsyncWorker {
public Task<string> WorkAsync() {
Task<string> task = new Task<string>(Worker);
task.Start();
return task;
}

string Worker() {
Console.WriteLine("Step 1");
Thread.Sleep(500);
Console.WriteLine("Step 2");
Thread.Sleep(500);
return "Done";
}
}
}
Класс Task содержит некоторое количество интересных статических методов. Ознакомиться с ними можно в документации msdn.