- •1.2. Правила записи программ на языке с
- •1.3 Правила формального описания синтаксиса языка программирования
- •1.5.3. Описание данных в языке с
- •1.5.4 Правила записи констант различных типов
- •1.5.5. Символьные строки
- •Глава 2. Понятие функции
- •2.1. Стандартная функция printf
- •2.2. Стандартная функция scanf
- •Перед каждым аргументом, не являющимся строкой (адресом) ставится знак & и трактуется как вычисление адреса.
- •2.3. Стандартные математические функции
- •2.4. Простейшие функции, определяемые программистом
- •3.5. Дополнительные арифметические операции
- •3.6. Дополнительные операции присваивания
- •3.7. Битовые операции
- •3.8. Операторы отношения
- •Глава 4. Структурное программирование и язык с
- •4.2. Операторы языка с
- •4.3. Оператор цикла while
- •4.4. Оператор цикла do – while (цикл с постусловием)
- •4.5. Условный оператор и условная операция
- •4.6. Оператор цикла for (цикл с известным числом повторений)
- •4.7. Запись алгоритмов при помощи диаграмм Несси-Шнейдермана
- •4.8. Оператор прерывания цикла
- •4.9. Оператор продолжения цикла (continue)
- •4.10. Множественный выбор
- •Глава 5. Типовые приемы в программировании
- •5.1. Использование счетчиков
- •5.2. Вычисление суммы и произведения.
- •5.3. Вычисление минимума и максимума последовательностей.
- •5.4. Использование флагов
- •Глава 6. Простейшая графика
- •6.1.Графические режимы
- •6.2. Идеология bgi и WinBgi
- •6.3.Основные графические функции
- •6.3.1. Управление графическими режимами
- •6.3.2. Графические примитивы
- •6.3.3. Установки и их проверка
- •6.3.4. Работа с текстом
- •Глава 7. Модульное программирование
- •7.2. Библиотеки функций
- •Глава 8. Массивы
- •8.1. Описание массива
- •8.2. Ввод – вывод массивов
- •8.3. Инициализация массива
- •8.6. Двумерные массивы
- •8.6.1. Инициализация двумерного массива
- •8.7. Многомерные массивы
- •Глава 9. Работа с файлами
- •9.1. Открытие и закрытие файлов
- •Глава 10. Структуры языка с
- •10.1. Описание структур
- •10.2. Трактовка имени структуры
- •10.2.1. Доступ к полям структуры
- •10.3. Инициализация структур
- •10.4. Структуры и функции
- •10.5. Поля бит в структурах
- •10.6. Объединение
- •Глава 11. Дополнительные сведения о функциях
- •11.1. Области видимости.
- •Глава 12. Анимация
- •Глава 13. Рекурсия
- •13.1. Понятие рекурсии
- •13.2. Вычисление факториала
- •13.3. Числа Фибоначчи
- •13.4. Замена итерационных алгоритмов рекурсивными
- •13.5. Применение рекурсии в графике
10.5. Поля бит в структурах
В структурах для целых чисел допускается использовать область памяти с нецелым количеством байт, указав длину в битах.
struct UniPopulation
{
int FIT:11;
int FEM:11;
int FEN:10;
};
Такая экономия памяти может быть важной, если используется большое количество структур. Но при этом следует учитывать, что при обращении к таким полям и выполнение операций над ними каждый раз будет выполняться преобразование к полноценному типу.
10.6. Объединение
Объединения описываются аналогично структурам, но используется ключевое слово union.
union
{
int a;
long b;
}p;
p.b=10;
p.a=5;
printf(“%ld”,p.b)//мусор выведется
Объединению выделяется памяти по длине самого большого поля. При этом адреса всех полей совпадают с адресом всего объединения. Объединение используется для поочередного хранения полей и корректно храниться лишь последнее записанное поле.
Глава 11. Дополнительные сведения о функциях
11.1. Области видимости.
Любые имена в С могут быть объявлены либо вне всех блоков и функций, либо в каком-нибудь из них. В связи с этим различают следующие области видимости:
Локальная – внутри блока.
Файловая – внутри файла
Глобальная – по всей программе
Имена, объявленные в локальной области видимости видны только внутри этого блока и внутри вложенных в него блоков. Объявленные вне всех блоков имена видны по всей программе. Однако, область видимости можно ограничить файлом с помощью ключевого слова static.
Препроцессор не различает области видимости, так как работает с исходными текстами не по правилам языка С, а по правилам предварительной обработки.
#define N 15
int n=N
int main()
{
Пример:
#include <stdio.h>
int I=1;
void PrintI()
{
printf(“I=%d\n”,i);
}
int main()
{
int i=10;
printf(“I=%d\n”,i);
PrintI();
{
int i=100;
printf(“I=%d\n”,i);
PrintI();
}
printf(“I=%d\n”,i);
PrintI();
}
Программа выведет: i=10, i=1, i=100, i=1, i=10, i=1
Локальная переменная перекрывает такой же идентификатор из более внешних локальных областей или глобальной области видимости, но располагается в отдельной области памяти и не мешает более внешней переменной.
Никогда не следует объявлять переменные глобальными, если на то нет веских причин. Все данные по функциям следует передавать в списке аргументов, а результаты возвращать return’ом.
Пример: посчитать сумму двумерного массива
#include <stdio.h>
int i;
int Sum(int A[],int n)
{
int s=0;
for(i=0,i<n,i++)
{
S+=A[i];
return s;
}
int main()
int B[3][2]={{1,1},{2,2},{3,3}};
int S=0;
for(i=0,i<n,i++)
{
S+=Sum(S[i],2);
}
}
printf(“%d\n”,s);
SYSTEMPAUSE;
return 0;
Программа выведет s=2
Т.к. на первом витке цикла функции main, функция Sum вернет 2, но при этом i после функции станет равна 2. Затем выполнится i++, и проверка 3<3 окажется ложью и цикл на второй виток не пойдет.
Для того, чтобы переменная виделась из всех фалов вашего проекта, ее следует объявить глобально внутри какого-либо файла с исходным кодом. И в каждом файле, где мы хотели бы ее видеть дополнительно объявить ее с помощью ключевого слова extern.
Обычно объявление со словом extern заключают в заголовочный файл.
Пример:
//MyLib.h
#ifndef MY_LIB_H
#define MY_LIB_H
//Описание типов библиотеки
...
//Объявление глобальных переменных
extern double my_pi; //память не выделяется
//прототипы функций
//MyLib.spp
#include “MyLib.h”
//описание глобальных переменных
double my_pi=3,14;//выделяется память!
//описание функций
Если требуется объявить глобальную переменную в рамках библиотеки и запретить доступ из других файлов. В таких случаях переменная описывается глобально, но с ключевым словом static. При этом в заголовочном файле мы ее не объявляем.
Пример использования переменных с файловым действием – настройки WinBGI.