- •Содержание
- •Глава 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. Собственное число
- •Комментарии к задачам
2.16. Структуры
Структуры в языке FORTRAN аналогичны записям в языке PASCAL и структурам в языке C. Структурные переменные описываются в программе в два этапа: сначала описывается структурный тип в операторе STRUCTURE :
STRUCTURE /имя типа/
описания элементов
END STRUCTURE
а затем описываются переменные в специальном операторе RECORD :
RECORD/имя типа/ имя переменной[описатель измерений]...
Допустимы вложенные структуры и массивы структур, структуры могут быть параметрами подпрограмм. Элемент структуры записывается в виде:
имя структуры.имя элемента
точно так же, как в языках PASCAL и C. Целые структуры нельзя вводить или выводить, подобно массивам; для них не работает оператор DATA.
2.17. Динамические массивы
В языке FORTRAN отсутствуют средства для произвольных операций с динамической памятью, как в языках PASCAL и C. Вместо них можно использовать динамически распределяемые (или просто динамические) массивы. Память под такие массивы отводится не при компиляции программы, а по мере необходимости во время выполнения, а после использования может быть освобождена. Динамические массивы описываются со специальным атрибутом ALLOCATABLE :
имя[ALLOCATABLE] описатель измерений
Причем описатель измерений динамического массива имеет вид
( : , : , ... , : )
и задает только размерность массива, которая равна количеству двоеточий (двоеточия разделяются запятыми). Выделяется память для динамического массива оператором ALLOCATE :
ALLOCATE (имя описатель измерений [,STAT=код ошибки])
Описатель измерений в операторе ALLOCATE записывается уже полностью, но, в отличие от обычных массивов, границы измерений могут задаваться любыми выражениями. Существует одно ограничение на использование динамических массивов - их можно использовать как скалярные переменные только в списках ввода-вывода, но не в операторе присваивания и не в арифметических выражениях. Память, отведенная под динамический массив, освобождается оператором DEALLOCATE :
DEALLOCATE (имя[,STAT=код ошибки])
2.18. Графика
Для использования в программе графической библиотеки необходимо включить в программу операторы:
INCLUDE ‘FGRAPH.FI’
INCLUDE ‘FGRAPH.FD‘
или метакоманды
$INCLUDE:’FGRAPH.FI’
$INCLUDE:’FGRAPH.FD’
для подключения файлов, содержащих описания графических процедур и функций (подпрограммы INTERFACE), а также для описания констант и переменных. Графический режим устанавливается функцией
INTEGER*2 FUNCTION SetVideoMode (mode)
INTEGER*2 mode
Аргумент mode может быть, например, одной из констант:
$MAXRESMODE =-3 - графический режим максимального разрешения;
$MAXCOLORMODE =-2 - графический режим максимальной цветности;
$DEFAULTMODE =-1 - возврат к оригинальному режиму.
Функция возвращает 0 в случае неудачи. Аналогична InitGraph в языках PASCAL и C.
Получить информацию о текущем экранном режиме можно с помощью процедуры:
SUBROUTINE GetVideoConfig(s)
STRUCTURE/videoconfig/
INTEGER*2 numxpixels ! число пикселов по X
INTEGER*2 numypixels ! число пикселов по Y
INTEGER*2 numtextcols ! число текстовых колонок
INTEGER*2 numtextrows ! число текстовых строк
INTEGER*2 numcolors ! число цветов
INTEGER*2 bitsperpixel ! число битов на пиксел
INTEGER*2 numvideopages ! число доступных видеостраниц
INTEGER*2 mode ! текущий видеорежим
INTEGER*2 adapter ! активный адаптер дисплея
INTEGER*2 monitor ! активный монитор
INTEGER*2 memory ! видеопамять адаптера в килобайтах
END STRUCTURE
RECORD/videoconfig/s
Процедура возвращает текущую графическую конфигурацию через структуру s. Поле mode возвращает установленный графический режим. Поле adapter возвращает тип графического адаптера, например, $VGA = 8 . Поле monitor возвращает тип монитора, например, $COLOR или $ENHCOLOR .Фоновый цвет экрана устанавливается функцией
INTEGER*4 FUNCTION SetBkColor (color)
INTEGER*4 color
Подпрограмма
SUBROUTINE ClearScreen(area)
INTEGER*2 area
очищает некоторую область экрана, заполняя ее текущим цветом фона. Параметр area может быть одной из следующих констант:
$GCLEARSCREEN - весь экран,
$GVIEWPORT - текущий видеопорт,
$GWINDOW - текущее текстовое окно.
Текущий цвет для линий и закраски устанавливает функция
INTEGER*2 FUNCTION SetColor(color)
INTEGER*2 color
Вывод пиксела на экран (с использованием текущего цвета) выполняется функцией
INTEGER*2 FUNCTION SetPixel (x,y)
INTEGER*2 x,y
Отрезок прямой от текущего положения графического курсора до точки с координатами x,y рисует функция
INTEGER*2 FUNCTION LineTo (x,y)
INTEGER*2 x,y
Графический курсор перемещается процедурой
SUBROUTINE MoveTo(x,y,s)
INTEGER*2 x,y
STRUCTURE/xycoord/
INTEGER*2 xcoord
INTEGER*2 ycoord
END STRUCTURE
RECORD/xycoord/s
Процедура возвращает через параметр s предыдущее положение графического курсора. Шаблон линии задается процедурой
SUBROUTINE SetLineStyle (mask)
INTEGER*2 mask
Эллиптическая дуга рисуется функцией
INTEGER*2 FUNCTION Arc(x1,y1,x2,y2,x3,y3,x4,y4)
INTEGER*2 x1,y1,x2,y2,x3,y3,x4,y4
Центром эллипса является центр прямоугольника, который определяется точками (x1,y1) и (x2,y2), дуга начинается в точке, (x3,y3), и заканчивается в точке (x4,y4). Эллипс рисуется функцией
INTEGER*2 FUNCTION Ellipse(control,x1,y1,x2,y2)
INTEGER*2 control,x1,y1,x2,y2
Центром эллипса является центр ограничивающего прямоугольника, определяемого точками (x1,y1) и (x2,y2). Аргумент control может быть одной из двух констант:
$GFILLINTERIOR - эллипс закрашивается,
$GBORDER - эллипс не закрашивается.
Прямоугольник рисуется функцией
INTEGER*2 FUNCTION Rectangle (control,x1,y1,x2,y2)
INTEGER*2 control,x1,y1,x2,y2
Замкнутая область закрашивается функцией
INTEGER*2 FUNCTION FloodFill(x,y,boundary)
INTEGER*2 x,y,boundary
Функция аналогична FloodFill в языках PASCAL и C. Способ закрашивания устанавливается процедурой
SUBROUTINE SetFillMask(mask)
INTEGER*1 mask
где mask - массив из 8 элементов типа INTEGER*1, который определяет шаблон закраски области 8 на 8 пикселов. Если маска заполнения не установлена или массив нулевой, то для заполнения используется текущий цвет. Текст на графический экран выводится процедурой
SUBROUTINE OutGText(text)
CHARACTER*(*) text
Текст выводится с использованием текущего шрифта, текущей графической позиции и текущего цвета. После вывода текста сохраняется текущая графическая позиция. Текст позиционируется по левому верхнему краю. Кроме того язык FORTRAN позволяет пользоваться в графическом режиме и обычными операторами PRINT и WRITE. Текущее положение графического курсора возвращает процедура
SUBROUTINE GetCurrentPosition (s)
RECORD/xycoord/s
Ширину текста в пикселах возвращает функция
INTEGER*2 FUNCTION GetGTextExtent(text)
CHARACTER *(*) text
Подключение графических шрифтов осуществляет функция
INTEGER*2 FUNCTION RegisterFonts (PathToFiles)
CHARACTER*(*) PathToFiles
Файлы с графическими шрифтами имеют расширение fon и должны быть доступны программе. Функция возвращает положительное число, равное номеру последнего зарегистрированного шрифта при успешной регистрации. Отрицательное число означает : -1 - файл не найден; -2,-3 - один или несколько файлов ошибочны. Графические шрифты отключаются процедурой
SUBROUTINE UnRegisterFonts()
Текущий шрифт устанавливается функцией
INTEGER*2 FUNCTION SetFont (options)
CHARACTER *(*) options
Она устанавливает один из зарегистрированных шрифтов, который характеризуется параметром options. Строка options может содержать подстроки:
t’fontname’ - имя шрифта;
hx - высота символа в пикселах для масштабируемых шрифтов;
wx - ширина символа в пикселах для масштабируемых шрифтов;
nx - номер шрифта.
2.19. Дополнительные возможности языка:
дополнительные точки входа, свободный формат,
строки отладки, средства консольного ввода-вывода,
системное время, случайные числа
В подпрограммах SUBROUTINE и FUNCTION могут быть дополнительные точки входа, которые задаются оператором ENTRY :
ENTRY имя точки входа(список параметров)
Операторы ENTRY могут записываться в любом месте подпрограммы, но не внутри цикла и не внутри условного оператора. Список параметров дополнительной точки входа может не совпадать со списком параметров в заголовке подпрограммы. Тип вычисляемого значения (если это функция) также может отличаться от типа, указанного в заголовке. Но в самом операторе ENTRY задать вычисляемый тип нельзя, это нужно сделать в операторе описания в начале подпрограммы. Подпрограмму, имеющую дополнительные точки входа, можно вызвать через любую из этих точек, точно так же, как и по основному имени. Но дополнительные точки входа нельзя передавать другим подпрограммам как аргументы.
Метакоманда $FREEFORM позволяет записывать текст программы в так называемом свободном формате. При этом операторы можно размещать в позициях с 1-й по 80-ю; метки записываются начиная с 1-й позиции и могут не отделяться от оператора пробелом; если последний символ строки “-”, то следующая строка считается строкой продолжения; признак комментария -символ “ в 1-й позиции.
Строки отладки позволяют осуществлять так называемую условную компиляцию, т.е. компилировать не все операторы программы, а лишь некоторое их подмножество. Строка отладки - это любая строка программы, в первой позиции которой записана какая-нибудь латинская буква (кроме буквы C). Для включения режима условной компиляции используется метакоманда $DEBUG. Она может быть задана (в любом месте программы) либо без параметров : $DEBUG , либо с параметром - строкой, состоящей из латинских букв : $DEBUG:’буквы’. В первом случае метакоманда включает расширенную диагностику ошибок времени выполнения (целочисленное переполнение, проверка границ подстрок, проверка индексных выражений элементов массивов и т.д.). Во втором случае метакоманда включает режим условной компиляции - компилируются только те из строк отладки, которые начинаются буквой, входящей в строку, заданную в $DEBUG, остальные строки отладки считаются комментариями. Отменить действие метакоманды $DEBUG можно либо другой метакомандой $DEBUG, либо метакомандой $NODEBUG.
В языке FORTRAN есть некоторые средства для работы с текстовыми окнами на экране. Они находятся в той же библиотеке, что и графические процедуры и функции, поэтому для их использования необходимо подключить к программе файлы fgraph.fi и fgraph.fd. Процедура SetTextWindow (y1,x1,y2,x2) распределяет текстовое окно на экране, y1,y2 - номера строк, x1,x2 - номера позиций. Для очистки текстового окна используются функция SetBkColor и процедура ClearScreen, которые работают как в графическом, так и в текстовом режиме. Положение курсора устанавливает процедура SetTextPosition(y,x,OlpPos), где y,x - номер строки и номер позиции (координаты отсчитываются от левого верхнего угла окна), OldPos - структурная переменная, через которую возвращаются предыдущие координаты курсора, она должна быть описана как RECORD/rccoord/TextPos. Цвет текста устанавливает функция SetTextColor(Color). Вывод в текстовое окно осуществляется специальной процедурой OutText(text). Процедура выводит только символьные значения, числа должны быть предварительно преобразованы в строку. Не следует использовать совместно с процедурой OutText операторы PRINT и WRITE. Форму курсора можно установить функцией SetTextCursor. Она имеет один параметр типа INTEGER*2, значение #0707 задает тонкий курсор, #0007 - максимально большой (“блочный”) курсор, #0607 - нормальный курсор, #2000 - невидимый курсор. При работе с текстовыми окнами нежелательно использование оператора PAUSE, вместо него можно использовать оператор READ(*,*), который ожидает нажатия клавиши Enter (как ReadLn в языке PASCAL). Этот оператор работает и во всех других случаях.
Для получения системного времени служит стандартная подпрограмма-процедура
SUBROUTINE GetTim(h,m,s,s100)
INTEGER*2 h,m,s,s100
где h-часы, m-минуты, s-секунды и s100-сотые доли секунды.
Случайное вещественное число из отрезка (0,1) возвращает подпрограмма-процедура
SUBROUTINE Random(x)
REAL*4 x
Генератор случайных чисел можно инициализировать с помощью подпрограммы-процедуры
SUBROUTINE Seed(Init)
INTEGER*2 Init
При возрастании параметра Init от 0 до примерно 10000 первое значение, возвращаемое генератором случайных чисел, растет от почти нуля до почти единицы, а для больших значений Init этот цикл повторяется. В качестве хорошего инициализатора можно брать величину s100*100, где s100 - сотые доли секунды текущего системного времени.
