Перейти к содержимому

Begin c что это

  • автор:

C++: Первая программа на С++

Изучать язык программирования, по традиции, начинают с программы ‘Hello, World!’.

Hello, World!

В языке C++ эта программа будет выглядеть так:

main()

Текст Hello, World! появится на экране благодаря команде std::cout Такая команда выводит на экран информацию, которая указана после оператора Оператор То есть теперь информация после Hello, World! будет выводиться на экране на следующей строке.

То, что присутствует на экране помимо этой команды, нужно для работы любой программы на языке C++, мы разберём это позднее.

Задание

Наберите в редакторе код из задания символ в символ и нажмите «Проверить».

#include int main() < //BEGIN std::cout 

Внимание: если вы напишете heLLo, woRld! вместо Hello, World! , то это будет считаться другим текстом, потому что заглавные и строчные буквы — это разные символы. Размер буквы называют регистром, и говорят: регистр — важен! Это касается почти всего в коде, поэтому привыкайте всегда обращать внимание на регистр.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

  • Если в редакторе есть запись // BEGIN и // END , то код нужно писать между этими строчками.

Язык C++

Стандартная библиотека содержит большое количество алгоритмов для работы с контейнерами стандартной библиотеки. Доступные инструменты покрывают значительную часть встречающихся алгоритмических задач. Использование стандартных алгоритмов вместо их самостоятельной реализации является хорошим стилем программирования по следующим причинам:

  • Экономия времени. Мы не тратим время на реализацию и отладку алгоритма.
  • Гарантия отсутствия ошибок в логике работы алгоритма. Алгоритмы стандартной библиотеки протестированы многими программистами.
  • Лаконичность и выразительность кода. Вместо некоторого количества строчек, которые выполняют неочевидные манипуляции, мы видим название хорошо документированного алгоритма.

Мы рассмотрим лишь некоторые из доступных алгоритмов. Полный список можно найти в документации. Мы рекомендуем всегда проверять наличие стандартного решения при встрече с алгоритмической задачей.

iota, for_each и transform

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

Решим следующую задачу: вывести в стандартный поток квадраты натуральных чисел от 1 до 100. Следующий код показывает, что эта задача может быть решена в четырех строчках кода и без явного использования циклов:

#include #include #include  // iota #include  // for_each using namespace std; int main()  vectorint> v(100); iota(v.begin(), v.end(), 1); // v = [1, 2, 3, . 100] for_each(v.begin(), v.end(), [](int& a)a = a*a;>); // v = [1, 4, 9, . 10000] for_each(v.begin(), v.end(), [](int a)cout  <a  <' ';>); return 0; > 

Мы воспользовались алгоритмом iota из библиотеки , чтобы проинициализировать массив набором последовательных целых чисел. Затем мы два раза использовали алгоритм for_each : для вычисления квадратов и для вывода значений в стандартный поток.

Третьим аргументом алгоритм for_each принимает функцию одного аргумента. Тип аргумента должен соответствовать типу элементов контейнера. Вместо обычной функции бывает удобно передать лямбда-выражение, что мы и сделали оба раза в этом примере. Лямбда-выражение позволяет определить функцию в месте ее использования. Квадратные скобки [] указывают на начало лямбда-выражения; в круглых скобках указываются аргументы выражения; в фигурных скобках содержится тело лямбда-выражения.

Модифицируем немного нашу задачу. Предположим, что мы не хотим изменять исходный вектор, а значения квадратов хотим сохранить в другом векторе. Алгоритм transform позволяет выполнить такое преобразование:

#include #include #include  // iota #include  // for_each, transform using namespace std; int main()  vectorint> source(100); iota(source.begin(), source.end(), 1); // v = [1, 2, 3, . 100] vectorint> target(source.size()); transform(source.begin(), source.end(), target.begin(), [](int& a)return a*a;>); // v = [1, 4, 9, . 10000] for_each(target.begin(), target.end(), [](int a)cout  <a  <' ';>); return 0; > 

Третьим аргументом алгоритм transform принимает итератор на место целевого контейнера, с которого нужно начать заполнять значения. Обратите внимание, что мы заранее инициализировали вектор target нужной длины.

all_of, any_of, none_of

Довольно часто возникает задача проверки какого-либо условия для всех объектов контейнера. Здесь на помощь приходят алгоритмы all_of , any_of и none_of с очевидным поведением, которые принимают диапазон значений и унарный предикат — функцию одного аргумента, которая возвращает true или false . Так, например, можно проверить содержит ли множество хотя бы один отрицательный элемент:

setdouble> s1.1, -0.9, 2.4, 10.1, 3.1415>; bool neg_in_set = any_of( s.begin(), s.end(), [](double x)return x  0;>); // true 

Вторая строчка этого примера не поменяется, если вместо контейнера set будет использован другой контейнер, например, list , vector , array или unordered_set .

count, count_if, find, find_if

Алгоритм count позволяет посчитать количество элементов в контейнере, равных заданному. Модификация этого алгоритма count_if подсчитывает количество элементов, удовлетворяющих определенному условию. Рассмотрим следующий пример: мы имеем дело с историей авторизации пользователей на сайте, которая хранится в виде вектора строк. Каждая строка — это логин пользователя. Подсчитаем сколько раз авторизовывался пользователь с логином david:

vectorstring> history = /*. */>; size_t david_count = count(history.begin(), history.end(), "david"); 

Если нам захочется удалить запись для логина david, мы можем это сделать с помощью алгоритма find и метода vector::erase :

if (auto item = find(history.begin(), history.end(), "david"); item != history.end())  history.erase(item); > 

Алгоритм find возвращает итератор на найденный элемент. Версия алгоритма find_if позволяет найти первый элемент, удовлетворяющий некоторому условию.

Как и другие алгоритмы, find и count могут работать с контейнерами разных типов. Они проходят переданный диапазон значений последовательно, начиная с первого элемента. Использование такого подхода для контейнеров set и map — плохая идея, ведь они созданы для того чтобы выполнять поиск объектов быстрее. Это общее правило: если контейнер имеет метод, аналогичный общему алгоритму, то следуем использовать метод контейнера. В большинстве случаев это даст выигрыш в производительности.

sort, stable_sort, nth_element

Алгоритмы сортировки — это важный и интересный раздел теории алгоритмов. Работать с отсортированными элементами во многих ситуациях удобнее, в частности, сложность поиска элементов становится логарифмической вместо линейной. Стандартная библиотека C++ предлагает алгоритмы sort и stable_sort , которые выполняют сортировку за время, пропорциональное N log(N), где N — количество элементов массива. Стабильная сортировка stable_sort при этом гарантирует, что равные объекты не меняют своего относительного положения в контейнере.

Рассмотрим простой пример сортировки:

vectorstring> v "David", "Ivan", "Adam", "Dmitry">; sort(v.begin(), v.end()); // ["Adam", "David", "Dmitry", "Ivan"] 
bool string_cmp(const string& lhs, const string& rhs)  return lhs.size() > rhs.size(); > vectorstring> v "David", "Ivan", "Adam", "Dmitry">; stable_sort(v.begin(), v.end(), string_cmp); // ["Dmitry", "David", "Ivan", "Adam"] 

Мы использовали стабильную версию сортировки. В этом случае Ivan гарантировано окажется левее Adam в отсортированном векторе.

Оказывается, что задача поиска n-го элемента (как если бы элементы стояли по порядку по какому-либо признаку) может быть решена быстрее, чем сортировка всего массива — за линейное время. Стандартная библиотека предлагает алгоритм nth_element для решения этой задачи.

lower_bound, upper_bound, binary_search

Коль скоро мы научились получать отсортированные массивы, рассмотрим алгоритмы для поиска элементов в них. Алгоритмы lower_bound и upper_bound позволяют найти в отсортированном массиве первый элемент не меньше данного и первый элемент больше данного, соответственно. Эти алгоритмы возвращают итератор, соответствующий найденному элементу.

Алгоритм binary_search проверяет, есть ли в отсортированном массиве данный элемент и возвращает true или false в зависимости от результата поиска.

Все три алгоритма выполняются за логарифмическое время.

Резюме

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

Полезные алгоритмы стандартной библиотеки не ограничиваются рассмотренными выше. Мы рекомендуем посмотреть на полный список доступных алгоритмов, среди которых можно обратить внимание на алгоритмы copy , remove , generate и partition , которые вполне могут пригодиться.

Конечно, мы не ожидаем, что после прочтения этого материала вы сразу начнете свободно применять разнообразные алгоритмы. Только с практикой использование алгоритмов становится естественным и полезным инструментом разработки.

Источники

  • en.cppreference.com/w/cpp/algorithm
  • en.cppreference.com/w/cpp/language/lambda
  • Введение
  • Настройка рабочей среды
  • Язык C++
    • Работа с потоками ввода-вывода
    • Строки
    • Контейнеры стандартной библиотеки C++
    • Эффективная передача параметров в функцию
    • Алгоритмы стандартной библиотеки C++
    • Итераторы
    • Библиотеки numeric и random
    • Классы
    • Наследование
    • Динамическое выделение памяти
    • Обобщенное программирование

    Функции

    Заголовок C++20 включает следующие вспомогательные функции, отличные от членов.

    Функции, не являющиеся членами Description
    begin C++20 Получите итератор к первому элементу в диапазоне.
    cbegin C++20 Получите итератор к первому const элементу в диапазоне.
    cend C++20 Получите sentinel в конце const диапазона -qualified.
    cdata C++20 const Получите указатель на первый элемент в непрерывном диапазоне.
    crbegin C++20 Получите обратный const итератор до начала диапазона.
    crend C++20 Получите sentinel в конце возвращаемого crbegin() значения.
    data C++20 Получите указатель на первый элемент в непрерывном диапазоне.
    empty C++20 Проверьте, является ли диапазон пустым.
    end C++20 Получите sentinel в конце диапазона.
    rbegin C++20 Получите обратный итератор до начала диапазона.
    rend C++20 Получите обратный итератор в sentinel в конце диапазона.
    size C++20 Получите размер диапазона в виде значения без знака.
    ssize C++20 Получите размер диапазона в виде подписанного значения.

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

    Многие из этих функций имеют соответствующие функции в std пространстве имен. Но при работе с диапазонами используйте эти вспомогательные функции. Эти функции используют основные понятия C++20, которые обеспечивают более высокую погрешность времени компиляции. Поскольку они реализованы в качестве точек настройки, проблемы, связанные с поиском зависимых аргументов (ADL) и константной правильностью, избегаются.

    begin

    Получите итератор к первому элементу в диапазоне.

    template constexpr std::input_or_output_iterator auto begin(T&& rg); 

    Параметры

    Возвращаемое значение

    Итератор к первому элементу в диапазоне:

    Picture of a vector with the elements 10, 20, and 30. The first element contains 10 and is labeled

    Если диапазон является массивом, возвращает эквивалент rg + 0 . Если auto(rg.begin()) возвращает итератор, возвращает эквивалент auto(rg.begin()) . Если это выражение неправильно сформировано, используется, auto(begin(rg)) если это выражение дает итератор.

    Замечания

    ranges::begin() работает на всех диапазонах, в то время как std::begin() не может.

    Пример: begin

    // requires /std:c++20 or later #include #include #include int main() < std::vectorv = ; auto vi = std::ranges::begin(v); std::cout 

    cbegin

    Получите итератор к первому const элементу в диапазоне. Итератор может получить доступ к элементам в диапазоне, но не может их изменить.

    template constexpr std::input_or_output_iterator auto cbegin(T&& rg); 

    Параметры

    Возвращаемое значение

    const Итератор к первому элементу в диапазоне:

    Picture of a vector with the elements 10, 20, and 30. The first element contains 10 and is labeled

    Если диапазон является массивом, возвращает эквивалент rg + 0 . Если auto(rg.cbegin()) возвращает итератор, возвращает эквивалент auto(rg.cbegin()) . Если это выражение неправильно сформировано, используется, auto(cbegin(rg)) если это выражение дает итератор.

    Замечания

    ranges::cbegin() работает на всех диапазонах, в то время как std::cbegin() не может.

    Пример: cbegin

    // requires /std:c++20 or later #include #include #include int main() < std::vectorv = ; auto vi = std::ranges::cbegin(v); std::cout 

    cdata

    const Получите указатель на первый элемент в непрерывном диапазоне.

    template constexpr std::add_pointer_t> cdata(T&& rg); 

    Параметры

    Возвращаемое значение

    Указатель const , основанный на типе диапазона, к первым данным элемента в непрерывном диапазоне. Например, если диапазон является вектором целых чисел, тип возвращаемого значения — это . const int *

    Пример: cdata

    #include #include int main() < std::vector v; std::string src< "a string" >; auto c_charPtr = std::ranges::cdata(src); // ptr is a const char * auto c_intPtr = std::ranges::cdata(v); // ptr2 is a const int * std::cout 

    cend

    Получите sentinel в конце const диапазона -qualified. Итератор может получить доступ к элементам в диапазоне, но не может их изменить.

    template constexpr std::sentinel_for()))> auto cend(T&& rg); 

    Параметры

    Возвращаемое значение

    Sentinel, следующий за последним элементом в диапазоне const -qualified:

    Picture of a vector with the elements 10, 20, and 30. The first element contains 10 and is labeled cbegin(). The last element contains 30 and is labeled

    Замечания

    ranges::cend() работает на всех диапазонах, в то время как std::cend() не может.

    Пример: cend

    // requires /std:c++20 or later #include #include #include int main() < std::vectorv = ; auto i = std::ranges::cend(v); --i; // get off the sentinel and onto the last element in the range std::cout 

    crbegin

    Получите обратный const итератор к первому элементу в обратном диапазоне. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

    template constexpr std::input_or_output_iterator auto crbegin(T&& rg); 

    Параметры

    Возвращаемое значение

    Обратный const итератор к первому элементу в диапазоне. Этот итератор возвращает элементы диапазона в обратном порядке, начиная с конца диапазона:

    Picture of a vector containing the elements 10, 20, and 30. There

    Если диапазон является массивом, возвращает эквивалент reverse_iterator того, где n находится число элементов в массиве. Если auto(rg.crbegin()) возвращает итератор, возвращает эквивалент auto(rg.crbegin()) . Если это выражение неправильно сформировано, используется, auto(crbegin(rg)) если это выражение дает итератор.

    Замечания

    ranges::crbegin() работает на всех двунаправленных диапазонах, в то время как std::crbegin() не может.

    Пример: crbegin

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; auto vi = std::ranges::crbegin(v); std::cout 

    crend

    Получите sentinel в конце возвращаемого crbegin() значения. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

    template std::sentinel_for()))> auto crend(T&& rg); 

    Параметры

    Возвращаемое значение

    Sentinel в конце возвращаемого cbegin() значения. Sentinel следует последнему элементу в обратном представлении диапазона:

    Picture of a vector containing the elements 10, 20, and 30. There

    Замечания

    ranges::crend() работает на всех двунаправленных диапазонах, в то время как std::crend() не может.

    crend Примере

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; auto vi = std::ranges::crend(v); --vi; // get off the sentinel and onto the last element in the reversed range std::cout 

    data

    Получите указатель на первый элемент в непрерывном диапазоне.

    template constexpr std::add_pointer_t> data(T&& rg); 

    Параметры

    Возвращаемое значение

    Указатель, основанный на типе диапазона, к первому элементу в непрерывном диапазоне. Например, если диапазон является вектором целых чисел, тип возвращаемого значения — это . int *

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; std::string src< "a string" >; auto charPtr = std::ranges::data(src); // charPtr is a char * auto intPtr = std::ranges::data(v); // intPtr is an int * std::cout 

    empty

    Проверьте, является ли диапазон пустым.

    template constexpr bool empty(T&& rg); 

    Параметры

    Возвращаемое значение

    Возвращает значение true , если диапазон не содержит элементов; в противном случае false.

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; std::vector v2; std::cout 

    end

    Получите sentinel в конце диапазона.

    template std::sentinel_for> auto end(T&& rg); 

    Параметры

    Возвращаемое значение

    Sentinel, следующий за последним элементом в диапазоне:

    Picture of a vector with the elements 10, 20, and 30. The first element contains 10 and is labeled begin(). The last element contains 30 and is labeled

    Замечания

    ranges::end() работает на всех диапазонах, в то время как std::end() не может.

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vectorv = ; auto i = std::ranges::end(v); --i; // get off the sentinel and onto the last element in the range std::cout 

    rbegin

    Получите обратный итератор к первому элементу в обратном диапазоне. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

    template constexpr std::input_or_output_iterator auto rbegin(T&& rg); 

    Параметры

    Возвращаемое значение

    Обратный итератор к первому элементу в диапазоне. Этот итератор возвращает элементы диапазона в обратном порядке, начиная с конца обратного диапазона:

    Picture of a vector containing the elements 10, 20, and 30. There

    Если диапазон является массивом, возвращает эквивалент reverse_iterator того, где n находится число элементов в массиве. Если auto(rg.rbegin()) возвращает итератор, возвращает эквивалент auto(rg.rbegin()) . Если это выражение неправильно сформировано, используется, auto(rbegin(rg)) если это выражение дает итератор.

    Замечания

    ranges::rbegin() работает на всех двунаправленных диапазонах, в то время как std::rbegin() не может.

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; auto vi = std::ranges::rbegin(v); std::cout 

    rend

    Получите обратный итератор в sentinel в конце обратного представления диапазона. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

    template constexpr std::sentinel_for()))> auto rend(T&& rg); 

    Параметры

    Возвращаемое значение

    Обратный итератор в sentinel в конце диапазона. Sentinel следует последнему элементу в обратном представлении диапазона:

    Picture of a vector containing the elements 10, 20, and 30. There

    Замечания

    ranges::rend() работает на всех двунаправленных диапазонах, в то время как std::rend() не может.

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; auto vi = std::ranges::rend(v); --vi; // get off the sentinel and onto the last element in the reversed range std::cout 

    size

    Получите количество элементов в диапазоне в виде значения без знака.

    template constexpr /*unsigned integer-like type */ size(T&& rg); 

    Параметры

    Возвращаемое значение

    Число элементов в диапазоне в виде целого числа без знака.

    Замечания

    Эта функция выполняется в постоянное время.

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; auto s = std::ranges::size(v); // s is a size_t std::cout 

    ssize

    Получите размер диапазона в виде подписанного значения.

    template constexpr /* signed-integer-like type */ ssize(T&& rg); 

    Параметры

    Возвращаемое значение

    Количество элементов в диапазоне в виде целочисленного значения со знаком.

    Замечания

    Эта функция выполняется в постоянное время.

    Пример

    // requires /std:c++20 or later #include #include #include int main() < std::vector v; auto s = std::ranges::ssize(v); std::cout 

    Pascal: Занятие №2. Часть 1: Условный оператор в Паскале (If)

    егэ разбор егэ разбор pascal уроки c уроки python уроки c++ уроки vb уроки lazarus уроки php уроки html уроки css уроки javascript уроки jquery и ajax уроки prolog уроки flash уроки

    Напоминаем, что данный сайт не претендует на полное изложение информации по теме. Целью портала является предоставление возможности усваивания материала на основе готовых решенных примеров по теме «Язык программирования Pascal» с практическими заданиями для закрепления материала. Представленные на сайте labs-org.ru задания по Паскалю выстроены последовательно по мере увеличения их сложности. Сайт labs-org.ru может быть использован учителями и преподавателями в качестве вспомогательного наглядного пособия.

    Условный оператор в Паскале

    До рассмотрения данной темы в основном использовались линейные алгоритмы в Паскале, характерные для весьма простых задач, когда действия (операторы) выполняются последовательно, одно за другим. Более сложные алгоритмы предусматривают использование конструкция ветвления.

    условный оператор в паскале блок-схема

    Блок-схема условного оператора:

    Условный оператор в Паскале имеет следующий синтаксис:

    if условие then оператор;

    if условие then оператор;

    Полный вариант:

    if условие then оператор else оператор;

    if условие then оператор else оператор;

    Условный оператор в Паскале — if — служит для организации хода задачи таким образом, при котором изменяется последовательность выполнения операторов в зависимости от какого-либо логического условия. Логическое условие может принимать одно из двух значений: либо true (истина), либо false (ложь), соответственно, оно может быть либо истинным, либо ложным.

    неполная форма ветвления

    Составной оператор

    Если при истинном условии необходимо выполнять несколько операторов, то их по правилам языка Pascal необходимо заключать в блок, начинающийся со служебного слова begin и заканчивающегося служебным словом end . Такой блок принято называть операторными скобками, а данную конструкцию — составным оператором:

    Операторные скобки и составной оператор в Паскале:

    if логическое выражение then begin оператор1; оператор2; end else begin оператор1; оператор2; end;

    if логическое выражение then begin оператор1; оператор2; end else begin оператор1; оператор2; end;

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

    IF THEN ELSE
    ЕСЛИ ТО ИНАЧЕ

    Условный оператор в Паскале

    В условии (в логическом выражении) используются операторы отношения.
    Рассмотрим список операторов отношения Паскаля:

    • больше >
    • меньше
    • больше или равно в Pascal >=
    • меньше либо равно в Pascal
    • сравнение в Pascal =
    • не равно в Pascal <>

    Пример: найти наибольшее из двух чисел

    Вариант 1 Вариант 2
    1_11 2

    Подробно разобраться в работе условного оператора в Паскале можно, просмотрев видеоурок:

    Пример: вычислить значение переменной у по одной из двух ветвей

    условный оператор

    Показать решение:

    1 2 3 4 5 6 7 8 9 10 11 12 13
    var x,y:real; begin writeln ('введите х'); read(x); if x>0 then y:=ln(x) else y:=exp(x); writeln ('y=', y:6:2) end.
    1 2 3 4 5 6 7 8 9
    begin var x:=readReal('введите х'); var y: real; if x>0 then y:=ln(x) else y:=exp(x); writeln ('y=', y:6:2) end.

    begin var x:=readReal('введите х'); var y: real; if x>0 then y:=ln(x) else y:=exp(x); writeln ('y=', y:6:2) end.

    Обратите внимание на то, как в данном примере выводится y . При выводе переменных типа real в pascal, можно использовать так называемый форматированный вывод, или запись с двумя двоеточиями:
    y:6:2
    - цифра после первого двоеточия ( 6 ) указывает на то, сколько знаков будет занимать число при выводе на экран
    - цифра после второго двоеточия ( 2 ) указывает на то, сколько знаков после запятой вещественного числа будет выводиться

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

    условный оператор в паскале

    Задача 0. Вычислить значение переменной у по одной из двух ветвей:

    [Название файла: L2task0.pas ]

    Задача 1. В компьютер вводятся два числа. Если первое больше второго, то вычислить их сумму, иначе - произведение. После этого компьютер должен напечатать результат и текст ЗАДАЧА РЕШЕНА

    [Название файла: L2task1.pas ]

    Задача 2. Дракон каждый год отращивает по три головы, но после того, как ему исполнится 100 лет - только по две. Сколько голов и глаз у дракона, которому N лет?

    [Название файла: L2task2.pas ]

    Логические операции в Паскале (в логическом выражении)

    Когда необходимо использовать двойное условие в Pascal, то понадобятся логические операции.

    • Логическая операция AND (И), поставленная между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия (должны быть истинными). Логический смысл операции - "конъюнкция".
    • Поставленный между двумя условиями, знак OR (ИЛИ) говорит о том, что достаточно, если будет выполняться хотя бы одно из них (одно из двух условий истинно). Логический смысл операции - "дизъюнкция".
    • На языке Паскаль XOR - знак логической операции, имеющий смысл "строгая дизъюнкция" и указывающий на то, что необходимо, чтобы одно из двух условий выполнялось (истинно), а другое - не выполнялось (ложно).
    • Логическая операция NOT перед логическим выражением или переменной имеет смысл "отрицание" или "инверсия" и указывает на то, что если данная переменная или выражение истинны, то их отрицание — ложь и наоборот.

      Таблица истинности, содержащая все возможные комбинации операндов:

    A B not A A or B A and B A xor B
    False False True False False False
    False True True True False True
    True False False True False True
    True True False True True False

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

    1 2 3 4 5 6 7 8
    var n:integer; begin n:=6; if (n>5) and (n10) then writeln('истина'); if (n>7) or (n10) then writeln('истина'); if (n>7) xor (n10) then writeln('истина'); if not(n>7) then writeln('истина'); end.

    Пример: Компания набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он для данной компании (вывести ответ «подходит» или «не подходит»).
    Особенность: надо проверить, выполняются ли два условия одновременно.

    Вариант 1 Вариант 2
    1 сложные условия

    Пример: Дано целое число A. Проверить истинность высказывания: «Число A является нечетным».
    Открыть решение:

    1 2 3 4 5 6 7 8 9 10 11
    var a,b: integer; begin write('Введите A: '); read(a); b := a mod 2; if b>0 then writeln('true') else writeln ('false') end.

    var a,b: integer; begin write('Введите A: '); read(a); b := a mod 2; if b>0 then writeln('true') else writeln ('false') end.

    1 2 3 4 5 6 7 8
    var a,b: integer; begin write('Введите A: '); read(a); b := a mod 2; writeln(b>0); end.

    var a,b: integer; begin write('Введите A: '); read(a); b := a mod 2; writeln(b>0); end.

    Задача 3. Дано целое число A. Проверить истинность высказывания: «Число A является положительным».

    [Название файла: L2task3.pas ]

    Задача 4. Человек вводит в компьютер число. Если оно находится в интервале от 28 до 30, то нужно напечатать текст ПОПАЛ , если оно больше или равно 30 - то ПЕРЕЛЕТ , если оно находится на отрезке от 0 до 28, то НЕДОЛЕТ , если число меньше нуля — НЕ БЕЙ ПО СВОИМ

    [Название файла: L2task4.pas ]

    Рассмотрим функции pascalABC.NET, которые возвращают логическое значение true или false:

    n.Divs(m) возвращает True, если целое n делится на m без остатка (n mod m = 0); n.DivsAll(m1, m2, . mn) возвращает True, если целое n делится без остатка на каждое из m1, m2, . mn; n.DivsAny(m1, m2, . mn) возвращает True, если целое n делится без остатка хотя бы на одно из m1, m2, . mn; n.InRange(a, b) - возвращает True, если для целого n верно, что a ≤ n ≤ b; n.IsEven возвращает True, если целое n имеет четное значение; n.IsOdd возвращает True, если целое n имеет нечетное значение; n.NotDivs(m) возвращает True, если целое n не делится на m без остатка (n mod m <> 0).

    Построение блок-схем по коду Паскаль

    Теперь настало время вспомнить о том, что такое блок-схемы.
    Блок схема - ориентированный граф, указывающий на последовательность операций, приводящую к решению поставленной задачи.

    Существуют управляющие структуры трех типов:

    блок-схема, следованиеследование блок-схема, ветвлениеветвление блок-схема, повторение или циклповторение или цикл

    Две из трех представленных структур блок-схемы мы уже можем перевести в код Pascal.

    Пример: Составить блок-схему вычисления значения величины С , определяемое по формулам: С=A+B , если A и C=A-B , если A>B .

    блок схема ветвление

    Результат:

    Задача 5. Составить блок-схему решения задачи 3

    Пример: автобусный билет считают счастливым, если сумма трех первых цифр билета равна сумме трех последних цифр. Требуется составить блок-схему алгоритма определения билета, имеющего счастливый номер.

    Открыть решение:

    блок-схема с ветвлением

    Задача 6. По составленной выше блок-схеме решить задачу на Pascal

    [Название файла: L2task6.pas ]

    Задача 7. Дано двузначное целое число. Вывести сумму и произведение его цифр. Проверьте правильность вашей программы. Для нахождения цифр числа использовать операцию взятия остатка mod и операцию целочисленного деления div . Модуль числа - функция abs() .

    Введите двузначное число: -12 Сумма цифр = 3 Произведение цифр = 2

    [Название файла: L2task7.pas ]

    Задача 8. Дано трёхзначное целое число. Вывести все его цифры (порядок не имеет значения). Проверьте правильность вашей программы. Для нахождения цифр числа использовать операцию взятия остатка mod и операцию целочисленного деления div .

    Введите трёхзначное число: -123 Разряд сотен: 1 Разряд десяток: 2 Разряд единиц: 3

    [Название файла: L2task8.pas ]

    Использование функции Assert (pascalAbc.net)

    Пользовательский ввод практически всегда должен проверяться на корректность. Чтобы избежать в программе ошибки, необходимо использовать функцию assert() , в качестве параметра которой указывается условие, которое должно возвращать значение true .

    Пример:

    Выполнить: Даны координаты точки (x,y) на координатной плоскости ( ≠ 0, ≠ 0). Вывести номер четверти:

    var (x,y) := ReadInteger2; var quarter: integer; Assert((x<>0) and (y<>0), 'некорректный ввод'); // True if x>0 then if y>0 then quarter := 1 else quarter := 4 else if y>0 then quarter := 2 else quarter := 3;

    var (x,y) := ReadInteger2; var quarter: integer; Assert((x<>0) and (y<>0), 'некорректный ввод'); // True if x>0 then if y>0 then quarter := 1 else quarter := 4 else if y>0 then quarter := 2 else quarter := 3;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *