Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория информационных процессов и систем120822.doc
Скачиваний:
2
Добавлен:
17.11.2019
Размер:
331.26 Кб
Скачать

Часть 1. Материал для повторения

МОДЕЛЬ РАБОЧЕГО СТОЛА

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

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

Значки и фон экрана являются визуальными образами объектов. Объектами в информатике называются сущности, обладающие определенным набором свойств и собственным поведением - реализацией на поступающие сообщения.

Состояние объекта характеризуется перечнем (обычно статистическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств"

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

Взаимодействие пользователя с персональным компьютером на котором установлена операционная система семейства Windows организовано таким образом, чтобы он как можно меньше обращался к клавиатуре. Главным инструментом общения пользователя с системой является меню (menu) – перечень возможных операций, которые пользователь может выполнить над объектом. Пользователь вызывает контекстное меню, установив указатель мыши на образе объекта и щелкнув правой кнопкой мыши.

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

Для взаимодействия с прикладными программами (приложениями) и блоками данных, хранящимися в памяти ЭВМ (документами) операционные системы семейств Windows предоставляют пользователю специальную структуру, визуальный образо которой называется окном.

В верхней части типичного окна операционной системы Windows расположена строка заголовка, под ней находиться строка меню, которая содержит перечни команд, выполняемых приложением. Ниже строки меню расположены панели инструментов, на которых иметься кнопки. Щелкая на них, можно быстро выполнить команды, которые часто используются. Еще ниже расположена линейка - удобный инструмент измерения, который помогает создать более сложные документы. В нижней части окна находиться строка состояния, здесь программы помешают различную полезную информацию. Большую часть окна занимают рабочая область, где создается документы. В этой части мигающий курсор указывает то место, куда будет помешен следующий символ, который вы введете (не путайте курсоры с указателем, который не мигает и перемешается мышью).

В левом верхнем углу имеется значок меню управления окном. Щелчок по нему вызывает появление меню с командами установления размеров, перемещения окна и выхода из изменения программы (эти команды можно выполнить другими, более простыми способами ) В правом конце строки заголовка расположена закрывающаяся кнопка восстановить \ развернуть\ кнопка свернуть.

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

ИНТЕРФЕЙС КОМАНДНОЙ СТРОКИ

Пользовательские интерфейсы современных операционных систем делятся на два класса. Большинство пользователей персональных ЭВМ знакомо лишь с оконным интерфейсом, включающим различные редактируемые элементы, меню, кнопки и т.п. Поддержка оконного интерфейса требует больших затрат ресурсов компьютера. Другой класс составляют интерфейсы командной строки, обеспечивающие ввод и вывод символьной информации только при помощи клавиатуры и дисплея. Такие интерфейсы применяются прежде всего на суперкомпьютерах, сетевых серверах, в системах, управляющих технологическими процессами. Они позволяют осуществлять выполнение программ в пакетном режиме, когда программы запускаются автоматически, при минимальном участии человека. Классический язык программирования С ориентирован на пользовательский интерфейс командной строки. Операционная система Windows включает эмулятор командной строки, который называется сеансом MS DOS. Здесь пользователь работает с полноценными Windows-приложениями, но их окна имитируют экран с командной строкой. Для операционных систем семейства UNIX, наоборот, интерфейс командной строки является основным, а окна, кнопки, меню и т.п. поддерживают специальные графические оболочки, например, XWindows.

Сеанс MS DOS представлен пунктом подменю программы меню кнопки Пуск Рабочего стола Windows. Его можно также запустить из окна выполнить: Рабочий стол / Пуск / Выполнить, в строке ввода окна наберите команду cmd для Windows NT, Windows 2000, Windows XP и command для Windows 95, Windows 98. Чтобы развернуть окно сеанса MS DOS на весь экран, используйте команду Alt+Enter (Alt-Ввод), эта же команда возвращает окну первоначальные размеры. Командная строка начинается с приглашения – специального изображения или текста, который показывает, что операционная система ожидает ввода команды пользователя.

Кроме идентификатора (имени) команда может содержать опции, аргументы и дополнительные параметры. Операционная система выполнит команду, после того, как пользователь нажмет клавишу Enter (Ввод).

Команда

mode con lines=25 cols=80 <Enter>

устанавливает стандартный размер шрифта на экране – 25 строк по 80 позиций в строке. Здесь mode (режим) – имя команды, con (консоль) – аргумент, 25 и 80 – параметры команды.

Обычно аргументами команды служат имена файлов и директорий (папок). Файлы и директории образуют иерархическую систему. Одна директория считается главной, она обозначается символом ‘\’. Каждый файл относится к определенной директории, точно так же любая директория, кроме главной, является поддиректорией другой директории. Полное имя файла или директории включает цепочку имен директорий, разделенных символом ‘\’, она начинается с символа главной директории, а каждая следующая директория цепочки является поддиректорией предыдущей:

\winnt\notepad.exe - файл notepad.exe относится к поддиректории winnt главной директории.

Вообще говоря, первоначально имена команд, файлов, директорий в операционной системе MS DOS состояли только из заглавных букв, если пользователь набирал их строчными буквами, операционная система сама изменяла их регистр. С другой стороны, в операционных системах семейства UNIX имена большинства стандартных команд и файлов состоят из строчных букв. Поэтому мы будем использовать в командной строке сеанса MS DOS в основном строчные буквы.

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

C:\winnt\notepad.exe

Задание. Создайте поддиректорию Test главной директории, а в ней – поддиректории с именами Bin, Include, Lib, Apps, Docs.

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

Сеанс MS DOS содержит дополнительную информацию, которая называется контекстом. Контекст включает перечень директорий PATH (путь), его можно вывести на экран при помощи команды PATH. Если пользователь запускает исполняемый файл без указания его полного имени, то операционная система ищет подходящий файл текущей директории и в директориях, входящих в перечень PATH. Команда

PATH имя_директории

оставляет в перечне PATH только директорию с заданным именем.

Задание. Выводите на экран перечень директорий PATH при помощи команды PATH. Затем выполните команду

PATH C:\Test\Bin

и убедитесь, что теперь перечень директорий PATH содержит только поддиректорию Bin директории Test.

Мы будем создавать программы в текстовом редакторе операционной системы Windows, который называется блокнотом. Текстовый процессор Word для этой цели не подходит так как созданный в нём документ содержит служебную информацию, которую не понимает компилятор языка С. Пользователь может запустить блокнот командой Рабочий стол/Пуск/программы/Стандартные/ Блокнот

или щелкнув правой кнопкой мыши по экрану и выбрав в появившемся меню пункт Создать/Текстовый документ.

В окне сеанса MS DOS блокнот вызывается командой

notepad.exe имя_файла.

В дальнейшем нам придется изменять перечень директории PATH, поэтому мы скопируем файл notepad.exe в директорию C:\Test\APPS.

Задание. Найдите на диске С:\ пакет программ инструментальной среды C Builder и скопируйте из него следующие файлы:

в директорию Bin

bcc32.exe;

ilink32.exe;

lnkdfm50.dll;

rlink32.dll;

в директорию Lib

c0x32.obj;

cw32.lib;

import32.lib;

uuid.lib.

КОМПИЛЯЦИЯ, КОМПОНОВКА И ВЫПОЛНЕНИЕ ПРОГРАММЫ

Компьютер выполняет команды, представленные при помощи языка машинных кодов. Программист, составляя программу, пишет её на языке высокого уровня, который не понимает ЭВМ. Системное программное обеспечение позволяет перевести исходный текст программы на язык машинных кодов. Компонентами системного программного обеспечения служат редактор исходного текста, компилятор, компоновщик (редактор связей), библиотеки.

С помощью редактора программист преобразует исходный текст в файл. Компилятор проверяет, есть ли в программе синтаксические ошибки – нарушения правил языка программирования. Если ошибок нет, он переводит исходный текст на язык машинных кодов и создает объектный файл. Обычно объектный файл имеет расширение obj. Компоновщик превращает объективный файл в исполняемый, добавляя в него средства взаимодействия с операционной системой. Исполняемый файл имеет расширение exe. Операционная система запускает программу, завершает её выполнение, а также передаёт ей данные и выводит результаты её работы на экран или помещает их в файл.

Выполняя задания предыдущего раздела, Вы должны были создать на диске С: директорию Test, в ней – поддиректории Bin, Include, Lib, Apps, Docs, и скопировать в эти директории системные файлы:

в директорию Bin

bcc32.exe;

ilink32.exe;

lnkdfm50.dll;

rlink32.dll;

в директорию Lib

c0x32.obj;

cw32.lib;

import32.lib;

uuid.lib

и в директорию Apps

notepad.exe.

Цифра 32 в именах файлов означает, что они являются компонентами 32-разрядной системы программного обеспечения:

bcc32.exe - компилятор;

ilink32.exe - компоновщик;

файлы с расширениями lib и dll представляют собой системные библиотеки, содержащие различные стандартные функции, написанные на языке машинных кодов.

Создадим первую программу на языке С. Для этого перейдем в директорию C:\Test\Apps и вызовем редактор notepad с именем файла, который мы хотим создать:

notepad.exe prog1.c

(расширение «c» указывает, что создаваемый файл содержит исходный текст программы на языке C). Редактор сообщит, что такого файла нет и предложит подтвердить, что мы действительно хотим создать файл с таким именем.

Наберем в окне редактора следующий текст:

main()

{}

и сохраним его в директории C:\Test\Apps. Иногда редактор добавляет к имени файла еще свое расширение txt. Проверим с помощью команды dir содержимое директории Apps, если имя файла имеет вид prog1.c.txt, переименуем его:

rename prog1.c.txt prog1.c

Укажем операционной системе, что компилятор следует искать в директории Bin:

path C:\Test\Bin

и обработаем файл программы компилятором:

bcc32.exe -L“C:\Test\Lib” prog1.c

Внимательно наберите эту команду: между опцией -L и следующим за ним именем директории не должно быть пробелов.

Если мы не сделали никаких ошибок, компилятор выдаст сообщение:

Warning W8070 prog1.c 2: Function should return a value in function main,

а в директории Apps, из которой мы запускали компилятор, появятся три новых файла:

prog1.tds

prog1.obj

prog1.exe

Постараемся разобраться в том, что мы сделали. Программа, написанная на языке С, обязательно должна содержать определение функции main. В соответствие с правилами синтаксиса языка C определение функции имеет следующий вид:

[тип_возвращаемого_значения] имя_функции ([аргументы])

{

[команды]

}

В квадратных скобках заключены необязательные компоненты определения. Оно начинается с заголовка, в нём следует указать имя функции и поставить пару круглых скобок. За заголовком располагается тело функции. Первая команда тела функции main служит точкой входа программы – здесь начинается ее выполнение, последняя команда функции main завершает программу. В нашем случае тело функции main пусто, команд нет, поэтому программа не решает никакую задачу. Исполняемый файл содержит лишь служебные команды, обрабатывающие те ресурсы, которые операционная система выделяет любой программе.

Для перевода программы на язык машинных кодов мы вызываем компилятор bcc32.exe; аббревиатура bcc означает Borland C compiler – компилятор языка С, разработанный фирмой Borland International Corporation. Он запускается из командной строки, аргументом служит имя файла с исходным текстом программы. Кроме того, при вызове компилятора следует указать два параметра: директорию Include и директорию Lib. В директории Include находятся стандартные включаемые файлы, содержащие заголовки определений тех стандартных функций, которые используются в программе, а в директории Lib – библиотечные файлы, в них размещаются объектные коды стандартных функций. Опции -L, -I помогают компилятору различать параметры. Как мы знаем, опции (или ключи) команд сеанса MS-DOS записываются по-другому: /s, /p. Дело в том, что формат вызова компилятора bcc удовлетворяет требованиям пользовательского интерфейса операционной системы UNIX.

Компилятор создает объектный файл программы (он имеет расширение obj) и передает управление компоновщику – исполняемому файлу ilink32.exe. Компоновщик формирует исполняемый файл программы с расширением exe. Файл с расширением tds содержит служебную информацию.

Рассмотрим предупреждение (warning), которое выдал компилятор. После слова Warning идет номер предупреждения W8070, имя программы prog1.c, номер строки, в которой обнаружена ошибка, и сообщение. Сообщение указывает, что функция должна возвращать значение, в конце сообщения стоит имя функции, в теле которой обнаружена ошибка. Тип возвращаемого значения следует объявить в начале определения функции, если его нет, то предполагается, что функция возвращает в точку вызова целое число. Функцию main вызывает операционная система, поэтому то значение, которое возвращает эта функция передается операционной системе. Оно называется кодом возврата и содержит информацию о характере завершения программы. Код возврата 0 означает, что в ходе взаимодействия программы операционной системой не обнаружено никаких ошибок.

Тип возвращаемого значения void (пустой) указывает, что на самом деле функция не возвращает никакого значения. Мы могли бы определить функцию main так:

void main()

{}

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

Для того, чтобы вернуть значение в точку вызова функции применяют оператор return (вернуть), он имеет такой формат:

return возвращаемое_значение;

(следует помнить, что в языке С любая команда завершается точкой с запятой). Снова вернемся в директорию Apps, загрузим в блокнот файл prog1.c и исправим программу:

main()

{

return 0;

}

(между именем оператора return и возвращаемым значением обязательно должен быть пробел). В языке C команда всегда завершается точкой с запятой. Откомпилируем программу:

bcc32.exe –L“C:\Test\Lib” prog1.c

Теперь компилятор не выводит предупреждения, на экране появляется служебная информация о ходе компиляции. В директории Apps мы видим те же три файла: prog1.obj, prog1.tds, prog1.exe. Файл prog1.exe – исполняемый, запустим его, набрав имя файла в командной строке. После того, как мы нажмем клавишу Enter (ввод) «ничего не произойдет», только экрана на мгновение очистится - исчезнет приглашение командной строки и другая информация.

Добавим в программу комментарий – часть исходного текста, ограниченная символами /* и */. Компилятор пропускает комментарий, не обрабатывая. Обычно комментарий содержит сведения, необходимые для понимания программы. Мы всегда будем начинать программу с комментария, указывающего имя программы:

/* prog1.c */

main()

{

return 0;

}

КОМАНДНЫЕ ФАЙЛЫ

Нам придется много раз компилировать программы, написанные на языке С. Достаточно утомительно каждый раз переписывать все параметры командной строки. Поэтому мы составим командный файл, который будет запускать компилятор в пакетном режиме. Этот файл также создается при помощи редактора notepad.exe, он должен иметь расширение .bat. Так как его основная работа – запуск компилятора bcc32.exe, то назовем его bcc.bat.

Наберем команду

notepad.exe bcc.bat,

подтвердим создание нового файла и введем в редактор следующий тект:

rem bcc.bat

if “%1”==“” goto error

path C:\Test\Bcc

bcc32.exe -I“C:\Test\Include” -L“C:\Test\Lib” %1.c

goto end

:error

echo Вы забыли указать имя программы (без расширения .c)

:end

Этот файл написан не на языке С, а на командном языке сеанса MS DOS. Его не надо компилировать, операционная система читает одну команду за другой и выполняет их. Расширение bat происходит от слова batch – пакет, оно означает, что файл выполняет группу команд как единое целое. Первая строка командного файла начинается со слова rem, это – начало комментария, концом комментария служит перевод строки. Как мы договорились, комменатрий должен содержать имя файла. Вторая строка содержит конструкцию %1; так обозначается аргумент пакетного файла. Теперь составим программу

/* prog2.c */

main()

{

return 2;

}

Если мы наберем в командной строке

bcc.bat prog2

то %1 будет именем слова prog2. Когда в командной строке стоит только имя пакетного файла bcc.bat аргумент пустой, “%1” - это просто пара двойных кавычек, два знака == - отношение равенства. Слово if служит началом оператора ветвления в пакетном файле, его формат

if [ NOT ] строка1 == строка2 команда

Операция NOT обращает истинность условия: истинное условие становится ложным, а ложное – истинным. Условие

строка1 == строка2

является истинным, когда эти строки совпадают, в этом случае оператор выполняет команду, стоящую после условия.

Слово NOT заключено в квадратные скобки, это означает, что оно является необязательной частью конструкции. Команду

if %1”==“” goto error

следует понимать так: если командный файл запущен с пустым аргументом, то выполняются команды, стоящие после метки error. Эту метку мы увидим ниже, двоеточие, с которого начинается строка с меткой, указывает, что error – метка, а не команда. За этой строкой находится строка с командой echo, она выводит на экран сообщение, напоминающее пользователю, что пакетный файл запускается с аргументом.

Если пользователь ввел аргумент – имя программы, то вместо перехода на метку error выполняется команда

path C:\Test\Bin

- теперь операционная система будет искать исполняемые файлы лишь в текущей директории и в директории Bin. Часто студенты говорят, что эта команда не нужна, «программа компилируется и так». На самом деле это означает, что список директорий поиска исполняемых файлов содержит путь к директории Bin пакета CBuilder, так что компилятор и компоновщик вызываются оттуда, откуда мы их копировали.

Следующая строка – вызов компилятора bcc32.exe с параметрами, указывающими имена директорий включаемых файлов и библиотек. Аргументом компилятора служит имя программы, в нашем случае – это аргумент пакетного файла %1. У любого файла с исходным текстом на языке С должно быть расширение .с; чтобы не повторять его каждый раз, мы передаем пакетному файлу имя файла - программы без расширения, а имя с расширением появляется при помощи конструкции %1.с. Команда безусловного перехода goto end позволяет обойти сообщение об ошибке, следующее за меткой error. После метки end команд нет, выполнение пакетного файла завершается.

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

@echo off

(символ @ подавляет вывод на экран самой команды echo off):

rem bcc.bat

@echo off

if “%1”==“” goto error

path C:\Test\Bcc

bcc32.exe -I“C:\Test\Include” -L“C:\Test\Lib” %1.c

goto end

:error

echo Вы забыли указать имя программы (без расширения .c)

:end

Задание. Составьте пакетный файл bcc.bat и убедитесь, что он корректно работает.

Код, который программа возвращает операционной системе в момент завершения, позволяет эмулятору командной строки управлять последовательностью выполнения команд пакетного файла. Для этого используется конструкция errorlevel. Оператор ветвления с этой конструкцией имеет такой формат:

"if [ NOT ] ERRORLEVEL число команда.

Условие

ERRORLEVEL число

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

Составим пакетный файл

rem test.bat

@echo off

prog2.exe

if ERRORLEVEL %1 echo Код возврата не меньше, чем %1

Исполняемый файл prog2.exe, полученный в результате компиляции программы prog2.c, возвращает операционной системе число 2 и завершается. Напомним, что программа test.bat представляет собой пакетный файл, её не надо компилировать. Запустим файл test/bat с аргументом 0:

test. bat 0

Первая команда после @echo off запускает файл prog2.exe.

Следующая команда состоит из двух частей. Первая часть - if ERRORLEVEL %1 - проверяет код возврата завершившейся программы и сравнивает его с аргументом - в нашем случае аргумент равен 0. Так как код возврата 2 не меньше, чем 0, то выполняется вторая часть: команда echo выводит на экран стоящее после неё сообщение: "Код возврата не меньше, чем 2". Запустим пакетный файл, увеличив аргумент:

test.bat 1.

На экране появится сообщений "Код возврата не меньше, чем 1". Запустим пакетный файл test.bat с аргументом 2. Условие ERRORLEVEL %1 по-прежнему будет истинным: 2 не меньше, чем 2. Команда echo выводит на экран сообщение: "Код возврата не меньше, чем 2". А после запуска

test.bat 3

на экране не появится никаких сообщений: код возврата 2 меньше, чем 3.

Задание. Cоставьте пакетный файл

rem test.bat

@echo off

prog2.exe

if NOT ERRORLEVEL %1 echo %1

Объясните результат выполнения следующих команд:

test.bat 0

test.bat 1

test.bat 2

test.bat 3

ВЫВОД СИМВОЛЬНОЙ ИНФОРМАЦИИ

В языке С для организации вывода используются стандартные функции. Тело стандартной функции написано на языке машинных кодов и входит в состав библиотеки – одного из файлов в директории Lib. Для того, чтобы компилятор мог её использовать, он должен знать её заголовок – имя функции, возвращаемое значение, количество и тип аргументов. Эта информация содержится в стандартных заголовочных файлах, которые находятся в директории Include. Скопируем в неё следующие файлы из директории Include пакета CBuilder:

C:\Test\Include

_defs.h

_nfile.h

_null.h

_stddef.h

stdio.h

Расширение h представляет собой сокращение слова header – заголовок. В тексте программы следует указать только один из файлов – stdio.h (standard input/output – стандартный ввод/вывод).

Создадим с помощью редактора notepad.exe в директории C:\Test\Apps файл с исходным текстом программы prog3.c:

/*prog3.c*/

#include <stdio.h>

main()

{

printf (“I am a student”);

return 0;

}

На первом этапе компиляции исходный текст программы обрабатывает специальный компонент компилятора, который называется препроцессором. Препроцессор изменяет программу так, чтобы её смог прочитать компилятор. В частности, он выполняет директивы, содержащиеся в исходном тексте. Каждая директива начинается с символа # - знака номера, или, как говорят программисты, «решётки». В отличие от команд, в конце директивы точка с запятой не ставится. Директива include имеет вид

#include <имя_файла>

Выполняя директиву include, препроцессор вставляет на её место содержимое указанного файла.

Стандартная функция printf (print – печатать, format – формат, способ представления данных) осуществляет вывод на экран содержимого строки – аргумента. Строка в языке С заключается в двойные кавычки.

Откомпилируем программу командой

bcc32.exe –I“C:\Test\Include” -L“C:\Test\Lib” prog3.c

Если программа составлена правильно, в директории Apps должен появиться файл prog2.exe. Запустив его, мы увидим на экране надпись “I am a student”.

Для того, чтобы функция printf не только выводила сообщения, но и осуществляла переход на новую строку, надо включить в строку управляющий символ \n:

printf (“I am a student\n”);

Если мы хотим отделить сообщение от последующих команд пустой строкой, то надо поставить два символа перевода строки:

printf (“I am a student\n\n”);

Вопросы для повторения:

Объясните, для чего нужна директива #include <stdio.h> в исходном тексте программы;

Что такое комментарии в исходном тексте программы? Объясните их назначение.

ОПЕРАЦИИ С ЦЕЛЫМИ ЧИСЛАМИ

Базовыми понятиями любого языка программирования служат константы, переменные и выражения. Переменные – это имена запоминающих устройств, чаще всего – областей памяти, а выражения строятся из констант и знаков операций. Переменная, входящая в выражение, интерпретируется как синоним константы, которая хранится в соответствующей области памяти. Каждая константа и переменная относится к тому или иному типу, тип константы определяет ее представление в памяти и те операции, в которых она может участвовать. Связь между переменными и областями памяти устанавливают специальные команды - объявления переменных. Объявление состоит из имени типа, за которым следует список переменных. Рассмотрим простой пример:

/*prog4.c*/

#include <stdio.h>

main()

{

int x = 17, y = 18, z;

z = x * y;

printf(“17 * 18 = %d\n”, z);

return 0;

}

Первой командой тела функции main является объявление переменных целого типа x, y и z. Слово int (integer-целых) – это имя типа; объявление выделяет в памяти две ячейки для хранения целых чисел. При объявлении переменных x и y выполняется их инициализация – в ячейку х помещается значение 17, а в ячейку y – 18. В следующей строке – операция присваивания, значения переменных x и y перемножаются и результат помещается в ячейку z. Произведение x * y представляет собой выражение, перемножаются те значения, которые были присвоены переменным в ходе инициализации.

Результат работы программы – в нашем случае произведение чисел 17 и 18 – надо каким-то образом сообщить пользователю. Для этого используется функция printf. Теперь у нее два аргумента. Первый аргумент, как и прежде, строка, функция выводит ее на экран один ее символ за другим, пока не дойдет до знака %, он отмечает начало спецификации формата. Следующий за ним символ определяет представление второго аргумента функции - константы, переменной или выражения, d означает, что значение должно быть выведено в виде десятичного числа. Закончив вывод значения аргумента, функция printf продолжает выводить символы строки, пока не пройдет ее всю. Если в строке встретится новая спецификация формата, то она определит представление на экране следующего аргумента функции printf. После выполнения программы на экране должно появиться сообщение: 17 * 18 = 306.

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

int x=17, y=17*18;

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

int x = 17, y;

y = x * 18;

Для ввода данных с клавиатуры в программах, написанных на языке С, используют функцию scanf:

/*prog5.c*/

#include <stdio.h>

main()

{

int x, y, z;

scanf ( “%d %d”, &x, &y);

z = x * y;

printf ( “%d * %d = %d\n”, x, y, z );

return 0;

}

когда мы запустим исполняемый файл, полученный при компиляции этой программы, компьютер перейдет в состояние ожидания ввода данных. Наберем значения 17 18 и нажмем Enter (ввод). На экране снова появится сообщение 17 * 18 = 306. Но теперь мы можем перемножать и другие пары чисел, например, если мы введем 44 55, то получим 44 * 55 = 2420. Объявляя переменные x и y, мы их не инициализируем. Функция scanf должна содержать не менее двух аргументов – строку со спецификациями формата и ссылки на переменные. Спецификации формата у функций printf и scanf совпадают. Знак & (амперсанд) перед переменной означает операцию ссылки, т.е. определение адреса переменной. Когда переменная встречается в составе выражения (в частности, когда она служит аргументом функции), компилятор интерпретирует её как синоним значения, присвоенного ранее этой переменной. Рассмотрим снова фрагмент программы:

int x = 17, y = 18, z;

z = x * y;

printf ( “%d\n”, x );

После инициализации переменная х получила значение 17, а y – 18. при вычислении выражения х * у перемножаются именно эти значения. Новое присваивание помещает в ячейку z значение 306, его и выводит функция printf. Функция scanf помещает значение, которое ввел пользователь, в ячейку, именем которой служит х, выражение &х передает функции scanf адрес этой ячейки.

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

/*prog6.c*/

#include <stdio.h>

main()

{

int x, y;

scanf ( “х = %d у = %d”, &x, &y );

printf ( “%d * %d = %d\n”, x, y, x * y );

return 0;

}

Теперь пользователь должен ввести данные в таком виде:

х=17 у=18

Символы х, =, у, = функция прочитает, но сохранит лишь значения 17 и 18. Если пользователь вместо х, у, = наберёт другие символы, программа будет выполнена некорректно, результат может быть совсем не тот, который ожидает пользователь.

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

+ сложить,

- вычесть,

* умножить,

/ выполнить целочисленное деление (деление с остатком)

% вычислить остаток от деления.

Как мы видим, символ % внутри первого аргумента функций printf, scanf интерпретируется как часть спецификации формата, а в арифметическом выражении – как знак операции вычисления остатка от деления одного числа на другое. Такие символы называются перегруженными. Значение перегруженного символа определяется его контекстом - той конструкцией, в состав которой он входит. Наличие перегруженных символов в языке программирования напоминает явление полисемии (многозначности) в естественном языке. Большая часть слов имеет не одно, а много значений: нос, коса, лист и т.п. Полисемия позволяет выражать самые разные мысли при помощи сравнительно небольшого запаса слов.

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

ОПЕРАЦИИ С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ

Вещественные числа относятся к типам float и double. Английское слово float обозначает плавать. Плавающими числами, точнее, числами с плавающей точкой называют вещественные числа, представленные в виде a * bp, число a называется мантиссой, во внутреннем представлении вещественных чисел мантисса удовлетворяет условию 0.5 < a ≤ 1. Число b равно 2 (во внутреннем представлении) или 10 (при выводе значения вещественного числа на экран), целое число p – порядок числа – может быть как положительным, так и отрицательным. Слово double означает двойной – вычисления выполняются с двойной точностью. Присваивая вещественному числу значение, выраженное десятичной дробью, ИСПОЛЬЗУЙТЕ ДЕСЯТИЧНУЮ ТОЧКУ. Ввод и вывод вещественных чисела осуществляется со спецификацией %f:

/*prog7.c*/

/*программа вычисляет среднее арифметическое двух чисел, которые пользователь вводит с клавиатуры*/

#include <stdio.h>

main()

{

float x, y, z;

scanf ( “х = %f у = %f”, &x, &y );

z = ( x + y ) / 2;

printf ( “среднее арифметическое чисел %f и %f равно %f”, x, y, z );

return 0;

}

Для работы с функциями вещественных аргументов надо добавить в программу директиву препроцессору

#unclude<math.h>

(вставить заголовочный файл math.h) или описать эти функции перед функцией main, указав типы аргумента и возвращаемого значения:

double sin ( double x ) - синус;

double cos ( double x ) - косинус;

double tan ( double x ) - тангенс;

double asin ( double x ) - арксинус;

double acos ( double x ) - арккосинус;

double atan ( double x ) - арктангенс;

double exp ( double x ) - экспоненциальная функция;

double log ( double x ) - натуральный логарифм;

double log10 ( double x ) - десятичный логарифм;

double sqrt ( double x ) - квадратный корень;

double fabs ( double x ) - абсолютная величина;

/*prog8.c*/

/*программа вычисляет квадратный корень числа, которое пользователь вводит с клавиатуры*/

#include <stdio.h>

#include <math.h>

main()

{

float x, y;

scanf ( “х = %f”, &x );

/*проверка: число, которое вводит пользователь, должно быть неотрицательным:*/

if (x < 0)

/*вывод сообщения об ошибке:*/

printf (“ошибка: надо ввести неотрицательное число”)

else

{

z = sqrt ( x );

printf ( “корень квадратный из числа %f равен %f”, x, y );

}

return 0;

}

Следующая программа также вычисляет корень квадратный из числа, которое вводит пользователь, но вместо включения файла math.h с помощью директивы include используется объявление функции sqrt:

/*prog9.c*/

/*программа вычисляет квадратный корень числа, которое пользователь вводит с клавиатуры*/

#include <stdio.h>

double sqrt ( double x );

main()

{

float x, y;

scanf ( “х = %f”, &x );

/*проверка: число, которое вводит пользователь, должно быть неотрицательным:*/

if (x < 0)

/*вывод сообщения об ошибке:*/

printf (“ошибка: надо ввести неотрицательное число”)

else

{

z = sqrt ( x );

printf ( “корень квадратный из числа %f равен %f”, x, y );

}

return 0;

}