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

Методичка БКП - 2. Науки российской федерации федеральное государственное бюджетное образовательное учреждение


Скачать 1.02 Mb.
НазваниеНауки российской федерации федеральное государственное бюджетное образовательное учреждение
АнкорМетодичка БКП - 2
Дата10.10.2019
Размер1.02 Mb.
Формат файлаdoc
Имя файлаМетодичка БКП - 2.doc
ТипМетодические указания
#89412
страница3 из 66
1   2   3   4   5   6   7   8   9   ...   66

3. Базовые понятия языка Си


Первоначально язык Си использовался для системного программирования, но большой перечень операций и типов данных сделали его языком программирования общего назначения. Кроме того, стандарт ANSI (Американский Национальный Институт Стандартов) обеспечивает переносимость программ на языке Си.

Алфавит и словарь языка.

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

  • строчные a, ... , z и прописные A, ... , Z буквы латинского алфавита;

  • символ подчеркивания _ ;

  • цифры 0, ... , 9 ;

  • специальные знаки . , ; + - * / = < > % & ! ( ) { } ^ | ? : [ ] ^ ' " # \

В отличие от языка Паскаль строчные и прописные буквы различаются.

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

auto, break, case, char, continue, default, do, double, else, enum, entry, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof,static, struct, switch, typedef, union, unsigned, void, while.

Идентификатором в языке Си является последовательность букв латинского алфавита вместе с символом подчеркивания и цифр, которая обязательно начинается с буквы. Начинать идентификатор с символа подчеркивания не следует.

Типы данных.

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

Логический тип (bool) используется для хранения результатов вычислений логических выражений со значениями true (1) или false (0) и занимает 1 байт памяти. Символьный тип (char) предусматривает размещение одного символа и в зависимости от среды реализации использует 1 или 2 байта.

Целый тип (int) стандартом не определен, и в зависимости от разрядности процессора может занимать как 2 байта (16-разрядный процессор), так и 4 байта (32-разрядный процессор) памяти, а в зависимости от предваряющих его спецификаторов имеет длину 2 байта (short int – короткие целые) или 4 байта (long int – длинные целые). При использовании спецификаторов включающих (signed) или выключающих (unsigned) знак числа меняется диапазон числовых значений. Целые числа (signed short int) имеют диапазон -32768 … 32767. Диапазон чисел (signed long int) составляет -2147483648 … 2147483647. Целые числа без знака (unsigned short int) имеют диапазон 0 … 65535, а числа (unsigned long int) изменяются в интервале 0 … 4294967295. Слово int можно не писать. Например, вместо short int можно указать short, а вместо unsigned long int записать unsigned long. Для вещественных чисел предусмотрены следующие типы и диапазоны значений: float (4 байта), double (8 байтов), long double (10 байтов).

Структура программы на языке Си.

Стандартная структура простой программы имеет вид:

Директивы препроцессора

тип имя_функции(спецификация параметров)

{

определения объектов;

исполняемые операторы;

}

voidmain(void)

{

определения объектов;

исполняемые операторы;

}

Программа на языке Си проходит три стадии подготовки исполняемого модуля: препроцессорная обработка, компиляция и компоновка. Препроцессор входит в транслятор среды программирования. Всего препроцессорных директив – двенадцать, они управляют преобразованием текста программы до компиляции, начинаются со знака решётка (#) и чаще всего размещаются в начале исходного текста.

Директива

#define<имя строка_замещения>

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

Директива

#undef <имя>

отменяет действие директивы #define.

Директива

#include <имя заголовочного файла>

включает текст других файлов в компилируемую программу. Обычно она подключают к тексту программы заголовочные файлы (от слова заголовок - header) в которых описаны системные функции и их аргументы. По этим описаниям компилятор вызывает стандартные функции библиотек системы. Наиболее используемы заголовочные файлы stdio.h (стандартный ввод-вывод), iostream.h (потоковый ввод-вывод), conio.h (посимвольный ввод-вывод), math.h (библиотека математических функций). Названия заголовочных файлов связаны с аббревиатурой английских слов, обозначающих их назначение: io (input/output - ввод/вывод), stream (поток), con (console – пульт оператора, клавиатура, дисплей).

Программа на языке Си состоит из произвольно упорядоченных функций, одной из которых является функция main(). Данные передаются в функцию через аргументы и возвращаются через заголовок. Функция может возвращать значение любого типа, кроме массива и функции. Допускается возвращать указатель на массив или указатель на функцию. Если функция не возвращает никакого значения, тип функции обозначается void. Тип void был введен в системы программирования Си в начале 80-х годов. Он является стандартным согласно ANSI Си. Известны два случая использования ключевого слова void: первый - для обозначения пустого списка аргументов, второй - для указания типа функции, не возвращающей никакого значения. Выполнение программы начинается с функции main(). Тело функции, заключенное в фигурные скобки, представляет собой набор операторов, каждый из которых оканчивается символом точка с запятой.

Для пояснений по тексту программы используются комментарии - игнорируемые компилятором наборы символов. Многострочные комментарии заключаются в скобки из специальных символов, определяющих начало и конец комментариев (/* и */). Однострочные комментарии начинается после пары символов "//" и заканчиваются в конце строки.

Форматный ввод информации.


Ввод данных осуществляется с помощью функции scanf, использующей форматную строку в виде:

scanf("<форматный указатель>",&<типизированная переменная>);

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

%[*][ширина][{l|h}]{d|i|u|o|x|f|e|g|с}

Квадратные скобки означают, что данный элемент может отсутствовать. Один из символов в фигурных скобках должен быть выбран. Обязательными элементами являются начальный символ % и последний символ, определяющий тип вводимого значения. Символ * после начального % указывает на пропуск соответствующего числа в строке ввода. Для целых чисел: d – целое десятичное со знаком, i - целое число, u – целое без знака. Для вещественных чисел используются форматы f, e, g. При вводе текстовых символов применяется формат с. Форматы o, x используются при вводе целых восьмеричных и шестнадцатиричных чисел без знака. Префиксные указатели l и h означают удвоенную или вполовину укороченную длину разрядной сетки числа.

Форматный вывод.


Форматный вывод результатов на устройство вывода экран дисплея осуществляется с помощью функции printf:

printf("<форматный указатель>",<типизированная переменная>);

Формат функции вывода напоминает обращение к функции scanf, но список выводимых переменных составляют не адреса, а идентификаторы или арифметические выражения в соответствии с их форматными указателями:

%[флажки][ширина][.точность][{l|h}]{d|i|u|o|x|f|e|g|с}

Аргумент «ширина» определяет размер поля вывода, а «точность» - количество цифр в дробной части вещественного числа. Переменные типа char можно вывести одним из следующих форматов %o, %i, %d, %ho, %hx, %hi, %hd.

Для вывода числовых результатов вещественного типа с фиксированной запятой используются форматные указатели %f и %lf, а с плавающей запятой -%e. Текст, включенный в форматную строку, однозначно переносится в строку вывода.

С помощью "\" в форматную строку могут быть включены такие управляющие символы (Escape-последовательности), как звуковой сигнал (\a), забой предыдущего символа (\b), переход на новую страницу (\f), переход на следующую строку (\n), возврат в начало текущей строки (\r), горизонтальная табуляция (\t).

Операции.

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

      • типа float преобразуются к типу double;

      • если один операнд - double, то второй преобразуется в double;

      • если один операнд - long double, то второй преобразуется в long double;

      • операнды типа char и short преобразуются в int;

      • операнды unsigned char и unsigned short преобразуются в unsigned int;

  • если один операнд - unsigned int, то второй преобразуется в unsigned int;

      • если один операнд - long, то второй преобразуется в long;

      • если один операнд - unsigned long, то второй преобразуется в unsigned long.

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

Пример:

double ft,sd;

unsigned char ch;

unsigned long in;

int i;

sd=ft*(i+ch/in);

При выполнении оператора будут проведены следующие преобразования. Операнд ch преобразуется к unsigned int. Затем он преобразуется к типу unsigned long. Значение i преобразуется к unsigned long и результат вычислений в круглых скобках также станет unsigned long. Затем он преобразуется к типу double и результат всего выражения будет иметь тип double.

Для проведения вычислений в библиотеке math.h предусмотрено большое число математических функции. Некоторые из них приведены в таблице 2.

Таблица 2.

Стандартные математические функции языка Си.

Математическая функция

Библиотечный прототип функции

arccos x

double acos(double x)

arcsin x

double asin(double x)

arctg x

double atan(double x)

cos x

double cos(double x)

ch x

double cosh(double x)

ex

double exp(double x)

| x |

double fabs(double x)

ln x

double log(double x)

lg x

double log10(double x)

максимум (a,b) с типом максимального аргумента

max(a,b)

минимум (a,b) с типом минимального аргумента

min(a,b)

xy

double pow(double x, double y)

10p

double pow10(int p)

sin x

double sin(double x)

sh x

double sinh(double x)

квадратный корень из x

double sqrt(double x)

tg x

double tan(double x)

th x

double tanh(double x)


Условный оператор.

Формат условного оператора if имеет вид:

if ( условие )

{

выполняемые операторы;// блок «если»

}

else

{

выполняемые операторы; // блок «иначе»

}

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

if ( условие )

{

выполняемые операторы

}

В условии используются логические отношения больше (>), меньше (<), больше или равно (>=), меньше или равно (<=), равно (=), не равно (!=). Простые отношения могут составлять сложные логические выражения, объединенные с помощью знаков логических операций конъюнкции И (&&), дизъюнкции ИЛИ (||), инверсии НЕ (! условие). Порядок действий может быть изменен использованием круглых скобок.

Пример альтернативной формы оператора условия.

#include

#include

main() // альтернативная форма оператора условияif - else

{

int K1, K2, Kmax;

printf("Input K1,K2");

scanf ( "%d%d", &K1, &K2);

if ( K2 > K1 ) Kmax = K2 else Kmax = K1;

printf ( "Largest= %d", Kmax );

getch();

}

Пример безальтернативной формы оператора условия.

#include

#include

main() // безальтернативная форма оператора условия if

{

int K1, K2, Kmax;

printf("Input K1,K2");

scanf ( "%d%d", &K1, &K2);

Kmax = K1;

if ( K2 > K1 ) Kmax = K2;

printf ( "Largest= %d", Kmax );

getch();

}

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

Оператор множественного выбора.

Оператор множественного выбора switch используется для выбора одного из нескольких вариантов в зависимости от значения целой или символьной переменной помеченной словом «выражение».

Формат оператора следующий:

switch ( выражение )

{

[ case константное-выражение1]: [ список-операторов1];

[ case константное-выражение2]: [ список-операторов2];



[ default: [ список операторов];]

}

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

Пример.

#include

#include

main() // Поиск фамилии по первой букве

{

char f;

printf("Input first letter");

scanf("%c", &f);

switch ( f )

{

case 'а': printf("Аппаев"); break;

case 'б': printf("Барагунов"); break;

case 'в': printf("Вадахов"); break;

default: printf("Фамилиинет");

getch();

}}

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

Наиболее общий способ организации цикла - оператор for имеет следующий формат:

for(< выражение 1> ; <выражение 2> ; <выражение 3> ) <тело цикла>;

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

Порядок выполнения оператора for таков. Вычисляются значение выражений 1 и 2. Цикл выполняется пока условие выражения 2 – истинно. Если значение выражения 2 ложно (равно нулю), то управление передается следующему за циклом оператору. Поэтому при изначальном значении условия «ложно» тело цикла не выполнится ни разу. При неизменно истинном значении условия цикл будет повторяться бесконечно.

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

while (<выражение>) <тело цикла> ;

Цикл выполняется, пока значение выражения истинно.

Оператором цикла do while с постусловием имеет вид:

do <тело цикла> while(<выражение>);

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

Для прерывания выполнения цикла используется оператор break.

Оператор continue используется внутри цикла для передачи управления на очередную итерацию.

Оператор безусловного перехода goto передает управление на оператор, помеченный меткой. Формат оператора следующий:

goto <имя-метки>; ...

<имя-метки>: <оператор>;

Использование оператора безусловного перехода goto в практике программирования на языке СИ не рекомендовано, так как он затрудняет понимание программ и возможность их модификаций. Формат оператора следующий:
1   2   3   4   5   6   7   8   9   ...   66


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