Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DOROGOVA.pdf
Скачиваний:
245
Добавлен:
05.06.2015
Размер:
853.4 Кб
Скачать

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

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

2.3. Стандартные типы данных

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

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

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

К простым типам данных относятся:

числовые данные: целые и с плавающей точкой;

символьные данные;

указатели.

Подмножествами целых данных являются:

данные перечислимого типа;

битовые поля.

Составные типы можно разделить на две группы. К первой группе относятся стандартный тип данных массив.

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

структуры (structures);

объединения, или союзы (unions);

битовые поля (bit fields);

перечисления (enumerations).

2.3.1. Простые типы данных

Весь спектр типов данных представлен на рис. 2.1. К простым данным относится пять стандартных типов:

char – символ; int – целое число;

float – число с плавающей точкой;

double – число с плавающей точкой (двойная точность); void– отсутствие значения.

Дадим краткую характеристику каждому из них:

1. Переменная типа char имеет размер 1 байт, ее значениями являются различные символы из кодовой таблицы, например: 'й', '.', 'j' (при записи в программе они заключаются в одинарные кавычки).

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Рис. 2.1. Типы данных

2.Размер переменной типа int в стандарте языка С не определен. В большинстве систем программирования размер переменной типа int соответствует размеру целого машинного слова. Например, в персональных компьютерах это 32 разряда.

3.Ключевое слово float позволяет определить переменные вещественного типа. Их значения имеют дробную часть, отделяемую точкой, например: -5.6, 31.28 Вещественные числа могут быть записаны также в форме с плавающей точкой, например: -1.09e+4. Число перед символом "е" называется мантиссой, а после порядком. Переменная типа float занимает в памяти 32 бита.

4.Ключевое слово double позволяет определить вещественную переменную двойной точности. Она занимает в памяти в два раза больше места, чем переменная типа float.

5.Ключевое слово void (означает "не имеющий значения") используется для нейтрализации значения объекта, например, для объявления функции, не возвращающей никаких значений.

2.3.2. Модификация типов данных

Объекты числовых типов могут быть модифицированы. Модификаторы не меняют тип данных, а лишь дают иную интерпретацию выделенной памяти или изменяют размер выделяемой памяти. Для этой цельи в стандарте ANSI языка С имеются следующие ключевые слова:

Unsigned беззнаковое; Signed – знаковое; Shortо короткое; Long длинное.

Модификаторы следует записывають перед типом данных, например: unsigned char.

Таблица 2.2. иллюстрирует возможные сочетания модификаторов (unsigned, signed, short, long) со спецификаторами (char, int, float и double), а также показывает размер и диапазон значений объекта (информация дана для 32-разрядных компиляторов).

Если модификатор не используется, то действуют правила умолчания. По умолчанию все числовые типы имеют знак, за исключением типа char, который по умолчанию знака не имеет.

Таблица 2.2

Тип

Память

Диапазон

данных

(в битах)

значений

bool

8

True, false

сhar

8

-128…127

unsigned char

8

0…255

short

16

-32768…32767

unsigned short

16

0…65535

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

int, long

32

-2 147 483 648… 2 147 483 647

unsigned int, long

32

0…4 294 967 295

float

32

3.4Е-38…3.4Е+38

double

64

1.7Е-308… 1.7Е+308

long double

80

3.4Е-4932…1.1Е+4932

Тип данных, как простой, так и составной, указывается при объявлении переменной или константы. Хорошим стилем программирования считается, объединение всех определений, относящихся к текущему

блоку программы,

в

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

Традиционно, область

объявления переменных располагают в начале функции, перед первой исполняемой

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

Пример объявления переменных:

int count, sum;

// 2 переменные типа int с именами count, sum.

char sim;

// переменная типа char с именем sim.

float sum=0;

// определение и задание начального значения переменной sum.

Пример объявления именованных констант:

#define MAX 256 // константе MAX присваивается значение 256. const double PI=3.14;// константе PI присваивается значение 3.14.

В языке С есть еще одна возможность по управлению типами данных это использование

квалификаторов – const и volatile. Квалификаторы не влияют на размер переменной, но меняют ее поведение, а точнее, отношение транслятора к этой переменной.

Const – объект имеет постоянное значение, доступное только для чтения (константа).

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

2.3.3. Символьные данные

Значением переменной или константы типа char могут быть только одиночные символы.

Пример определения переменных: char dog, cat;

Каждый символ кодируется числом (код символа) – машинное представление символа. Код символа

это целое число без знака в диапазоне от 0 до 255. Символьные константы заключаются в апострофы.

Примеры символьных констант:

'A', 'a', '7', '$'.

2.3.4. Целые числа

Типы int, short, long являются числами со знаками, то есть значениями этих типов могут быть только целые числа положительные, отрицательные и нуль.

Один бит используется для указания знака числа, поэтому диапазон представления чисел без знака

больше, чем со знаком.

 

Примеры:

 

signed int n;

// целое со знаком

unsigned int b;

// целое без знака

В языке С приняты следующие умолчания:

int c;

// подразумевается signed int c

unsigned d;

// подразумевается unsigned int d

signed f;

// подразумевается signed int f

Целые константы. Число без десятичной точки и без показателя степени рассматривается как целое (соглашения языка С). Компилятор по внешнему виду константы определяет, целая она или вещественная.

Примеры целых констант:

 

5

целая десятичная константа

6l, 128L

целая десятичная константа двойной точности

0105L

восьмеричная константа двойной точности

0X2A11

шестнадцатеричная константа

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

2.3.5 Данные плавающего типа (вещественные числа)

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

 

 

float

-

одинарная точность представления

 

 

double

-

двойная точность.

Вещественные числа хранятся в памяти в виде мантиссы и порядка

1.5

-

мантисса

 

15000 = 1.5 *10

4

 

4

-

порядок

 

 

Формат представления вещественного числа:

 

 

 

 

float (4 байта)

 

1 бит знака числа;

 

 

 

 

 

 

 

8 бит порядок;

 

 

 

 

 

 

23 бита мантисса;

 

 

 

double (8 байтов)

1 бит знака числа;

 

 

 

 

 

 

 

16 бит порядок;

Примеры определения переменных:

 

47 бита мантисса.

 

 

float f, a, b;

// вещественные числа одинарной точности

double x,y;

// вещественные числа двойной точности

long float w;

 

 

// аналогично double

 

Числа могут быть представлены в разных видах, несколько примеров приведено в таблице 2.3.

Таблица 2.3

Число

Алгебраическая запись

Запись для ввода

в компьютер

 

 

 

 

 

5000

5.0 * 103

5.0e3

 

 

 

0.000077

7.7 * 10-5

7.7e-5

 

 

 

Наличие десятичной точки в числе указывает компилятору, что перед ним вещественная константа. Наличие модификатора L или l увеличивает размер выделяемой памяти, а значит и точность константы.

Примеры вещественных констант:

5.

десятичная константа

123.456L, 1.3l

константы двойной точности

2.3.6. Инициализация переменных

Инициализация это выделение памяти с последующим заданием начальных значений. Для этой цели могут использоваться константы.

Примеры инициализации переменных с использованием констант:

int web=5;

// десятичная целая

int rad=077;

//восьмеричная

int nina =0X99;

// шестнадцатеричная

double sum=5.;

// десятичные вещественные

float bigword=5.77e+34;

// символьная

char dog='b';

2.4.Компоненты простой программы

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

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

2.4.1 Структура С-программы

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

Традиционно, изучение языка программирования начинают с программы, которая печатает текст на экране дисплея, например фразу "hello, world!".

Текст программы имеет вид:

#include <stdio.h>

// включение файла в текст программы

void main ()

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

{

 

printf("hello, world!\n");

// библиотечная функция вывода на терминал

}

 

Первая строка программы: #include <stdio.h> сообщает компилятору, что он должен включить в исходный текст программы стандартную библиотеку ввода-вывода. Инструкция #include является директивой (или командой) препроцессора (подробнее о директивах препроцессора смотрите в разделе).

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

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

Следом за main() вводятся инструкции. Инструкции могут быть представлены в виде стандартных команд и имен функций, содержащихся в библиотеках или написанных программистом самостоятельно. Фигурные скобки { } отмечают начало и конец функции main(), тело функции. В нашей программе тело функции main() состоит из одной инструкции – printf("hello, world\n"). Это вызов функции с именем printf и аргументом "hello, world!\n". Функция printf является библиотечной, она выдает выходные данные на терминал, в данном случае печатается строка символов hello, world!

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

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

#include <stdio.h> main()

{

printf("hello, "); printf("world"); printf("\n");

}

Подчеркнем, что \n представляет собой только один символ. Это пример "управляющей последовательности", символы подобные \n, дают общий механизм для представления невидимых символов, которые не отображаются на экране, а выполняют некоторое действие.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

2.4.2. Комментарии как средство облегчения понимания программы

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

До сих пор авторитеты в области программирования не пришли к общему мнению по вопросу комментирования программ. Некоторые специалисты являются сторонниками минимизации комментариев, они сходятся во мнении, что комментарии должны объяснять намерения программиста, а не код программы. То, что можно выразить на языке программирования, не должно выноситься в комментарии, то есть текст самой программы должен максимально брать на себя функции комментариев. В частности, надо использовать "говорящие названия" (названия, объясняющие назначение) для переменных, функций и тому подобных, разбивать программу на лёгкие для понимания части, стремиться к тому, чтобы структура программы была максимально понятной и прозрачной. Есть даже ортодоксальное мнение, что если для понимания программы требуются комментарии значит, она плохо написана.

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

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

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

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

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

// это однострочный комментарий; /* это многострочный комментарий, однако, надо быть осторожным, внутри комментария не должно

быть операторов программы, которые так же, как и этот текст будут игнорироваться */.

Длинные строки программы можно переносить. Для этой цели служит символ "\" (обратная косая черта).

Пример текста с переносом: printf ("Очень длинные\ строки можно переносить:\n");

Эквивалентный текст:

printf("Очень длинные строки можно переносить:\n");

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

Приведем несколько принципов для написания хорошо читаемых программ:

1.Следует использовать "говорящие названия", то есть все обозначения должны быть осмысленны.

2.Помещайте каждый оператор на отдельной строке.

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

4.Текст программы должен коротко комментироваться, при этом комментарии объясняют намерения программиста, а не код программы.

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

Пример: Программа снабжена комментариями, дающими пояснения к примеру. #include <stdio.h>

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

void main(void )

{// область определения переменных int num;

num = l;

// выполняемая часть программы printf ("\nПечатаем \

первое число в ряду натуральных чисел:\n %d\n", num );

}

В результате выполнения программы на экране появится следующий текст: Печатаем первое число в ряду натуральных чисел: 1

2.4.3. Пример создания программы

Большинство задач подчиняются алгоритму, включающему следующие стандартные части программы:

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

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

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

Разберем подробно все этапы создания программы на примере простой расчетной задачи.

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

1. На первом этапе следует описать задачу как можно подробнее. Ввод данных будет проводиться с клавиатуры: для расчета необходимы два параметра: объем продаж и ставка налога, причем ставка налога величина постоянная, а объем продаж может меняться. Поскольку программа используется неоднократно, объем продаж следует вводить при каждом новом расчете. Ставка налога может быть введена прямо в текст программы. Опишем ввод более четко:

Указать пользователю, что он должен ввести сумму продаж (sum), показатель вводится с клавиатуры.

Указать компьютеру величину налога на продажи (rate), задать в виде константы в тексте программы.

Обработка: чтобы рассчитать сумму налога (tax), необходимо умножить сумму продаж на ставку налога.

Вывод будет проводиться на экран дисплея: Выводим результат вычислений (tax) с

форматированием.

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

3. Программирование.

// Программа расчета налога на продажи

#include <stdio.h>

// подключение библиотеки стандартного ввода-вывода

void main ()

// головная функция

{ /* определение константы rate и двух переменных плавающего типа tax и sum */ const double rate=0.2;

double sum , tax ;

/* вывод на терминал «приглашения» для ввода суммы продаж*/

M:printf("\n input selling sum=");

/* ввод данных с клавиатуры в переменную sum

scanf (“%e”,&sum);

 

if (sum > 0)

tax = rate * sum;

else

{ printf(" error input selling sum !!!");

goto M;

}

printf ("\ntax=%f rub",tax);

}

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]