5. Выполнение команд.
В СИ имеются команды-выражения: пустые, групповые и начи-
нающиеся с ключевого слова., Каждой команде, за исключением
групповой, образующей тело функции, может предшествовать метка
или группа меток через двоеточие:
fin: return a+b;
Команда-выражение имеет вид:
ехр; - где ехр является произвольным выражением.
При выполнении такой команды происходит вычисление данно-
го, представленного выражением ехр, а затем его игнорирование. При
вычислении 2+(а=5) вычислятся данное, равное 7 и это данное затем
игнорируется. Т.о. 2+(а=5) аналогично а=5.
6. Вызов функции.
Вызов функции имеет вид:
fun (argl, arg2,... argN)
Пример:
main ()
int print ()
output (13, print);
output (Num, Fun)
int Num, (*Fun) ();
(*Fun)("%d", Num);
print (Fmt, Val)
char *Fmt;
int Val;
printf (Fmt, -Val);
- при выполнении примера будет напечатано -13. Аргумент print
неявно преобразуется на указание функции print, следовательно,
*Fun представляет функцию printf, а команда:
Fun) Г % el", Num);
выполняется как команда
printf Г % (Г, Num)
7. Входное преобразование программ.
Интегральная часть компилятора Hisoft образует процессор -
подсистему, осуществляющую входное преобразование программ.
Директивы процессора отличаются от других записей тем, что они
находятся в отдельных строках, начинающихся с 'решетки' - #.
Наиболее часто используемой директивой процессора является
определяющая директива. В общем случае:
#define идентификатор последовательность-лексических
единиц
При интерпретации этой директивы последовательность лекси-
ческих единиц связывается с идентификатором и заменяет его в тек-
сте программы.
#define NULL О
#define TRUE 1
#define void int main()
{
void outO;
out ("Izabela");
}
void
out (Name)
char *Name;
{
if (Name = NULL)
return;
while (TRUE) {
printf ("%c", ♦Name);
if (*Name++ = NULL)
return;
}
}
Директива #include.
При интерпретации директивы без параметров в процессе ком-
пиляции программы текст из буфера редактора включается в место
появления этой директивы.
Директива #include с параметрами:
#include "имя" - включение в место появления директивы текста
из файла 'имя'. При использовании магнитофона, сразу после ис-
пользования этой директивы необходимо включить магнитофон.
В том случае, если файл 'имя' является библиотекой функций,
к которым есть обращения в программе, то для избирательного вклю-
чения их в программу необходимо использовать директиву:
#include ? имя ?
Пример:
Если имеем программу:
main ()
{
sub О;
fun ();
}
sub ()
{printf ("JanB sub nM);}
а в файле LIBRA имеется текст:
sub ()
{ printf ("Library sub");}
fun ()
{printf ("Libraryfun");}
то выполнение в процессе компиляции двух директив:
#include
#include ? LIBRA ?
приведет к появлению программы:
main ()
{
sub О;
fun ();
}
sub ()
{printf ("JanB sub n");}
fun ()
{printf ("Library fun");}
Директива # translate 'имя'.
Директива выполняется перед компиляцией, что приводит к
формированию программного модуля, размещаемого в файле 'имя' и
загружаемого из Basic'a командами:
LOAD "имя" CODE
RANDOMIZE USR 25200.
8. Использование библиотек функций.
Совместно с компилятором языка фирма Hisoft поставляет два
модуля; stdio.h и stdio.lib. Первый содержит ряд полезных определе-
ний:
# define NULL 0
# define FALSE О
# define TRUE-1
# define EOF-1
typedef int FILE;
extern unsigned strlen () и др.;
и так же определение двух функций min О и max О.
При необходимости, все эти определения и декларации можно
включить в программу:
#include "stdio.h"
main ()
{ printf С %сГ, maxCJVB'));}
или
#include "stdio.h"
main ()
{ printf("%d", strlenCJB"));}
#include ? stdio.h ?
Описание содержимого файлов stdio.h и stdio.lib приведено в
Приложении С. Можно создавать и собственные библиотеки, создав
в редакторе последовательность описаний и выполнив директиву ре-
дактора : pi,9999,JB.LIB.
9. Выполнение операций ввода/вывода.
В процессе операций ввода/вывода происходит обмен информа-
цией между массивами данных и оборудованием. Связь файла с мас-
сивом или оборудованием осуществляется с помощью функции
fopenO, а прекращение этой связи - fcloseO. Идентификация файла
происходит с помощью файлового указателя, получаемого как ре-
зультат функции fopen. Этим указателем является данное типа
(FILE*), зависящее от реализации и определенное в файле stdio.h. В
системе Hisoft тип FILE определен с помощью директивы:
typedef int FILE;
т.е. он не отличается от типа (int)
Специальным образом трактуются три файла: стандартный
файл ввода, стандартный файл вывода и стандартный файл сообще-
ний об ошибках. В системе Hisoft и стандартный файл ввода связан с
клавиатурой, а файлы вывода и сообщений об ошибках - с верхней
частью экрана. При обмене с клавиатурой, экраном и принтером,
следовательно, не требуется предварительное выполнение функции
fopen. Если тип (STREAM) определен как:
typedef FILE *STREAM;
то установится следующее соответствие:
Оборудование Файловый указатель
Клавиатура cast (STREAM) О
Верхняя часть экрана cast (STREAM) О
Нижняя часть экрана cast (STREAM) 1
Верхняя часть экрана cast (STREAM) 2
Принтер cast (STREA M) 3
Некоторые функции, неявно связанные со стандартными фай-
лами (printf и др.), могут быть вызваны без установки файлового
указателя.
Функция fopen (встроенная)
FILE *fopen (name, mode)
char *name, *mode;
При вызове функции открывается файл, связанный с массивом
name, в режиме, установленном аргументом mode:
mode = "г" - файл на ввод;
mode = V - файл на вывод.
Результатом функции является файловый указатель, иденти-
фицирующий открытый файл. Если файл открыть невозможно, то
результат - пустой указатель (NULL)
Функция fclose (встроенная)
FILE *ptr;
Выполнение функции fclose приводит к закрытию файла, иден-
тифицируемого указателем ptr. Если файл был открыт на вывод, то
его закрытие будет сопровождаться знаком 'конец файла' - EOF,
которым в Hisoft является (SS+I) или -1.
typedef int FILE;
main ()
{
FILE *out, *fopen();
out = fopen CJANB'V'w")) ;
putc ('J', out);
putc ('b', out);
fciose (out)
}
- выполнение функции fopen приводит к открытию файла, свя-
занного с массивом JANB, на вывод. Результатом функции является
файловый указатель, идентифицирующий упомянутый файл. Этот
указатель присвоен файловой переменной out, к которой имеются
обращения в функциях putc и fclose. Таким образом, выполнение
этих функций в общем случае относится к массиву JANB. Выполне-
ние функции fclose приводит к закрытию файла, дополнив оный EOF.
Функция getc (встроенная)
int getc (inp)
FILE *inp
Вывод очередного знака из файла inp. Результатом функции
является данное типа (int) величиной, равной коду введенного знака.
Функция ungetc (встроенная)
ungetc (с, inp)
char с;
FILE *inp
Возврат в файл inp, символа, представленного с. Возврат заклю-
чается в том, что при последующем выполнении функции getc осуще-
ствляется доступ к возвращенному символу.
Функция putc (встроенная)
int putc (с, out)
char с;
FILE *out;
Вывод в файл out знака с. Результатом функции является данное
типа (int) величиной, равной коду введенного знака.
typedef int FILE;
typedef FILE «STREAM;
# define EOF (-1)
# define monitor cast (STREAM) 0
main ()
{
FILE *inp, *fopen ();
int ch;
if (inp==fopen ("stdio.h" ,"r")) {
wHile ((ch=getc(inp))!=EOF)
putc (ch,monitor);
putc Cn monitor);
}
}
- вывод файла stdio.h на монитор.
Функция getchar (встроенная)
int getchar ()
Ввод одного символа из стандартного файла ввода. Результат
функции - данное типа (int), равное коду введенного символа или
EOF.
Функция putchar (встроенная)
int putchar (с)
int с;
Вывод в стандартный файл вывода одного знака с кодом с. Ре-
зультат функции - данное типа (int), равное коду выводимого знака.
# define EOF (-1)
char flag;
main ()
{
int ch;
if ((ch = getchar() ) !=EOF)
main ();
if (Iflag ) {
flag = 1;
putchar ('n');
}
putchar (ch);
}
- ввод с клавиатуры последовательности знаков, оканчиваю-
щейся EOF, а затем вывод этой последовательности в обратном по-
рядке.
Функция printf (встроенная)
printf (fmt, pi, р2,..., pn)
char *fmt;
Выполнение данной функции приводит к выводу в стандартный
файл вывода под управлением списка форматов fmt данных, пред-
ставленных pi ... рп. Функция printf может быть вызвана с перемен-
ным числом аргументов; на один больше, чем форматов конверсии,
содержащихся в последовательности fmt. Каждый формат, если он
существует, состоит из последовательности знаков, начинающейся с
символа % и заканчивающейся одной из букв: d, о, х, и, с, s.
% - начало формата преобразования. Означает, что выводимая
последовательность должна быть выровнена в выходном поле влево;
d - вывод аргументов в виде десятичных чисел;
о - вывод аргументов в виде восьмеричных чисел;
х - вывод аргументов в виде шестнадцатеричных чисел;
и - вывод аргументов в виде числа без знака;
с - вывод аргументов в виде одного знака;
s - вывод последовательности знаков, указанных аргументом,
printf ("Any Text" ); —> Any Text
printf("(%-2d)",5); —> (5)
printf("(%4.3s)","JanB"); —> (Jan)
printf("%с",'В'); —> В
printf ("%x", -1); —> FFFF
Функция fprintf (встроенная)
fprintf (out,fmt, pi, p2, ..., pn);
FILE *out;
char «fmt;
Вывод в файл, идентифицированный out, в формате fmt пере-
менйых р! - рп. Аналогична printf; может быть вызвана с переменным
числом аргументов.
•Функция sprintf (встроенная)
sprintf (str,fmt, pi, p2,..., pn)
char «str;
char «fmt;
При выполнении этой функции данные pi - рп размещаются в
поле памяти str под управлением fmt. Функция может быть вызвана
с переменным числом аргументов.
# include "stdio.h"
FILE «Inp, «fopen ();
char Number [7];
int Ind, Ch, Count;
main ()
{
if (Inp=fopen("Janek","r")) {
while ((Ch = getc(Inp)) != EOF)
Count++;
sprintf (Number, "%u%c", Count, ' ');
while (Number [Ind ] = ' ')
Number [Ind++] = '«';
printf ("Janekzawiera %s znakow", Number);
}
}
- подсчет знаков в файле Janek и вывод в виде:
Janek zawiera «««« 13 znakow
Функция scanf (встроенная)
int scanf (fmt, pi, p2,..., pn)
char «fmt;
Выполнение данной функции приводит к вводу из стандартного
файла ввода под управлением форматов fmt установленного числа
знаков, трактовку их как последовательности величин переменных и
присвоение этих величин аргументам pi ... рп. Функция может быть
вызвана с переменным числом аргументов, зависящим от числа фор-
матов. Каждый формат, если он имеется, состоит из последователь-
ности знаков, начинающейся с символа % и кончающейся одной из
букв: d, о, х, с, s. Последовательность знаков, указанных fmt, в общем
случае состоит из пробела, знаков, отличных от пробела, и форматов
преобразования. Если в такой последовательности присутствует про-
бел, во входном файле ему должна соответствовать последователь-
ность отступов (пробелы, знаки табуляции и знаки новой строки).
Если в рассматриваемой последовательности присутствует знак, от-
личный от пробела, то во входном файле должен присутствовать
такой же знак. Если же имеет место быть указатель преобразования,
то он определяет размер и способ интерпретации следующего поля
входного файла. Такое поле ограничивается ближайшим отступом,
но если в формате указана величина поля, то поле имеет не больше
знаков, чем указано в формате. Если после знака % стоит знак *, то
ближайшее поле входного файла игнорируется.
Очень важно, чтобы тип переменных, указываемых аргумента-
ми функции scanf, соответствовал фюрматам. К примеру, если был
использован формат %d, то переменная, указанная аргументом, мо-
жет быть типа (int), но не может быть типа (char).
Результатом функции scanf является данное типа (int), равное
числу переменных, которым были присвоены данные или EOF.
Функция fscanf (встроенная)
int fscanf (inp,fmt, pi, p2,..., pn)
FILE *inp;
char *fmt;
Ввод из файла, указанного inp, под управлением fmt.... Анало-
гично scanf.
Функция sscanf (встроенная)
int sscanf (str,fmt, pi, p2,..., pn)
char *str;
char *fmt;
Ввод из поля памяти, указанного str, под управлением fmt уста-
новленной последовательности знаков и т.п. Аналогично scanf.
int my Age;
char Sep;
char myName [20 ];
main ()
{
sscanf ("Age=44 JanB=Janek",
"Age=%d%c%*5s%3s",
&myAge, &Sep, myName);
printf (" % sis %dcnow", myName, myAge, Sep);
}
- печать Jan is 44 now.
Функция raw (встроенная)
raw ()
Ввод с клавиатуры одного символа без вывода его на экран и без
передвижения курсора. Результат функции - переменная типа (int),
равная коду введенного символа.
Функция keyhit (встроенная)
int keyhit ()
Проверка буфера клавиатуры на предмет наличия невведенного
символа. Результат функции - переменная типа (int), имеющая вели-
чину 0, если буфер чист и 1 (истина), если в буфере клавиатуры
имеется невведенный символ.
С каждой переменной связан ее класс. С некоторыми
упрощениями можно сказать, что если в декларации не указан
int
max (Count) auto
int Count;
{
int argc, *argv, max;
argc= (Count > 1)-1;
argv = Count + argc;
max = -32768;
while (argc—)
if (*argv — max)
max = argv [1 ];
return max;
>
Внимание: Этого нет в базовом языке.
Команда inline
В системе Hisoft Вы имеете возможность вставлять в свою про-
грамму на Си фрагменты в машинных кодах с помощью команды
inline. Аргументами этой команды могут быть произвольные выраже-
ния, в частности, 16-ричные литералы Oxdd. Принято, что первый
аргумент в пределах 0-255 генерирует один байт кода, а каждый
последующий - два байта кода. В файле stdio.lib команда inline ис-
пользуется для определения ряда графических функций:
els О
{
inline(0xCD,0xD68);
}
Внимание: Этого нет в базовом языке.
Примеры.
1. Определение функции для вычисления абсолютной величины
аргумента типа (int).
int
abs (Par)
int Par;
{ return Par 0 ? -Par: Par}
2. Определение функции для вычисления максимального эле-
мента массива с элементами типа (int):
int
max (Arr, Len)
int Len, Arr[ ]:
{
int Val;
Val = -32768;
while (Len—)
if (Arr [Len ]Val)
Val=Arr [Len ];
return Val;
}
3. Определение функции для подсчета числа единичных бит в
аргументе типа (int):
int
count (Bits)
unsigned Bits;
{
int Tally
for (Tally = 0; Bits; Bits >=1)
Tally+ = Bits&l;
return Tally;
}
4. Определение функции, аргументом которой является адрес
памяти, а результатом - данное типа (char), находящееся по этому
адресу:
char
peek (Addr)
unsigned Addr;
{
typedef char *ChrPtr;
return *cast (Chr Ptr) Addr;
}
5. Определение функции poke для записи данных типа (char) по
адресу Addr:
poke (Addr, Data)
unsigned Addr;
char Data;
{
typedef char *ChrPtr;
♦cast (ChrPtr) Addr = Data;
}
6. Определение функции сравнения последовательностей зна-
ков:
int
strcmp (Str, Trg)
char *Src, *Trg;
{
while (*Src = *Trg++)
if (!*Src++) return 0;
return *Src Trg[-1 ] ? 1: -1;
}
7. Определение функции для создания данного типа (int) из
последовательности цифр:
int
atoi (Src)
char *Src;
{
int Chr, Val;
Val = 0;
while <(Ch = *Src++) = ")
Val = 10*Val+Chr -'0';
return Val;
}
8. Используя функции динамического управления памятью
(calloc и free), описанные в приложении С, создать строковый редак-
тор, позволяющий создавать текст, строки которого нумеруются чис-
лами без знака. Принять, что ввод строки требует ввода числа и
текста строки. Если текст строки отсутствует (пусто), то строка игно-
рируется. Если отсутствуют и число и текст, то на монитор выводятся
все строки текста. Каждая введенная строка должна оканчиваться
знаком ENTER, а текст - знаком EOF (SS +1).
#inclide "stdio.h"
typedef struct Str{
struct Str *next;
int lab;
}LIST;
typedef LIST *ListPtr;
typedef char *CharPtr;
LIST head - {NULL};
mainO
{
extern LIST *find О;
int num, del;
char line [81 ];
LIST *pos;
num - 0;
do {
if (!num)
display ();
else {
pos = find (num);
if (pos-next&&pos-next-lab = num)
delete (pos);
if(del!='n'){
get Line (line,81);
insert (pos, num, line);
}
>
getNumber (&rtum, &del);
}
LIST*
find (num)
int num;
{
LIST *ref;
ref = &head;
while (ref-next&&ref-next-lab num)
ref = ref-next;
return ref;
{
delete (pos)
LIST *pos;
{
LIST *ptr;
ptr = pos-next;
pos-next = ptr-next;
free (cast (CharPtr) ptr);
}
getline (ptr, max)
char *ptr;
int max;
{
int i, с;
for (M);
i max-1 &&(c=getchar()) !='n';
i++) *ptr++ = c;
if (c!- 'n')
while (getcharO !='n');
*ptr=' ';
}
int
length (line)
char *line;
{
int len;
len=0;
while (*line++)
len++;
return len;
}
insert (pos, num, line)
LIST *pos;
int num;
char line [ ];
{
LIST *ptr, *ref;
int size;
size=sizeof (List Ptr) +sizeof (int) ^length (line)+1;
if (ptr=cast(ListPtr)callof(l,size)) {
ref=pos-next;
pos-next=ptr;
ptr-next=ref;
ptr-lab=num;
fill (cast (CharPtr) (ptr+l),line);
} else
printf ("Zignorowano:-brak pamieci");
}
display ()
{
LIST *ref;
ref=head.next;
while (ref) {
print("%3d%s'n", ref-lab,cast (CharPtr) (ref+1));
ref=rtf-next;
}
}
fill (ref,line)
char *ref, *line;
{
while (*ref++=*line++);
*ref=' ';
}
getNumber (num, del)
int *num, ""del;
{
int c, val;
vaM);
while ((c=getchar())=,0,&&c,9')
val=10*val+c-'0';
*num=val;
*del==c;
}
#include? stdio.lib?
9. Создать программу для вывода на экран содержимого файла
TEXT.DOC:
#define EOF (-1);
typedef int FILE;
main()
{
int Chr;
FILE *input, *fopen();
if ((input=fopen("TEXT.DOC,,/,r"))!=NULL)
while ((Chr=getc (input)) !=EOF)
putchar (Chr);
}
10. Программа копирования строки с клавиатуры на принтер:
typedef int FILE;
#define EOF (-1)
main ()
{
FILE *STREAM;
int Chr;
while((Chr=getchar() !=EOF)
putc (Chr, cast (STREAM) 3);
}
ПРИЛОЖЕНИЕ А
Редактор Hisoft.
Директивы редактора имеют вид:
Dnl,n2,tl,t2;
- где D - однобуквенная директива, nl и п2 - целые числа
1...32767, tl и t2 - записи не более 20 символов каждая. Некоторые
параметры могут быть опущены. В этом случае они принимают зна-
чение соответствующих параметров предыдущей директивы.
Если система Hisoft находится в режиме компиляции, то для
вызова редактора необходимо нажать EDIT (CS+1), а затем клавишу
ENTER. Для окончания редактирования и вызова компилятора ис-
пользуется директива С, а для выхода в BASIC - директива В.
Директива I (insert) Im,n.
Директива служит для инициации автоматическрй нумерации
строк текста. Непосредственно после ее выполнения на экране поя-
вится число т. После нажатия ENTER ввод строки с этим номером
заканчивается, а на экране в новой строке появится число m+n, соот-
ветствующее номеру следующей строки. Для прекращения действия
директивы I нажмите EDIT.
Директива L (list) Lin,п.
Директива служит для вывода на экран строк текста п ...т. По
умолчанию т=1, а п=32767. Если весь текст не умещается на экране,
то он выводится порциями по 10 строк. Размер порции вывода может
быть изменен директивой К. Для выхода из директивы необходимо
нажать EDIT.
Директива К (Chunk) Lm.
Директива устанавливает порцию вывода из m строк для дирек-
тивы L.
Директива W (Write) Wm,n.
Вывод на принтер. Для прерывания печати - BREAK.
Директива S (Set) S,,d.
Изменение сепаратора аргументов директив. По умолчанию се-
паратором является* запятая, но можно установить любой другой
знак.
Директива V (View) L.
I
Вывод на экран аргументов nl, n2, tl, t2, использованных в
последней выполненной директиве; вывод адресов начала и конца
буфера текста.
Директива D (Delete) Dm,п.
Удаление строк от m до п. D10,10 или D10 - удаление только 10-й
строки.
Директива N (Renumber) Nm,n.
Перенумерация: первая строка имеет номер т, последующие
п+т.
Директива Р (Put) Pm,n,t.
Запись во внешнюю память, как в файл с именем t, строк про-
граммы от m до п.
Директива G (Get) G,,t.
Ввод из внешней памяти как из файла с именем t текста програм-
мы. Введенный текст размещается непосредственно за уже отредак-
тированным, а его строки автоматически нумеруются с
дискретностью 10.
Директива С (Compiler) С.
Директива В (Basic) В. .
Для возврата в СИ - PRINT USR 25200.
Директива F (Find) Fm,n,f,s.
Поиск в отрезке m...n строки с наименьшим номером, содержа-
щей f. После этого выполняется директива Е. Найденный текст может
быть заменен на текст s, если использовать поддирективу s.
Директива Е (Edit) Em.
Неявное выполнение этой директивы происходит при компиля-
ции программы, содержащей ошибочную строку т. В этом случае на
экран выводится сообщение об ошибке, а по нажатию EDIT неявно
выполняется директива Em. При нажатии любой другой клавиши
вызывается компилятор. Редактирование строки осуществляется с
помощью однозначных поддиректив.
* поддиректива => (CS+8).
Если к моменту использования этой поддирективы вся итоговая
строка была выведена на экран, то к строке добавляется введенный
символ, в противном случае вводится следующий знак итоговой стро-
ки;
* поддиректива <= (CS+5).
Стирание на экране последнего знака итоговой строки и сдвиг
курсора вправо;
* поддиректива ENTER.
Перенос в итоговую строку оставшихся символов исходной,
окончание редактирования и замена в тексте исходной строки на
итоговую;
* поддиректива Q (Quit).
Окончание редактирования без изменения исходной строки;
* поддиректива R (Replace).
Игнорирование итоговой строки и повторение редактирования;
* поддиректива L (List).
Перенос в итоговую строку оставшихся символов исходной и
установка курсора на начало итоговой строки. Как-будто итоговая
строка становится исходной, а новая итоговая - пустой;
* поддиректива К (Kill).
Если на экран выведена вся итоговая строка, то при выполнении
поддирективы удаляется ближайший символ исходной строки, в про-
тивном случае удаляется знак, под которым находится курсор в ито-
говой строке;
* поддиректива Z (Zeroize).
Пропуск всех символов итоговой строки, начиная от символа под
курсором и всех последующих символов - еще не рассмотренных -
исходной;
* поддиректива I (Insert).
Изменение вида курсора с L на * и переход в режим, при котором
символы, введенные с клавиатуры, вводятся непосредственно в ито-
говую строку. В этом режиме ошибки устраняются DELETE. Выход
из режима по нажатию ENTER.
* поддиректива X (External).
Перенос в итоговую строку оставшихся символов исходной, вы-
вод на экран всей итоговой строки и неявное выполнение поддирек-
тивы I;
* поддиректива С (Chang).
Изменение вида курсора с L на + и переход в режим, при котором
символы, введенные с клавиатуры, непосредственно вводятся в ито-
говую строку. Если в момент ввода такого символа на экран выведена
вся итоговая строка, то введенные символы размещаются в конце
строки, а следующий знак исходной строки опускается. В противном
случае вводимый символ замещает находящийся под курсором сим-
вол исходной строки и неявно выполняется поддиректива =. Выход из
этого режима по ENTER.
* поддиректива F (Final).
Поддиректива выполняется после неявного выполнения дирек-
тивы Е, вызванного выполнением директивы F. При этом организу-
ется поиск следующего участка, содержащего текст f, который был
указан в предварительно выполненной директиве F. Следует по-
мнить, что поиск текста осуществляется в границах, определенных в
директиве F;
* поддиректива S (Substitute).
Замена найденною текста f текстом s и неявное выполнение
поддирективы F. Поиск текста должен быть инициирован выполне-
нием директивы или поддирективы F.
ПРИЛОЖЕНИЕ В
Некоторые библиотечные функции
Арифметика, знаковые операции и конверсии.
Функция max; (stdio.h)
int max (count) auto
int count;
Функция min; (stdio.h)
int min (count) auto
int count;
Функция abs; (stdio.lib)
int abs(p)
int p;
Функция sign; (stdio.h)
int sign (p)
int p;
Результатом функции является данное величиной -1,0 или 1 в
зависимости от знака аргумента.
Функция peek; (stdio.lib)
char peek (addr)
unsigned addr;
Возвращает данное типа (char), хранящееся по адресу addr.
Функция poke; (stdio.lib)
poke (addr, ch)
unsigned addr;
int ch;
Функция tolower; (встроенная)
char tolower (с)
char с;
Результатом функции является данное типа (char). Если с за-
главная буква, то результат - соответствующая малая, В остальных
случаях - символ, равный с.
Функция toupper; (встроенная)
char toupper (с)
char с;
Функция обратная tolower.
Функция atoi; (stdio.lib)
int atoi (str)
char *str;
Преобразование последовательности символов, указанных str в
данные типа (int). Если последовательность начинается с целого чис-
ла, то результатом является это число, в противном случае - 0.
Сортировка.
Функция qsort; (stdio.lib)
qsort (ptr, cnt, size, fum)
char *ptr;
int cnt, size;
int (*fun) ();
Сортировка данных, являющихся массивом из cnt элементов,
первый байт которого указан str. Размер элементов определен size, а
сравнивающая функция - fun. Функция, связанная с параметром fun,
должна быть подобрана так, чтобы для ее элементов elml и elm2
результатом вызова:
(*fun) (&elml,&elm2)
было данное типа (int) величиной -1,0 или 1 в соответствии с:
-1 если elm 12;
0 если elml=elm2;
1 если elmlelm2;
Преобразование символьных последовательностей.
Функция strcat; (stdio.lib)
char *strcat (first, second)
char *first, «second;
Удлинение последовательности символов, указанных first, на
длину последовательности second (т.е. присоединение second к first).
Результат функции - данное типа (*char), указывающее на первый
знак последовательности first.
Функция strcmp; (stdio.lib)
int strcmp (src, trg)
char *src, *trg;
Сравнение последовательности знаков, указанных src и trg, и
доступ к данному типа (int), определяющему результат сравнения.
Данное имеет величину 0 - если последовательности равны, положи-
тельную - если первая последовательность больше второй или отри-
цательную, если первая меньше второй. Сравнение идет до конца
последовательности или до первого несравнения.
Функция strcpy; (stdio.lib)
char "strcpy (dst, src)
char "dst, "src;
Копирование последовательности, указанной src, в область па-
мяти, указанную dst.
Функция strlen; (stdio.lib)
unsigned strlen (str)
char *str;
Доступ к данному типа (ifit) равному числу знаков последова-
тельности, указанной str.
Управление оперативной памятью.
Функция calloc; (stdio.lib)
char *calloc (n, size)
unsigned n, size;
Выделение области памяти, предназначенной для размещения
п объектов размером size каждый и доступ к указателю на эту область.
Если выделение области невозможно, то результат - NULL.
Функция free; (stdio.lib)
free (ptr)
char *ptr;
Освобождение области памяти, выделенной функцией calloc.
Аргумент функции представляет собой указатель на эту область.
Функция swap; (встроенная)
swap (pArea, qArea, len)
char *pArea, *qArea;
unsigned len;
Обмен местами содержимого двух областей памяти длиной len
байт, указанных рАгеа и qArea.
Функция move; (встроенная)
move (dst, src, len)
char «dst, «src;
unsigned len;
Копирование области памяти длиной len, указанной src, в об-
ласть, указанную dst.
Операции ввода/вывода.
Функция gets; (stdio.lib)
char gets (str)
char «str;
Размещение в области памяти, указанной str, последовательно-
сти символов, получаемой из стандартного файла ввода. Выполнение
функции заканчивается при получении знака 'W (ENTER). Вместо
него в ЗУ записывается знак с кодом 0. Результатом функции явля-
ется указатель на первый знак поля памяти.
Функция puts; (stdio.lib)
puts (str)
char «str;
Вывод в стандартный файл вывода последовательности символов,
указанных str. Необходимо, чтобы последним знаком был знак с кодом 0.
Функция fgets; (stdio.lib)
char «fgets (str, n, inp)
char «str;
int n;
FILE «inp;
Размещение в поле памяти, указанном str, не более чем п зна-
ков, получаемых из файла, указанного inp. Выполнение функции
заканчивается при размещении п-1 знака или при получении знака
'п После этого в поле размещается дополнительный знак с кодом 0.
Результатом функции является указатель на первый знак поля или
знак NULL, если файл пустой.
Функция fputs; (stdio.lib)
fputs (str, out)
char «str;
FILE «out;
Вывод в файл, указанный out, последовательности знаков, ука-
занных str, оканчивающейся символом с кодом 0.
Генерация случайных чисел.
Функция rand; (stdio.lib)
int rand О
Функция srand (s); (stdio.lib)
int s;
Переустановка генератора случайных чисел.
Графика и звук.
Функция plot; (stdio.lib)
plot (on, x, у)
int on,x,y;
Индикация на экране пикселя с координатами х, у и с цветом
paper, если оп=0, или ink, если оп=1.
Функция line; (stdio.lib) line (on, dx, dy)
int on, dx, dy;
Вычерчивание отрезка прямой от текущей позиции, установ-
ленной функцией plot, до точки, удаленной на dx, dy. On определяет
цвет.
Функция paper; (stdio.lib)
paper (color)
int color;
Функция ink; (stdio.lib)
ink (color)
int color;
Функция els; (stdio.lib)
clsO
Функция beep; (stdio.lib)
beep (time, tone)
int time, tone;
Tone - частота в Hz, time - длительность 1/10 s.
ПРИЛОЖЕНИЕ С
Сообщения об ошибках.
Error-0 missing 'х'
отсутствие ожидаемого знака
Error-1 RESTRICTION: not implemented
неизвестный тип данных
Error-2 bad character constant
ошибка в символьном литерале
Error-3 not a prerocessor command
ошибочная директива препроцессора
Error-4 LIMIT: macro buffer full
определение отменяет само себя
Error-5 can only define identifiersas macros
ошибочная директива препроцессора
Error-6 RESTRICTION: macros may not have parametrs
ошибочная директива препроцессора
Error-7 cannot open file
отсутствие файла с данным именем
Error-8 RESTRICTION: cannot nest includes
включенный файл содержит дириктиву включения
другого файла
Error-9 missing while
ошибка в команде do
Error-10 not in loop or switch
неправильное использование команды break
Error-11 not in loop
неправильное использование команды continue
Error-12 not in switch
команды case или default неправильно использованы
Error-13 LIMIT: too many case satements
слишком много case
Error-14 multiple def auit statments
более чем один defauit
Error-15 goto needs a label
отсутствие метки в команде goto
Error-16 multiple use of identifier
совпадение метки и идентификатора
Error-17 direct execution not possible
некорректное использование директивы препроцессора
Error-18 LIMIT: name table full
слишком много типов данных
Error-19 LIMIT:too many types
слишком много типов данных
Error-20 duplicate declaration - type
двойное объявление
Error-21 duplicate declaranion - storage class
двойное объявление
Error-22 LIMIT: global symbol table full
Error-23 LIMIT: too much global data
слишком много переменных вне объявления функции
Error-24 duplicate declaration
двойное объявление
Error-25 LIMIT: local symbol table full
слишком много переменных в функции
Error-26 this variable was not in parametr list
переменная не была упомянута в списке параметров
Error-27 undefined variable
Error-28 bad function return type
ошибочное выражение в команде return
Error-29 no arrys of functions
использован массив функций
Error-30 LIMIT:expression too complicated
Error-31 LIMIT:expression too complicated
слишком сложное выражение
Error-32 bad type combination
некорректный аргумент операции
Error-33 bad operand type
некорректный аргумент операции
Error-34 need an lvalue
использовано не 1-выражение
Error-35 not a defined members of a structure
имя не идентифицирует поля
Error-36 expected a primary here
использовано не первичное выражение
Error-37 undefined variable
обращение к не объявленной переменной
Error-38 need a type name
не использовано имя типа
Error-39 need a constant expression
использовано не константное выражение
Error-40 can only call functions
в вызове не использовано имя функции
Error-41 does not follow? properly
неправильное использование 3-х-аргументного
оператора
Error-42 destination must be an lvalue
использовано не 1-выражение
Error-43 need a: to follow ?
неправильное использование 3-х-аргументного
оператора
Error-44 need a pointer
не использован указатель
Error-45 illegal parametr type
некорректный параметр функции
Error-46 RESTRICTION: not implemented
неизвестный тип данных
Error-47 cannot use this operator
неизвестный тип данных
Error-48 bad declaration
ошибка в объявлении
Error-49 storage class not valid
ошибка в объявлении
Error-50
Error-51 duplicate declaration of structure tag
двойная декларация признака
Error-52 use a predeclared structure for parameters
объяви структурный тип после функции
Error-53 structure cannot contain itself
структура не может содержать саму себя
Error-54 bad declarator
ошибка в объявлении
Error-55 missing) in function declaration
отсутствие О в объявлении функции
Error-56 bad formal parameter list
ошибка в объявлении функции
Error-57 type should be function
неизвестный тип результата функции
Error-58
Error-59
Error-60 LIMIT: no more memory
недостаточен объем памяти
Error-61 RESTRICTION: use assignment to initialize
некорректное присвоение начальных данных
Error-62-63 cannot initialize this
некорректное присвоение начальных данных
Error-64 too much initialization data
слишком много начальных данных
1 - предполагается, что следующий символ (символы) образуют
команду ассемблера (см. Пункт 2. 8). Все символы после команды
трактуются как комментарии;
<CR> - символ конца строки. Линия просто игнорируется;
- - пробел или табуляция. Если первым символом строки явля-
ется пробел или табуляция, то GENS4 предполагает, что следующий
отличный от пробела или табуляции символ будет началом кода
2 - алгебраическое умножение
/ - алгебраическое деление
? - MOD-ФУНКЦИЯ (А?В=А-(А/В)*В
Замечание:
# - используют для того, чтобы отметить начало 16-ричного
числа
% - используют для того, чтобы отметить начало двоичного
числа