Лекция: Структура программы из двух текстовых файлов

Рассмотрим модель программы из двух текстовых файлов (Рис.1.9). Линии 1-3 указывают область действия глобальных переменных (ниже точки определения): массива array, переменных ext_ch и ext_pp. В пределах области определения их можно использовать во всех функциях без дополнительного объявления как extern(линия 1 для массива array; линия 2 для переменной ext_ch; линия 3 для переменной ext_pp). Чтобы использовать переменные ext_ch и ext_pp в функции main(), т.е. выше точки определения, их надо объявить как extern (внешние) (например, линия 6 для переменной ext_pp).

Во всех функциях, за исключением function3() из файла File2.cpp, описана внутренняя переменная a, которой соответствует своя память, доступ к которой возможен только из пределов функции, но не из других функций.

Область определения глобальных переменных ограничена пределами одного файла (File1.cpp), и, следовательно, эти переменные невидимы в другом файле (File2.cpp). Для их использования требуется также объявление extern (например, линия 5 для массива array; линия 7 для переменной ext_ch; только функцияfunction3() для переменной ext_pp).

File2.cpp
File1.cpp

Рис.1.9. Структура программы из двух файлов и область действия переменных в программе

Пример более сложной программы на С++ (сортировка строк)[10]*

Программа сортирует строки в лексикографическом порядке, возрастающем или убывающем в зависимости от признака, передаваемого функции main() через аргумент argv, и выводит их на экран.

Исходный текст программы представлен в текстовых файлах (main.cpp, bblsort.cpp) и в заголовочных файлах (Рис.1.10):

· стандартном заголовочном файлеstdafx.h

· файлеbblsort.h (подключаемом в начале каждого из текстовых файлов в рамках файлаstdafx.h).

 

 

 


Рис.1.10. Структура программы сортировки строк

 

Программа с комментариями и подробное описание действий, выполняемых каждым фрагментом (А, B, C, D, …), представлены ниже:

 

//bblsort.h – заголовочный файл
А #define MAXLINES 10 #define LINESIZE (12+1)
//stdafx.h – стандартный заголовочный файл
  B #include <iostream> //для ввода/вывода #include <conio.h> //для _getch() #include <cstring> //для strcmp(), strcpy_s() #include «bblsort.h» //для MAXLINES, LINESIZE int rdlines(void); //прототипы функций, определенных в файле main.cpp void wrlines(int);   int lexcmp(int, int);//прототипы функций, определенных в файле bblsort.cpp void swap(int, int); void bblsort(int);   using namespace std;
   
  //main.cpp – программный файл
C #include «stdafx.h» //подключение стандартного заголовочного файла
D //глобальные переменные char Line[MAXLINES] [LINESIZE]; //буфер строк int Revflg; //признак направления сортировки  
E //определение функции main() int main (int argc, char **argv) //аргументы вызова программы // argc — число аргументов, argv – указатель на строки-аргументы
  {  
F int numlines; //локальная переменная функции main()  
G Revflg = (argc>1 && argv[1][0] =='-'); numlines = rdlines();//вызов функции ввода строк cout << "\n----------------------\n"; bblsort(numlines);//вызов функции сортировки, аргумент – количество строк wrlines(numlines);//вызов функции вывода строк, аргумент – количество строк cout << "\n----------------------\n"; _getch(); //функция _getch(); ожидает нажатия клавиши return 0; }
   
H //определение функции rdlines() ввода строк с клавиатуры static int rdlines() //функция доступна только в данном файлеmain.cpp
I { int i; //локальная переменная функции rdlines() for (i=0; i < MAXLINES; i++) if (!cin.getline(Line[i], LINESIZE) ) break; return i; //функция возвращает количество введенных строк }
   
J //определение функции wrlines() вывода n строк на экран static void wrlines(int n) //функция доступна только в файле main.cpp { unsigned i; //локальная переменная функции wrlines() for (i=0; i<n; i++) cout << Line[i] << endl; return; //функция выводит строки и ничего не возвращает }
   
//bblsort.cpp – программный файл
K #include «stdafx.h» //подключение стандартного заголовочного файла
   
L extern char Line [][LINESIZE]; //объявление массива Line, // определенного в файле main.cpp
   
M //определение функции bblsort()сортировки строк void bblsort( int n) // n — число строк { unsigned i, j; //локальные переменные функции bblsort() for (i=1; i<n-1; i++) for (j=n-1; j>=i; j--) if (lexcmp(j-1, j)) swap(j-1, j); return; //функция сортирует строки и ничего не возвращает }
   
N // определение функции lexcmp() сравнения строк //аргументы i, j – номера строк для сравнения static int lexcmp (int i, int j) {//функция доступна только в файле bblsort.cpp extern int Revflg; //объявление Revflg, определение в файле main.cpp int lc; lc= strcmp(Line[i], Line[j]); //библиотечная функция сравнения строк return ((lc<0 && Revflg) || (lc > 0 && !Revflg)); }//функция lexcmp() возвращает 1 или 0 в зависимости от результата //сравнения строк lc и признака Revflg направления сортировки
   
O //определение функции swap() обмена строк // аргументы i, j – номера строк для обмена static void swap( int i, int j) //функция доступна только в этом файле { char temp [LINESIZE]; strcpy_s(temp, Line[j]); //библиотечная функция копирования строк strcpy_s(Line[j], Line[i]); strcpy_s(Line[i], temp); return; //функция swap() меняет строки и ничего не возвращает }

 

А– заголовочный файл bblsort.h с препроцессорными константами MAXLINES и LINESIZE. Препроцессорные константы обычно помещаются в заголовочный файл, включаемый в другие файлы программы, по мере необходимости. При изменении значений констант изменения затронут только файлbblsort.h.

B – стандартный заголовочный файл stdafx.h. Содержит директивы препроцессора для подключения стандартных заголовочных файлов с прототипами библиотечных функций (для работы со строками и другими функциями, вызываемыми в файле); директиву препроцессора для подключения пользовательского заголовочного файла bblsort.hс препроцессорными константами MAXLINES и LINESIZE; прототипы функций rdlines(), wrlines(), определенных в файле main.cpp, иlexcmp(), swap(), bblsort(), определенных в файле bblsort.cpp программы, а также директиву using namespace std; определяющую для данной программы в качестве пространства,в котором распознаются ее имена, стандартное пространство имен std (за пределами его имена будутнеизвестны).

БлокиотСдоJвключительно представляют содержание файла main.cppс головной функцией main()и вызываемыми в ее теле функциями rdlines()иwrlines().

еще рефераты
Еще работы по информатике