вопросы. общие вопросы. Программа ипрограммирование
Скачать 1.45 Mb.
|
Тело Циклаит1 Конструкция for может использоваться для задания бесконечного цикла в случае отсутствия инициализирующих действий, условия и итераторов: for (;;);. В этом случае нужно предусмотреть другой способ прерывания исполнения — например, с помощью break, goto или return. ит2 95 ЗАМЕЧАНИЕ Если условие изначально ложно, тело цикла может не выполниться ни разу, в отличие от инициализирующих действий. Цикл for часто используется для эмуляции стандартного цикла с параметром – цикла ДЛЯ других языков программирования, хотя им и не является (в строгом смысле слова). Чтобы превратить его в цикл с параметром, необходимо, чтобы инициализирующие действия включали задание начального значения переменной цикла, условие относилось к границе изменения параметра, а действия-итераторы включали изменение значения переменной цикла. Пример: /* умножение всех элементов массива на 2*/ for (i=0; i Несмотря на частое использование в качестве цикла с параметром, возможности for языка программирования Си гораздо шире. Это иллюстрируют следующие примеры: /* пробег сразу двух массивов во встречных направлениях */ for (i=0,j=M; i /* тело цикла пустое — все делают итераторы*/ for (i=0;i ЗАМЕЧАНИЕ Программистам не рекомендуется злоупотреблять подобными трюками, поскольку они затрудняют понимание программы человеком и чреваты внесением трудноуловимых ошибок. С помощью цикла for могут быть эмулированы и стандартные циклы вида ПОКА и ДО (читателю предлагается самостоятельно разобраться, каким образом). Несмотря на это отдельные формы этих циклов в языке также присутствуют, примеры можно найти в главе о базовых конструкциях императивных языков. В примере используется также условный оператор языка Си. Его синтаксис выглядит следующим образом: if (<условие>) <действие 1> else <действие 2>; В случае истинности условия (которое может быть сложным, где фигурируют несколько простых условий, связанных логическими связками И — &&, ИЛИ — ||) выполняются <действия 1>, в качестве которых может выступать один оператор или группа операторов, заключенных в операторные скобки (фигурные скобки). Если условие не выполняется, то исполняется <действие 2>. Ветвь ИНАЧЕ (else) может отсутствовать. Этот случай соответствует сокращенному условному выражению, когда в случае ложности условия просто ничего не происходит. Пример: if (summa>0 && ostatok>0 && (!ograblenie())) vydat_dengi(); ЗАМЕЧАНИЕ Благодаря наличию в языке Си условного выражения иногда можно обойтись без использования оператора if. Кроме оператора if язык Си поддерживает оператор выбора, выглядящий следующим образом: switch(<пер>) { case <зн1>:<действия1>;break; case <зн2>:<действия2>;break; case <зн3>:<действия3>;break; … [default:<действия_если_ни_одно_не_подошло>] } В операторе выбора для выбора альтернативной ветви используется значение переменной в скобках после switch (переменная должна быть перечислимого типа, например целочисленная). Если оно совпадет с <зн1>, выполняются <действия1>, если со <зн2> — <действия2> и т. д. Если действия включают несколько операторов, последние не заключаются в операторные скобки, а лишь записываются один за другим и разделяются точкой с запятой. Строк case столько, сколько важных вариантов должна обработать программа. Иногда в оператор выбора добавляется строка default, содержащая действия, выполняемые, если значение переменной не совпало ни с одним из <знi>. Обработка иллюстрируется рис. 15. case1: case2: switch (){ case3: casen: break break } break break defaul ЗАМЕЧАНИЕ Поскольку ветви case реализованы в языке программирования Си фактически как метки, для того чтобы при входе в каждую из веток и выполнения соответствующих действий автоматически не происходили переход к следующей строке и выполнение строки со следующим case, необходимо каждую ветвь заканчивать оператором break. Пример использования switch приводится в лабораторном практикуме (приложение А). Помимо простых, или одномерных, массивов в языке Си возможна работа с так называемыми многомерными массивами, то есть массивами, элементы которых также являются массивами. В простейшем случае двумерный массив (аналогом которого в математике является двумерная матрица) может быть описан следующим образом: float matr[10][20]; Здесь объявляется массив из 10 строк по 20 элементов в каждой. Доступ к элементам массива осуществляется очевидным образом: y+=matr[i][j]; ЗАМЕЧАНИЕ Обратите внимание на то, что каждое измерение записывается в своих квадратных скобках. В примере к переменной y добавляется значение элемента массива matr, находящееся на пересечении i-й строки и j-го столбца матрицы. Аналогично выполняется работа с трехмерными и имеющими большее число измерений массивами. Важным элементом программирования является возможность задания значений переменной при объявлении. В некоторых языках, например, принадлежащих к Паскаль-семейству, по умолчанию все переменные инициализируются нулем. В Си по умолчанию переменным не присваивается никакого значения, что служит источником трудноуловимых ошибок, ведь значение неинициализированной явным образом переменной соответствует случайному числу, находившемуся в данной ячейке памяти до запуска программы. Причем может оказаться, что 50 раз при запуске там случайно оказывается, например, ноль и программа работает штатно, а затем происходит неожиданный сбой на 51-м запуске, когда в данной ячейке будет иное значение. В связи с этим хорошим тоном в программах на Си является запись вида int k=0,b=2; /* инициализация при объявлении */ float z=3.21 Подобным образом можно инициализировать и массивы: int a[7]={-7,0,1,2,15,21,-1}; /* одномерный массив*/ char ima[20]="дядя Ваня"; /* строка — массив символов */ int mat[2][3]={ {1, 2, 3}, {-1,0, 1} }; Как и в других языках программирования, в Си возможно создание на основе базовых типов данных более сложных конструкций. В некоторых языках подобного рода конгломераты называются записями, в других — структурами и т. д. Идея структуры состоит в том, что под одним именем группируются сразу несколько параметров (элементов данных). Можно попытаться описать, например, гоночный автомобиль следующим набором параметров: мощность двигателя (целое число лошадиных сил), изготовитель (строка символов), тип мотора (строка символов), количество передач (целое число), максимальная скорость (число с плавающей точкой). В языке программирования Си возможно объявление соответствующей данному описанию структуры: struct { int Power; char Manufacturer[40]; char Motor[40]; int transmissons; float MaxSpeed; } Auto; После этого объявления можно обращаться к отдельным элементам данных структуры Auto. Делается это следующим образом, например: Auto.Power=340; Auto.MaxSpeed=380.2; scanf("%s",Auto.Manufacturer); Помимо простого объявления структуры в языке Си возможно объявление структуры с определением нового типа данных с именем, совпадающим с именем структуры. Для этого используется ключевое слово typedef. В приведенном примере, например, заголовок мог бы выглядеть следующим образом: typedef struct {…} Auto; После этого можно объявлять переменные нового типа Auto, например: Auto car,car2; Дальнейшее обращение к членам данных переменных car и сar2 производится стандартным образом, например: car.Power, car.Motor и т. д. 45 Работа с файлами в языке Си Для удобства обращения информация в запоминающих устройствах хранится в виде файлов. Файл – именованная область внешней памяти, выделенная для хранения массива данных. Данные, содержащиеся в файлах, имеют самый разнообразный характер: программы на алгоритмическом или машинном языке; исходные данные для работы программ или результаты выполнения программ; произвольные тексты; графические изображения и т. п. Каталог (папка, директория) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов. Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках). Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт). Рассмотрим структуру файловой системы на примере FAT32. |