Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создание и добавление головного файла в проект






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

При решении больших по объему прикладных задач на компьютере написание основной программы сводится к вызовам функций, которые позволяют решать подзадачи. Если описывать функции и основную программу в одном файле, то это затруднит её понимание при проверке. Эту проблему в языке С++ позволяет решить многофайловая программа.

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

Реализация многофайловой программы:

1. Создать проект программы.

2. Выбрать пункт меню Projectà Add to Projectà New (для создания нового головного файла) и Projectà Add to Projectà Files… (для подключения уже созданного головного файла). Среда Visual C++ 6.0 будет выглядеть следующим образом (рис.10).

3. Появится диалоговое окно, в котором будет предложено выбрать тип подключаемого файла (C/C++ Header File) и, если это нужно, набрать имя создаваемого головного файла в поле File name. После этого нужно нажать на кнопку (рис.11).

4. Созданный головной файл будет находиться в той же папке, где и располагаются файлы проекта. В среде программирования файл можно найти на вкладке FileView, раскрыв папку Header Files (рис.12):

5. Открыв созданный головной файл, в окне редактора можно набрать текст функции. Для возможности использования созданной функции в своей программе необходимо в файле главной функции < имя_проекта>.cрр (на вкладке FileView окна рабочего пространства открыть папку Source Files) при помощи директивы #includе подключить созданный головной файл (рис.13).

 

Пример 1. Дан одномерный массив целых чисел. Вычислить сумму максимального и первого элементов массива.

 

Ход выполнения работы

1. Основной алгоритм решения задачи (декомпозиция) выглядит следующим образом:

1) ввод элементов массива;

2) нахождение максимального элемента;

3) вычисление суммы;

4) вывод элементов массива на печать.

Каждая часть основного алгоритма является логически завершенной. Следовательно, для решения этой задачи нужно разработать три функции:

ввод элементов массива;

нахождение максимального элемента;

вывод элементов массива на печать.

Определим параметры и результаты работы каждой функции.

Ø Результатом работы первой функции должен быть сформированный массив. Этого можно достичь двумя способами: тип результата работы функции можно сделать указателем на тип элементов массива (1 вариант) или сделать формальным параметром указатель на тип элементов массива (2 вариант). Если в первом случае в теле функции будет необходимо использовать оператор return и будет возвращаться указатель на начало массива в ОП, то во втором случае этого не надо будет делать, поскольку в качестве фактического параметра будет передаваться адрес массива в ОП. При передаче указателя – фактического параметра в функцию произойдет заполнение ячеек ОП, которые будут отведены под массив. При этом их адреса не будут изменены. Еще одним параметром функции должна быть переменная, значение которой определяет количество вводимых переменных.

Ø Результатом работы функции нахождения максимального элемента будет найденный элемент. Следовательно, в теле функции обязательно должен быть оператор return, который вернет найденное значение. Формальными параметрами функции будут указатель на начало массива и переменная, хранящая количество элементов массива.

Ø Функция вывода элементов массива на печать не возвращает никакого результата, т.е. в теле функции оператор return отсутствует. Следовательно, формальными параметрами этой функции будут указатель на начало массива и переменная, хранящая количество элементов массива.

2. Создать проект (консольное приложение) с именем massive. В проекте создать и подключить два головных файла с именами vvod.h и comp.h. В первом файле описать функцию ввода и функцию вывода элементов одномерного массива, во втором – функцию, которая будет искать максимальный элемент.

3. Записать тексты функций в головные файлы. Для этого открыть в окне рабочего пространства вкладку FileView, затем открыть папку Header Files. В этой папке открыть файл vvod.h и записать в него тексты первых двух функций. В той же папке открыть файл comp.h и записать в него текст функции. Тексты программ, записанных в каждом файле:

файл vvod.h:

//функция ввода элементов массива: 1-ый вариант

int *vv(int a[], int n) //в качестве аргументов выступают одномерный

//массив и количество его элементов

{

int i; //локальная переменная – номер элемента массива. Область

//видимости переменной – тело функции

for(i=0; i< =n-1; i++)

{

cout< < " a[" < < i< < " ]=";

cin> > a[i];

}

return a; //возвращаем адрес на начало массива в ОП

}

 

//функция ввода элементов массива: 2-ой вариант

void vv(int *a, int n)

{

int i; //локальная переменная – номер элемента массива.

//Область видимости – тело функции

for(i=0; i< =n-1; i++)

{

cout< < " a" < < i< < " =";

cin> > *(a+i);

}

}

 

//функция вывода элементов массива

void viv(int *a, int n)

{

int i; //локальная переменная – номер элемента массива.

//Область видимости – тело функции

for(i=0; i< =n-1; i++)

{

cout< < " a" < < i< < " =" < < *(a+i)< < " ";

}

cout< < endl;

}

 

файл comp.h:

//функция поиска максимального элемента массива

int max(int *a, int n)

{

int i; //локальная переменная – номер элемента массива.

//Область видимости – тело функции

int max_a; //локальная переменная – максимальный элемент массива.

//Область видимости – тело функции

max_a=*a;

for(i=1; i< =n-1; i++)

{

if(max_a< *(a+i))

max_a=*(a+i);

}

return max_a;

}

4. Записать текст главной функции. Для этого открыть в окне рабочего пространства вкладку FileView и папку Source Files. В этой папке открыть файл massive.cpp и записать в него текст главной функции:

#include " stdio.h"

#include " stdlib.h"

#include " iostream.h"

#include " iomanip.h"

#include " vvod.h"

#include " comp.h"

int main()

{

int n, *p, s;

cout< < " Введите количество элементов массива n=";

cin> > n;

p=(int*)malloc(n*sizeof(int));

//введем элементы массива при помощи нашей функции 2-ой

//вариант

vv(p, n);

// при втором варианте описания этой функции был бы вызов:

// p=vv(p, n);

//вычислим сумму

s=*p+max(p, n);

//выведем значение суммы на экран

cout< < " summa=" < < s< < endl;

//выведем элементы массива

viv(p, n);

free(p);

return 1;

}

 

Примечания:

ü При написании программ с использованием функций и массивов нужно учитывать тот факт, что если массив (одномерный или двухмерный, целочисленный или символьный и т.д.) должен быть изменен в результате работы функции, то в качестве формального параметра выступает указатель на начало массива в ОП. Если же массив не изменяется в процессе выполнения функции, то в качестве формального параметра можно определить указатель на начало массива в ОП, но при этом надо следить за тем, чтобы элементы массива не изменялись в процессе выполнения операторов тела функции.

ü Как видно из примера имена фактических и формальных параметров не совпадают, что не влияет на правильность работы программы.

5. Откомпилировать файл massive.cpp. Запустить программу на выполнение.

 

Пример 2. Каждого студента можно описать при помощи характеристик: ФИО, курс, специальность, предмет1, предмет2, предмет3. Написать программу (с использованием файлов и функций), определяющую количество студентов:

1) сдавших сессию на «отлично»;

2) не сдавших хотя бы 1 экзамен.

 

Ход выполнения работы

1. Опишем основной алгоритм решения задачи (декомпозиция). Переменная var обозначает вариант работы:

var=-1

пока var! =0

ввод var

выбор var

случай 1: // создание и запись в файл

вызов функции создания и записи в файл

выход

случай 2: //открытие файла для добавления

вызов функции добавления данных в файл

выход

случай 3: // открытие файл в режиме чтения

//определение характеристик

вызов функции вычисления искомых величин

печать характеристик

выход

все_выбор

все_цикл

Определим входные параметры и результат работы каждой функции.

a). Функция создания и записи в файл. Функционально результат ее работы будет зависеть от имени файла, указателя на поток (файл) и режима открытия файла. Следовательно, эти величины и будут формальными параметрами этой функции. Данная функция будет возвращать результат – целое число 0 в случае неудачной попытки открытия файла и число 1, если функция отработала нормально.

b). Функция добавления данных в файл. Функционально результат ее работы будет зависеть от имени файла, указателя на поток (файл) и режима открытия файла. Следовательно, эти величины и будут формальными параметрами этой функции. Данная функция будет возвращать результат – целое число 0 в случае неудачной попытки открытия файла и число 1, если функция отработала нормально. Из п.п.a), b) следует, что можно написать одну функцию для реализации действий, описанных в этих двух пунктах.

c). Функция вычисления искомых величин. Функционально результат ее работы будет зависеть от имени файла, указателя на поток (файл) и режима открытия файла. Следовательно, эти величины и будут формальными параметрами этой функции. Данная функция будет возвращать результат – целое число 0 в случае неудачной попытки открытия файла и число 1, если функция отработала нормально. В список формальных параметров этой функции добавим еще два параметра: указатели на искомые величины (будем называть их характеристиками) – значения, расположенные по переданным адресам, будут изменены в процессе выполнения функции.

Программа должна быть универсальной с точки зрения пользователя. Для достижения этого воспользуемся оператором выбора switch(), в котором будут вызываться соответствующие функции. Работа с файлом осуществляется не напрямую, а через динамический массив структур. Для ввода-вывода значений будут использоваться потоковые функции.

2. Создать проект (консольное приложение) с именем student. В проекте создать и подключить один головной файл с именем my_function.h. Открыть этот файл в окне рабочего пространства и описать в нем все функции. Тексты функций:

файл my_function.h:

//описание структурного типа

typedef struct

{

char fio[30];

int kurs;

char spec[30];

int hist;

int math;

int phis;

} stud;

//функция записи или добавления данных в файл

int write(char *name, FILE *pf, char *rezh)

{

stud *st;

int i;

long int n;

cout< < " n=";

cin> > n;

st=(stud*)malloc(n*sizeof(stud));

//заполнение массива структур

for(i=0; i< =n-1; i++)

{

cout< < " fio=";

cin> > ((st+i)–> fio);

cout< < " kurs=";

cin> > ((st+i)–> kurs);

cout< < " spec=";

cin> > ((st+i)–> spec);

cout< < " history=";

cin> > ((st+i)–> hist);

cout< < " math=";

cin> > ((st+i)–> math);

cout< < " phis=";

cin> > ((st+i)–> phis);

}

//файл pf с именем name открывается в режиме rezh

if((pf=fopen(name, rezh))==NULL)

{

printf(" файл не открыт\n");

return 0;

}

//запись в файл

fwrite(st, sizeof(stud), n, pf);

fclose(pf);

free(st);

return 1;

}

//функция вычисления искомых величин

int read(char *name, FILE *pf, char *rezh, int *c_5, int *c_2)

{

stud *st;

int i;

long int n;

//локальные переменные cnt5 и cnt2 нужны для вычисления

//характеристик

int cnt5, cnt2;

// файл pf с именем name открывается в режиме rezh

if((pf=fopen(name, rezh))==NULL)

{

printf(" файл не открыт\n"); return 0;

}

//определение длины файла в байтах

fseek(pf, 0, SEEK_END);

n=ftell(pf);

//определение количества записей в файле

n=n/sizeof(stud);

st=(stud*)malloc(n*sizeof(stud));

//возвращаем указатель в начало файла

rewind(pf);

//заполнение массива структур

fread(st, sizeof(stud), n, pf);

cnt5=cnt2=0;

for (i=0; i< =n-1; i++)

{ //определяем количество отличников

if((st+i)–> hist==5& & (st+i)–> math==5& & (st+i)–> phis==5)

cnt5++;

//определяем количество студентов, не сдавших хотя бы один

//экзамен

if((st+i)–> hist==2||(st+i)–> math==2||(st+i)–> phis==2)

cnt2++;

}

fclose(pf);

free(st);

//возвращение найденных характеристик в главную программу

//через указатели

*c_5=cnt5;

*c_2=cnt2;

return 1;

}

3. Записать текст главной функции. Открыть в окне рабочего пространства вкладку FileView и папку Source Files. В этой папке открыть файл student.cpp и записать в него текст главной функции:

#include " stdio.h"

#include " stdlib.h"

#include " iostream.h"

#include " iomanip.h"

#include " my_function.h"

int main()

{

FILE *pf;

int var, count_5, count_2, i;

char name_file[25];

//вводится имя файла, с которым предстоит работать

cout< < " name_file=";

cin> > name_file;

var=-1;

while(var! =0)

{

cout< < " 0–выход; 1–запись; 2–добавление; 3–характеристики: "

< < " var=";

cin> > var;

switch(var)

{

case 1:

//записываем данные в файл

i=write(name_file, pf, " w");

break;

case 2:

cout< < " name_file=";

cin> > name_file;

//дозаписываем данные в файл

i=write(name_file, pf, " a");

break;

case 3:

cout< < " name_file=";

cin> > name_file;

//определяем характеристики

i=read(name_file, pf, " r", & count_5, & count_2);

if(i! =0)

{

cout< < " count_5=" < < count_5< < endl;

cout< < " count_2=" < < count_2< < endl;

}

break;

}

}

return 1;

}

 

Примечания:

1. В списке формальных параметров функции read() присутствуют два параметра-указателя. Это сделано для того, чтобы можно было при помощи функции возвращать не одну, а две величины (характеристики). Таким образом, если в результате работы функции должно быть получено более одной результирующей величины, то одну из этих величин можно возвращать при помощи оператора return, а другие добавлять в список формальных параметров как указатели на искомые переменные. В этом случае напрямую использовать эти параметры в операторах тела функции (например, в выражениях) не рекомендуется. Целесообразнее использовать локальные переменные для вычисления характеристик (в нашем примере это cnt2 и cnt5). Затем, полученные значения этих переменных записать по адресам ОП, переданным в функцию через указатели – фактические параметры.

2. Очевидно, что с использованием функций текст главной функции main() значительно упростился и стал более понятен при чтении. Намного проще становится отладка программы, поскольку можно выявить неправильную работу всей программы, исследуя ее по частям (функциям).

4. Откомпилировать файл massive.cpp. Запустить программу на выполнение.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.