bsuir.info
БГУИР: Дистанционное и заочное обучение
(файловый архив)
Вход (быстрый)
Регистрация
Категории каталога
Другое [157]
АВС [6]
КПиЯП [80]
ОАиП [305]
ОКТ [79]
СиСПО [8]
Форма входа
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Файловый архив
Файлы » ПОИТ » ОАиП

КОНТРОЛЬНАЯ РАБОТА № 2. Вариант 2
Подробности о скачивании 04.12.2011, 02:19
ЗАДАНИЕ № Доп-1.
В двухмерном целочисленном массиве (размеры массива N, M и значения его элементов вводить с клавиатуры) найти указанное значение.
Массив в памяти разместить динамически (с использованием операций new и delete), ввод исходных данных и вывод полученных результатов выполнить в основной функции, а решение задачи оформить в виде отдельной функции пользователя. Не использовать глобальных переменных. Найти произведение элементов, расположенных на главной диагонали.

Текст программы:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
int ProGlDiag(int, int**);
void main()
{
int n, m, i, j, **a, rez;

cout << "\t\tZadanie: Dop-1. Variant: 2" << endl;

cout << "(N=M)" <<endl;
cout << "Input N: ";
cin >> n;
cout << "Input M: ";
cin >> m;
while (n != m)
{
printf ("Nevernij razmer massiva\n\n");
cout << "Input N: ";
cin >> n;
cout << "Input M: ";
cin >> m;
}

a = new int*[n];

for(i=0; i<n; i++)
a[i] = new int[m];

cout << "\n\nInput A:" << endl;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
{
cout << "\ta[" << i+1 << "][" << j+1 << "]=";
cin >> a[i][j];
}
cout << "\n\nMatrix A:" << endl;

for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
cout << "\t" << a[i][j];
cout << endl;
}

rez = ProGlDiag(n, a);
cout << "\nProizvedenie elementov na glavnoj diagonali:" << endl;
cout << "\tRezultat = " << rez << endl;

delete []a; // Îñâîáîæäåíèå ïàìÿòè
cout << "\n\n Delete !" << endl;
cout << " Press any key ... " << endl;
getch();
}
//---------------------------------------------------------------------------

int ProGlDiag(int c, int**x)
{
int i, p;
p=1;
for (i=0; i<c; i++)
p*=x[i][i];
return p;
}

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


Задание № 3

Написать программу по созданию, добавлению (в начало, в конец), про-смотру (с начала, с конца) и решению поставленной в лаб. работе № 2 задачи для двунаправленных линейных списков.
Удалить из созданного списка элементы с четными числами.

Текст программы:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

struct Spis {
int index;
Spis *next, *prev;
} *start, *last, *t;

void Create_Spis(Spis**, Spis**, int);
void Add_Spis(int, Spis**, Spis**, int);
void View_Spis(int, Spis*);
void Del_All(Spis**);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i, in = StrToInt(Edit1->Text);

if(start != NULL){
ShowMessage("Освободите Память!");
return;
}
Create_Spis(&start, &last, in);
Memo1->Lines->Add("Начало = " + IntToStr(start -> index));
Edit1->SetFocus();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i, in = StrToInt(Edit1->Text), kod = RadioGroup1->ItemIndex;
String Str[2] = {"в начало ", "в конец "};
Add_Spis(kod, &start, &last, in);
if(kod == 0) t = start;
else t = last;
Memo1->Lines->Add("Добавили " + Str[kod] + IntToStr(t -> index));
Edit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(!start){
ShowMessage("Список Пуст!");
return;
}
if(RadioGroup1->ItemIndex == 0) {
t = start;
Form1->Memo1->Lines->Add("-- С начала --");
}
else {
t = last;
Form1->Memo1->Lines->Add("--- С конца --");
}
View_Spis(RadioGroup1->ItemIndex, t);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Del_All(&start);
ShowMessage("Память освобождена!");
Memo1->Clear();
}

//---------------------------------------------------------------------------
//------------------- Создание первого элемента --------------------------------------------
void Create_Spis(Spis **b, Spis **e, int in) {
t = new Spis;
t -> index = in;
t -> next = t -> prev = NULL;
*b = *e = t;
}
//------------------- Добавление элемента в список ----------------------------------------
void Add_Spis(int kod, Spis **b, Spis **e, int in) {
t = new Spis;
t -> index = in;
if(kod == 0){
t -> prev = NULL;
t -> next = *b;
(*b) -> prev = t;
*b = t;
}
else {
t -> next = NULL;
t -> prev = *e;
(*e) -> next = t;
*e = t;
}
}
//--------------------- Просмотр элементов списка -----------------------------------------
void View_Spis(int kod, Spis *t) {
while(t != NULL) {
Form1->Memo1->Lines->Add(t->index);
if(kod == 0) t = t->next;
else t = t->prev;
}
}

//--------------------------- Функция освобождения памяти --------------------------------
void Del_All(Spis **p) {
while(*p != NULL) {
t = *p;
*p = (*p) -> next;
delete t;
}
}

//-------------------- Удаление из списка элементов с четными числами -------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
t = start;
Spis *key = NULL;

while(t != NULL) {
if ((t->index % 2)==0) {
key = t;
Memo1->Lines->Add("Удалить :" + IntToStr(key->index ));
if (key == start) {
start = start->next;
start->prev = NULL;
}
else {
if (key == last) {
last = last->prev;
last->next = NULL;
}
else {
(key->prev)->next = key->next;
(key->next)->prev = key->prev;
}
}
}
t = t->next;
}
delete key;
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
}
//---------------------------------------------------------------------------

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





Задание № 6

Написать и отладить программу поиска всех корней функции f(x) на отрезке [a, b] в соответствии с вариантом. Метод нахождения корня оформить в виде отдельной функции, алгоритм которой описать блок-схемой.
а = -1 b = 3 Метод Ньютона
Блок-схема алгоритма:

Текст программы:

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double fun(double);
double diff_fun(double);
double Metod_Newton(double,double,double);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a, b, x, eps, h, y, r;
int nom=0, iter;
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
h = StrToFloat(Edit3->Text);
eps = StrToFloat(Edit4->Text);

Memo1->Lines->Clear();
Memo1->Lines->Add(" Функция x^2 - 10sin^2(x) + 2 ");
Memo1->Lines->Add(" Метод Ньютона ");
Chart1->Series[0]->Clear();

for(x = a-h; x< b+h; x+=h)
Chart1->Series[0]->AddXY(x,fun(x));

Memo1->Lines->Add("------ Корни ------");

for(x = a; x<=b; x+=h){

if(fun(x)*fun(x+h)<0){
nom++;
y = Metod_Newton(x, x+h, eps);
Memo1->Lines->Add(IntToStr(nom)+"-й = "+FloatToStrF(y,ffFixed,8,6));
}
}
if(nom==0) Memo1->Lines->Add("На отрезке корней НЕТ!");
}
//---------------------------------------------------------------------------
double Metod_Newton(double x0,double x1,double eps) {
double x2,de;

do {
x2=x0-fun(x0)/diff_fun(x0);
de=fabs(x1-x2);
x0=x1;
x1=x2;
} while (de>eps);

return x2; // Возвращаем значение, для которого достигнута точность
}

//------------------------------- Заданная функция f(x) ----------------------------------------
double fun(double x) {
return pow(x,2) - 10*pow(sin(x),2) + 2;
}
//------------------------------- Производная заданной функций f(x) ----------------------------------------
double diff_fun(double x) {
return 2*x - 20*cos(x)*sin(x);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

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



Задание № 8

Написать и отладить программу вычисления интеграла указанным методом двумя способами – по заданному количеству разбиений n и заданной точности e (метод 1) (задания табл. 8.1). Реализацию указанного метода оформить отдельной функцией, алгоритм которой описать в виде блок-схемы.
a = 0 b = 3 Метод трапеций

Блок-схема алгоритма:

Текст программы:
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
typedef double (*type_f)(double);
double fun(double);
double Trapeciya(type_f, double, double, int);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a, b, x, eps, h, Int1, Int2, pogr;
int n, n1;
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
n = StrToInt(Edit3->Text);
eps = StrToFloat(Edit4->Text);
h = (b - a)/100; // Шаг вывода исходной функции
Chart1->Series[0]->Clear();
Memo1->Clear();
for(x = a-h; x< b+h; x+=h)
Chart1->Series[0]->AddXY(x,fun(x));
switch(RadioGroup1->ItemIndex) {
case 0:
Memo1->Lines->Add("Расчет по разбиению на n = " + IntToStr(n));
Int1 = Trapeciya(fun,a,b,n);
break;
case 1:
n1=2;
Memo1->Lines->Add("Расчет по точности eps");
Int1 = Trapeciya(fun,a,b,n1);
do {
n1*=2;
Int2 = Trapeciya(fun,a,b,n1);
pogr = fabs(Int2-Int1);
Int1 = Int2;
} while(pogr > eps);
Memo1->Lines->Add("При n = " +IntToStr(n1));
break;
}
Memo1->Lines->Add("Значение интеграла = " + FloatToStrF(Int1,ffFixed,8,3));

}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
double Trapeciya(type_f f, double a, double b, int n) {
double s,h;

s=0;
h=(b-a)/n;

for(int i=0;i<=n;i++) {
s+=(f(a+(i*h))+f(a+((i+1)*h)))/2;
}
return s*h;
}
//------------------------------ Подинтегральная функция f(x) ------------------------------
double fun(double x) {
return pow(x,2)-10*pow(sin(x),2);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
RadioGroup1->ItemIndex = 0;
}
//---------------------------------------------------------------------------

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



Список литературы
1. Батура М.П., Бусько В.Л., Корбит А.Г., Кривоносова Т.М. Основы алгоритмизации и программирования. Язык Си : учеб. пособие. – Минск: БГУИР, 2007.
2. Основы программирования в среде С++ Builder: методические указания по выполнению контрольной работы по курсу «Основы алгоритмизации и программирования» для студентов 1 – 2-го курсов заочного отделения специальностей ЭВС и ПОИТ БГУИР. В 2-х частях. Часть 2. / Кривоносова Т.М. – Минск: БГУИР, 2010 – 83 с.: ил.
3. Стефан Р. Дэвис, С++ для «чайников», 4-е издание. : Пер. с англ.: - М. : Издательский дом «Вильямс», 2003. – 336 с.
Категория: ОАиП | Добавил: Station
Просмотров: 2488 | Загрузок: 45
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]