шпоры си-2 (1)
.docx
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)) которые можно закрасить в тот или иной цвет.
|
|