Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Область видимости переменных и других идентификаторов в языке Си. Время жизни.




Ответ:

Время жизни - интервал времени выполнения программы, в течение которого программный объект (переменная или функция) существует.

Время жизни переменной (глобальной илилокальной) определяется по следующим правилам:

· Переменная, объявленная глобально (т.е. вне всех блоков), существует на протяжении всего времени выполнения программы.

· Локальные переменные (объявленные внутри блока) существуют:

o На период выполнения блока – если объявлены с классом памяти register или auto;

o На период выполнения всей программы – если объявлены с классом памяти static или extern.

  Переменная Функция
Время жизни · Глобальное · Локальное Только глобальное
Область видимости · Локальная, в пределах блока (функции) где определена · В пределах модуля где определена · Глобальная · В пределах модуля где определена · Глобальная  

Область видимости и время жизни имён.

· Глобальное (статическое)

o Время жизни объекта совпадает с временем жизни программы

o Размещены вне функций

o Всегда инициализируются (автоматически – нулем)

o Создаются до старта программы

· Динамическое

o Время жизни объекта управляется пользователем.

o Позволяют использовать все доступное адресное пространство.

o Создаются и удаляются при помощи библиотечных функций (C) или предопределенных команд (C++).

o Время жизни – от создания до удаления.

· Локальное (стековое, автоматическое)

o По умолчанию время жизни объекта ограничено областью видимости.

o Размещаются в стеке при входе в блок, при выходе из блока память освобождается.

· Временное.

o Время жизни объекта ограничено точкой применения.

o Как правило, используются для передачи параметров в подпрограмму.

o Размещаются в стеке.

o Время жизни – до окончания функции.

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

Структурная единица программы

Название области видимости
{...} Блок «В пределах блока»
имя_функции() { ... } Функция «Локальная, в пределах функции (блока)»  
file.c Модуль «В пределах модуля»
file1.c file2.c ... Проект «Глобальная»  

Символьный тип данных в языке Си. Строковый тип данных. Строковые переменные и константы. Двойственный характер строк. Примеры.

Ответ:

Символьный тип- хранит код символа и используется для отображения символов в различных кодировках.

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

Для хранения кодов символов в языке Си используется тип char.

Задавать значение символьного типа можно как целочисленной константой, так и ASCII-символом в

одинарных кавычках:

chara, b;

a = 75;

b = 'K';

При выводе символов на экран (или в текстовый файл) все переменные типа char трактуются как беззнаковые целые числа в диапазоне 0..255 (unsigned char).

Поумолчанию «char» = «signedchar» (дляMSVisualC/C++). Использование типа char по умолчанию (signed / unsigned)может быть изменено, например, в параметрах компиляции.

В языке Си отсутствует специализированный строковый тип

Строка хранится в массиве типа char:

char str[20];

Конец строки определяется нуль-символом.

Строка задается последовательностью символов, заключенных в кавычки"":

char str[30] = "Так хранится строка впамяти";

Максимальная длина строки равна длине массива (минус 1 на нуль-символ).

Определение строк в программе.

#defineLINESTR 50

#degine NUMROWS 3;

char string1[LINESTR];

char string_n[LINESTR] = “asd”; // избыточныеэлементы = 0

char string2[] = “My first string”;

char *string_ptr = “My second string\n”;

char string_c[] = {‘M’, ‘y’, ‘ ‘, ‘f’, ‘i’, ‘r’, ‘s’, ‘t’};

char *string_array[NUMROWS] =

{

“First row”,

“Second row another length”,

“Third row”

};

char *name;                         // опасно! память не выделяется!

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

Значение символьной константы равно коду представляемого ею символа.

Символьные константы имеют тип int и при преобразовании типов дополняются знаком

Примеры:

'T'

'\n'

'\08'

'sdf'

E

Строковая константа (литерал) –последовательность символов, заключенная вкавычки.

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

Строка хранится в памяти с добавлением символа '\0', означающего "конец строки".

Строка имеет тип char[] (строку символов).

Примеры:

"School N 2" // 11 байтов

"XUS sjhdkasdh" // 14 байтов

ПРО ДВОЙСТВЕННЫЙ ХАРАКТЕР СТРОК
Строка может одновременно рассматриваться и как тип данных, и как массив с переменными char.


Понятие рекурсии. Механизм рекурсии. Пример рекурсивной функции.

Ответ:

Рекурсия - способ вызова, при котором функция обращается к самой себе.

Основное преимущество – использование для более простого создания версии некоторых алгоритмов по сравнению с итеративными эквивалентами.

int fact (int n) { int t, answer=1; for (t=1; t<=n; t++) answer = answer * t; return(answer); } int fact(int n) { if (n==0) return 1; n = n * fact(n-1); return n; }       <- Условие остановки (базовый случай) <- Условие продолжения (шаг рекурсии)  

Механизм рекурсии.

intF(intN) { if (N == 0) return 1; else return ( N * F(N-1) ); }  

Возможные проблемы:

· Самая распространенная ошибка при организации рекурсии – бесконечная последовательность "само- вызовов".

· При написании рекурсивной функции необходимо начинать с организация выхода!

· При большой глубине рекурсии возможно переполнение стека.

На этапе отладки целесообразно использовать printf(...)для вывода отладочной информации о текущем шаге:

int fac(int n)

{

printf("Function fuc(), n=%d\n", n);

if (n==0)    

return 1;

n = n*fac(n-1);

printf("Function fuc(), n=%d\n", n);

return n;

       }

Рекурсия.

· Любой алгоритм, представленный в виде функции врекурсивной форме с одним вызовом самой себя, может бытьлегко представлен в итерационной форме (и наоборот).

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

· Примеры задач, для которых рекурсия будет наиболее простым и естественным способом решения: поиск в по дереву, обход графа, быстрые сортировки и др.

Рекомендации:

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

· Считая, что функция правильно решает любые подзадачи, для решения этих подзадач следует рекурсивно обратиться к нашей же функции и из ответов подзадач построить ответ для исходной задачи.

· Явный ответ надо давать, когда исходная задача уже не сводится к подзадачам.










Последнее изменение этой страницы: 2018-04-12; просмотров: 813.

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