Кафедра заочного обучения
Домашнее задание
«ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ»»
Вариант № 1
Выполнил:
Студент группы ИСТЗС-13
Голубев И.А.
Проверил:
Преподаватель доцент каф. ИТУС Исаева Г.Н.
Королев
Введение.
Целью выполнения домашних заданий (лабораторных работ) являются:
· расширение и углубление теоретических знаний по изучаемой дисциплине;
· получение дополнительных практических навыков по тематике домашних заданий (лабораторных работ);
· развитие творческих способностей и самостоятельности в ходе проведения исследований.
Тема №1 «Исследование информации различной структуры и обработка её средствами среды программирования Visual Studio с использованием ЯП С/С++»
Задача 1.
Размерности массивов следует задать именованными константами. Все необходимые данные должны передаваться подпрограммам в качестве параметров; все величины, используемые только внутри подпрограмм, должны быть описаны как локальные. Использование глобальных переменных в подпрограммах не допускается. Вывод результатов работы подпрограмм должен выполняться в главной программе
Дана целочисленная прямоугольная матрица. Определить:
1. Количество строк, не содержащих ни одного нулевого элемента (оформить в виде функции).
2. Максимальное из чисел, встречающихся в заданной матрице более одного раза (оформить в виде процедуры).
Анализ задачи 1.
Входные параметры и переменные:
1. константы n и m, которые задают размер массива;
2. переменная a[m][n], которая задает массив;
Вспомогательные параметры и переменные:
1. переменные i и j для индексов элементов.
2. str0 - переменная для получения результата выполнения функции определяющей количество строк, не содержащих ни одного нулевого элемента;
Функции и процедуры
1. функция вывод массива на экран монитора;
2. функции определяющей количество строк, не содержащих ни одного нулевого элемента;
3. процедура определяющая максимальное из чисел, встречающихся в заданной матрице более одного раза и выводящая это число на экран монитора;
Результаты вычисления:
Алгоритм решения задачи в программных кодах С/С++:
Листинг программы для задачи 1.
//
// ИСТЗС-13
// 04.10.2016 Titulov вариант 1
// Дана целочисленная прямоугольная матрица. Определить:
// 1. Количество строк, не содержащих ни одного нулевого элемента(оформить в виде функции).
// 2. Максимальное из чисел, встречающихся в заданной матрице более одного раза(оформить в
// виде процедуры).
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
using namespace std;
int printA(int m, int n, int a[5][5]);
int str_not_0(int m, int n, int a[5][5]);
void max2(int m, int n, int a[5][5]);
int main()
{
const int n = 5;
const int m = 5;
int i, j, a[m][n], str0;
str0 = 0;
setlocale(LC_ALL, "RUS");
// printf(" Введи элементы матрицы: \n");
// for (i = 0; i <= m - 1; i++)
// for (j = 0; j <= n - 1; j++)
// {
// printf("a(%d, %d) = ", i, j);
// scanf("%d", &a[i][j]);
// }
// заполнение матрицы для тестирования
a[0][0] = 0; a[0][1] = 3; a[0][2] = 1; a[0][3] = 1; a[0][4] = 1;
a[1][0] = 2; a[1][1] = 6; a[1][2] = 2; a[1][3] = 2; a[1][4] = 2;
a[2][0] = 1; a[2][1] = 5; a[2][2] = 3; a[2][3] = 3; a[2][4] = 3;
a[3][0] = 1; a[3][1] = 0; a[3][2] = 0; a[3][3] = 4; a[3][4] = 4;
a[4][0] = 2; a[4][1] = 3; a[4][2] = 4; a[4][3] = 4; a[4][4] = 5;
//// заполнение матрицы для тестирования
//a[0][0] = 0; a[0][1] = 6; a[0][2] = 11; a[0][3] = 16; a[0][4] = 31;
//a[1][0] = 2; a[1][1] = 7; a[1][2] = 12; a[1][3] = 17; a[1][4] = 32;
//a[2][0] = 3; a[2][1] = 8; a[2][2] = 13; a[2][3] = 18; a[2][4] = 33;
//a[3][0] = 4; a[3][1] = 9; a[3][2] = 14; a[3][3] = 19; a[3][4] = 34;
//a[4][0] = 5; a[4][1] = 10; a[4][2] = 15; a[4][3] = 44; a[4][4] = 35;
cout << "Введена матрица: \n";
printA(m, n, a);
str0 = str_not_0(m, n, a);
cout << "строк, не содержащих ни одного нулевого элемента: " << str0 << "\n";
max2(m, n, a);
system("pause");
return 0;
}
int printA(int m, int n, int a[5][5])
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
int str_not_0(int m, int n, int a[5][5])
{
int i, j, x, y;
y = 0;
for (i = 0; i < m; i++)
{
x = 0;
for (j = 0; j < n; j++)
if (a[i][j] == 0) x++;
if (x == 0) y++;
}
return y;
}
void max2(int m, int n, int a[5][5])
{
int i,j,f,k,t, t1 = 0, r = 0, t2;
double kof;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
t2 = a[i][j];
a[i][j] = 0;
for (int k = 0; k < m; k++)
{
for (int f = 0; f < n; f++)
{
if (t2 == a[k][f])
{
t = a[k][f];
}
else
r++;
}
if (t1 > t) t = t1;
}
t1 = t;
a[i][j] = t2;
}
}
kof = pow((double)m, 4);
if (r == kof-1)
cout << "Однинаковых элементов нет!\n";
else
cout << "Максимальное из встречающихся более 1 раза: " << t << "\n";
return;
}
Тема №2 «Решение практических задач методом ООП».
Задача 2.Поиск в массиве структур
В текстовом файле хранится база отдела кадров предприятия. На предприятии 100 сотрудников. Каждая строка файла содержит запись об одном сотруднике. Формат записи: фамилия и инициалы (30 позиций, фамилия должна начинаться с первой позиции), год рождения (5 позиций), оклад (10 позиций). Написать программу, которая по заданной фамилии выводит на экран сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников.
Входные параметры и переменные:
1. filename файл – d котором хранится база отдела кадров предприятия;
Вспомогательные параметры и переменные:
1. maxn_record – максимальное количество записей в файле;
2. man – класс содержащий переменные:
· pName - фамилия и инициалы;
· birth_year - год рождения;
· pay – оклад;
3. Man массив записей класса man размером maxn_record;
4. Name – переменная для ввода фамилии, используется при поиске;
Результаты вычисления:
Алгоритм решения задачи в программных кодах С/С++:
Листинг программы для задачи 2.
//////////////////////////////////////////////////////////////
// Проект Taskl_l
//////////////////////////////////////////////////////////////
//Man.h
//#include "CyrlOS.h" // for Visual C++ 6.0
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
const int l_name = 30;
const int l_year = 5;
const int l_pay = 10;
const int l_buf = l_name + l_year + l_pay;
class Man
{
public:
Man(int IName = 30);
~Man();
bool CompareName(const char*) const;
int GetBlrthYear() const { return birth_year; }
float GetPay() const { return pay; }
char* GetName() const { return pName; }
void Print() const;
void SetBirthYear(const char*);
void SetName(const char*);
void SetPay(const char*);
private:
char* pName;
int birth_year;
float pay;
};
//////////////////////////////////////////////////////////////
// man.cpp:
//
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include "Man.h"
using namespace std;
Man::Man(int lName) {
cout << "Constructor is working" << "\n";
pName = new char[lName + 1];
}
Man::~Man() {
cout << "Destructor is working" << "\n";
delete[] pName;
}
void Man::SetName(const char* fromBuf)
{
// strncpy(pName,fromBuf,l_name);
strncpy_s(pName,l_name, fromBuf, _TRUNCATE);
pName[l_name] = 0;
}
void Man::SetBirthYear(const char* fromBuf) {
birth_year = atoi(fromBuf + l_name);
}
void Man::SetPay(const char* fromBuf) {
pay = atof(fromBuf + l_name + l_year);
}
bool Man::CompareName(const char* name) const
{
// cout << ">" << pName << "<>" << name << "<\n";
if ((strstr(pName,name)) && (pName[strlen(name)] == ' '))
return true;
else
return false;
}
void Man::Print() const {
cout << pName << birth_year << ' ' << pay << "\n";
// cout <<">"<< pName <<"<"<< birth_year << ' ' << pay << "\n";
}
//////////////////////////////////
// main.cpp
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#include "Man.h"
using namespace std;
const char filename[] = "E:\\web_c\\man\\Debug\\dbase.txt";
int main()
{
const int maxn_record = 10;
Man man[maxn_record];
char buf[l_buf + 1];
char name[l_name + 1];
setlocale(LC_ALL, "RUS");
ifstream fin(filename);
if(!fin)
{
cout << "\nОшибка открытия файла " << filename << "\n";
system("pause");
return 1;
}
int i = 0;
while (fin.getline(buf,l_buf))
{
if(i >= maxn_record)
{
cout << "\nСлишком длинный файл";
system("pause");
return 1;
}
man[i].SetName(buf);
man[i].SetBirthYear(buf);
man[i].SetPay(buf);
i++;
}
int n_record = i, n_man = 0;
float mean_pay = 0;
while (true)
{
cout << "Введите фамилию или слово end или all: ";
cin >> name;
// cout << "\n name: "<< name << "\n";
if (0 == strcmp(name, "end")) break;
if (0 == strcmp(name, "all"))
{
cout << "\n";
for (i = 0; i < n_record; ++i)
man[i].Print();
//break;
}
else
{
bool not_found = true;
for (i = 0; i < n_record; ++i)
{
if (man[i].CompareName(name))
{
man[i].Print();
n_man++; mean_pay += man[i].GetPay();
not_found = false;
break;
}
}
if (not_found) cout << "\nНет сотрудника: " << name << "\n";
}
}
if (n_man) cout << "\nСредний оклад просмотренных: " << mean_pay / n_man << "\n";
system("pause");
return 0;
}
Заключение.
В ходе выполнения домашних заданий (лабораторных работ) я
· расширил и углубил теоретические знаний по ООП;
· получил дополнительные практические навыки по интегрируемой средой Microsoft VisualStudio2015;
· развил творческие способности и самостоятельность в ходе проведения исследований.
Литература.
1. Павловская Т.А. C/C++. Программирование на языке высокого уровня. — CПб.: Питер, 2001-2010. — 461 с.
2. Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. — СПб: ПИТЕР, 2002-2007. — 239 с.
3. Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование: Практикум. — СПб: ПИТЕР, 2004-2007. — 265 с.
4. Павловская Т.А., Щупак Ю.А. С/С++. Структурное и объектно-ориентированное программирование: Практикум. — СПб: ПИТЕР, 2010. — 352 с.
5. Учебник: Столяр С.Е., Владыкин А.А. Информатика. Представление данных и алгоритмы. — СПб.: Бином, Невский диалект, 2007. — 382 с.
6. Голицына О.Л., Попов И. И. Программирование на языках высокого уровня: учебное пособие. – М: ФОРУМ, 2011.-496 с.: ил.
СОДЕРЖАНИЕ
Введение. 2
Тема №1 «Исследование информации различной структуры и обработка её средствами среды программирования Visual Studio с использованием ЯП С/С++». 2
Тема №2 «Решение практических задач методом ООП». 6
Заключение. 11
Литература. 12