- •Содержание
- •Глава 1. Описание языка c ......................................................................... 5
- •Глава 2. Описание языка fortran ....................................................... 38
- •Глава 3. Решение задач на языках c и fortran ................................ 70
- •Глава 1. Описание языка c
- •1.1. Структура c-программы
- •1.2. Скалярные типы данных и константы, строковые константы
- •1.3. Описание скалярных переменных. Директива #define
- •1.4. Операции. Выражения
- •1.5. Стандартные математические функции
- •1.6. Ввод-вывод
- •Int printf ( строка формата [ , список вывода ] )
- •Int scanf ( строка формата , список ввода )
- •1.7. Метки, оператор goto, условные конструкции, оператор break, функция exit
- •If ( логическое выражение ) оператор/блок [ else оператор/блок ]
- •1.8. Циклические конструкции
- •1.9. Указатели, адресная арифметика
- •1.10. Массивы
- •1.11. Функции
- •1.12. Классы памяти. Общие правила описания. Оператор typedef
- •1.13. Строковые переменные, ввод-вывод строк, стандартные функции обработки строк. Функции проверки символов
- •Int sprintf(char* s,char* формат [ , список вывода ] )
- •1.14. Макроопределения
- •1.15. Внешние файлы
- •Int fclose(file* указатель на файл )
- •Int feof(file* файл )
- •1.16. Структуры, объединения, битовые поля
- •1.17. Динамическое распределение памяти
- •1.18. Графика
- •Глава 2. Описание языка fortran
- •2.1. Структура fortran-программы
- •2.2. Типы данных. Константы
- •2.3. Описание переменных, правила умолчания, операторы
- •Implicit тип ( буквы ) , ...
- •2.4. Оператор присваивания. Операции
- •2.5. Стандартные математические функции
- •2.6. Ввод-вывод
- •2.7. Оператор соntinue. Операторы перехода. Условные операторы
- •If (логическое выражение)оператор
- •If (арифметическое выражение)метка1,метка2,метка3
- •2.8. Операторы цикла
- •2.9. Функции loc, locfar, locnear
- •2.10. Массивы
- •2.11. Подпрограммы subroutine, function и interface
- •Intrinsic список имен
- •2.12. Общие области, подпрограмма block data. Оператор equivalence
- •2.13. Символьные переменные
- •2.14. Операторные функции
- •2.15. Внешние файлы
- •2.16. Структуры
- •2.17. Динамические массивы
- •2.18. Графика
- •Глава 3. Решение задач на языках c и fortran
- •Задача 1. Вывод натурального числа
- •Задача 2. Сумма ряда
- •Задача 3. Медленная сортировка
- •Задача 4. Быстрая сортировка
- •Задача 5. Слова
- •Задача 6. График
- •Задача 7. Кубическое уравнение
- •Задача 8. Собственное число
- •Комментарии к задачам
1.12. Классы памяти. Общие правила описания. Оператор typedef
Кроме своего типа каждая переменная в языке С характеризуется также классом памяти. Существует четыре класса памяти :
auto - автоматические переменные;
extern - внешние переменные;
static - статические переменные;
register - регистровые переменные.
Описатель класса памяти может указываться в описаниях переменных слева от типа:
класс памяти тип имя = { список значений } ;
Автоматические переменные определены в той функции или блоке, где они описаны и инициализируются при каждом выполнении функции (блока). Такие объекты “живут” лишь во время работы блока (функции).
Внешние переменные описываются вне функций (без описателя extern) и определены во всех функциях данного файла, следующих за этим описанием, а также во всех функциях, где эта переменная описана с описателем extern. Внешние переменные инициализируются один раз в начале выполнения программы. Внутри функций внешним переменным нельзя присваивать начальные значения, это разрешено только в главном описании переменной.
Статические переменные во всем аналогичны автоматическим, но инициализируются лишь при первом выполнении функции (блока), в которой они описаны, и “время жизни” таких переменных равно времени работы программы.
Регистровые переменные могут храниться в регистрах центрального процессора (что приводит к исключительно быстрой обработке этих переменных), в остальном они аналогичны автоматическим. При недостатке регистровой памяти описатель register игнорируется, но к любым переменным, описанным как регистровые, неприменима операция “адрес”.
По умолчанию переменные, описанные в функциях, имеют класс памяти auto, описанные вне функций - extern. Внутри функции в случае совпадения имен глобальной и локальной переменных действовать будет только локальная переменная.
В С++ предусмотрен доступ к глобальным переменным, скрытым локальными переменными с тем же именем. Операция разрешения области видимости :: позволяет в таких ситуациях воспользоваться глобальной переменной. Например:
int x=5;
void main() { int x=3;
printf("Локальная x= %d\n",x); printf("Глобальная x= %d\n",::x); }
В описаниях кроме имен переменных и имен типов используются модификаторы : * - указатель, () - функция и [] - массив, причем в описаниях сложных объектов модификаторов может быть много, что затрудняет чтение и запись таких конструкций. Для правильной интерпретации описаний используются следующие правила приоритетов :
1) чем ближе модификатор к имени, тем выше его приоритет;
2) [] и () имеют более высокий приоритет, чем *;
3) можно использовать круглые скобки для повышения приоритета модификатора *.
Модификаторы доступа volatile и const позволяют сообщить компилятору об изменчивости или постоянстве определяемого объекта. Если переменная описана как const, то она недоступна в других модулях проекта, подобно статическим переменным, и не может быть изменена в процессе выполнения программы. Константа должна быть инициализирована при описании. С помощью модификатора const создаются типизированные именованные константы, которые в отличие от символических констант, определенных директивой #define, подлежат контролю типов. Например:
const double PI=3.141528; const char yes='Y';
Одно из важных применений переменных типа const - защита параметров функции от модификации, если аргумент передается по ссылке. Модификатор volatile сообщает компилятору, что значение таких подвижных объектов может быть изменено скрытно от компилятора каким-либо фоновым процессом. Например, при обработке прерывания глобальная переменная, содержащая системное время компьютера, может изменить свое значение. Компилятор не должен помещать такие переменные в регистровую память. Пример объявления : volatile unsigned timer;
Так же, как и в языке PASCAL, в языке С программист имеет возможность создавать собственные именованные типы, для чего используется оператор typedef . Запись оператора совпадает с записью описания переменной, только вместо имени переменной задается имя типа и описание предваряется ключевым словом typedef. Оператор typedef может находиться внутри функции - тогда он действует только в данной функции, либо вне функций, и тогда он действует до конца файла. Идентификатор, заданный в операторе typedef, становится именем типа и в дальнейшем может использоваться в описаниях переменных. Например, вместо описания
#define SIZE 3
int b[][SIZE]={1,2,3,4,5,6,7,8,9};
можно использовать описание
#define SIZE 3
typedef int ARRAY[][SIZE]; ARRAY b={1,2,3,4,5,6,7,8,9};
Отметим, что декларация typedef не создает новый тип (как в языке PASCAL), она лишь сообщает новое имя уже существующего типа.
