Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Сибирский государственный университет
телекоммуникаций и информатики
Дисциплина “Информатика”
Язык программирования Си.
Лекции
Преподаватель: к. т.н., доцент кафедры
Прикладной информатики и кибернетики
Новосибирск – 2011
Содержание
ВВЕДЕНИЕ
1. Правила записи программы на языке Си.. 7
2. Правила формального описания синтаксиса языка программирования.. 8
3. Идентификаторы языка Си.. 9
4. Понятие о типах данных. 9
4.1. Системы счисления. Представление данных в ЭВМ. 10
4.2. Основные типы данных языка Си.. 11
4.3. Правила записи констант различных типов.. 12
4.4. Беззнаковый тип для целых данных.. 14
4.5. Символьные строки.. 14
5. Понятие функции.. 15
5.1. Стандартная функция printf. 15
5.2. Стандартная функция scanf. 16
6. Операции и выражения.. 17
6.1. Простейшие арифметические операции.. 17
6.2. Операция присваивания.. 18
6.3. Оператор-выражение.. 18
6.4. Использование в выражениях операндов разных типов.. 18
6.5. Операции преобразования типов.. 19
6.6. Стандартные математические функции.. 19
6.7. Простейшие функции, определяемые программистом... 20
6.8. Дополнительные арифметические операции.. 21
6.9. Дополнительные операции присваивания.. 22
6.10. Битовые операции.. 23
6.11. Операции отношения.. 24
6.12. Логические операции.. 25
6.13. Операция определения размера данных.. 26
6.14. Приоритеты операций.. 26
7. Программирование алгоритма линейной структуры на языке Си.. 27
8. Понятие о препроцессоре языка Си.. 28
9. Операторы языка Си и приемы программирования.. 29
9.1. Оператор цикла while.. 29
9.2. Условный оператор и условная операция.. 30
9.3. Запись алгоритмов с помощью диаграмм Несси - Шнейдермана (структограмм ) 33
9.4. Некоторые приемы программирования.. 34
9.5. Оператор прерывания цикла.. 37
9.6. Оператор продолжения цикла.. 38
9.7. Пример организации простейшего меню... 38
9.8. Множественный выбор. Оператор переключения.. 39
9.9. Оператор цикла do-while. 40
9.10. Перечисления. Работа с клавиатурой IBM PC.. 41
9.11. Пример организации светового меню... 44
9. Массивы. Адресная арифметика языка Си.. 47
9.1. Описание массива.. 47
9.2. Ввод-вывод массива.. 48
9.3. Инициализация массива.. 49
9.4. Программа вычисления длины строки символов.. 50
9.5. Двумерные массивы (массивы массивов) 51
9.6. Адресная арифметика языка Си.. 54
9.7. Указатели и одномерные массивы... 58
9.8. Указатели и двумерные массивы... 59
9.9. Указатели и функции.. 61
9.10. Оператор typedef. 62
9.11. Дополнительные описания указателей для IBM PC.. 63
9.12. Непосредственная работа с экранной памятью... 65
10. Дополнительные сведения о функциях.. 66
10.1. Области видимости и глобальные данные.. 66
10.2. Время жизни переменных и классы памяти языка Си.. 69
10.3. Передача аргументов в функцию... 70
10.4. Возврат значений из функций.. 71
11. Работа с динамической памятью.... 73
11.1. Стандартные функции управления динамической памятью... 73
11.2. Пример использования динамической памяти.. 75
11.3. Особенности работы с двумерными массивами.. 76
11.3.1. Пересчет индексов вручную.. 76
11.3.2. Массивы с постоянной длиной строки. 78
11.3.3. Общий случай двумерного массива. 79
11.4. Особенности работы с массивами большого размера.. 84
12. Модульное программирование в системе Turbo C.. 87
12.1. Обеспечение корректной стыковки модулей.. 87
12.2. Создание библиотек функций.. 88
13. Некоторые библиотечные функции языка Си.. 89
13.1. Функции консольного ввода/вывода (уникальны для TC) 89
13.2. Функции обработки строк. 91
13.3. Функции распознавания вида символа.. 93
13.4. Функции преобразования данных.. 94
14. Структуры языка C. 95
14.1. Описание структуры... 96
14.2. Трактовка имени структуры. 97
14.2.1. Доступ к элементу структуры. 97
14.3. Инициализация структур. 97
14.4. Структуры и функции. 98
14.5. Поля бит в структурах. 99
15. Объединения. 101
16. Дополнительные сведения о препроцессоре языка C. 101
22. Условное выражение. 103
22.1. Приоритеты и направления операций. 103
23. Динамические данные. 105
23.1. Линейные списки. 105
23.2. Организация данных в виде стека. 112
23.3. Организация данных в виде очереди. 113
23.4. Организация данных в виде деревьев. 114
24. Библиотека ввода-вывода языка C. 115
24.1. Открытие потока. 115
24.2. Закрытие потока. 116
24.3. Предопределенные указатели потоков. 117
24.4. Функции ввода-вывода. 117
Введение
Язык программирования Си создан в 1972 г. Деннисом Ритчи при разработке операционной системы UNIX. Язык проектировался как инструмент для системного программирования с ориентацией на разработку хорошо структурированных программ. Первоначально он появился в операционной системе UNIX, и развивался как основной язык систем, совместимых с ОС UNIX. Сам язык, однако, не связан с какой-либо одной операционной системой или машиной; и хотя его называют языком системного программирования, так как он удобен для написания операционных систем, он может использоваться для написания любых больших вычислительных программ, программ для обработки текстов и баз данных. Компиляторы языка Си работают почти на всех типах современных ЭВМ в операционных системах UNIX, MS-DOS, OS/2, Windows, Windows NT и т. д.
Зачем нужно программирование?
Иногда создается впечатление, что все существующие задачи могут быть решены с помощью готовых программ для компьютеров. Во многом это действительно так, но опыт показывает, что всегда находятся задачи, которые не решаются (или плохо решаются) стандартными средствами. В этих случаях приходится писать собственную программу, которая делает все так, как вы этого хотите.
Два этапа создания программ
Программа на языке Си, также как и на большинстве современных языков программиро-
вания, создается в два этапа
1) трансляция – перевод текста программы в машинные коды;
2) компоновка – сборка частей программы и подключение стандартных функций.
Исходный файл:
first. cpp
транслятор
Объектный файл:first. o Стандартные функции
![]()
![]()
компоновщик
Исполняемый файл:
first. exe
Почему же не сделать все за один шаг? Для простейших программ это действительно было бы проще, но для сложных проектов двухступенчатый процесс имеет явные преимущества:
• обычно сложная программа разбивается на несколько отдельных частей (модулей), которые отлаживаются отдельно и зачастую разными людьми; поэтому в завершении остается лишь собрать готовые модули в единый проект;
• при исправлении в одном модуле не надо снова транслировать (переводить в машинные коды) все остальные (это могут быть десятки тысяч строк);
• при компоновке во многих системах можно подключать модули, написанные на других
языках, например, на Ассемблере (в машинных кодах).
Трансляторы языка Си называются компиляторами: они переводят (транслируют) сразу
всю программу в машинный код, а не транслируют строчка за строчкой во время выполнения, как это делают интерпретаторы. Это позволяет значительно ускорить выполнение программы и не ставить интерпретатор на каждый компьютер, где программа будет выполняться.
Исходный файл программы на языке Си имеет расширение *.с или *.cpp (расширение
*.cpp говорит о том, что в программе могут быть использованы возможности языка Си++).
Это обычный текстовый файл, в который записывают текст программы в любом текстовом редакторе, например, в Блокноте.
Транслятор переводит исходный файл (вернее, записанную в нем программу) в машин-
ные коды и строит так называемый объектный файл с тем же именем и расширением *.o. Хотя в нем уже записан машинный код, объектный файл еще нельзя запускать на компьютере, потому что в нем не хватает стандартных функций (например, для ввода и вывода данных).
Компоновщик подключает стандартные функции, хранящиеся в библиотеках (они имеют
расширение *.a). В результате получается один файл с расширением *.exe, который и пред
ставляет собой готовую программу.
Простейшая программа на Си
Такая программа состоит всего из 8 символов. Вот она:
main()
{
}
Основная программа всегда называется именем main (будьте внимательны – Си различает
большие и маленькие буквы, а все стандартные операторы Си записываются маленькими буквами). Пустые скобки означают, что main не имеет аргументов. Фигурные скобки обозначают начало и конец основной программы – поскольку внутри них ничего нет, наша программа ничего не делает, она просто соответствует правилам языка Си, ее можно скомпилировать и получить exe-файл.
Вывод текста на экран
Составим теперь программу, которая делает что-нибудь полезное, например, выводит на
экран слово «Привет».
#include <stdio. h> подключение функций стандартного ввода и вывода,
описание которых находится в файле stdio. h
main() вызов функции
{
printf("Привет"); вывода на экран
}
Выводы:
• Чтобы использовать стандартные функции, необходимо сказать транслятору, что есть
функция с таким именем и перечислить тип ее аргументов – тогда он сможет определить,
верно ли мы ее используем. Это значит, что надо включить в программу описание этой
функции. Описания стандартных функций Си находятся в так называемых заголовочных
файлах с расширением *.h.
• Для подключения заголовочных файлов используется директива (команда) препроцессора #include, после которой в угловых скобках ставится имя файла. Внутри угловых скобок не должно быть пробелов. Для подключения еще каждого нового заголовочного файла надо использовать новую команду #include.
Препроцессор – это специальная программа, которая обрабатывает текст вашей программы раньше транслятора. Все команды препроцессора начиняются знаком #.
• Для вывода информации на экран используется функция printf. В простейшем случае
она принимает единственный аргумент – строку в кавычках, которую надо вывести на эк-
ран.
• Каждый оператор языка Си заканчивается точкой с запятой.
Как запустить программу?
Чтобы проверить эту программу, надо сначала «напустить» на нее транслятор, который
переведет ее в машинные коды, а затем – компоновщик, который подключит стандартные
функции и создаст исполняемый файл. Раньше все это делали, вводя команды в командной строке или с помощью так называемых пакетных файлов. На современном уровне все этапы создания, трансляции, компоновки, отладки и проверки программы объединены и выполняются внутри специальной программы-оболочки, которую называют интегрированная среда разработки (IDE – integrated development environment). В нее входят:
• редактор текста
• транслятор
• компоновщик
• отладчик
В этой среде вам достаточно набрать текст программы и нажать на одну клавишу, чтобы она выполнилась (если нет ошибок).
В оболочке, например, Dev-C++ для запуска программы надо нажать клавишу F9. Если в программе есть ошибки, вы увидите в нижней части экрана оболочки сообщения об этих ошибках (к сожалению, на английском языке). Если щелкнуть по одной из этих строчек, в тексте программы выделяется строка, в которой транслятору что-то не понравилось.
При поиске ошибок надо помнить, что
• часто ошибка сделана не в выделенной строке, а в предыдущей – проверяйте и ее тоже;
• часто одна ошибка вызывает еще несколько, и появляются так называемые наведенные
ошибки.
Остановим мгновение
Если запускать рассмотренную выше программу, то обнаружится, что программа сразу
заканчивает работу и возвращается обратно в оболочку, не дав нам посмотреть результат ее работы на экране. Бороться с этим можно так – давайте скажем компьютеру, что в конце работы надо дождаться нажатия любой клавиши.
#include <stdio. h>
#include <conio. h> подключение заголовочного файла conio. h
main()
{
printf("Привет"); // вывод на экран
getch(); /*ждать нажатия клавиши*/
}
Выводы:
• Задержка до нажатия любой клавиши выполняется функцией getch().
• Описание этой функции находится в заголовочном файле conio. h.
1. Правила записи программы на языке Си
Программа перед обработкой компьютером должна быть помещена в файл на диске. Обычно этот файл имеет расширение <.c>.
Рассмотрим типичную структуру файла с программой на языке Си и правила его оформления на следующем простом примере:
/* Включить описания функций стандартного ввода-вывода */
#include <stdio. h>
/* Включить описания математических функций */
#include <math. h>
/* Другие включаемые файлы */
.
.
.
/* Собственно текст программы */
void main( void ) /* <-- заголовок главной функции */
{
float num; /* <-- описание типов данных */
/* Исполняемые операторы -* */
num = 2.345; /* Присвоим переменной num
значение 2.345 */
printf( " sin(%f) = %f\n", num, sin(num) ); /* Вывод на экран */
}
Любой файл начинается с директив #include, вставляющих в текст программы так называемые заголовочные файлы, которые содержат описания функций, используемых в этом файле. В нашем примере это описания стандартных функций ввода-вывода <stdio. h> и математических функций <math. h>.
Далее следует заголовок главной функции программы main, операторы описания типов данных и исполняемые операторы.
Директивы #include должны всегда начинаться с новой строки, остальные же операторы программы могут иметь произвольное положение в файле вплоть до записи в одну строку. При записи не допускается разрывать слова, числа, двухсимвольные операции.
Пробелы используются для отделения слов друг от друга и для придания тексту большей выразительности и могут использоваться везде, за исключением случаев, описанных в предыдущем абзаце. Там, где допускается один пробел, можно поставить любое их количество.
В любом месте программы, там, где может стоять пробел, допускается записывать комментарии.
/* Это комментарий */
// Это тоже комментарии.
Комментарии должны помогать понять смысл выполняемых программой действий и являются обязательной ее частью. При написании комментариев следует придерживаться ряда простых истин:
программы читаются людьми, компьютеру комментарии не нужны;
всегда необходимы вводные комментарии, в которых указывается назначение программы, ее автор, дата написания и изменения, краткое описание алгоритма, входных и выходных данных, основных переменных и вызываемых функций;
комментарии должны содержать дополнительную информацию, а не перефразировать программу;
комментарии должны быть расположены так, чтобы программа не была менее наглядной;
неправильные комментарии хуже, чем их отсутствие.
Стиль программирования, расположение операторов в строках, использование пробелов, выбор имен переменных и т. д. должны быть направлены на то, чтобы сделать программу более понятной людям, ее читающим.
2. Правила формального описания синтаксиса языка программирования
Под синтаксисом языка программирования понимают правила построения корректных конструкций данного языка. Синтаксис языка можно описать формально. Для этого удобно использовать расширенную форму Бэкуса-Наура (БНФ), которая состоит из ряда следующих обозначений и правил:
символы в кавычках переносятся в конструкцию языка так, как они записаны. Кавычки при этом отбрасываются. Например, "while" означает, что в конструкции языка присутствует while;
имена, записанные слитно русскими и латинскими буквами, обозначают различные конструкции языка. Например, оператор_цикла;
квадратные скобки охватывают элементы языка, которые могут повторяться 0 или 1 раз. Например, "AB"["C"] означает, что в конструкции языка может присутствовать или AB или ABC;
фигурные скобки охватывают элементы языка, которые могут повторяться 0 или много раз. Например, "AB" { "C" } означает, что в конструкции языка может присутствовать или AB, или ABC, или ABCC и т. д.;
символ | обозначает или, то есть используется для задания альтернативных значений, из списка элементов, разделенных знаком |. Например, "AB"|"C"|"ff" означает, что в конструкции языка может присутствовать или AB или C или ff;
круглые скобки используются для группировки. Например, "A"("B"|"C")"D" означает, что в конструкции языка может присутствовать или ABD или ACD;
многоточие используется для обозначения очевидных пропущенных значений в перечислении;
символ = обозначает - слово есть. Например, буква = "A"|"B"|"C".
3. Идентификаторы языка Си
Идентификаторы или имена служат для обозначения различных объектов программ: переменных (ячеек памяти), адресов, функций, файлов и т. д., иначе говоря - данных и действий над данными.
Имена должны начинаться с букв латинского алфавита или знака подчеркивания, далее допускается использовать и арабские цифры:
имя = ( буква | "_" ) { буква | цифра | "_" }
буква = |"A"|"B"|...|"Y"|"Z"|"a"|"b"|...|"y"|"z"
цифра = "0"|"1"|...|"9"
При этом прописные и строчные буквы считаются разными.
Длина имени в ANSI стандарте языка Си не ограничена. В Турбо Си имя не может быть длиннее 32 символов. Например: a, a1, _a, a_b.
Выбор имен должен производиться так, чтобы имя как можно точнее соответствовало смыслу объекта или действия, которое оно обозначает. Например: speed_of_body, SpeedOfBody, BodySpeed.
Экономия на длине имен - плохой стиль программирования.
4. Понятие о типах данных.
Тип данных определяет структуру объекта данных, множество его разрешенных значений и множество операций, которые можно над ним выполнять. Объекты различных типов требуют различного количества памяти для их хранения и различных команд процессора для выполнения действий над ними.
4.1. Системы счисления. Представление данных в ЭВМ.
В современном мире для записи числовой информации используют позиционные системы счисления, в которых числа записываются с помощью ограниченного количества цифр, а фактический вес цифры в результирующем числе определяется не только ее значением, но и позицией, которую она занимает в записи числа. Вес соседних позиций отличается в M раз, где M - основание системы счисления.
Пусть, например, имеем запись числа
an... a3 a2 a1 a0
тогда его значение можно вычислить по следующей формуле
an*Mn + ... + a3*M3 + a2*M2 + a1*M1 + a0*M0 ,
где an...a0 - цифры из записи числа.
Максимальное значение числа без знака, которое может быть представлено N разрядами позиционной системы счисления определяется как
MN - 1 .
В общепринятой десятичной системе счисления для записи чисел используются десять цифр 0,1,2,3,4,5,6,7,8,9. Основание системы счисления - 10. Значение числа определяется, например, так
9= 9*103 + 7*102 + 2*101 + 1*100
В вычислительной технике, кроме десятичной, широко используются двоичная, восьмеричная и шестнадцатеричная системы счисления. Все данные внутри ЭВМ представлены в двоичной системе, поскольку в этом случае достаточно всего двух цифр, а электронные схемы, как правило, тоже имеют два различных состояния. Десятичная, восьмеричная и шестнадцатеричная системы используются при выводе информации для пользователя, недостающие цифры шестнадцатеричной системы счисления заменяются буквами A, B,C, D,E, F.
Приведем несколько примеров:
1= 1*23 + 0*22 + 1*21 + 0*20 =
2= 2*83 + 7*82 + 0*81 + 1*80 = 1
F4A (16) = 15*162 + 4*161 + 10*160 = 3
Для перевода чисел из десятичной системы счисления в любую другую нужно последовательно делить его на основание новой системы счисления, при этом остатки от каждого деления будут представлять собой цифры из записи числа в новой системе, например:
1473 : 8 = 184 остаток 1
184 : 8 = 23 остаток 0
23 : 8 = 2 остаток 7
2 : 8 = 0 остаток 2
-----
1= 2
Перевод чисел из двоичной системы счисления в восьмеричную или шестнадцатеричную осуществляется путем разбиения двоичного числа на триады или тетрады и записи вместо них соответствующей восьмеричной или шестнадцатеричной цифры. Например:
000 (2) = 5BCF (16) = 23
5 11=B 15=F 12=C
0 = 55= 23
Обратное преобразование выполняется путем записи вместо восьмеричной или шестнадцатеричной цифры соответствующей двоичной триады или тетрады.
Целые беззнаковые числа хранятся в памяти ЭВМ в виде двоичных чисел, занимающих N двоичных разрядов. Диапазон чисел в этом случае от 0 до 2N-1. Целые числа со знаком, записанные в те же N двоичных разрядов будут иметь диапазон от -2(N-1) до 2(N-1)-1 .
Действительные числа хранятся в памяти ЭВМ в специальном формате с плавающей точкой. При этом часть двоичных разрядов ячейки хранит мантиссу числа со знаком, а другая часть - порядок числа. Диапазон действительных чисел определяется количеством двоичных разрядов, отведенных под порядок, а их точность - количеством разрядов под мантиссу.
Символы представлены в ЭВМ в виде соответствующих целочисленных кодов, хранимых в двоичной форме. Обычно под символ отводится один байт памяти, поэтому количество различных символов равно 28-1=255.
4.2. Основные типы данных языка Си
Язык Си относится к языку с жестко определенными типами данных: каждое имя всегда обозначает объект некоторого типа, причем этот тип нельзя изменить до конца выполнения программы.
Назначение типа имени осуществляется с помощью описания типа.
описание_типа =
["const "] имя_типа " " имя ["=" константа]
{ "," имя ["=" константа] } ";"
Если в описании присутствует ключевое слово const, то описываемое данное объявляется как немодифицируемое, то есть его значение не может быть изменено в процессе выполнения программы.
Если в описании имеется знак "=" и константа соответствующего типа, то вместе с объявлением переменной происходит ее инициализация, то есть присваивание начального значения.
В языке Си предопределены несколько имен типов:
имя_типа = "int" | "short" | "long" | "char" |
"float" | "double"
int - целый длиной 2 байта, диапазон значений -32+32767;
short - целый короткий, для IBM PC аналогичен int;
long - целый длиной 4 байта, диапазон значений ![]()
char - символьный длиной 1 байт, его можно рассматривать как целое -128...+127 (иногда 0...255);
float - тип данных с плавающей точкой, длиной 4 байта, вещественное число с диапазоном значений от
до
и 6-ю значащими цифрами;
double - тип данных с плавающей точкой, длиной 8 байт, вещественное число с диапазоном значений от
до
и 14-ю значащими цифрами;
Примеры описаний:
int a, b=4, c; /* описывает целые переменные a, b,c */
/* и инициализирует переменную b */
float speed, line; /* описывает вещественные переменные */
/* speed, line */
const double pi=3.14159; /* описывается имя pi, которое */
/* используется как константа */
/* типа double */
Вещественный тип данных следует использовать в тех случаях, когда данное в принципе может иметь дробную часть. Например, его надо использовать для описания почти всех физические величин: длины, массы, времени и т. д. Иногда величина, вообще говоря, целая, но большая настолько, что типа данных long не хватает. В этом случае тоже используется вещественный тип данных. Однако необходимо учитывать, что все арифметические действия с вещественными типами выполняются приближенно.
Целый тип данных часто используется для организации флагов, счетчиков, индексов и т. д.
4.3. Правила записи констант различных типов
Константы - это объекты данных, которые не меняют своих значений в процессе выполнения программы. Имя константы однозначно определяет и ее тип, и ее значение.
В простейшем случае в Си определены три типа констант: целые, вещественные, символьные. Рассмотрим правила их записи.
целая_константа =
( десятичная | восьмеричная |
шестнадцатеричная ) ["l"|"L"]
десятичная = цифра {цифра}
восьмеричная = "0" цифра8 {цифра8}
шестнадцатеричная = "0" ( "x" | "X" ) цифра16 {цифра16}
цифра8 = "0"|"1"|...|"7"
цифра16 = "0"|"1"|...|"9"|"A"|"B"|"C"|"D"|"E"|"F"
Обычно целые константы имеют тип int, добавление сзади константы буквы l или L обозначает константу типа long.
Пример правильных целых констант: 17, 012L, 0x35, 1235L
Отрицательные целые константы получаются путем добавления знака "-" перед константой без знака. Значением целой константы является число, которое она обозначает.
вещ_константа = цифра {цифра} "." {цифра}
[ "e" [ "+" | "-" ] цифра {цифра} ]
Пример правильных вещественных констант: 12e-33, 12.5, 128.05e-56, 54e23 .
Отрицательные вещественные константы получаются путем добавления знака "-" перед константой без знака. Значением вещественной константы является число, которое она обозначает.
Символьной константой является любой символ, заключенный в апострофы: 'A', 'c', 'd'. Значение символьной константы - величина целого типа, равная коду символа из таблицы кодов.
Для обозначения некоторых невидимых управляющих символов используется специальная кодировка:
'\n' - символ перевода строки,
'\r' - символ возврата каретки,
'\t' - символ табуляции,
'\b' - символ возврата на шаг,
'\\' - обратная косая черта,
'\"' - кавычки,
'\0' - символ с кодом 0.
Несмотря на то, что специальные символы записываются с помощью двух символов, фактически определяется однобайтовая символьная константа.
Символ может быть представлен и его шестнадцатеричным кодом, перед которым необходимо поставить \x. Например: '\x4C'эквивалентно 'L' и т. д.
4.4. Беззнаковый тип для целых данных
Обычно целый тип охватывает и отрицательные и положительные значения. Например, тип int имеет диапазон значений от -32768 до 32767. Иногда отрицательные значения не нужны. Тогда имеется возможность вдвое увеличить диапазон положительных значений, т. е. от 0 до 65535. Это можно сделать если описать тип как беззнаковый.
имя_беззнакового_типа =
"unsigned "("int"|"long"|"short"|"char" )
Пример:
unsigned int ab, c, d;
4.5. Символьные строки
Последовательность символов, заключенная в двойные кавычки, представляет собой символьную строку. Двойные кавычки в строку не входят. Например, "Это строка символов". Первая кавычка указывает на начало строки, последняя на ее окончание.
Строка символов хранится в памяти ЭВМ как массив символов.
Массив символов представляет собой последовательность символов, расположенных в непрерывной области памяти и объединенных общим именем:
Э | т | о | С | т | р | о | к | а | с | и | м | в | о | л | о | в | \0 |
![]()
В конце строки символов компилятор ставит ноль-символ, т. е. символ, код которого равен 0. Он служит признаком конца строки.
Значение символьной строки - это адрес ее первого символа.
При трансляции программы компилятор разместит все символьные строки в памяти, а в программу вместо них подставит соответствующие адреса (т. е. значения символьных строк!).
Символьная строка является константой, т. е. ее невозможно изменить в процессе выполнения программы. На практике часто необходимо выполнять различные действия над символьными строками: например запросить ввод имени пользователя, которое затем используется в выводной информации. Подобные операции возможны, если описать переменную как массив символов.
описание_массива_символов =
"char " имя "["размер"]" { "," имя "["размер"]" } ";"
где размер - максимально возможное количество символов плюс 1 для размещения нуль символа.
Пример:
char name[50], fio[81];
Переменная name способна хранить строку из 49 символов, fio из 80. Значениями переменной name и fio являются адреса областей памяти, выделенных для хранения соответствующих строк.
5. Понятие функции
Под функцией понимают часть программы, которая реализует вполне законченный алгоритм, и может быть вызвана (то есть, запущена) из любого места программы. После окончания работы функции программы продолжается с места вызова функции.
Язык Си имеет мощные средства создания собственных функций пользователя. Однако на первых порах мы будем использовать стандартные готовые функции, предоставляемые нам библиотекой языка Си. Для вызова функции необходимо записать следующую конструкцию языка:
вызов_функции =
имя_ функции "(" [ аргумент { "," аргумент } ] ")"
Пример:
printf( "Это простое число %d", num );
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


