Page 1


СОДЕРЖАНИЕ СОДЕРЖАНИЕ .................................................................................................................................................................. 1 СПРАВОЧНЫЕ МАТЕРИАЛЫ ........................................................................................................................................... 2 ПРОЦЕДУРА APPEND ....................................................................................................................................................... 2 Ошибка ввода-вывода в Паскале ................................................................................................................ 3 АССЕМБЛЕР .................................................................................................................................................................... 4 КОМАНДА ААА ............................................................................................................................................................... 4 ПРИМЕРЫ НА АССЕМБЛЕРЕ .............................................................................................................................................. 5 КАК ВЫВЕСТИ СТРОКУ НА ЭКРАН В АССЕМБЛЕРЕ............................................................................................................ 6 Функции вывода DOS ......................................................................................................................................... 7 Функции вывода BIOS ....................................................................................................................................... 8 ЯЗЫКИ ПРОГРАММИРОВАНИЯ ..................................................................................................................................... 10 ПЛОХ

ТОТ ПРОГРАММИСТ, КОТОРЫЙ НЕ ЗНАЕТ… ........................................................................................................... 10

МИКРОКОНТРОЛЛЕРЫ, ЭЛЕКТРОНИКА ..................................................................................................................... 11 В МИР ЗАЧЕМ 1001

ЭЛЕКТРИЧЕСТВА КАК В ПЕРВЫЙ РАЗ ................................................................................................................. 11 ВАМ

С++,

ЕСЛИ ВЫ ПРОГРАММИСТ МИКРОКОНТРОЛЛЕРОВ? ................................................................................ 12

МИКРОКОНТРОЛЛЕРНАЯ СХЕМА ............................................................................................................................. 13

ЗАДАЧИ ......................................................................................................................................................................... 14 ДВОИЧНОЕ ЧИСЛО В ВИДЕ СТРОКИ ................................................................................................................................ 14 Решение задачи на Паскале ....................................................................................................................... 15 Решение задачи на С++ ................................................................................................................................ 16 НАЙТИ СУММУ ДЕЛИТЕЛЕЙ НАТУРАЛЬНОГО ЧИСЛА .......................................................................................................... 17 Решение задачи на Паскале ....................................................................................................................... 18 Решение задачи на С++ ................................................................................................................................ 19 АРХИВ ........................................................................................................................................................................... 21 КАК

БЫСТРО СТАТЬ ПРОГРАММИСТОМ ............................................................................................................................ 21

КНИГА НОМЕРА ........................................................................................................................................................... 23 ОБ АВТОРЕ .................................................................................................................................................................. 24 ПРАВОВЫЕ ПОЛОЖЕНИЯ .............................................................................................................................................. 24


Автоматизация и Программирование. info-master.su

СПРАВОЧНЫЕ МАТЕРИАЛЫ Процедура Append Оригинал статьи и видео см. здесь: http://info-master.su/programming/pascal-functions/append.php Процедура Append открывает файл в режиме добавления данных. Синтаксис: procedure Append(var F : Text); Процедура открывает существующий файл F в режиме добавления данных. Любые данные будут добавлены в файл F. Только текстовые файлы могут быть открыты в режиме добавления. После вызова процедуры Append файл F становится доступными только для записи. Права доступа к файлу не учитываются при вызове процедуры Append. ОШИБКИ Если файл F не существует, то будет сгенерирована ошибка времени выполнения. Это поведение изменилось в операционных системах Windows и Linux, где в версиях до 1.0.6 в режиме добавления будет создан новый файл. Пример: program testfunc; var F : Text; begin Assign(F, 'test.txt'); Rewrite(F); //Файл открыт для записи и очистки (если существует) Writeln(F, 'This is the first line of text.txt'); Close(F); Append(F); //Файл открыт для записи, но не очищается //а текст будет добавлен Writeln(F, 'This is the second line of text.txt'); Close(F); //Здесь будет ошибка времени выполнения программы, //потому что файла testappend.txt не существует {Assign(F, 'testappend.txt'); Append(F); Writeln(F, 'This is the first line of testappend.txt'); Close(F);} //Чтобы ошибка не останавливала программу, можно сделать так {$I-} Assign(F, 'testappend.txt'); Append(F); Writeln(F, 'This is the first line of testappend.txt'); Close(F); {$I+} if IOResult <> 0 then Writeln('Error opening file: "testappend.txt"'); ReadLn; end.

2


Автоматизация и Программирование. info-master.su

3

Ошибка ввода-вывода в Паскале В последней части программы мы использовали директивы компилятора, чтобы отключить генерацию ошибок ввода-вывода. Для чего это делается? Неприятность заключается в том, что при работе с файлами могут возникать ошибки. Например, файла с указанным именем не существует, тип файла не позволяет выполнить нужную операцию, файл занят другим приложением и т.п. В этом случае ваша программа не сможет выполнить операцию с файлом. Но по умолчанию программа компилируется таким образом, что все непредвиденные ошибки обрабатываются операционной системой. Поэтому, в случае такой непредвиденной ошибки, ваша программа будет остановлена, и операционная система выдаст пользователю какое-то сообщение. Чаще всего это будет малопонятное обычному человеку сообщение, и этот обычный человек сильно расстроится, и, возможно, никогда уже не будет пользоваться вашей программой. Поэтому надо стремиться к тому, чтобы предусмотреть как можно больше вариантов развития событий, и обрабатывать как можно больше ошибок в вашей программе. Мы здесь так и поступили - отключили проверку ошибок ввода-вывода, выполнили операцию, которая может вызвать ошибку, затем снова включили проверку ошибок, а также проверили итог работы нашей программы на критическом участке. Если в переменной IOResult не ноль, то при выполнении операции ввода-вывода произошла ошибка. О чём мы и сообщили пользователю. А вообще обработка ошибок - это отдельная тема. Как-нибудь я к ней ещё вернусь...


Автоматизация и Программирование. info-master.su

4

АССЕМБЛЕР Команда ААА Оригинал статьи и видео см. здесь: http://av-assembler.ru/instructions/aaa.php Инструкция AAA в Ассемблере делает необходимые поправки в регистрах AH и AL после сложения при работе с BCD-значениями. У этой команды нет операндов. Команда AAA работает согласно следующему алгоритму: Если младшие (правые) четыре бита регистра AL > 9 или флаг AF = 1, то: AL AH AF CF

= = = =

AL + 6 AH + 1 1 1

иначе AF = 0 CF = 0 в любом случае команда очищает старшие четыре бита регистра AL. Флаги AF и CF изменяются в зависимости от результата выполнения команды (см. алгоритм работы выше). Остальные флаги имеют неопределённое состояние и анализировать их нет смысла. А теперь ещё немного, почти то же самое, что было сказано выше, но другими словами. Возможно, кому то это будет более понятно. Команда ААА исправляет сумму двух неупакованных двоично-десятичных чисел, которая находится в регистре AL. Если исправление приводит к десятичному переносу, то значение регистра AH увеличивается на единицу. Соответственно, перед вызовом команды AAA надо поместить сумму двух неупакованных двоично-десятичных чисел в регистр AL. То есть инструкцию ААА лучше использовать сразу после сложения двух таких чисел. Например, если при сложении чисел 06 и 09 в регистре АХ окажется число 000Fh, то команда AAA исправит его, и в регистре АХ будет число 0105 (неупакованное десятичное число 15): MOV AX, 15 AAA

; AH = 00, AL = 0Fh = 15 ; AH = 01, AL = 05

Команда AAA применяется после выполнения команд ADD или ADC. В итоге сумма, которая находится в регистре AL, всегда будет соответствовать представлению чисел в формате ASCII.


Автоматизация и Программирование. info-master.su

5

Ниже приведён пример, где показано, как можно сложить два BCD-значения 6 и 9, а с помощью команды AAA получить правильную сумму в BCD-формате (в десятичном упакованном формате). Обратите внимание, что перед сложением нужно обнулить содержимое регистра AH. .model .code ORG 100h

tiny

start: MOV MOV ADD AAA OR

AH, 0 AL, 6 AL, 9 AX, 3030h

;Обнулить AH ;AL = 6 ;AL = 6 + 9 = 15 = 0Fh ;Выполнить поправку ;Преобразовать в коды ASCII

MOV DL, AH

;DL = 31h (ASCII-код числа 1)

MOV MOV MOV MOV MOV MOV ADD MOV

;Позиция первого символа на экране ;Установить CX = B800h (память VGA) ;Копировать значение из CX в DS ;DH = атрибуты цвета ;Записать символ в видеопамять ;AL = 35h (ASCII-код числа 5) ;Сместить позицию на экране ;Записать символ в видеопамять

END

BX, 676h CX, 0B800h DS, CX DH, 01001110b [BX], DX DL, AL BX, 2 [BX], DX start

Способ вывода на экран с помощью команды MOV мы уже рассматривали здесь и здесь. Остальное, думаю, понятно из описания. С помощью команды OR AX, 3030h мы преобразуем содержимое регистров AH и AL в ASCIIкоды символов, которые соответствуют находящимся в этих регистрах числам в BCDформате. В итоге получаем в AX число 3135h (31h - ASCII-код символа 1, а 35h - ASCII-код символа 5). Ну и напоследок о происхождении названия команды. AAA - это ASCII Adjust After Addition - ASCII-коррекция после сложения.

Примеры на Ассемблере Примеры на Ассемблере позволяют, во-первых, потренироваться в программировании на этом языке, а во-вторых, более глубоко вникнуть в ассемблер и более полно в нём разобраться. Поэтому я решил наконец создать раздел, где буду приводить примеры относительно простых программ. Я буду стараться, чтобы это были не просто исходники на ассемблере, где рассматривается использование какой-либо команды (как это я делаю в рассказах об инструкциях процессора Интел), а чтобы это были какие-то более-менее законченные программы, которые полностью или частично можно было бы применить где-то ещё - в своих разработках, в курсовых/контрольных и т.п. То есть в этом разделе будут исходные коды несложных программ на Ассемблере. И это, надеюсь, поможет вам в изучении Ассемблера, а также позволит какие-то части этих программ использовать в своих разработках.


Автоматизация и Программирование. info-master.su

6

Подразумевается, что у вас есть начальные знания в этой области. Иначе, хотя все примеры будут с подробными комментариями, понять в полной мере всё это будет сложно. Для создания программ я буду использовать разные средства разработки. Обычно это будет текстовый редактор и какой-либо ассемблер. Самые простые программы я буду создавать в Emu8086. Программы посложнее буду писать в текстовом редакторе PSPad, а компилировать либо с помощью TASM, либо с помощью MASM. Сам процесс компиляции (ассемблирования) я описывать не буду. Надеюсь, вы знаете, как это делается. Если нет, то см. по ссылкам выше. ВАЖНО! Не все программы будут работать в Windows NT или других операционных системах. Надеюсь, это тоже понятно. ВАЖНО! Некоторые примеры будут на языках высокого уровня, а код на ассемблере будет только в виде небольшой вставки. Это будет в тех случаях, когда надо показать простой пример на ассемблере, а загромождать исходный текст большими кусками кода не самых важных функций ввода-вывода не хочется. И первый простой пример вы найдёте в следующем разделе…

Как вывести строку на экран в Ассемблере Оригинал статьи и видео см. здесь: http://av-assembler.ru/source/string-to-screen.php Что бы ни делала ваша программа, в большинстве случаев она должна выводить какие-то данные на экран. И если в языках высокого уровня это делается “лёгким движением руки”, то в ассемблере для этого приходится как следует помучиться. Правда, в современных воплощениях языка Ассемблера могут быть стандартные макросы или подпрограммы для вывода строк на экран. Однако начинающим будет полезно разобраться с тем, как это можно сделать только с помощью инструкций, без применения каких-либо облегчающих жизнь библиотек. Итак, выводить строки на экран можно двумя путями: 1. Посимвольно (то есть в цикле выводить каждый символ строки). 2. Строку целиком. Кроме того, в текстовом режиме вывод на экран можно выполнить одним из трёх способов: 1. С помощью функций DOS. 2. С помощью функций BIOS. 3. Путём прямой записи в видеопамять. Третий способ хорош тем, что он сразу записывает данные в видеопамять, что позволяет выполнять вывод более быстро. Однако в наше время он применим, разве что, в учебных целях. Потому что современные операционные системы не позволяют напрямую обращаться к “железу”.


Автоматизация и Программирование. info-master.su

7

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

Функции вывода DOS Итак, начнём с функций вывода DOS. Эти функции являются функциями операционной системы DOS, но поддерживаются и операционными системами Windows. Как я уже говорил, можно напечатать на экране строку в цикле, отдельно выводя каждый символ. Для этих целей можно использовать функции 02h, 06h или недокуметированное прерывание 29h. Если требуется вывести на экран строку целиком, то можно применить функции 09h и 40h. Для использования функций DOS надо сначала подготовить необходимые данные, записать номер функции в регистр AH, а затем вызвать прерывание 21h. Все функции рассматривать здесь не будем. Для примера используем одну из самых простых функций DOS - функцию 09h, которая выводит в стандартное устройство вывода (в нашем случае - на экран) строку, адрес которой находится в DS:DX. Строка должна заканчиваться символом $, иначе функция не поймёт, где конец строки, и программа будет выводить много-много символов из памяти, начиная с указанного адреса. Примерно так, как показано на рисунке:


Автоматизация и Программирование. info-master.su

8

Пример: ;========================================================== ; Эта программа выводит на экран строку "Hello, World!!!" ; с помощью функции DOS 09h ;---------------------------------------------------------.model tiny .code ORG 100h ;начало СОМ-файла start: MOV AH, MOV DX, INT 21h RET

09h offset stroka

;Номер функции 09h ;Адрес строки записываем в DX ;завершение СОМ-файла

Stroka DB 'Hello, World!!!$' ;Строка для вывода END start ;========================================================== При правильном использовании на экран будет выведено примерно следующее:

Функции вывода BIOS Функции BIOS также могут выводить как отдельные символы (функции 09h, 0Ah, 0Eh), так и строки целиком (функция 13h). Кроме того с помощью функций BIOS можно установить видеорежим, установить или считать положение курсора, а также считать символ и его атрибуты. Хотя функции DOS тоже могут считывать символы, но всё-таки возможности BIOS более широки. Для работы с функциями BIOS также сначала надо подготовить данные, записать номер функции в регистр AH, а затем вызвать прерывание 10h.


9

Автоматизация и Программирование. info-master.su

Для примера рассмотрим функцию 13h. Перед вызовом функции надо: Записать номер функции в регистр АН. Записать режим вывода в регистр AL: o бит 0: переместить курсор в конец строки после вывода. o бит 1: строка содержит не только символы, но и атрибуты. Так что каждый символ описывается двумя байтами - ASCII-код и атрибут. Это можно использовать, если в строке символы должны иметь, например, разный цвет. Если атрибуты одинаковы для всей строки, то этот бит лучше сбросить (обнулить). o биты 2-7: не используются. Записать длину строки в регистр СХ (только число символов, байты атрибутов не учитываются). Если строка содержит только символы, то записать в регистр BL атрибут. Этот атрибут будет применяться для всей строки. Записать координаты экрана, начиная с которых будет выводиться строка, в регистры DL (столбец - координата Х) и DH (строка - координата Y). Записать адрес начала строки в ES:BP. Пример: ;========================================================== ; Эта программа выводит на экран строку "Hello, World!!!" ; с помощью функции BIOS 13h ;---------------------------------------------------------.model tiny .code ORG 100h ;начало СОМ-файла start: MOV MOV MOV MOV MOV MOV MOV INT RET

AH, AL, CX, BL, DL, DH, BP, 10h

13h 1 15 00011110b 5 2 offset stroka

;Номер функции 13h ;Перевести курсор в конец строки ;Длина строки ;Жёлтый текст на синем фоне ;Координата Х ;Координата Y ;Адрес строки записываем в DX ;завершение СОМ-файла

stroka DB 'Hello, World!!!' ;Строка для вывода END start ;==========================================================

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


Автоматизация и Программирование. info-master.su

10

ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Плох тот программист, который не знает… Плох тот программист, который не знает С++. И неважно, на каком языке вы пишите свои программы - на Паскале или даже Визуал Бэйсике. Это не имеет значения. Потому что уважающий себя программист должен знать С++, даже если он вообще уже давно не пишет программы, а руководит ИТ отделом или собственным делом. Потому что С++ - это легенда. Потому что на С++ написаны почти все операционные системы. Потому что С++ лежит в основе множества языков программирования, таких как JScript, JavaScript, ActionScript, C#, Java и многих других. Поэтому с уверенностью могу сказать - если вы изучите С++, то дальнейшее движение по пути программиста будет для вас лёгким и непринуждённым... >>> Изучить С++ >>>


Автоматизация и Программирование. info-master.su

11

МИКРОКОНТРОЛЛЕРЫ, ЭЛЕКТРОНИКА В мир электричества как в первый раз В прошлом номере журнала была статья о подключении реле к микроконтроллеру. Надеюсь, она оказалась полезной ну или просто интересной. А вообще, создавая устройства на микроконтроллерах, обойтись хотя бы без начальных знаний электротехники невозможно. Даже если вы занимаетесь исключительно программированием микроконтроллеров, всё равно надо понимать, как должны управляться подключаемые к нему устройства. Если у вас в этой области знаний есть пробелы, то советую изучить отличный видеокурс:

>>> В мир электричества как в первый раз >>> Этот курс полезен сам по себе, но, кроме того, в комплекте с курсом есть ещё несколько небольших, но приятных подарков. Это тоже полезные сведения, которые могут пригодиться начинающим электронщикам и электрикам: 1. Видеоурок о работе с мультиметром. Пожалуй, работать с мультиметром может каждый. Однако, как говорится, “есть нюансы”. Вполне возможно, что вы ещё не всё знаете о мультиметрах. 2. Люминисцентные лампы - подборка ссылок и схем. Да, люминисцентные лампы уже уходят в прошлое, вытесняемые светодиодами и прочими новыми технологиями. И всё же (особенно для тех, кто чаще ремонтирует существующее оборудование, чем создаёт новое) данная подборка будет полезной. 3. Сборник программ по теме электричества. А вот это точно полезная вещь. Всего вы получите 17 компьютерных программ, которые помогут вам выполнять электрические расчёты, определять тип и номинал элемента по цветовой кодировке, создавать виртуальные электрические и электронные устройства и проверять их работу без паяльника и риска сжечь дорогостоящие элементы. В общем, как говорится, мелочь - а приятно. В любом случае лучше приобрести курс по электротехнике в комплекте с этими подарками, чем без них.


Автоматизация и Программирование. info-master.su

12

Когда то давно я учился в СПТУ на электрика. Там нам давали основные знания в этой области, и всё казалось не очень сложно. И действительно, для того, чтобы заниматься ремонтом электрооборудования, не надо быть “семи пядей во лбу”. Когда я изучал электротехнику в университете, то это была уже совсем другая электротехника: тройные интегралы, комплексные числа и прочие прелести высшей математики. Это всё было, конечно, интересно. Но многие из тех знаний в обычной жизни инженера просто не нужны. Поэтому для практической работы надо всегда выбирать “золотую середину” между теорией и практикой. То есть теории должно быть ровно столько, чтобы чётко понимать, что и почему ты делаешь на практике. Иначе лишние знания просто будут занимать место в голове без надежды быть когда-нибудь использованными. Именно такой “золотой серединой” является видеокурс: >>> В мир электричества как в первый раз >>>

Зачем вам С++, если вы программист микроконтроллеров? У тех, кто программирует микроконтроллеры, может возникнуть вопрос: зачем программисту микроконтроллеров С++? Ведь программы на микроконтроллерах пишут, в основном, на Ассемблере или на чистом Си. Ну в общем да. И в то же время нет. Как я уже говорил, микроконтроллеры программируют на разных языках, в том числе на Паскале и даже на Бэйсике. Ну и, конечно, на С++ (а не только на чистом Си). Кроме того, если вам о чём-то говорит слово “Ардуино” (Arduino), то здесь как раз таки для программирования используется язык С++ (совсем немного изменённый для упрощения программирования целевых систем - систем автоматики и робототехники). Так что даже если ваши интересы лежат исключительно в сфере программирования микроконтроллеров, знание языка С++ вам никак не повредит. >>> Изучить С++ >>>


Автоматизация и Программирование. info-master.su

13

1001 микроконтроллерная схема Программирование микроконтроллеров - занятие увлекательное. Но чтобы из разряда увлечений оно могло перейти в ряд практических задач, требуется не только программировать микроконтроллеры, но и собирать на них какие-то свои устройства. И здесь мы переходим к другому увлекательному занятию - разработке устройств на микроконтроллерах. Но как быть, если электроника - не ваша сильная сторона? Да очень просто - взять готовую схему и повторить её. А программу разработать самостоятельно. Бесценный кладезь таких схем вы найдёте в книге: >>> 1001 микроконтроллерная схема >>> P.S. Кстати, книга пригодится и опытным электронщикам, поскольку содержит множество схем типовых узлов, используемых совместно с МК, и вам не придётся тратить время на самостоятельную разработку.


Автоматизация и Программирование. info-master.su

14

ЗАДАЧИ Двоичное число в виде строки Оригинал статьи и видео см. здесь: http://info-master.su/programming/lab/binary-number-in-string.php Условие задачи 0.1 Преобразовать десятичное число в двоичное и вывести на экран в виде строки, не используя для преобразования стандартные функции. То есть создать собственный аналог функции BinStr в FreePascal. Я уже рассказывал о том, как преобразовать число в двоичную строку. Там мы применили стандартную функцию BinStr. Эта функция довольно удобна, и при создании программ на FreePascal/Lazarus её стоит использовать. Однако для учебных программ это было бы слишком просто. К тому же при обучении может быть задана именно такая задача, как приведённая выше - то есть преобразование числа в строку с его двоичным представлением без использования каких-либо стандартных функций. Кроме того, далеко не во всех языках программирования есть функции, подобные BinStr. Поэтому знать способы решения такой задачи весьма полезно. Решить эту задачу можно, как всегда, несколькими способами. Но я покажу только один. Алгоритм решения этим способом следующий: 1. В цикле проверять биты числа справа налево (хотя можно и наоборот). 2. Если текущий бит числа равен 1, то присоединить строку к символу ‘1’, иначе присоединить строку к символу ‘0’. ВАЖНО! Обратите внимание на то, что я написал во втором шаге: именно присоединять строку к символу, а не символ к строке. Разъяснения будут ниже. Алгоритм, как видите, простой. Однако новички могут не справиться со вторым шагом, потому что, скорее всего, не знают, как проверить отдельный бит числа, да ещё без использования каких-нибудь приятных в работе функций. Тех, кто получал в школе двойки по информатике и не знает, что такое бит, отправляю сюда для того, чтобы вспомнить суть двоичной системы счисления. Для остальных расскажу, как определить значение отдельного бита в числе. Здесь тоже может быть несколько способов. Но я использую следующий: 1. Взять число А, все биты которого равны нулю, кроме того бита, который мы хотим проверить в заданном числе В. 2. Выполнить операцию И между числами А и В, затем сравнить результат с нулём. 3. Если результат равен 0, то и поверяемый бит равен нулю. Иначе бит равен 1.


Автоматизация и Программирование. info-master.su

15

Углубляться в объяснения не буду. Если хотите разобраться - изучайте информатику вообще и двоичную систему в частности, а также булеву алгебру и ассемблер. Если разобраться не хотите - то просто поверьте на слово, что это работает, и смотрите примеры программ на Паскале и С++, где этот способ используется.

Решение задачи на Паскале program mybinstrfunc; //**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** var Num : DWORD; Str : ShortString; //**************************************************************** // ФУНКЦИИ И ПРОЦЕДУРЫ //**************************************************************** //**************************************************************** // Преобразует десятичное число в строку с двоичным представлением числа // ВХОД: Val - число, Num - количество символов в строке // ВЫХОД: строка с двоичным представлением числа Val, или // пустая строка, если в параметре Num указано значение более 32 // этим функция отличается от стандартной BinStr //**************************************************************** function MyBinStr(Val : DWORD; Cnt : byte) : ShortString; var i, n : DWORD; sval : ShortString; begin Result := ''; if Cnt > 32 then //Если указано слишком большое число символов, Exit; //то выйти из функции i := 1; n := 0; sval := ''; while n < Cnt do //Перебираем разряды в цикле, begin //начиная с младшего (справа налево) Inc(n); if (Val and i) = i then //Если в разряде 1 sval := '1' + sval else //Если в разряде 0 sval := '0' + sval; i := i * 2; //Перейти к следующему разряду end; Result := sval; end;


Автоматизация и Программирование. info-master.su

//**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** begin //Проверяем работу функции MyBinStr for Num := 0 to 15 do begin Str := MyBinStr(Num, 4); WriteLn(Num, '(DEC) = ', Str, '(BIN)'); end; //Сравниваем со стандартной функцией BinStr Num := 987654321; Str := MyBinStr(Num, 33); if Str = '' then WriteLn('ERROR: Too large a value of the second parameter!') else WriteLn(Num, '(DEC) = ', Str, '(BIN)'); //Функция BinStr не проверяет значение параметра Cnt, поэтому //выведет столько знаков, сколько указано, //заполнив лишние старшие разряды нулями WriteLn(Num, '(DEC) = ', BinStr(Num, 34), '(BIN)'); WriteLn('The end. Press ENTER...'); ReadLn; end.

Решение задачи на С++ #include <cstdlib> #include <iostream> using namespace std; unsigned long int Num; string Str;

//**************************************************************** // Преобразует десятичное число в строку с двоичным представлением числа // ВХОД: Val - число, Num - количество символов в строке // ВЫХОД: строка с двоичным представлением числа Val, или // пустая строка, если в параметре Num указано значение более 32 // этим функция отличается от стандартной BinStr //**************************************************************** string MyBinStr(unsigned long int Val, char Cnt) { unsigned long int i = 1, n = 0; string sval = ""; if (Cnt > 32) //Если указано слишком большое число символов, return(sval); //то выйти из функции while (n < Cnt) { n++; if ((Val & i) == i) sval = '1' + sval; else sval = '0' + sval;

16


Автоматизация и Программирование. info-master.su

i = i * 2; } return(sval); } //**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** int main(int argc, char *argv[]) { for (Num = 0; Num < 16; Num++) { Str = MyBinStr(Num, 4); cout << Num << "(DEC) = " << Str << "(BIN)" << endl; } Num = 987654321; Str = MyBinStr(Num, 32); if (Str == "") cout << "ERROR: Too large a value of the second parameter!" << endl; else cout << Num << "(DEC) = " << Str << "(BIN)" << endl; system("PAUSE"); return EXIT_SUCCESS; }

Найти сумму делителей натурального числа Оригинал статьи см. здесь: http://info-master.su/programming/lab/find-sum-divisors-positive-integer.php Условие задачи 2.16. Дано натуральное число N. Вывести на экран сумму его делителей. Число 1 считается делителем любого натурального числа. Число N не является делителем числа N. Эту задачу довольно часто задают в контрольных и прочих студенческих делах. Задача несложная. Однако на её примере начинающие могут кое-чему научиться. Алгоритм решения довольно простой: 1. Перебираем в цикле все возможные целые числа от 1 до числа N. 2. Каждый раз пытаемся делить число N на текущее число. Если оно делится без остатка, то текущее число является делителем числа N. Прибавляем его к итоговой сумме. Разумеется, сначала подготавливаем необходимые переменные. Ну а чтобы задачка была поинтереснее, предлагаю дополнительно сделать так, чтобы на экран была выведена не только итоговая сумма делителей числа N, но и сами делители. Решения на Паскале и С++ представлены ниже. Если кто забыл, что такое натуральное число, то см. здесь.

17


Автоматизация и Программирование. info-master.su

18

Краткое описание программы: 1. Обнуляем переменную Sum, в которой у нас будет итоговая сумма делителей. 2. Получаем случайное значение и записываем его в переменную N. 3. Затем запускаем цикл от 1 до N и в каждой итерации цикла вызываем нашу функцию ThisDivider(N, i), которая возвращает TRUE, если число i является делителем числа N. Саму функцию описывать не буду, потому что она достаточно простая. 4. Если число i является делителем числа N, то к переменной Sum мы прибавляем число i, а к строке Str присоединяем строковое представление числа i, предварительно преобразовав это число в строку. Так мы получаем строку, которая содержит все делители числа N. 5. Ну и в конце выводим всё на экран. Обратите внимание, что для использования функции преобразования числа в строку в Паскале надо подключить модуль SysUtils, а в С++ - <sstream>. Также обратите внимание на то, как мы преобразуем число в строку на С++. Делается это довольно замысловато. И это ещё не самый сложный способ. В Паскале же всё просто и интуитивно понятно. Ну а в С++, как всегда, всё через зад. Правда, начиная со стандарта С++ 2011 года (вроде с него), появилась более понятная и приятная функция to_string(). Но плохая новость заключается в том, что далеко не все средства разработки (особенно бесплатные) поддерживают этот стандарт. Поэтому я не стал использовать эту функцию в своей программе.

Решение задачи на Паскале program t216; uses SysUtils;

//Подключить этот модуль

//**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** var i : WORD; //Индекс N : WORD; //Число Sum : DWORD = 0; //Сумма Str : string = ''; //Строка для делителей //**************************************************************** // ФУНКЦИИ И ПРОЦЕДУРЫ //**************************************************************** //****************************************************************// Функция принимает число и возможный делитель. // ВХОД: Num - число // Del - возможный делитель // ВЫХОД: TRUE - если Del является делителем числа Num //**************************************************************** function ThisDivider(Num, Del : WORD) : boolean; begin if Del = Num then begin Result := FALSE; Exit; end; Result := (Num mod Del) = 0; end;


19

Автоматизация и Программирование. info-master.su

//**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** begin Randomize; //Запустить генерацию случайных чисел N := Random(High(N)); //Получить случайное число WriteLn('N = ', N); for i := 1 to N do //В цикле проверить возможные делители begin if ThisDivider(N, i) then //Если это делитель, то begin Sum := Sum + i; //прибавить его к сумме Str := Str + IntToStr(i) + ' '; end; end; //Вывести на экран WriteLn('Dividers : ', Str); WriteLn('Sum of the divisors = ', Sum); WriteLn('The end. Press ENTER...'); ReadLn; end.

Решение задачи на С++ #include <cstdlib> #include <iostream> #include <sstream>

//Подключить этот файл

using namespace std; //**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** unsigned short int N; //Число unsigned long int Sum = 0; //Сумма ostringstream Str; //Строка для делителей //**************************************************************** // ФУНКЦИИ И ПРОЦЕДУРЫ //**************************************************************** //**************************************************************** // Функция принимает число и возможный делитель. // ВХОД: Num - число // Del - возможный делитель // ВЫХОД: TRUE - если Del является делителем числа Num //**************************************************************** bool ThisDivider(unsigned short int Num, unsigned short int Del) { if (Del == Num) return(false); return(0 == (Num % Del)); }


Автоматизация и Программирование. info-master.su

//**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** int main(int argc, char *argv[]) { srand(time(0)); //Запустить генерацию случайных чисел N = rand() % USHRT_MAX; //Получить случайное число Str.clear(); cout << "N = " << N << endl; for(int i = 1; i <= N; i++) { if (ThisDivider(N, i)) { Str << i << ' '; Sum = Sum + i; } } //Вывести на экран cout << "Dividers : " << Str.str() << endl; cout << "Sum of the divisors = " << Sum << endl; system("PAUSE"); return EXIT_SUCCESS; }

20


Автоматизация и Программирование. info-master.su

21

АРХИВ Как быстро стать программистом Оригинал статьи см. здесь. Да никак. В одной из статей я уже рассказал о том, сколько примерно времени потребуется для того, чтобы стать хорошим программистом. Однако многие читатели и пользователи Интернета по-прежнему задаются вопросом как стать программистом, причём быстро. Как сказал известный литературный герой: “скоро только кошки родятся”. И это действительно так. Вот уже на протяжении длительного времени я пытаюсь убедить вас в том, что невозможно быстро стать профессионалом в какой-либо сложной профессии. Да и несложные профессии, например продавец в магазине, тоже требуют какого-то опыта. Наверняка вы не раз сталкивались с ситуацией, когда зайдя в магазин, и увидев недовольную рожу продавца, вы просто оттуда уходили, хотя изначально хотели сделать покупку. То есть работать продавцом тоже надо уметь. В любой специальности профессионалов крайне мало (во всяком случае, в России). А мало их потому, что большинство людей думают, что научившись печатать текст программы в редакторе исходного кода, они уже стали программистами. Нет. И ещё раз нет. Это болезнь нашего века. Время летит стремительно, в суете и информационном перегрузе люди просто не понимают, как ставить цели и достигать результата. Со всех сторон им кричат, что есть какие-нибудь замечательные новые способы обучения, которые позволят им за два дня выучить английский, научиться вести бизнес, похудеть, стать программистом… На самом деле всё это брехня. Не существует никаких способов, которые бы позволили сократить сроки обучения в 10 раз. Сократить сроки обучения можете только вы сами - если будете упорно и непрерывно заниматься, и также непрерывно изучать свою профессию. Этот процесс, вообще говоря, бесконечный. Однако, с какого-то момента человек уже может начать считать себя профессионалом. Но, чтобы этот момент когда-нибудь наступил, начинать надо с самых основ. Одна из самых распространённых ошибок нынешнего поколения студентов заключается в том, что они быстро “скачут по верхушкам” знаний, и, изучив пару приёмов и несколько умных терминов, уже могут выдавать себя за профессионалов в среде непрофессионалов.


Автоматизация и Программирование. info-master.su

22

Однако такой способ обучения не позволяет им создавать реальные профессиональные программы. Потому что они не понимают основ и не знают базовой теоретической части. Потому что они пропустили её, стремясь сократить сроки обучения. Начинать надо всегда с азов. Иначе у вас будет только два пути: 1) забросить обучение, так и не разобравшись со сложными вещами; 2) вернуться к основам и начать всё сначала. Понятно, что первый путь не приведёт к результату. Второй путь может привести к результату, но в итоге вы потратите ещё больше времени, чем изначально планировали. В любом случае, лучше вернуться назад и начать всё сначала, чем всё бросить и сдаться.


23

Автоматизация и Программирование. info-master.su

КНИГА НОМЕРА В этом выпуске журнала я советую вам обратить внимание на мою книгу «Основы программирования»:

Как говорят некоторые аналитики, через несколько лет (ну быть может, десятков лет) миром будут править инженеры и программисты! Хотите править миром? ))) Тогда начинайте изучать программирование прямо сейчас! >>> Для читателей журнала скидка 40% >>>


Автоматизация и Программирование. info-master.su

24

ОБ АВТОРЕ На всякий случай представлюсь (вдруг кому интересно). Это я – Поляков Андрей Валерьевич (можно просто Андрей))). По образованию я инженер. Работаю руководителем инженерного отдела в крупном (по меркам нашего региона) агрохолдинге. Это основная работа. Но есть у меня и другие интересы. Я пишу книги, создаю обучающие курсы. А также немного (на уровне любопытства) занимаюсь инфо-бизнесом. Все ссылки на мои контакты можно найти здесь: http://info-master.su/contact.php Все выпуски журнала можно найти здесь: http://info-master.su/programming/journal/

ПРАВОВЫЕ ПОЛОЖЕНИЯ Этот журнал является бесплатным. Однако это не означает, что Вы можете делать с ним всё, что угодно. ВАМ ЗАПРЕЩЕНО Продавать журнал и/или любое из приложений к журналу Изменять содержимое журнала Присваивать авторство журнала Использовать журнал или любые его части в своих книгах или других инфо-продуктах без согласования с автором ВАМ РАЗРЕШЕНО Использовать журнал в личных целях (для самообразования и развития) Распространять журнал любыми бесплатными способами (кроме спама) Включать в качестве подарка в комплект своих платных продуктов Раздавать за подписку (без нарушения правил данного раздела) ОТВЕТСТВЕННОСТЬ АВТОРА Автор гарантирует, что все описанные в журнале схемы и способы работоспособны, а информация соответствует действительности на момент написания книги. Любой другой текст журнала, не имеющий прямого отношения к описаниям каких-либо методик и технических моментов, является личным мнением автора и отражает его мировоззрение на момент выхода журнала. Автор не предоставляет Вам никаких гарантий, явных или подразумеваемых, что журнал не содержит ошибок, что журнал будет отвечать Вашим требованиям или ожиданиям, будет соответствовать Вашим целям и задачам. Ни автор, ни другие юридические или физические лица, имеющие отношение к созданию, производству или распространению журнала, не несут ответственности за прямые или косвенные убытки, которые могут возникнуть вследствие использования или невозможности использования журнала, даже если Вы уведомили представителя автора о возможности возникновения таких убытков. Никакое другое письменное или устное соглашение, предоставленное Вам, не может расширить границы этой ответственности.

Автоматизация и Программирование”, февраль 2018  
Автоматизация и Программирование”, февраль 2018  
Advertisement