Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

шпоры си-2 (1)

.docx
Скачиваний:
16
Добавлен:
29.05.2015
Размер:
35.29 Кб
Скачать

38 .Операторы, выражения и операции.

Оператор языка СИ состоит из ключевых слов, управляющих порядком выполнения программы, (таких как for или while), выражений и вызовов функций. "Выражение" представляет собой комбинацию операндов и операций, которые при вычислении дают единственное значение. "Операция" показывает, какие действия производить с операндами. "Операнд"-это константа, либо переменная, входящая в выражение.

-Формат оператора.

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

-Составные операторы.

Составные операторы-это набор нескольких операторов, заключенных в фигурные скобки { }. Составной оператор может находиться там же, где и обычный оператор. После фигурной скобки не требуется точки с запятой. Составной оператор известен также под названием "блок". -Выражения.

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

В языке СИ, присваивания считаются выражениями.

-Операция присваивания.

Операция присваивания определяет, что значение операнда с правой стороны помещается в память по адресу, задаваемому операндом с левой стороны.

-Операции.

Язык СИ поддерживает более 40 операций, начиная от основных арифметических операций до логических и поразрядных операций. Операции языка СИ дают результат, который может быть вложен внутрь большого выражения. Операции также могут быть объединены с оператором присвоения (=) для формирования составного оператора присваивания в следующей форме:

X+=Y;

-Преобразования типов.

Явное приведение типов может быть сделано с помощью операции приведения (cast), которая представляет собой тип, заключенный в скобки. В нижеследующем переменная i (предварительно описанная, как int) преобразуется в тип float:

(float)i

-Операции приращения и уменьшения.

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

Используйте эти операнды, как описано ниже:

if (i-->0) /* i сравнивается с нулем, затем i уменьшается */printf ("сравнивается, затем уменьшается"); if (--i>0) /* i уменьшается, затем сравнивается с нулем */printf ("уменьшается, затем сравнивается")

-Примеры: Некомментированные СИ-выражения.

while ((c=getchar())!=EOF)

Операторы цикла.

В языке СИ операторы for и while обеспечивают возможности повтрорения выполняемых операторов.

-Оператор for.

Оператор for используется для повторения какого либо оператора или составного оператора определенное количество раз. Он состоит из трех частей:

1. Выражение, стартующее цикл ( init-expr).

2. Текстовое выражение (cond-expr), вычисляемое перед каждой итерацией.

3. Выражение цикла (loop-expr), выполняемое в конце каждой итерации. Формат оператора for приведен ниже:

for([init-expr];[cond-expr];[loop-expr])statement

Оператор while.

Оператор цикла while состоит из текстового выражения (test-expr), которое вычисляется перед телом выполняемого цикла. Если test-expr при вычислении дает "ложь", цикл никогда не выполняется. Формат оператора while следующий:

while ([test-expr])

statement

Тело цикла while состоит из оператора или составного оператора. Если тестовое выражение дает при вычислении "истину", тело цикла выполняется до тех пор, пока выражение не станет "ложным".

-Окончание работы операторов for и while.

Обычно, операторы for и while завершают работу, как только тестовое выражение в цикле примет значение "ложь". Если необходимо прервать цикл раньше, можно воспользоваться операторами break, goto или return. Оператор continue прерывает интерацию без выхода из цикла и передает контроль следующей итерации оператора for или while.

Пример: Использование циклов for и while.

В языке СИ функции условий и переходов выполняют операторы if и switch.

-Оператор if.

Если тестовое выражение в операторе if получает значение "истина", выполняется тело оператора if. В противном случае, программа продолжается со следующего оператора. Оператор if может иметь также операторную скобку else. Однако, поскольку в языке СИ нет конструкции "else if", для достижения того же самого эффекта используйте вложенные операторы if. Без явного указания, язык СИ спаривает каждое else с ближайшим предыдущим if, которому не хватает else. Компилятору будет "яснее", если вы заключите группу операторов в фигурные скобки. Нижеследующие примеры показывают типичные операторы if: Оператор switch.

Оператор switch заменяет большое количество вложенных конструкций if и else.

39. Директивой препроцессора (или командной строкой препроцессора[1]) называется строка в исходном коде, которая начинается с символа # и следующего за ним ключевого слова препроцессора. Есть чётко определённый список ключевых слов:

define — задаёт макроопределение (макрос) или символическую константу

undef — отменяет предыдущее определение

include — вставляет текст из указанного файла

if — осуществляет условную компиляцию при истинности константного выражения

ifdef — осуществляет условную компиляцию при определённости символической константы

ifndef — осуществляет условную компиляцию при неопределённости символической константы

else — ветка условной компиляции при ложности выражения

endif — конец ветки условной компиляции

line — препроцессор изменяет номер текущей строки и имя компилируемого файла

error — выдача диагностического сообщения

pragma — действие, зависящее от конкретной реализации компилятора

пустое слово - пустое действие.

Препроцессор Си, встречая следующие директивы:

#include "..."

или

#include <...>

полностью копирует содержимое указанного файла в файл, в котором указана эта директива, в месте вызова директивы. Эти файлы обычно (хотя скорее, всегда) содержат определение интерфейса для различных функций библиотек и типов данных, которые должны быть подключены перед их использованием; таким образом, директива #include обычно указывается в начале (заголовке) файла. По этой причине подключаемые файлы и называются заголовочными. Некоторые содержат примеры из стандартной библиотеки Си (<math.h> и <stdio.h>), обеспечивая математические функции и функции ввода-вывода соответственно.

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

40. Процедуры

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

В программе трижды вызывается процедура work, в которой формальные переменные r, s, s1 заменяются фактическими n, sum, sr. Процедура выполняет ввод элементов массива, вычисляет сумму и среднее значение. Переменные s и s1 возвращаются в главную программу, поэтому перед их описанием ставится служебное слово var. Локальные параметры mas, j действуют только в процедуре. Глобальные - i, n, sum, sr доступны во всей программе.

Функции

Набор встроенных функций языка Паскаль достаточно широк (ABS, SQR, TRUNC и т.д.). Если в программу включается новая, нестандартная функция, то ее необходимо описать в тексте программы, после чего можно обращаться к ней из программы. Обращение к функции осуществляется в правой части оператора присваивания, с указанием имени функции и фактических параметров. Функция может иметь собственные локальные константы, типы, переменные, процедуры и функции. Описание функций аналогично описанию процедур. Отличительные особенности функций:

- результат выполнения - одно значение, которое присваивается имени функции и передается в основную программу;

- имя функции может входить в выражение как операнд.

Процедуры и функции СИ определенное действие или группу действий.

Каждая функция имеет свой интерфейс и реализацию.

Интерфейс функции – заголовок функции, в котором указывается название функции, список ее параметров и тип возвращаемого значения.

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

С точки зрения программиста функции бывают:

библиотечные – функции описанные в библиотеках языка С (как стандартных, так и не стандартных);

пользовательские – функции реализованные программистом в процессе разработки программы.

Описание функции на языке С осуществляется в любом месте программы вне описания других функций и состоит из трех элементов:

1. прототип функции;

2. заголовок функции;

3. тело функции.

Прототип функции – необязательная часть описания функции, предназначенная для объявления некоторой функции, интерфейс которой соответствует данному прототипу.

Объявление прототипа имеет следующий вид:

тип имя(список типов формальных параметров);

Параметры функции

Параметры функции – значения, передаваемые в функцию при ее вызове. Выделяют понятия: формальные и фактические параметры.

Формальные параметры – переменные, описываемые при объявлении функции в ее прототипе и заголовке и используемые в программном коде тела функции.

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

Прототип функции

Заголовок функции

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

Синтаксис объявления заголовка функции:

типимя(список формальных параметров)

Каждый элемент (формальный параметр) имеет следующий формат объявления:

Тело функции

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

43. Доступ к файлам

Описанные в начале данного раздела программы читают из

стандартного ввода и пишут в стандартный вывод, которые пре-

доставляются программе операционной системой.

Для программ, которые сами должны организовывать связь

с файлами, в библиотеке ввода/вывода действуют следующие

правила.

Прежде чем считывать из некоторого файла или записы-

вать в него, этот файл должен быть открыт с помощью функции

open из стандартной библиотеки. Функция fopen берет внешнее

имя (подобное х.c или "temp002") и возвращает внутреннее

имя, которое должно использоваться при последующих чтениях

из файла или записях в него.

Это внутреннее имя, называемое "указателем файла", фактически является указателем структуры, которая содержит

информацию о файле, такую как место размещения буфера, теку-

щая позиция символа в буфере, происходит ли чтение из файла

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

знать эти детали, потому что среди определений, получаемых

из файла stdio.h, содержится определение этой структуры.

Единственное необходимое для указателя файла описание демонстрируется примером: FILE *fp;

Здесь говорится, что fp является указателем на FILE.

Обратите внимание, что file является именем типа, подобным

int, а не ярлыком структуры; это реализовано через

"#define".

Обращение к функции fopen в программе имеет вид:

fp=fopen(name,mode);

Первым аргументом функции fopen является имя файла, которое

задается в виде символьной сроки "name". Второй аргумент

mode (режим) также является символьной строкой, которая ука-

зывает, как этот файл будет использоваться. Допустимыми

режимами являются: чтение (r), запись (w) и добавление (a),

возможен еще символ + справа (например, r+), который озна-

чает, что возможно и чтение, и запись в файл.

Если вы откроете файл, который еще не существует, для

записи или добавления, то такой файл будет создан (если это

возможно). Открытие существующего файла на запись приводит

к отбрасыванию его старого содержимого. Попытка чтения несу-

ществующего файла является ощибкой. Ошибки могут быть обус-

ловлены и другими причинами (например, попытка чтения из

файла, не имея на то разрешения). При наличии какой-либо

ошибки функция возвращает нулевое значение указателя NULL

(которое для удобства также определяется в файле stdio.h).

Другой необходимой вещью является способ чтения или

записи, если файл уже открыт. Здесь имеется несколько воз-

можностей, из которых getc и putc являются простейшими.

Функция getc считывает из файла следующий символ; ей необхо-

дим указатель файла, чтобы знать, из какого файла читать.

Обращение: c=getc(fp)

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

вом fp, и EOF, если достигнут конец файла.Функция putc: putc(c,fp)

помещает символ c в файл fp и возвращает c. Подобно функциям

getchar и putchar, getc и putc могут быть макросами, а не

функциями.

При запуске программы автоматически открываются три

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

Этими файлами являются стандартный ввод, стандартный вывод и

стандартный вывод ошибок; соответствующие указатели файлов

называются stdin, stdout и stderr. Обычно все эти указатели

связаны с терминалом, но stdin и stdout могут быть перенап-

равлены на файлы или в межпроцессный канал.

Функции getchar и putchar могут быть определены в тер-

минах getc, putc, stdin и stdout следующим образом:

#define getchar() getc(stdin)

#define putchar(c) putc(c, stdout)

При работе с файлами для форматного ввода и вывода можно

использовать функции fscanf и fprintf. Они идентичны функ-

циям scanf и printf, за исключением того, что первым аргу-

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

который будет читаться или куда будет вестись запись; управ-

ляющая строка будет вторым аргументом.

Указатели файлов stdin и stdout заранее определены в

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

вывод; они могут быть использованы в любом месте, где можно

использовать объект типа FILE *. Они, однако, являются конс-

тантами, а не переменными, так что их нельзя изменять.

Функция fclose является обратной по отношению к fopen;

она разрывает связь между указателем файла и внешним именем,

установленную функцией fopen, и высвобождает указатель файла

для другого файла. В операционной системе имеются ограниче-

ния на число одновременно открытых файлов, которыми может

распоряжаться программа. Функция fclose закрывает файл, а

также вызывает выдачу информации из буфера, в котором putc

собирает вывод (при нормальном завершении программы функция

fclose вызывается автоматически для каждого открытого

файла).

41.

48.Поясню использованные в примере обозначения. Все определенные элементы класса имеют тип verbosity. Модификаторы protected internal означают, что доступ к элементам класса ограничен пределами данного проекта (internal) или классов, производных от verbosity. readonly означает доступ только для чтения; virtual — возможность переопределения метода в производных классах. Символ @ в имени константы позволяет использовать зарезервированное слово const в роли идентификатора. Слово this, обозначая данный экземпляр класса, является обязательным элементом описания индексатора.

В то же время отсутствие в языке Си# специальных слов, обозначающих метод и свойство (подобно словам procedure, function в паскалеподобных языках) заставляет отличать их описания друг от друга и от описания полей и индексаторов по косвенным признакам. В описании метода после его имени есть круглые скобки; в описании свойства — фигурные; у индексатора — квадратные; в описании поля нет скобок, но может присутствовать знак равенства¼ Просто тест на внимательность получается.

Многословие Си# (как, впрочем, и Явы) выглядит непривлекательно и стилистически ущербно. Заимствованные из Си правила позволяют очень компактно записывать выражения и операторы, используя разнообразные специальные знаки. В то же время объектные нововведения оформлены громоздко и, наоборот, игнорируют возможности знаков препинания. В итоге получается, что и писать трудно, и читать не легко.

Как уже говорилось, при разумном использовании пространства программы число различных описателей могло быть меньше. Описатель static был бы не нужен. Могло быть меньшим и число слов, регулирующих доступ. Пример простого, удобного и наглядного оформления доступа дают, опять же, языки Оберон и Оберон-2.

Перспективы Си#

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

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

Си# представляется более реалистичным языком, чем Ява. В отличие от Явы, он самодостаточен. То есть на Си# можно написать любую программу, не прибегая к другим языкам. Это возможно благодаря наличию «небезопасных» блоков кода, которые открывают доступ непосредственно к аппаратуре. В языке Ява для доступа к средствам низкого уровня должны использоваться «родные методы» (native methods), которые необходимо программировать на других языках.

И, разумеется, перспективы Си# в первую очередь связаны с теми усилиями, которые, конечно же, приложит компания Microsoft для его продвижения. Можно не сомневаться. Новая перспектива

Перспектива развития всемирной Сети, известной как проект Веб 3.0 поддерживает особый интерес к семантике распределенных данных и их обработке декларативными методами. В связи с этим появились концепции языка OWL, основанного на концепции First-Order Logic (FOL)[3], реализацию которой, в свою очередь, можно рассматривать как значительно более расширенную[источник не указан 466 дней] технику классического Prolog.

47. С помощью Turbo Pascal 7.0 можно создавать любые программы – от программ, предназначенных для решения простейших вычислительных задач до сложных современных систем управления базами данных [10, c. 44].

Систему программирования Turbo Pascal 7.0 называют интегрированной (integration – объединение отдельных элементов в единое целое) средой программирования, так как она объединяет в себе возможности ранее разрозненных средств, используемых при разработке программ: редактора текстов, компилятора, комповщика, отладчика, и при этом обеспечивает программисту великолепные сервисные возможности. Часто ее кратко называют IDE (Integrated Development Envirinment – интегрированная среда разработки).

Интегрированная инструментальная оболочка языка программирования Turbo Pascal 7.0 (рисунок 2) содержит «Меню» возможных режимов – верхняя строка, нижняя – краткую справку о назначении основных функциональных клавиш. Вся остальная часть экрана принадлежит окну редактора, очерченному двойной рамкой и предназначенному для ввода и коррекции текстов программ. В его верхней строке приводятся имя дискового файла, откуда был прочитан текст программы (новому файлу присваивается имя NONAME00.PAS), два специальных поля, используемых при работе с устройством ввода «мыши» (эти поля выделены квадратными скобками), и цифра 1 – номер окна. Среда Turbo Pascal 7.0 позволяет использовать до 9-ти окон редактора одновременно

Язык Turbo Pascal 7.0 состоит приблизительно из 80зарезервированных слов и специальных символов. Алфавит языка составляют буквы латинского алфавита, арабские цифры от 0 до 9, а также специальные символы, такие, например, как +, -, _

46. Начиная с версии 4.0, в состав Turbo Pascal включена мощная библиотека графических программ Graph, остающаяся практически неизменной во всех последующих версиях.

Модуль Graph cодержит обширный набор типов, констант, процедур и функций для управления графическим режимом работы экрана. С помощью подпрограмм, входящих в модуль Graph, можно создавать разнообразные графические изображения и выводить на экран текстовые надписи стандартными или разработанными программистом шрифтами. Подпрограммы модуля Graph после соответствующей настройки могут поддерживать различные типы аппаратных графических средств. Настройка на имеющиеся в распоряжении программиста технические средства графики осуществляется специальными программами – драйверами. Драйвер хранится в отдельном файле на диске и содержит как исполняемый код, так и необходимые ему для работы данные. Признак файла с драйвером – расширение .big имени файла .Для работы графики её надоинициализировать, а для этого необходимо определить возможный графический режим. Для включения графического режима используется процедура: InitGraph (var driver, Mode : Integer; Path : String);

Любое изображение на экране монитора формируется из отдельных элементов – пикселов (от английского pixel, возникшего в результате объединения слов «рисунок» (picture) и «элемент» (element)) которые можно закрасить в тот или иной цвет.