Справочная система C guide


СТРУКТУРА ПРОГРАММЫ


Программа, описанная в следующем примере, вводит до MAXLINES строк со стандартного входа, сортирует строки в лексикографическом порядке, возрастающем или уменьшающемся в зависимости от признака, передаваемого функции mainQ через аргумент argv Затем программа записывает отсортированные строки на стандартный выход Стандартными входом и выходом (stdin и stdout) могут быть терминал, канал или некоторый файл

//файл bblsort.h

#define MAXLINES 100

#define LINLSIZE (132+1)

main.c

include <stdio h>

include "bblsort h"

char Lme[MAXLINES]ELINESIZE], /* буфер строк */ С int Revfig , /* признак направления * сортировки */

/*

* сортировка строк текста в лексикографическом порядке

*/

main(argc, argv)



D char **argv, /* аргументы вызова программы */

int argc, /* число аргументов */

{

int rdlinesO;

void bblsortO, wrlines();

int numlines;

G Revflg = (argc > 1 && |argv[l][0] [ == '-');

numlines = rdlinesO;

bblsort(numlmes);

wrlines(numlines),

/* запись строк со стандартного выхода*/

Н static int rdlinesO

chai^ *fgets(), / register int l;

/ foi(i=0,i< MAXLINES; i++)

if (fgets(Lme[i], LINESIZE, stdin)

/ == ] (char *)NULL ) break;

return (i);

}

/* запись строк на стандартный выход*/

Структура программы 57

К static void wrhnes(n) L register mt n; /* число строк */

{

register int l,

for (i = 0; i < n; i++) fputs(Lme [i], stdout);

bblsort.c

# include "bblsort.h"

N extern char Line [] [LINESIZE]; [

/* bubble sort */

void bblsort(n) register int n; /* число строк */

int lexcmp();

void swap();

regicterint i,j;

for (i = 1; i <= n - 1; i++) for(J=n- 1;j>= i;J—) if (lexcmp(j - 1, J)) swapO - l.j);

/* лексикографическое сравнение двух строк */

static int lexcmp(i,J)

register int i, j; /* элементы массива строк */ {

strcmp();

extern int Revflg;

register int Ic;

Ic = strcmp(Line [i], Line [j]);

return ((Ic < 0 && Revflg)

(Ic > 0 && '.Revflg));

/* обмен строк */

static void swap(iJ) register int i, j; /* элементы массива строк */


char *strcpy();

char temp [LINESIZE];

strcpy(temp. Line [i]);

strcpy(Line [i], Lme [j]);

strepy(Line [j], temp);

Пояснения к программе

А)

Поименованные константы, используемь- е во всей программе, обычно помещаются в отдельный файл, включаемый в другие файлы программы по мере необходимости. Поэтому при изменении этих параметров программы будет затронут только один файл.

В)

Включаемые файлы обычно помещаются в начало некоторого файла программы. Файл stdio h содержит описания файлов stdm. stdout и константы NULL, необходимых для использования функций fgets() и fputsQ

С)

Описания внешних переменных обычно размещаются в начале файла. В данной программе определены глобальный массив буфера строк и глобальный признак направления сортировки.

D) Если функция main() использует формальные параметры, то они должны быть описаны. Функция main() выполняется первой.

Е) Типы функций, вызываемых в теле функции, обычно описываются в начале тела функции.

F)

Переменная numlmes описана как локальная в блоке автоматическая целая переменная

G) По соглашению первый аргумент argv, передаваемый функции main(), является именем программы; argv [l] — это второй аргумент и argv[l] [О] - это первый символ второго аргумента. Обратите внимание, что перед обращением к argv [l ] [0] проверяется число аргументов argc, так как при отсутствии второго аргумента выражение argv [l] [О] не имеет смысла.

H)

Функция rdlmesQ возвращает целое число прочитанных строк, так как она определена как имеющая тип mt. Прилагательное static указывает, что функция используется только в данном файле.

I) Переменная i определена как локальная в блоке. Описание register — это попытка ускорить выполнение цикла for

J) Поскольку функция fgetsO возвращает значение типа char *,то это значение должно сравниваться с указателем на символ. Поэтому нулевой указатель NULL преобразуется к типу (char *).

К) Функция wrhnesO не возвращает значения, поэтому она опреде лена как имеющая тип void.

L)

Формальный параметр п определен как register для ускорения цикла.



М)

Включение файла bblsort.h определяет поименованную константу LINESIZE.

N)

Это описание массива Line относится ко всему последующему файлу исходного кода. Здесь описывается тип Line, но сам массив определен в предыдущем файле.

О)

Функция bblsortO не описывается как static, потому что она вызывается функцией main(), которая определена в другом файле.

Р)

Формальные параметры i и j объявлены с помощью одного описания. Порядок параметров в таком описании несуществен.

Q)

Глобальный признак Revfig должен быть описан как extern, чтобы показать, что эта переменная определена в другом файле. Это описание может располагаться в начале текущего файла вместе с описанием массива Line

R)

Значением этого выражения является или Истина (1), или Ложь (0), кодируемые целыми значениями. Поэтому функция 1ехстр() определена как имеющая тип int.
Содержание раздела