Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке высокого уровня. Методические указания к проведению лабораторных работ по курсу «Программирование»

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
641 Кб
Скачать

Символьные строки

Символьная строка — это последовательность символов, заключенная в двойные кавычки. Символьная строка рассматривается как массив символов,

каждый элемент которого представляет отдельный символ. Символьная строка имеет следующую форму представления:

"<символы>"

<символы> — это произвольное (в том числе нулевое) количество символов из множества представимых символов, за исключением символов двойная кавычка ("), обратный слэш (\) и новая строка.

1.1.3.Идентификаторы

Идентификаторы — это имена переменных, функций и меток,

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

Компилятор языка Си не допускает использования идентификаторов,

совпадающих по написанию с ключевыми словами.

1.1.4.Ключевые слова

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

Cписок ключевых слов:

auto

continue

else

for

long

signed

switch

void

break

default

enum

goto

register

sizeof

typedef

while

case

do

extern

if

return

static

union

 

char

double

float

int

short

struct

unsigned

 

11

1.1.5.Комментарии

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

/* <символы> */

<символы> должны принадлежать множеству представимых символов.

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

Компилятор языка Си рассматривает комментарий как пробельный символ, поэтому комментарии допускается использовать везде, где можно использовать пробельные символы (но нельзя, например, внутри лексем).

1.2. ФОРМАТНЫЙ ВВОД / ВЫВОД НА КОНСОЛЬ

Функции printf() и scanf() выполняют форматный ввод и вывод, то есть они могут читать и писать данные в разных форматах. Данные на консоль выводит printf(). А ее "дополнение", функция scanf(), наоборот — считывает данные с клавиатуры. Обе функции могут работать с любым встроенным типом данных, а также с символьными строками, которые завершаются символом конца строки ('0').

1.2.1.printf()

Прототип функции printf():

int printf(const char *управляющая_строка, ...);

Функция printf() возвращает число выведенных символов или

отрицательное значение в случае ошибки.

12

Управляющая_строка состоит из элементов двух видов. Первый из них

— это символы, которые предстоит вывести на экран; второй — это

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

В функции printf(), как видно из табл. 3, имеется широкий набор спецификаторов преобразования.

Таблица 4

 

Спецификаторы преобразования для функции printf()

Код

Формат

 

 

%a

Шестнадцатеричное в виде 0xh.hhhhp+d (только С99)

 

 

%A

Шестнадцатеричное в виде 0Xh.hhhhP+d (только С99)

 

 

%c

Символ

 

 

%d

Десятичное целое со знаком

 

 

%i

Десятичное целое со знаком

 

 

%e

Экспоненциальное представление ('е' на нижнем регистре)

 

 

%E

Экспоненциальное представление ('Е' на верхнем регистре)

 

 

%f

Десятичное с плавающей точкой

 

 

%g

В зависимости от того, какой вывод будет короче, используется %е или %f

 

 

%G

В зависимости от того, какой вывод будет короче, используется %Е или %F

 

 

%o

Восьмеричное без знака

 

 

%s

Строка символов

 

 

%u

Десятичное целое без знака

 

 

%x

Шестнадцатеричное без знака (буквы на нижнем регистре)

 

 

%X

Шестнадцатеричное без знака (буквы на верхнем регистре)

 

 

%p

Выводит указатель

 

 

%n

Аргумент, соответствующий этому спецификатору, должен быть указателем на

 

целочисленную переменную. Спецификатор позволяет сохранить в этой переменной

 

количество записанных символов (записанных до того места, в котором находится код %n)

 

 

%%

Выводит знак %

 

 

 

13

1.2.2.scanf()

Функция scanf() — это программа ввода общего назначения,

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

int scanf(const char *управляющая_строка, ...);

Эта функция возвращает количество тех элементов данных, которым было успешно присвоено значение. В случае ошибки scanf() возвращает EOF, управляющая_строка определяет преобразование считываемых значений при записи их переменные, на которые указывают элементы списка аргументов.

Управляющая строка состоит из символов трех видов:

спецификаторов преобразования,

разделителей,

символов, не являющихся разделителями.

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

Таблица 5

 

Спецификаторы преобразования для функции scanf()

 

 

Код

Значение

 

 

1

2

 

 

%a

Читает значение с плавающей точкой (только С99)

 

 

%c

Читает одиночный символ

 

 

%d

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

 

 

 

14

 

Продолжение табл. 5

 

 

1

2

 

 

%i

Читает целое число как в десятичном, так и восьмеричном или шестнадцатеричном формате

 

 

%e

Читает число с плавающей точкой

 

 

%f

Читает число с плавающей точкой

 

 

%g

Читает число с плавающей точкой

 

 

Читает восьмеричное число

 

 

%s

Читает строку

 

 

%x

Читает шестнадцатеричное число

 

 

%p

Читает указатель

 

 

%n

Принимает целое значение, равное количеству уже считанных символов

 

 

%u

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

 

 

%[]

Читает набор сканируемых символов

 

 

%%

Читает знак процента

 

 

1.3.ЦИКЛЫ

Вязыке С операторы цикла служат для многократного выполнения последовательности операторов до тех пор, пока выполняется некоторое условие. Условие может быть установленным заранее (как в операторе for) или меняться при выполнении тела цикла (как в while или do-while).

1.3.1.Цикл for

Общая форма оператора for следующая:

for (инициализация; условие; приращение) оператор;

Цикл for может иметь большое количество вариаций. В наиболее общем

виде принцип его работы следующий. Инициализация — это присваивание

начального значения переменной, которая называется параметром

цикла. Условие представляет собой условное выражение, определяющее,

следует ли выполнять

оператор

цикла (часто его называют телом цикла) в

очередной раз.

Оператор приращение осуществляет изменение параметра

цикла

при каждой

итерации.

Эти три оператора (они называются

также

секциями

оператора for)

обязательно разделяются точкой с запятой.

 

 

 

 

15

Цикл for выполняется, если выражение условие принимает значение ИСТИНА. Если оно хотя бы один раз примет значение ЛОЖЬ, то программа выходит из цикла и выполняется оператор, следующий за телом цикла for.

1.3.2.Цикл while

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

while (условие) оператор;

Здесь оператор (тело цикла) может быть пустым оператором,

единственным оператором или блоком. Условие (управляющее выражение)

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

если условие принимает значение ИСТИНА. Если условие принимает значение ЛОЖЬ, программа выходит из цикла и выполняется следующий за циклом оператор.

1.3.3.Цикл do-while

В отличие от циклов for и while, которые проверяют свое условие перед итерацией, do-while делает это после нее. Поэтому цикл do-while всегда выполняется как минимум один раз. Общая форма цикла do-while следующая:

do {

оператор;

} while (условие);

Если оператор не является блоком, фигурные скобки не обязательны, но их почти всегда ставят, чтобы оператор достаточно наглядно отделялся от условия. Итерации оператора do-while выполняются, пока условие не примет значение ЛОЖЬ.

1.4. ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ

1.4.1.Общий вид функции

В общем виде функция выглядит следующим образом:

16

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

{

тело функции

}

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

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

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

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

f(тип имя_переменной1, тип имя_переменной2,..., тип имя_переменнойN)

1.4.2.Прототип функции

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

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

Компилятор также обнаружит различия в количестве аргументов,

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

В общем виде прототип функции должен выглядеть таким образом:

17

тип имя_функции(тип имя_парам1, тип имя_парам2, ..., имя_парамN);

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

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

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

1.5. МАССИВЫ, СТРОКИ

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

это наиболее распространенный тип массива.

1.5.1.Одномерные массивы

Общая форма объявления одномерного массива имеет следующий вид:

тип имя_переменной [размер];

Как и другие переменные, массив должен быть объявлен явно, чтобы компилятор выделил для него определенную область памяти (т.е. разместил массив). Здесь тип обозначает базовый тип массива, являющийся типом каждого элемента. Размер задает количество элементов массива. Например,

следующий оператор объявляет массив из 100 элементов типа double под именем balance:

double balance[100];

18

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

Доступ к элементу массива осуществляется с помощью имени массива и индекса. Индекс элемента массива помещается в квадратных скобках после имени. Например, оператор

balance[3] = 12.23;

присваивает 3-му элементу массива balance значение 12.23.

Индекс первого элемента любого массива в языке С равен нулю. Поэтому оператор

char p[10];

объявляет массив символов из 10 элементов — от р[0] до р[9].

1.5.2.Двухмерные массивы

Стандартом С определены многомерные массивы. Простейшая форма многомерного массива — двухмерный массив. Двухмерный массив — это массив одномерных массивов. Объявление двухмерного массива d с

размерами 10 на 20 выглядит следующим образом:

int d[10][20];

Во многих языках измерения массива отделяются друг от друга запятой.

В языке С каждое измерение заключено в свои квадратные скобки.

Аналогично обращению к элементу одномерного массива, обращение к элементу с индексами 1 и 2 двухмерного массива d выглядит так:

d[1][2]

1.5.3.Строки

Одномерный массив наиболее часто применяется в виде строки символов. Строка — это одномерный массив символов, заканчивающийся нулевым символом. В языке С признаком окончания строки (нулевым символом) служит символ '\0'. Таким образом, строка содержит символы,

19

составляющие строку, а также нулевой символ. Это единственный вид строки, определенный в С.

Объявляя массив символов, предназначенный для хранения строки, необходимо предусмотреть место для нуля, т.е. указать его размер в объявлении на один символ больше, чем наибольшее предполагаемое количество символов. Например, объявление массива str, предназначенного для хранения строки из 10 символов, должно выглядеть так:

char str[11];

Последний, 11-й байт предназначен для нулевого символа.

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

Таблица 7

 

Функции обработки строк

 

 

Имя

Выполняемое действие

функции

 

 

 

strcpy(s1,s2)

Копирование s2 в s1

 

 

strcat(s1,s2)

Конкатенация (присоединение) s2 в конец s1

 

 

strlen(s1)

Возвращает длину строки s1

 

 

strcmp(s1,s2)

Возвращает 0, если s1 и s2 совпадают, отрицательное значение, если s1<s2 и

 

положительное значение, еслиs1>s2

 

 

strchr(s1,ch)

Возвращает указатель на первое вхождение символа ch в строку s1

 

 

strstr(s1,s2)

Возвращает указатель на первое вхождение строки s2 в строку s1

 

 

Эти функции объявлены в заголовочном файле <string.h>.

2.Задания к лабораторному практикуму

2.1.ЛАБОРАТОРНАЯ РАБОТА №1 «ИЗУЧЕНИЕ ОСНОВ СИНТАКСИСА

ЯЗЫКА С И ФУНКЦИЙ ВВОДА/ВЫВОДА»

Цель работы

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

20

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