Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_Lect1.doc
Скачиваний:
4
Добавлен:
08.09.2019
Размер:
56.32 Кб
Скачать

3.3. Описания

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

Пользование стандартными библиотечными функциями требует большого количества относящихся к ним описаний. Эти описания не нужно писать самому: они помещены в т.н. стандартные «заголовочные» файлы, которые поставляются вместе с компилятором и библиотеками. Заголовочные файлы включаются в состав программы с помощью директивы #include.

3.4. Общая структура программы

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

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

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

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

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

  • для всех функций в пределах одного исходного файла (внешняя статическая)

  • для всех функций программы (внешняя, или глобальная)

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

  • для всех функций в пределах одного исходного файла (статическая функция)

  • для всех функций программы (глобальная функция)

3.5. Способ передачи аргументов при вызове функции

В языке C имеется единственный способ передачи аргументов (параметров) при вызове функций — по значению. Это значит, что в момент вызова функции создается временная переменная и в нее копируется значение аргумента. Таким образом, функция имеет дело с копией, а не с аргументом-оригиналом.

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

В языке C есть две специальных операции для работы с указателями:

&x — определить адрес (получить указатель) на переменную x

*p — обратиться к памяти по адресу p (т.е. получить доступ к переменной по указателю на нее).

4. Пример простой программы: решение квадратного уравнения

/* example1.c - Решение квадратного уравнения.

*/

#include <stdio.h>

#include <math.h>

void main (void)

{

double a, b, c, d, x1, x2;

printf ("Введи коэффициенты a, b, c: ");

scanf ("%lf%lf%lf", &a, &b, &c);

d = b*b - 4.0*a*c;

if (d < 0.0)

printf ("Уравнение имеет комплексные корни\n");

else {

x1 = (-b + sqrt(d))/(2.0*a);

x2 = (-b - sqrt(d))/(2.0*a);

printf ("x1 = %g\nx2 = %g\n", x1, x2);

}

}

1 Имеются переводы на русский язык обеих изданий книги Кернигана и Ритчи. Второе английское издание вышло по меньшей мере в трех разных переводах:

– Перевод Вик. С. Штаркмана под ред. Вс. С. Штарк­ма­на, М.: «Финансы и статистика», 1992 г.

– Те же переводчик и редактор, исправленное издание (пересмотрен перевод терминологии, заново проведена сверка с оригиналом). СПб.: «Невский Диалект», 2001.

– Перевод В. Л. Бродового. М.: Издательский дом «Вильямс», 2006.

2 В языке C говорят, что функция «возвращает» значение, т.е. программа обращается к функции («вызывает» ее), та вычисляет значение, соответствующее заданному аргументу (аргументам) и возвращает вычисленное значение вызвавшей программе, которая после этого продолжает свою работу.

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