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

Void main(void){}.

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

на интервале с шагом . Заметим, что в приложении не будет ввода исходных данных. Стандартная функция scanf(), позволяющая вводить с клавиатуры объекты основных типов, рассматривается позднее. Вместо нее трижды используется операция присваивания. Для вывода результатов применяется (без объяснений) стандартная функция printf(). Как и scanf(), она будет рассмотрена позднее.

Пример 3.3. Табулирование функции

#include <stdio.h>

#include <math.h>

void main(){

// Создание переменных

double x, y, a, b, h;

// Задание исходных данных

a=0.0, b=1.0, h=0.1;

// Организация цикла

x=a;

while(x<=b){

y=(2.1*x*x-1.0)/sqrt(x*x+3.4);

// Отображение x, y

printf("\tx=%.3f\ty=%.3f\n", x, y);

x+=h;

}

}

После выполнения этого приложения на экране дисплея появится следующая таблица

x=0.000 y=-0.542

x=0.100 y=-0.530

x=0.200 y=-0.494

x=0.300 y=-0.434

x=0.400 y=-0.352

x=0.500 y=-0.249

x=0.600 y=-0.126

x=0.700 y=0.015

x=0.800 y=0.171

x=0.900 y=0.342

x=1.000 y=0.524

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

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

Пример 3.4. Попытка изменения значений переменных

#include <stdio.h >

// Определение функции Change()

void Change (int i1, int i2) {

// Запоминание значения переменной i1

int iTemp=i1;

// Замена значений переменных

i1=i2;

i2=iTemp;

}

// Главная функция

void main(void){

int x=1, y=2;

Change(x, y);

printf(“x=%d\ny=%d\n”, x,y);

}

После выполнения приложение на экране дисплея появится сообщение

x=1

y=2

Оно означает, что поставленную задачу решить не удалось. О том, как можно исправить ситуацию, речь пойдет в 3.3 и 3.4.

3.3 Знакомство с указателями

Для хранения каждого объекта операционная система выделяет область памяти. Она состоит из следующих друг за другом байтов и называется блоком. Размер блока опре­деляется типом объекта. Байт с наименьшим адресом в блоке называется младшим. Адресом блока или хранящегося в нем объекта называется адрес младшего байта. Если известно имя объекта, то его адрес можно получить при помощи унарной операции со вторым приоритетом. Она называется “получение адреса объекта” и обозначается знаком “&”. Единственным операндом операции является имя (идентификатор) объ­екта, который должен следовать за символом “&”. Результатом операции является его адрес. Важной особенностью языка Си является интенсивное использование адресов для получения доступа к объектам.

Если Type – идентификатор некоторого типа данных (например, int, double или char), то множество адресов объектов типа Type образует тип, для обозначения которого используется конструкция вида Type*. Отметим, что идентификатором она не является. Переменные, хранящие адреса объектов типа Type, называются указателями на Type. Они создаются по обычным правилам:

// Создание указателя на объект типа Type

Type* Указатель;

// Создание и инициализация указателя

Type* Указатель=Адрес;

Во втором случае справа от знака “=” должен стоять адрес объекта типа Type или выражение вида &ИмяОбъекта. Обычно имена указателей начинаются с префикса p, который является первой буквой слова pointer. Например: