Студопедия

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

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

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






Листинг 7.10






 

#include < 1ostream.h>

#include < str1ng.h>

 

template < class T> T Max(T *b. int n);

int main()

{

const int n = 20;

int I, b[n];

cout «" Введите " «n «" целых чисел: " «endl;

 

for (i = 0; i < n; i++) cin» b[i];

cout «Max(b, n) «endl;

 

double a[] = {0.22, 117.2, -0.08, 0.21, 42.5};

cout «Max(a, 5) «endl;

 

char *str = " Sophisticated fantastic template";

cout «Max(str. strlen(str)) «endl;

 

return 0;

}

template < class T> T Max(T *b, int n)

{

int imax = 0;

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

if (b[i] > b[imax]) imax = i;

return b[imax];

}

 

Шаблон функции имеет имя Мах. После ключевого слова tempi ate в угловых скоб­ках перечисляются все параметры шаблона. В данном случае параметр один. При инстанцировании шаблона (в данном случае - неявном), то есть когда компиля­тор будет создавать конкретный вариант функции, этот тип будет заменен конк­ретным стандартным или пользовательским типом. Соответствие устанавливается при вызове функции либо по типу аргументов, либо по явным образом указанно­му типу. Например, последний вызов функции можно записать так:

 

cout «Max < char> (str, strlen(str));

 

Этот способ применяется в тех случаях, когда тип не определяется по виду опера­тора вызова функции.

Аналогично обычным параметрам функции, можно задавать значение параметра шаблона по умолчанию.

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

Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15². Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.

Указания по технике безопасности. Техника безопасности при выполнении лабораторной работы совпадает с общепринятой для пользователей персональных компьютеров, самостоятельно не производить ремонт персонального компьютера, установку и удаление программного обеспечения; в случае неисправности персонального компьютера сообщить об этом обслуживающему персоналу лаборатории (оператору, администратору); соблюдать правила техники безопасности при работе с электрооборудованием; не касаться электрических розеток металлическими предметами; рабочее место пользователя персонального компьютера должно содержаться в чистоте; не разрешается возле персонального компьютера принимать пищу, напитки.

Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем.Порядок выполнения работы:

1. Проработать примеры, приведенные в лабораторной работе.

2. Выполнить задания согласно варианта индивидуального задания №1 лабораторной работы №6, оформив каждый пункт задания в виде функ­ции. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

3. Выполнить задания согласно варианта индивидуального задания №1 лабораторной работы №6, оформив каждый пункт зада­ния в виде шаблона функции. Все необходимые данные для функций должны пе­редаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

4. В соответствии с вариантом, используя прямую рекурсию, написать и выполнить программу. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Вариант:

1. Напечатать в обратном порядке последовательность чисел, признаком конца которой является 0.

2. Для n = 12 найти числа Фибоначчи. Числа Фибоначчи: F(0) = 1, F(1) = 1 F(n) = F(n - 2) + F(n - l)

3. Даны целые числа m и n, где 0 ≤ mn, вычислить, используя рекурсию, число сочетаний С(n, m) по формуле: , при 0 ≤ mn. Воспользовавшись формулой можно проверить правильность результата.

4. Опишите рекурсивную функцию, которая по заданным вещественному х и целому п вычисляет величину хn согласно формуле:

5. Задана последовательность положительных чисел, признаком конца которых служит отрицательное число. Используя рекурсию, подсчитать количество чисел и их сумму.

6. Дан вектор X из n вещественных чисел. Найти минимальный элемент вектора, используя вспомогательную рекурсивную функцию, находящую минимум среди последних элементов вектора X, начиная с n -гo.

7. Напишите рекурсивную функцию для нахождения биномиальных коэффициентов (для заданного Мij > 0 вычислите все ):

8. Напишите программу вычисления функции Аккермана для всех неотрицательных целых аргументов т и п:

9. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

 

10. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

11. Напишите рекурсивную функцию, которая вычисляет по следующей формуле:

п = 0, 1, 2, …. За ответ принять приближение, для которого выполняется условие , где e = 0, 0001.

12. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

13. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

14. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

15. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

16. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

17. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

18. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

19. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

20. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

21. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

22. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

23. Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:

Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из:

1. Названия лабораторной работы.

2. Цели и содержания лабораторной работы.

3. Ответов на контрольные вопросы лабораторной работы.

4. Формулировки индивидуальных заданий и порядка их выполнения.

Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.

Вопросы для защиты работы

1. Что представляет собой функция в С++? Что нужно для ее использования?

2. Приведите пример заголовка функции.

3. Что включает в себя определение функции?

4. В чем отличие функции от других программных объектов?

5. Каким образом происходит вызов функции?

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

7. Каков механизм передачи параметров в функцию?

8. Способы передачи входных данных.

9. Что представляет собой средство C++, называемое значениями параметров по умолчанию?

10. Каким образом происходит передача в функцию имени функции?

11. Каким образом происходит передача одномерных массивов в функцию?

12. Каким образом происходит передача строк в функцию?

13. Каким образом происходит передача двумерных массивов в функцию?

14. Каким образом происходит передача структур в функцию?

15. Какая функция называется рекурсивной? Преимущества и недостатки рекурсии.

16. Что называется перегрузкой функций? Перечислите правила описания перегруженных функций.

17. Область применения шаблонов.

18. Что такое инстанцирование? Способы инстанцирования шаблона.

 

Пример выполнения лабораторной работы №7:

 

1. Индивидуальное задание №1:

1.1. Постановка задачи:

Выполнить задание, оформив каждый пункт в виде функ­ции. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

Задача: построить резуль­тат сглаживания заданной вещественной матрицы размером 10 на 10. В сглаженной матрице найти сумму модулей элементов, расположенных выше глав­ной диагонали. Ввод и вовод данных в программе осуществить с помощью файла.

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

1.2. UML-диаграмма:

1.3. Листинг программы:

// Лабораторная работа №7

// Индивидуальное задание №1

 

#include < iostream>

#include < fstream>

#include < iomanip>

using namespace std;

 

int sort_array(int ncol, int nrow);

 

int sort_array(int ncol, int nrow)

{

ifstream fin(" input.txt", ios:: in);

if (! fin)

{

cout < < " Can't find input.txt" < < endl;

return 1;

}

 

ofstream fout(" output.txt");

if (! fout)

{

cout < < " Write falure: check permission" < < endl;

return 1;

}

 

int k, l, k1, l1, counter, i, j;

double sum, sumdiag = 0;

double a[nrow][ncol];

cout < < " Чтение данных из файла..." < < endl;

for(i = 0; i < nrow; i++)

for(j = 0; j < ncol; j++)

fin > > a[i][j];

 

cout < < " Обработка данных..." < < endl;

counter = 0; sum = 0; l = 0; l1 = 0;

double m[nrow][ncol];

 

//calculate neighbour' sum & sum diagonalies

for(i = 0; i < nrow; i++)

for(j = 0; j < ncol; j++)

{

k = i -1;

k1 = i + 1;

if (k< 0) k++;

if (k1 > nco l- 1) k1--;

if ((j < = ncol - 1)& & (j > = ncol - i)) sumdiag = sumdiag+a[i][j];

for(k; k < = k1; k++)

{

l = j - 1;

l1 = j + 1;

if (l < 0) l++;

if (l1 > ncol - 1) l1--;

for(l; l < = l1; l++)

if ((k == i) & & (l == j)) continue;

else

{

sum = sum + a[k][l];

counter++;

}

}

m[i][j] = (float) sum/counter;

sum = 0;

counter = 0;

}

for(i = 0; i < nrow; i++)

{

for(j = 0; j < ncol; j++)

fout < < setw(5) < < left < < setprecision(3) < < m[i][j] < < " " < < endl;

}

fout < < endl;

fout < < " Сумма эл-ов ниже главной диагонали: " < < setw(5) < < setprecision(9) < < sumdiag < < endl;

return 0;

}

 

int main()

{

const int nrow = 10;

const int ncol = 10;

 

if (! sort_array(ncol, nrow))

{

cout< < " Запись результатов обработки в файл..." < < endl;

cout< < " Обработка успешно закончена! " < < endl;

return 0;

}

else

{

cout< < " Ошибка обработки данных! " < < endl;

return 1;

}

}

1.4. Результаты работы программы:

Рисунок 7.1 – Файл для входных данных

Рисунок 7.2 – Файл для выходных данных

Рисунок 7.3 – Вывод программы на экран

2. Индивидуальное задание №2:

2.1. Постановка задачи:

Выполнить задания согласно варианта индивидуального задания №1 лабораторной работы №7, оформив в виде функций законченные последовательности действий. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

2.2. UML-диаграмма:

2.3. Листинг программы:

// Лабораторная работа №7

// Индивидуальное задание №2

 

#include < iostream.h>

#include < fstream>

#include < string.h>

 

using namespace std;

int readfile(string fileName)

{

ifstream fin(fileName.c_str(), ios:: in);

if (! fin)

{

cout < < " Ошибка открытия файла" < < endl;

return 1;

}

int nword;

 

cout < < " Введите искомое число слов в предложении: ";

cin > > nword;

 

fin.seekg(0, ios:: end);

int len = fin.tellg();

char *buf = new char [len + 1];

fin.seekg(0, ios:: beg);

fin.read(buf, len);

buf[len] = '\0';

int l_beg = 0, i = 0, n = 0, j = 0;

bool exist;

exist = false;

while (buf[i])

{

if (buf[i] == ' ') n++;

if (buf[i] == '.')

{

n++;

if (n == nword)

{

for(j = l_beg; j < = i; j++)

cout < < buf[j];

exist = true;

cout < < endl;

}

l_beg = i + 2;

i = i + 2;

n = 0;

}

i++;

}

if (! exist)

cout < < " Таких предложений не найдено" < < endl;

fin.close();

return 0;

}

 

int main()

{

setlocale(LC_ALL, " Russian");

cout < < " \n"

< < " \tЛабораторная работа № 7\n"

< < " \n"

< < " ------------------------------------------\n"

< < " Задание: Считать текст из файла. Вывести на экран только предложения, \n"

< < " \tсостоящие из заданного количества слов\n"

< < " -----------------------------------------\n";

 

string str;

cout < < " Какой файл открыть? ";

cin > > str;

readfile(str);

return 0;

}

2.4. Результаты работы программы:

Рисунок 7.4 – Файл для входных данных

 

 

Рисунок 7.5 – Вывод программы на экран

3. Индивидуальное задание №3:

3.1. Постановка задачи:

Выполнить задания согласно варианта индивидуального задания №1 лабораторной работы №6, оформив каждый пункт задания в виде шаблона функции. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

3.2. Листинг программы:

// Лабораторная работа №7

// Индивидуальное задание №3

 

#include < iostream>

#include < fstream>

#include < iomanip>

using namespace std;

 

template < class T> T sort_array(T ncol, T nrow)

{

ifstream fin(" input.txt", ios:: in);

if (! fin)

{

cout < < " Can't find input.txt" < < endl;

return 1;

}

ofstream fout(" output.txt");

if (! fout)

{

cout < < " Write falure: check permission" < < endl;

return 1;

}

 

int k, l, k1, l1, counter, i, j;

double sum, sumdiag = 0;

double a[nrow][ncol];

 

cout < < " Чтение данных из файла..." < < endl;

for(i = 0; i < nrow; i++)

for(j = 0; j < ncol; j++) fin > > a[i][j];

 

cout < < " Обработка данных..." < < endl;

 

counter = 0; sum = 0; l = 0; l1 = 0;

double m[nrow][ncol];

 

//calculate neighbour' sum & sum diagonalies

for(i = 0; i < nrow; i++)

for(j = 0; j < ncol; j++)

{

k = i - 1;

k1 = i + 1;

if (k< 0) k++;

if (k1 > ncol - 1) k1--;

if ((j < = ncol - 1)& & (j > = ncol - i))

sumdiag = sumdiag + a[i][j];

for(k; k < = k1; k++)

{

l = j - 1;

l1 = j + 1;

if (l < 0) l++;

if (l1 > ncol - 1) l1--;

for(l; l < = l1; l++)

if ((k == i)& & (l == j)) continue;

else

{

sum = sum + a[k][l];

counter++;

}

}

m[i][j] = (float) sum/counter;

sum = 0;

counter = 0;

}

 

for(i = 0; i < nrow; i++)

{

for(j = 0; j < ncol; j++)

fout < < setw(5) < < left < < setprecision(3)

< < m[i][j] < < " ";

fout < < endl;

}

fout < < endl;

fout < < " Сумма эл-ов ниже главной диагонали: "

< < setw(5) < < setprecision(9) < < sumdiag < < endl;

return 0;

}

 

int main()

{

const int nrow = 10;

const int ncol = 10;

 

sort_array(ncol, nrow);

cout < < " Запись результатов обработки в файл..."

< < endl;

cout < < " Обработка успешно закончена! " < < endl;

cout < < " Ошибка обработки данных! " < < endl;

return 0;

}

4. Индивидуальное задание №4:

4.1. Постановка задачи:

Дан вектор X из n вещественных чисел. Найти минимальный элемент вектора, используя вспомогательную рекурсивную функцию, находящую минимум среди последних элементов вектора X, начиная с n -гo.

4.2. UML-диаграмма:

4.3. UML-диаграмма для функции float sort_array(float array[], int size, int pos)

4.4. Листинг программы:

// Лабораторная работа №7

// Индивидуальное задание №4

 

#include < iostream>

#include < math.h>

 

using namespace std;

 

float sort_array(float array[], int size, int pos)

{

float min = array[pos];

pos++;

for(int i = pos; i < 7; i++)

{

if (array[i] < min) min = array[i];

sort_array(array, size, pos);

}

return min;

}

 

int main()

{

int size = 0;

cout < < " Введите количество элементов вектора X: ";

cin > > size;

 

float *array = new float [size];

for(int i = 0; i < size; i++)

{

cout < < " Введите " < < i< < " элемент вектора X: ";

cin > > array[i];

}

 

int pos = 0;

cout < < " С какого элемента начать сортировку? ";

cin > > pos;

 

cout < < endl;

cout < < " Ввод данных закончен...\n";

cout < < " Идет процесс сортировки...\n";

 

cout < < " Минимальный элемент вектора X: "

< < sort_array(array, size, pos) < < " \n";

return 0;

}

4.5. Результаты работы программы:

Лабораторная работа №8.
Строки и файлы в языке C++

 

Цель работы и содержание: закрепление знаний о строках и файлах, составление программ со строками и файлами.

 






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