Главная страница

Алгоритмизации


Скачать 1.15 Mb.
НазваниеАлгоритмизации
Дата27.09.2022
Размер1.15 Mb.
Формат файлаdocx
Имя файла12_100229_1_124427 (1).docx
ТипДокументы
#700459
страница4 из 67
1   2   3   4   5   6   7   8   9   ...   67

ГЛАВА 2. Базовые средства языка Си



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

При создании программ разработчик может допустить следующие ошибки: синтаксические и логические.

Синтаксические ошибки – это результат нарушения формальных правил написания программы на конкретном языке программирования.

Логические ошибки разделяются, в свою очередь, на ошибки алгоритма и семантические ошибки.

Причиной ошибки алгоритма является несоответствие построенного алгоритма ходу получения конечного результата сформулированной задачи.

Причина семантической ошибки неправильное понимание смысла

(семантики) операторов выбранного языка программирования.

    1. АлфавитязыкаСи


Алфавит любого языка составляет совокупность символов – тех неделимых знаков, при помощи которых записываются все тексты на данном языке.

Каждому из множества значений, определяемых одним байтом (от 0 до 255), в таблице знакогенератора ЭВМ ставится в соответствие символ. По кодировке фирмы IBM символы с кодами от 0 до 127, образующие первую половину таблицы знакогенератора, построены по стандарту ASCII и одинаковы для всех компьютеров, вторая половина символов (коды 128 – 255) может отличаться и обычно используется для размещения символов национального алфавита. Коды 176 – 223 отводятся под символы псевдографики, а коды 240 – 255 – под специальные знаки (прил. 1).

Алфавит языка Си включает:

  • прописные и строчные буквы латинского алфавита и знак подчеркивания (код 95);

  • арабские цифры от 0 до 9;

  • специальные символы, смысл и правила использования которых будем рассматривать по тексту;

  • пробельные (разделительные) символы: пробел, символы табуляции, перевода строки, возврата каретки, новой страницы и новой строки.



    1. Лексемы


Из символов алфавита формируются лексемы (или элементарные конструкции) языка минимальные значимые единицы текста в программе:

  • идентификаторы;

  • ключевые (зарезервированные) слова;

  • знаки операций;

  • константы;

  • разделители (скобки, точка, запятая, пробельные символы).

Границы лексем определяются другими лексемами, такими как разделители или знаки операций, а также комментариями.

    1. Идентификаторыиключевыеслова


Идентификатор (ID) – это имя программного объекта (константы, переменной, метки, типа, функции и т.д.). В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания; первый символ ID– не цифра; пробелы внутри ID не допускаются.

Длина идентификатора определяется выбранной версией среды программирования. Например, в среде Borland C++ 6.0 идентификаторы могут включать любое число символов, из которых воспринимаются и используются только первые32 символа. Современная тенденция– снятие ограничений длины идентификатора.

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

  • IDпеременных и функций обычно пишутся строчными (малыми)

буквами index,max();

  • IDтипов пишутся с большой буквы, например, Spis, Stack;

  • IDконстант (макросов) большими буквами INDEX, MAX_INT;

  • идентификатор должен нести смысл, поясняющий назначение объекта в программе, например, birth_date день рождения, sum сумма;

  • если ID состоит из нескольких слов, как, например, birth_date, то принято либо разделять слова символом подчеркивания, либо писать каждое следующее слово с большой буквы – birthDate.

В Си прописные и строчные буквы различные символы.

Идентификаторы Name, NAME, name различные объекты.

Ключевые (зарезервированные) слова не могут быть использованы в качестве идентификаторов.

Список ключевых слов, определенных в стандарте ANSI Cи:


auto

do

goto

signed

unsigned

break

double

if

sizeof

void

case

else

int

static

volatile

char

const

enum

extern

long

register

struct

switch

while

continue default

float for

return short

typedef union








Здесь и далее по тексту объектами будем называть элементы, участвующие в программе.
    1. Комментарии


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

В Си комментарии ограничиваются парами символов /* и */, а в С++ был введен вариант комментария, который начинается символами // и заканчивается символом перехода на новую строку.

    1. Простейшаяпрограмма


Программа, написанная на языке Си, состоит из одной или нескольких функций, одна из которых имеет идентификатор main главная (основная). Она является первой выполняемой функцией (с нее начинается выполнение программы) и ее назначение – управлять работой всей программы (проекта).

Общая структура программы на языке Си имеет вид:

<директивы препроцессора>

<определение типов пользователя typedef>

<описание прототипов функций>

<определение глобальных переменных>

<функции>

В свою очередь, каждая функция имеет следующую структуру:

<класс памяти> <тип> < IDфункции> (<объявление параметров>)

{ начало функции

код функции

} конец функции

Код функции является блоком и поэтому заключается в фигурные скобки.

Функции не могут быть вложенными друг в друга.

Рассмотрим кратко основные части общей структуры программ.

Перед компиляцией программа обрабатывается препроцессором(прил. 3),

который работает под управлением директив.

Препроцессорные директивыначинаются символом #, за которым следует наименование директивы, указывающее ее действие.

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

#include< ID_файла.h>

где h расширение заголовочных файлов.





Более подробное описание функции mainрассматривается в п. 11.7.

Если идентификатор файла заключен в угловые скобки (< >), то поиск данного файла производится в стандартном каталоге, если – в двойные кавычки (” ”), то поиск файла производится в текущем каталоге.

К наиболее часто используемым библиотекам относятся:

stdio.h содержит стандартные функции файлового ввода-вывода;

math.h математические функции;

conio.h – функции для работы с консолью (клавиатура, дисплей). Второе основное назначение препроцессора обработка макроопре-

делений. Макроподстановка определить(define) имеет общий вид

#defineIDстрока


Например: #definePI3.1415927

в ходе препроцессорной обработки программы идентификатор PIвезде будет заменяться значением 3.1415927.

Рассмотрим пример, позволяющий понять простейшие приемы программирования на языке Си:

#include void main(void)

{ // Начало функции main

printf(“ Высшая оценка знаний 10 !”);

} // Окончание функции main

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

Для начала будем использовать функцию mainбез параметров и не возвращающую значения.

Код функции представляет собой набор инструкций, каждая из которых оканчивается символом «;». В нашем примере одна инструкция – функция printf, выполняющая вывод данных на экран, в данном случае – указанную фразу.




Приемы отладки в среде программирования VisualC++ 6.0

рассматриваются в прил. 5.


    1. Основныетипыданных


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

Тип данных определяет:

внутреннее представление данных в оперативной памяти;

–совокупность значений (диапазон), которые могут принимать данные этого типа;

набор операций, которые допустимы над такими данными.

Основные типы базовых данных: целый – int (integer), вещественный с одинарной точностью – floatи символьный – char (character).

В свою очередь, данные целого типа могут быть короткими short, длинными – longи беззнаковыми – unsigned, а вещественные – с удвоенной точностью – double.

Сложные типы данных– массивы, структуры– struct, объединения–

union, перечисления– enum.

Данные целого и вещественного типов находятся в определенных диапазонах, т.к. занимают разный объем оперативной памяти (табл. 2.1).

Таблица 2.1


Тип данных Об

ъем памяти (байт) Диапа

зон значений

сhar1




–128 127

int2 (4)*




–32768 32767

short1 (2)*




–32768 32767(–128 127)

long4




–2147483648 2147483647

unsignedint4




0 65535

unsignedlong4




0 4294967295

float4




3,141038 3,141308

double8




1,710308 1,713008

longdouble10




3,4104932 3,4140932

  • Размер памяти зависит от разрядности процессора, для 16-разрядных объем памяти определяется первой цифрой, для 32-разрядных – второй.



    1. Декларацияобъектов


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

    • описание, не приводящее к выделению памяти;

    • определение, при котором под объект выделяется объем памяти в соответствии с его типом; в этом случае объект можно инициализировать, т.е. задать его начальное значение.

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

<атрибуты> <списокIDобъектов>;


элементы спискаIDобъектовразделяются запятыми, а атрибуты

разделителями, например: inti,j,k; floata,b;

Объекты программы могут иметь следующие атрибуты:

класс памяти– характеристика способа размещения объектов в памяти (статическая, динамическая); определяет область видимости и время

жизни переменной (по умолчанию – auto), данные атрибуты будут рассмотрены в гл. 12;

тип тип будущих значений декларируемых объектов (по умолчанию устанавливается тип int).

Класс памяти и тип– атрибуты необязательные и при отсутствии одного из них (но не обоих одновременно) устанавливаются атрибуты по умолчанию.

Примеры декларации простых объектов:

inti,j, k; charr; doublegfd;

Рассмотрим основные базовые типы данных более подробно.

    1. Данныецелоготипа(integer)


Тип int целое число, обычно соответствующее естественному размеру целых чисел. Квалификаторы shortи longуказывают на различные размеры и определяют объем памяти, выделяемый под них (см. табл. 2.1), например:

shortx; longx;

unsignedx= 8; декларация с инициализацией числом 8;

атрибут intв этих случаях может быть опущен.

Атрибуты signedи unsignedпоказывают, как интерпретируется старший бит числа – как знак или как часть числа:



Знак Зн

ачение числа

15

14 13 12 11 10 9 8 7 6 5 4 3 2 1 0



int

unsignedint


Значение числа
15 0


  • номера бит


long

31 30 0

Значение числа
unsignedlong

31 0


    1. Данныесимвольноготипа(char)


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

Для персональных компьютеров (ПК) наиболее распространена ASCII (AmericanStandardCodeforInformationInterchenge) таблица кодов (см. прил. 1). Данные типа charрассматриваются компилятором как целые, поэтому

возможно использование signedchar: величины со знаком (по умолчанию) – символы с кодами от –128 до +127 и unsignedchar беззнаковые символы с кодами от 0 до 255. Этого достаточно для хранения любого символа из 256- символьного набора ASCII. Величины типа charприменяют еще и для хранения целых чисел из указанных диапазонов.

Примеры: charres, simv1, simv2;

charlet= 's'; декларация символьной переменной с инициализацией символом s.

    1. Данныевещественноготипа(float,double)


Данные вещественного типа в памяти занимают (табл. 2.2): float 4 байта (одинарная точность), double(удвоенная точность) 8 байт; long double (повышенная точность) – 10 байт. Для размещения данных типа float обычно 8 бит выделено для представления порядка и знака и 24 бита под мантиссу.

Таблица 2.2


Тип Точность (ман

тисса) Порядок




float(4 байта)

7 цифр после запятой

± 38

double(8 байт)

15

± 308

longdouble(10 байт)

19

± 4932


Типы данных с плавающей десятичной точкой хранятся в оперативной памяти иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей: мантиссы и порядка (см. разд. 3.2 «Константы вещественного типа»). В IBM совместимых ПК, как вы уже знаете, переменная типа float занимает 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу.

Мантисса это число больше единицы и меньше двух. Поскольку старшая цифра мантиссы всегда равна единице, то ее не хранят.

Для величин типа doublе, занимающих 8 байт, под порядок и мантиссу отводится11 и52 разряда соответственно. Длина мантиссы определяет точность числа, а порядок его диапазон. Как можно видеть из приведенных выше таблиц, при одинаковом количестве байт, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления значений таких данных.

При переносе программы с одной платформы на другую нельзя делать предположений, например, о типе int, так как для оперативной системы (ОС) MSDOS этот тип имеет размер в два байта, а для ОС Windows9X – четыре байта. В стандарте ANSI поэтому диапазоны значений для основных типов не задаются, а определяются только соотношения между их размерами, например:

sizeof(float) < sizeof(double) < sizeof(longdouble) ,

sizeof(char) < sizeof(short) < sizeof(int) < sizeof(long) ,

где операция sizeof возвращает количество байт для указанного аргумента

скалярного типа данных.

    1. Использованиемодификаторовпридекларациипроизводныхтипов данных


Ключевые слова int, float, charи т.д. называют конечными атрибутами декларации объектов программы. При декларации так называемых производных объектов используют еще дополнительные – промежуточные атрибуты или, как их иногда называют, «модификаторы».

К символам модификации текущего типа относятся:

    • символ * перед идентификатором, обозначающий декларацию указателя на объект исходного типа (левый промежуточный атрибут);

    • символы [ ] после идентификатора объекта декларация массива объектов;

    • символы ( ) после идентификатора объекта декларация функции

(правые промежуточные атрибуты).

Допускается использование более одного модификатора типа с учетом следующих правил:

      1. чем ближе модификатор к IDобъекта, тем выше его приоритет;

      2. при одинаковом расстоянии от идентификатора объекта модифика- торы [ ] и ( ) обладают приоритетом перед атрибутом звездочка *;

      3. дополнительные круглые скобки позволяют изменить приоритет объединяемых ими элементов описания;

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

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

Примеры декларации объектов с конечным атрибутом int:

int a; переменная типаint;

int a[5]; – массив из пяти элементов типа int; int *a; – указатель на объект типа int;

int**a; указатель на указатель на объект типа int;

int*a[5]; массив из пяти указателей на элементы типа int;

int(*a)[10]; указатель на массив из десяти элементов типаint;

int *a[3][4]; – 3-элементный массив указателей на одномерные целочисленные массивы по четыре элемента каждый;

inta[5][2]; двухмерный массив элементов типаint;

int a(void); – функция без параметров, возвращающая значение типа int;

int *a(void); – функция без параметров, возвращающая указатель на элемент типа int;

int (*a)(void); – указатель на функцию без параметров, возвращаю- щую значение типа int;

int *a(void)[6]; – функция без параметров, возвращающая указатель на массив элементов типа int;

int *a [4](void); – массив указателей на функцию без параметров, возвращающую значение типа int.

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

1   2   3   4   5   6   7   8   9   ...   67


написать администратору сайта