Помощничек
Главная | Обратная связь


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

ПРОГРАММИРОВАНИЕ ДЛЯ ЭВМ

Министерство образования и науки

Российской федерации

 

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ

РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)»

 

Подлежит возврату

№ 0000

 

ПРОГРАММИРОВАНИЕ ДЛЯ ЭВМ

Методические указания

по выполнению лабораторных работ

для студентов, обучающихся по направлению 231300

 

(бакалавры)

Часть 2

 

МОСКВА 2012


 

Составитель: Л.П. Андреева

Редактор: В.В. Чердынцев

 

Методические указания содержат задания по лабораторным работам, примеры программ на языке С++, а также справочный материал по операциям языка и функциям стандартной библиотеки. Методические указания предназначены для студентов, обучающихся по направлению «Прикладная математика», изучающих курс «Программирование для ЭВМ».

 

Печатается по решению редакционно-издательского совета университета.

 

 

Рецензенты: А.В. Сетуха

Н.Я. Петрова

 

© МИРЭА, 2012

 

 


Оформление лабораторной работы

Для каждой лабораторной работы должен быть составлен отчет. Отчет должен включать следующие разделы:

1. название лабораторной работы;

2. постановка задачи для конкретного варианта;

3. тесты для программы в виде таблицы тестов;

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

Лабораторная работа № 1

Обработка символьной информации

 

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

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

Примеры правильной записи адресов электронной почты:

la2010@mail.ru, anton@cs.mcgill.ca, sedek.agro@mtu-shet.info,
vb-22@mail.ru

Варианты заданий приведены в табл. 1.

 

Таблица 1

Варианты заданий

Операция проверки электронного адреса
В имени пользователя могут быть только одиночные дефисы (-).Например, недопустим адрес: an--ton@cs mcgill.ca
Обязательность имени пользователя. Например, недопустим адрес: @mail.ru
В имени пользователя могут быть только следующие символы: буквы латинского алфавита, цифры, дефис (-), подчеркивание (_), точка (.), латинские прописные и строчные буквы, цифры. Например, недопустим адрес с пробелом: la 2010@mail.ru
В доменном имени могут быть только следующие символы: буквы латинского алфавита, цифры, дефис (-), подчеркивание (_), точка (.), латинские прописные и строчные буквы, цифры. Например, недопустим адрес с пробелом: anton@cs mcgill.ca
Имя пользователя может начинаться только на букву и заканчиваться только на букву или цифру. Например, недопустимы адреса: 2010anton@cs mcgill.ca, ant-@csmcgill.ca
В имени пользователя могут быть только одиночные точки
Домен не может начинаться с точки. Например, недопустимы адреса: p_pg@.m12.it.mirea.ru, p_pg@m12.it..mirea.ru
Дефис в доменном имени может быть только одиночным. Например, недопустим адрес:p_pg@m12.i--t.mirea.ru
В зонном (старшем) домене могут быть только буквы. Например, недопустим адрес sedek.agro@mtu-shet.inf1
Домен не может заканчиваться дефисом. Например, недопустим адрес: p_pg@m12-.it.mirea.ru
В адрес электронной почты символ @ должен входить только один раз. Например, недопустим адрес: pg@m12@.it.mirea.ru
Домен не может заканчиваться точкой. Например, недопустим адрес: p_pg@m12.it..mirea.ru
В имени пользователя могут быть только одиночные символы подчеркивания (_).Например, недопустим адрес: p__pg@m12.it.mirea.ru
Домен не может начинаться дефисом. Например, недопустим адрес: p_pg@m12.it.-mirea.ru
Обязательность доменного имени. Например, недопустим адрес: asd@

 

Пример программы

// Подсчет гласных латинского алфавита в слове.

# include <iostream.h>

#include <conio.h>

void main()

{

char s[21]; //строка без пробельных символов

char glas[]=”aeyouiAEYOUI”;

int i; //номер символа в слове

int j; //номер символа в массиве гласных

int, k; //счетчик гласных

cout<<”s ? ”;

cin>>s;

k=0;

//Проверка всех s[i] символов на принадлежность к гласным

i=0;

// Цикл по символам слова

while (s[i]!=’\0’) //можно =0

{

//Поиск вхождения s[i] в гласные

j=0;

while (glas[j]!=0 && glas[j]!=s[i])

j++;

//Анализ выхода из цикла

if (glas[j]!=’\0’) // выход из цикла до конца массива гласных

k++;

i++;

}

cout<<”k=”<<k;

getch();

}

 

Пример программы

// Удаление пробелов из текста

# include <iostream.h>

#include <conio.h>

void main()

{

char s[81]; //текст с пробелами

int i; //номер символа в тексте

int j; //количество символов в измененной строке

cout<<”s ? ”;

cin.getline(s,81); //ввод строки с пробелами

// Инициализация цикла

j=0;

i=0;

// Цикл по символам текста

while (s[i]!=’\0’)

if (s[i]==' ')

{

s[j]=s[i]; //перемещение символа в начало строки в j-позицию

j++;

}

s[j]=’\0’; //завершение строки

cout<<”s=”<<s;

getch();

}

Лабораторная работа № 2

ИСПОЛЬЗОВАНИЕ БИБЛИОТЕЧНЫХ ФУНКЦИЙ ДЛЯ ОБРАБОТКИ ТЕКСТА

 

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

Варианты заданий приведены в табл. 2. Основные библиотечные функции для работы со строками и символами приведены в табл. 3.

 

Таблица 2

Варианты заданий

Описание операции обработки текста
Вывести все слова, которые встречаются в тексте только один раз.
Найти все слова палиндромы, которые встречаются в тексте. Если таких слов нет, то вывести сообщение об этом.
Составить частотный словарь текста: для каждого из слов текста указать количество его вхождений в текст.
Заменить в тексте все слова - целые числа (числа заданы последовательностью цифр) на символ *.
Найти в тексте первое слово - целое число, состоящее из наибольшего количества цифр (числа заданы последовательностью цифр). Если слов-чисел в тексте нет, то вывести сообщение об этом.
Найти количество слов, которые являются записью четных чисел (числа заданы последовательностью цифр).
Подсчитать количество вхождений в текст заданного слова.
Удалить из текста все слова, заключенные в круглые скобки. Сами скобки также удалить.
Найти в тексте максимальное целое число-слово (числа заданы последовательностью цифр).
Вывести предложения текста, содержащие слова-палиндромы. Если таких предложений нет, то вывести сообщение об этом.
Найти среднее количество символов в слове текста.
Найти в тексте первое слово - целое число, состоящее из наименьшего количества цифр (числа заданы последовательностью цифр). Если слов-чисел в тексте нет, то вывести сообщение об этом.
Вывести те слова текста, в которых символы лексиграфически упорядочены. Если таких слов нет, то вывести сообщение об этом.
Вывести все слова, которые встречаются в тексте ровно два раза. Если таких слов нет, то вывести сообщение об этом.
Найти первое слово текста с наибольшим количеством вхождений данного символа.

 

Таблица 3

Функции для работы со строками и символами

Функция Описание функции Заголовочный файл
char* strcat(char *s1, char *s2) Добавляет строку s2 к строке s1 и возвращает s1 <string.h>
size_t strlen(char *s) Возвращает длину строки s <string.h>
char *strcpy (char *s1, char *s2) Копирует строку s1 в s2 и возвращает s1 <string.h>
char *strchr (char *s, int c) Возвращает указатель на первое вхождение символа c в строку s, если его нет, то возвращает 0 <string.h>
char*strrchr (char *s, int c) Возвращает указатель на первое вхождение символа c в строку s справа, если его нет, то возвращает 0 <string.h>
int strcmp (char *s1, char *s2) Сравнивает строки и возвращает отрицательное (если s1<s2), нулевое (если s1=s2) или положительное (если s1>s2) значение <string.h>
char *strstr (char *s1, char *s2) Возвращает указатель на символ в строке s1, с которого начинается первое вхождение строки s2, если s2 не входит в s1, то возвращает 0 <string.h>
char *strtok (char *s1, char *s2) Возвращает очередную лексему из строки s1, отделенную любым из символов-ограничителей строки s2 <string.h>
int atoi (const char *s) Преобразует строку s в целое число, если преобразование невозможно, то возвращает 0 <stdlib.h>
char *itoa (int x, char *s, int r) Преобразует число х в строку s, представляющую собой число х с основанием r. Возвращает указатель на строку s <stdlib.h>
int isalnum (int c) Возвращает значение не равное 0, если символ c является буквой (A-Z, a-z) или цифрой, иначе возвращает 0 <ctype.h>
int isalpha (int c) Возвращает значение не равное 0, если символ c является буквой (A-Z, a-z), иначе возвращает 0 <ctype.h>
int isdigit (int c) Возвращает значение не равное 0, если символ c является цифрой, иначе возвращает 0 <ctype.h>

 

Пример программы

Дан текст, слова в котором разделены знаками: пробелом, точкой, запятой, точкой с запятой, тире, двоеточием, вопросительным знаком и восклицательным знаком. Вывести все слова текста через один пробел.

#include <conio.h>

#include <iostream.h>

#include <string.h>

int main()

{

char raz[]=" ,.!?:;-"; //массив разделителей

char s[81]; //исходный текст

char *slovo; //указатель на очередное слово

cout<<”s: “;

cin.getline(s,81); //ввод текста с пробелами

slovo=strtok(s,raz); // выделение первой лексемы

while(slovo!=0)

{

cout<<slovo<<" ";

slovo=strtok(0,raz); // выделение следующих лексем

}

getch();

}

Лабораторная работа № 3

МОДУЛЬНОЕ ПРОГРАММИРОВАНИе

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

Разработать программу, выполняющую операции над целочисленным динамическим массивом из n элементов (n<=100):

· ввод массива;

· вывод массива на экран;

· дополнительные операции.

Алгоритмы выполнения операций оформить в виде функций. В алгоритмах выполнения операций добавления и удаления элементов предусмотреть проверку возможности выполнения операций. Программа должна выводить текстовое меню для тестирования операций. Варианты заданий приведены в табл. 4.

 

Таблица 4

Варианты заданий

Дополнительные операции
Операция 1 Операция 2
Сумма положительных чисел массива Добавление после первого максимального числа числа х
Произведение отрицательных чисел массива Удаление всех максимальных чисел
Количество четных чисел массива Добавление перед первым максимальным числом числа х
Среднее арифметическое чисел массива Удаление числа перед последним максимальным числом
Количество чисел массива, принадлежащих диапазону [x,y] Добавление после последнего максимального числа числа х
Произведение чисел массива с нечетными индексами Удаление числа после последнего максимального числа
Перестановка чисел массива в обратном порядке Добавление перед последним максимальным числом числа х
Поиск номера последнего отрицательного элемента Удаление числа перед каждым максимальным числом
Поиск максимального элемента Добавление после первого отрицательного числа числа х
Замена отрицательных элементов массива на их модули Добавление перед каждым максимальным числом числа х
Поиск номера первого максимального элемента Добавление перед каждым нулевым числом числа х
Поиск номера последнего минимального элемента Добавление после каждого отрицательного числа числа х
Количество чисел массива отличных от последнего элемента массива Удаление числа перед первым максимальным числом
Сумма элементов массива с четными индексами Добавление после каждого максимального числа числа х
Сумма четных чисел Удаление числа после первого максимального числа

 

Методические указания

1. На первом этапе разработки программы включите в исходный код:

· директивы препроцессора #include;

· прототипы разрабатываемых функций;

· функцию main, выводящую текстовое меню и вызывающую функции, выполняющие операции над массивом;

· заглушки разрабатываемых функций.

2. Протестируйте и отладьте функцию main.

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

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

Пример программы

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

#include <iostream.h>

#include <conio.h>

#include <string.h>

string rus(char s[]); //перевод кодировки Windows в Dos

void input(int a[], int n); //ввод массива

void output(int a[], int n); //вывод массива

int sum(int a[], int n); //вычисление суммы элементов

int mult(int a[], int n); //вычисление произведения элементов

void main( )

{

int p; //номер пункта меню, вводимый пользователем

int n; //количество элементов

int a[100];

cout<< rus(“Введите количество элементов<100 ”;

cin>>n;

do

{

// Вывод на экран меню для выбора операций

clrscr();

cout<< rus("1. Ввод массива")<<endl;

cout<< rus("2. Вывод массива")<<endl;

cout<< rus("3. Сумма элементов")<<endl;

cout<< rus("4. Произведение элементов")<<endl;

cout<< rus("5. Завершение работы")<<endl<<endl;

cout<<rus("Укажите пункт меню: ");

cin>>p;

switch (p) //выполнение выбранной операции

{

case 1: cout<<rus("Введите массив " );

input(a,n);

break;

case 2: cout<<rus("Массив: " )<<endl;

output(a,n);

break;

case 3: cout<<rus("Сумма= " )<<sum(a,n) <<endl;

break;

case 4: cout<<rus("Произведение= " )<<mult(a,n) <<endl;

break;

case 5: return;

}

getch();

}while (true);

}

//Заглушки функций

void input(int a[], int n)

{

cout<<”input: ”<<endl;

 

}

void output(int a[], int n)

{cout<<”output” <<endl;}

int sum(int a[], int n)

{return 1;}

int mult(int a[], int n)

{return 1;}

// Перевод кодировки Windows в Dos

string rus(char s[])

{

string t;

t=s;

int i=0;

while (s[i]!=0)

{

if(s[i]>='А'&& s[i]<='п' ) t[i]-=64;

if(s[i]>='р'&& s[i]<='я' ) t[i]-=16;

if(s[i]=='Ё' ) t[i]=240;

if(s[i]=='ё' ) t[i]=241;

i++;

}

return t;

}

Лабораторная работа № 4

МЕТОДЫ ПРИБЛИЖЕННОГО ВЫЧИСЛЕНИЯ ИНТЕГРАЛОВ

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

Разработать функцию вычисления определенного интеграла с заданной точностью. Использовать разработанную функцию при вычислении заданного интеграла. Вычисление подынтегральной функции оформить в виде функции C++. Результаты вычисления интеграла для заданных значений параметра представить в виде таблицы. Для вариантов 1, 2, 3, 5, 7, 12, 13, 14 включить в таблицу с результатами дополнительный столбец с количеством элементарных отрезков, используемом для получения значений интеграла с заданной точностью. Варианты заданий приведены в табл. 5.

Таблица 5

Варианты заданий

Метод интегрирования Подынтегральная функция Пределы интегрирования (a и b) Примечание
Метод правых прямоугольников xe-x a=0, b - параметр b=0.5, 1.0, 1.5, 2.0
Метод Симпсона xe-x a=0, b - параметр b=0.5, 1.0, 1.5, 2.0
Метод трапеций xke-x где k – параметр функции a=0, b=1.5   k=0, 1, 2, 3, 4
Метод Веддля cos(πx2/2) a=0, b - параметр b=0.5, 1.0, 1.5, 2.0
Метод левых прямоугольников x2e-tx, где t – параметр функции a=-1, b=1 t=0.5, 1.0, 1.5, 2.0 t=0.5, 1.0, 1.5, 2.0
Метод Ньютона-Котеса (m=3) xk/(ex) , где k – параметр функции a=0, b=1 k=1, 2, 3, 4
Метод средних e-x/(x2) a=0, b - параметр b=0.5, 1.0, 1.5, 2.0
Метод Ньютона-Котеса (m=4) sin(πx2/2) a=0, b - параметр b=0.5, 1.0, 1.5, 2.0
Метод Бодэ e-x/(xk), где k – параметр функции a=1, b=5   k=1, 2, 3, 4
Метод Ньютона-Котеса (m=5) (1-k*sin2(x))1/2, где k – параметр функции a=0, b=π/2   k=0.2, 0.3, 0.4, 0.5
Метод Ньютона-Котеса (m=6) (1-k*sin2(x))1/2, где k – параметр функции a=0, b=π/2   k=0.1, 0.2, 0.3, 0.4
Метод средних x*e-x a=0, b - параметр b=1, 2,…,10
Метод Симпсона x2e-0.5x a=0, b - параметр b=1, 2,…,10
Метод правых прямоугольников sin(πx2/2) a=0, b - параметр b=0.5, 1.0, 1.5, 2.0
Метод Ньютона-Котеса (m=4) xk/(ex) , где k – параметр функции a=0, b=1 k=1, 2, 3, 4

Методические указания

1. Формулы численного интегрирования

Метод левых прямоугольников

где n – количество элементарных отрезков, на которые разделяется отрезок интегрирования [a,b], h=(b-a)/n, х1=a, хii-1+h, i=2, 3, …,n

Метод правых прямоугольников

где n – количество элементарных отрезков, на которые разделяется отрезок интегрирования [a,b], h=(b-a)/n, х1=a+h, хii-1+h, i=2, 3, …,n

Метод средних

где n – количество элементарных отрезков, на которые разделяется отрезок интегрирования [a,b], h=(b-a)/n, х1=a+h/2, хii-1+h, i=2, 3, …,n

Метод трапеций

где n – количество элементарных отрезков, на которые разделяется отрезок интегрирования [a,b], h=(b-a)/n, х1=a+h, хii-1+h, i=1, 3, …,n-1

Метод Симпсона

где n (четное)– количество элементарных отрезков, на которые разделяется отрезок интегрирования [a,b], h=(b-a)/n

Метод Веддля

Метод базируется на применении к каждому из n элементарных отрезков длиной h=(b-a)/n формулы

где z=h/6, x1 – левая граница элементарного отрезка, х7 – правая граница элементарного отрезка, xi=xi-1+z, i=2, 3, 4, 5, 6, 7

Метод Ньютона-Котеса (для m=3)

Метод базируется на применении к каждому из n элементарных отрезков длиной h=(b-a)/n формулы

где z=h/3, x1 – левая граница элементарного отрезка, х4 – правая граница элементарного отрезка, xi=xi-1+z, i=2, 3, 4

Метод Ньютона-Котеса (для m=4)

Метод базируется на применении к каждому из n элементарных отрезков длиной h=(b-a)/n формулы

где z=h/4, x1 – левая граница элементарного отрезка, х5 – правая граница элементарного отрезка, xi=xi-1+z, i=2, 3, 4, 5

Метод Ньютона-Котеса (для m=5)

Метод базируется на применении к каждому из n элементарных отрезков длиной h=(b-a)/n формулы

где z=h/5, x1 – левая граница элементарного отрезка, х6 – правая граница элементарного отрезка, xi=xi-1+z, i=2, 3, 4, 5, 6

Метод Ньютона-Котеса (для m=6)

Метод базируется на применении к каждому из n элементарных отрезков длиной h=(b-a)/n формулы

где z=h/6, x1 – левая граница элементарного отрезка, х7 – правая граница элементарного отрезка, xi=xi-1+z, i=2, 3, 4, 5, 6, 7

Метод Бодэ

Метод базируется на применении к каждому из n элементарных отрезков длиной h=(b-a)/n формулы

где z=h/4, x1 – левая граница элементарного отрезка, х5 – правая граница элементарного отрезка, xi=xi-1+z, i=2, 3, 4, 5

2. Для достижения заданной точности вычисления интеграла использовать алгоритм последовательного удвоения количества элементарных отрезков. Алгоритм состоит в вычислении приближения выбранным методом с шагом h, а затем с шагом h/2, и сравнением разности двух приближений с заданной точностью вычисления интеграла.

3. Для отладки алгоритма использовать простую подынтегральную функцию, для которой интеграл можно вычислить аналитически, например, f(x)=x или f(x)=x2. После отладки эту функцию заменить на функцию Вашего варианта.

Пример программы

Программа вычисления корня нелинейного уравнения f(x)=0 на интервале (a, b), на котором функция f(x) меняет знак. В программе используется функция

float metod (float a, float b, float eps, float(* f)(float x))

Функция вычисляет корень уравнения с точностью eps методом деления отрезка пополам. Программа использует функцию metod для примера

f(x)=x3-2x-5

Эта функция имеет корень, который находится между 2 и 3.

#include <iostream.h>

#include <conio.h>

float metod (float a, float b, float eps, float(* f)(float x)); //функция вычисления корня

float f(float x); //функция задает нелинейное уравнение

void main( )

{

float a=2, b=3; //левая и правая границы корня

float eps; //точность вычисления корня

cout<<”eps? “;

cin>>eps;

cout<<metod(a,b,eps,f);

getch();

}

float metod (float a, float b, float eps, float(* f)(float x))

{

float x; //приближение корня

float u,v;//значение функции f(x) на левой и правой границах интервала

u=f(a);

do

{

x=(a+b)/2;

v=f(x);

if (u*v<0) //функция имеет разные знаки на интервале [a,x]

b=x; //выбирается левый интервал [a, x] для поиска корня

else //выбирается правый интервал [x, b] для поиска корня

{a=x; u=v;}

}

while (b-a>eps);

return x;

}

float f(float x)

{

return x*x*x-2*x-5;

}

Лабораторная работа № 5

Перегрузка функций

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

Разработать программу, которая вводит матрицу из n строк и m столбцов (n<=100, m<=50) и упорядочивает элементы матрицы. Правило упорядочивания определяется вариантом. Программа должна предоставлять пользователю выбор типа элементов матрицы: целого или строкового. Операции ввода, вывода и упорядочивания элементов матрицы должны быть реализованы в виде перегруженных функций. Варианты заданий приведены в табл. 6.

 

Таблица 6

Варианты заданий

Правило упорядочивания элементов матрицы
Упорядочить каждую строку по возрастанию элементов
Упорядочить строки по возрастанию последних элементов строк
Разместить все элементы с заданным значением в правой верхней области матрицы (заполняя ими матрицу по столбцам сверху вниз), а остальные – в левой нижней области
Упорядочить столбцы по убыванию первых элементов столбцов
Упорядочить все элементы матрицы таким образом, чтобы при чтении матрицы по строкам ее элементы образовывали отсортированный по убыванию массив
Переместить в каждой строке все элементы с заданным значением в начало строки, а остальные – в конец
Разместить все элементы с заданным значением в правой нижней области матрицы (заполняя ими матрицу по строкам справа налево), а остальные – в левой нижней области
Упорядочить все элементы матрицы таким образом, чтобы при чтении матрицы по строкам ее элементы образовывали отсортированный по возрастанию массив
Разместить все элементы с заданным значением в левой верхней области матрицы (заполняя ими матрицу по строкам слева направо), а остальные – в правой нижней области
Упорядочить все элементы матрицы таким образом, чтобы при чтении матрицы по столбцам ее элементы образовывали отсортированный по возрастанию массив
Упорядочить каждый столбец по возрастанию элементов
Разместить все элементы с заданным значением в левой верхней области матрицы (заполняя ими матрицу по столбцам сверху вниз), а остальные – в правой нижней области
Упорядочить столбцы по возрастанию последних элементов столбцов
Упорядочить столбцы по убыванию последних элементов столбцов
Упорядочить столбцы по возрастанию последних элементов столбцов

 

Лабораторная работа № 6

 

шаблонЫ функций

 

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

Создать шаблоны функций, выполняющих упорядочивание, ввод и вывод матрицы. Протестировать шаблоны для матрицы с элементами различных типов: int, float и char. Варианты заданий приведены в лабораторной работе № 5.

 

Пример программы

// Шаблон функции перестановки значений двух переменных.

template <class t>

void change (t a, t b)

{

t c;

c=a; a=b; b=c;

}

 

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

 

рекурсивные функции

 

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

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

 

Таблица 7

Варианты заданий

Задача рекурсивной функции
Вычисление факториала
Возведение вещественного числа в целую степень
Суммирование элементов массива из n целых чисел
Проверка является ли строка палиндромом
Поиск минимального значения массива из n целых чисел
Вывод на экран строки в обратном порядке
Последовательный поиск в массиве из n целых чисел
Бинарный поиск в массиве из n целых чисел
Вычисление произведения элементов массива из n целых чисел
Вычисление суммы ряда
Вывод массива из n целых чисел в обратном порядке
Вывод массива из n целых чисел в прямом порядке
Поиск максимального значения массива из n целых чисел
Подсчет значений элементов массива из n целых чисел равных заданному числу х
Вычисление номера первого отрицательного числа в массиве из n целых чисел

 

Пример программы вычисления n-го числа Фибоначчи

Последовательность чисел Фибоначчи: 0, 1, 1, 2, 3, 5, 8, 13, 21,…

начинается с 0 и 1, а каждое последующее число является суммой двух предыдущих чисел. Числа этой последовательности обозначаются через Fn и формально определяются следующим образом: F0=0, F1=1, Fn=Fn-1+Fn-2, n>=2

#include <iostream.h>

#include <conio.h>

int fib(int n);//рекурсивная функция вычисления числа Фибоначчи

void main()

{

int n;

cout<<"n? ";

cin>>n;

cout<<"fib="<<fib(n);

getch();

}

// Рекурсивная функция вычисления n-го числа Фибоначчи

int fib(int n)

{

if (n==0 || n==1) // условие выхода из рекурсии

return n;

return fib(n-1)+fib(n-2); // рекурсивный вызов функции

}

 

Лабораторная работа № 8

 

ФАЙЛЫ

 

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

Разработать программу, выполняющую следующие функции:

· ввод данных об n объектах из текстового файла в массив структур (0<n<=50);

· сортировку массива структур по возрастанию значений одного из полей структуры;

· вывод данных об объектах на экран в упорядоченном по возрастанию виде;

· поиск объекта по значению одного из полей;

· запись упорядоченных данных об объектах в двоичный файл;

· чтение двоичного файла.

Алгоритмы чтения файла, сортировки, поиска, вывода данных об объектах и записи данных в файл оформить в виде функций. Для поиска элемента в упорядоченном массиве использовать бинарный поиск. Текстовый файл создать с помощью любого текстового редактора. Варианты заданий приведены в табл. 8. В табл. 9 содержатся описания функций классов библиотеки fstream для работы с файлами, в табл. 10 – список режимов открытия файлов.

 

Таблица 8

Варианты заданий

Объект Поле, по которому выполняется упорядочивание и поиск
Автобусный маршрут (номер рейса, название конечного населенного пункта, время отправления, цена билета) Номер рейса
Туристический маршрут (номер маршрута, конечный пункт, продолжительность, дата начала) Номер маршрута
Записная книжка (телефон, ФИО, дата рождения) ФИО
Успеваемость (шифр студента, ФИО, студенческая группа, средний балл) Шифр студента
Заказ (номер заказа, ФИО заказчика, товар в заказе, количество товара, сумма заказа) Номер заказа
Экзамен (шифр студента, дисциплина, семестр, оценка) Шифр студента
Работник (табельный номер, должность, стаж, зарплата) Табельный номер
Покупка (номер чека, общая сумма покупки, дата и время покупки) Номер чека
Выпускник (ФИО выпускника, ВУЗ, специальность, год окончания) ФИО выпускника
Книга (учетный номер книги, шифр, авторы, название книги, год издания) Учетный номер
Банковский счет (номер счета, ФИО, дата открытия, сумма) Номер счета
Анкета (ИНН, ФИО, пол, дата рождения) ИНН
Видеокассета (код видеокассеты, название фильма, режиссер, год выпуска) Код видеокассеты
Нагрузка преподавателя (табельный номер, ФИО, должность, количество часов) Табельный номер
Поставка товара (номер поставки, товар, поставщик, количество, дата поставки) Номер поставки

 

Таблица 9

Функции классов-потоков ввода-вывода

Функция Описание функции
void open(«внешнее имя файла»[, режим]) Открытие файла
ostream& write(const signed char*, int n) Вывод в выходной поток nбайтов из области памяти, адрес которой задает первый параметр
istream& read (const signed char*, int n) Ввод из входного потока nбайтов в область памяти, адрес которой задает первый параметр
int eof( ) Тестирование конца файла (1- конец файла)
void close( ) Закрытие потока (файла)
ostream& seekp (смещение, точка отсчета) Смещение указателя файла на заданное число байтов от точки отсчета (0-начало, 1-текщая позиция, 2-конец потока) для записи в файл
istream& seekg (смещение, точка отсчета)   Смещение указателя на заданное число байтов от точки отсчета (0-начало, 1-текщая позиция, 2-конец потока) для чтения из файла
long tellg( ) Возвращение текущей позиции указателя файла при чтении файла
long tellp( ) Возвращение текущей позиции указателя при записи в файл

 

Таблица 10

Режимы открытия файла

Значение параметра «режим» Описание параметра
ios::in Задает режим открытия файла для ввода
ios::out Задает режим открытия файла для вывода
ios::ate Задает режим открытия файла для добавления в конец файла
ios::app Задает режим открытия файла для добавления в конец файла (можно добавлять записи только в конец)
ios::trunc Удаляет содержимое файла
ios::binary Задает режим открытия файла в двоичном режиме

 

Пример программы

//Создание текстового файла с данными о работниках

#include <fstream.h>

#include <iostream.h>

struct worker //тип «Работник»

{

long number; //номер

char fam[25]; //фамилия

char name[15]; //имя

int salary; //зарплата

};

void output_file(char file_name[30]); //создание файла

void main( )

{

char file_name[30]; //имя файла

cout<<"file_name_file? ";

cin>>file_name;

output_file(file_name);

}

void output_file(char file_name[30])

{

worker r; //работник

ofstream f; //файловая переменная

f.open(name); //открытие текстового файла

// Запись в файл данных о 3 работниках

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

{

cout<<"number? "; cin>>r.nom;

cout<<”fam? “; cin>>r.fam;

cout<<”name? “; cin>>r.name;

cout<<”salary? “; cin>>r.salary;

f<<r.number<<" "<<r.fam<<" "<<r.name<<" "<<r.salary<<endl;

}

f.close( ); //закрытие файла

}

 

 

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

 

1. Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование. Практикум. – СПб.: Питер, 2002. – 240 с.

2. Подбельский В.В. Язык С++; Учебное пособие. М.: Финансы и статистика, 1996. – 560 с.

3. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464 с.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.