Міністерство освіти і науки України
Національний університет „Львівська політехніка”
кафедра ЕОМ
Курсова робота
з курсу
“Програмно-орієнтовані мови програмування”
Виконав: ст.гр. КH-1
Перевірив:
Львів – 2006
Завдання для роботи
Знаходження оберненої матриці методом Гауса.
Вимоги до програми:
введення-виведення даних виконати у зручній формі у вигляді таблиць;
забезпечити можливість редагування вхідних даних у межах визначених полів введення даних;
програма повинна бути реалізована на мові С/С++;
програма повинна працювати у вікні MS-DOS під керуванням операційної системи Windows;
передбачити введення/виведення даних з клавіатури та з файлу;
керування режимами роботи програми виконати за допомогою клавіатури та миші.
Вступ
Комп’ютер – це машина, що обробляє інформацію. Вивчення засобів програмування передбачає вивчення того, яким чином ця інформація організована всередині ЕОМ, як вона обробляється і як може бути використана. Тому, для вивчення дисципліни студенту особливо важливо зрозуміти концепцію організації даних і роботи з ними.
Програма представляє собою в кінцевому рахунку конкретні формулювання абстрактних алгоритмів, що базуються на конкретних представленнях і структурах даних. Зрозуміло, що рішення про структури даних які необхідно застосувати неможливо прийняти без знання алгоритмів, що застосовуються до цих даних, і навпаки, вибір алгоритмів суттєво залежить від вибраних структур даних. Отже, структури програм і структури даних нерозривно пов’язані.
Мова С – це універсальна мова програмування, для якої характерні економічність виразів, сумісний потік управління та структури даних , багатий набір операторів. Мова С не являється ні мовою «дуже високого рівня», ні «великою» мовою, і не предназначається для деякої спеціальної області застосувань, але відсутність обмежень і загальність мови роблять її більш зручною і ефективною для багатьох задач.
Методи та засоби розвязування задачі
Для розвязання задачі ми напишем програму. Програма повинна мати меню для вибору режиму роботи. Ми повинні реалізувати ввід матриці. На виході ж має бути матриця, обернена до вхідної. Крім цього слід розділити спосіб вводу/виводу даних з клавіатури та з файлу.
Щоб створити таку прграму створим головне меню програми, де можна буде вибрати один з наступних варіантів: ввід матриці з клавіатури; ввід матриці з файлу; обрахунок оберненої матриці.
Кожен із пунктів головного меню реалізуємо як окрему функцію. Знаходження оберненої матриці відбуватиметься методом Гауса.
Блок-схема функції знаходження оберненої матриці
SHAPE \* MERGEFORMAT Створення одиничної матриці
Перебір стовбців
Зведення першого ненульового елемента рядка до 1. Аналогічні математичні дії виконуються з одиничною матрицею
Проходження по рядку
Віднімання рядків задля встановлення потрібних елементів в 0. Аналогічні математичні дії виконуються з одиничною матрицею
Перебір рядків
Блок-схема функції вводу матриці з клавіатури
SHAPE \* MERGEFORMAT Зчитування розрядності матриці
Виділення памяті для розміщення матриці
Введення з клавіатури наступного елемента матриці
Запит чи всі дані уже введено
Блок-схема функції вводу матриці з файлу SHAPE \* MERGEFORMAT Відкриття файлу.
Зчитування розмірності матриці
Виділення памяті для розміщення матриці
Зчитування з рядка файлу елемента матриці
Запит чи всі дані уже введено
Опис алгоритму знаходження оберненої матриці методом Гауса
Матрицю що була введена ми зводим до одиничної матриці методом Гауса. При цьому усі дії що були виконані над матрицею ми виконуємо і над одиничною матрицею в тому ж порядку. Коли матриця зведена до одиничної, матриця, що спочатку була одиничною і буде оберненою до початкової матриці, введеної з клавіатури.
Метод Гауса зведення до одиничної матриці полягає в тому, що ми перетворюємо елементи в головній діагоналі матриці в одиниці шляхом ділення всього рядка на елемент що знаходиться на діагоналі. Решта елементів зводяться до нулів шляхом множення та додавання рядків.
Результат виконання програми
Основне меню програми, що зоображене на малюнку, дозволяє нам ввести вхідні дані з клавіатури, файлу, знайти обернену матрицю методом Гауса чи вийти з програми.
Щоб вибрати бажану дію слід ввести номер потрібного пункту меню та натиснути Ввід.
При виборі першого пункту «Ввід матриці з клавіатури» нам потрібно вказати розмірність матриці і після цього вводити елементи матриці.
При виборі другого пункту «Ввід матриці з файлу» нам слід вказати відносний шлях до файлу, з якого відбудеться читання вхідних даних. Після цього слід вказати розмірність матриці, яку ми бажаємо зчитати з файлу. Після виконання необхідних дій програма поверне нас в головне меню. Вхідний файл повинен містити елементи матриці, тобто дійсні числа розташовані в стовбчик.
При виборі третього пункту «Обрахунок оберненої матриці» програма знаходить обернену матрицю до вхідної та виводить її на екран. Після виведення інформації ми знов опинимось в головному меню.
При виборі четвертого пункту «Впорядкування даних» список, що був введений за допомогою пункту 1 або 2 буде відсортовано. Щоб продивитись відсортований список слід вибрати пункт 3 «Вивід списку» після виконання сортування.
При виборі четвертого пункту «Вихід» виконується вихід з програми в операційну систему.
Програма
#include <stdio.h>
#include <alloc.h>
#include <string.h>
#include <math.h>
int n,i,j;
double **m,**z;
char t[20];
void kl(){
printf("Vvedit rozmirnist matryci: ");
scanf("%d",&n);
m=(double**)malloc(n*sizeof(double*));
for(i=0;i<n;i++)
m[i]=(double*)malloc(n*sizeof(double));
for(i=0;i<n;i++)
for(j=0;j<n;j++){
printf("M[%d,%d]=",i,j);
scanf("%s",&t);
m[i][j]=atof(t);};
}
void fa(){
FILE *f; char pat[150],qq[50];
printf("Vvedit shlyah do fajlu: ");
scanf("%s",&pat);
printf("Vvedit rozmirnist matryci: ");
scanf("%d",&n);
m=(double**)malloc(n*sizeof(double*));
for(i=0;i<n;i++)
m[i]=(double*)malloc(n*sizeof(double));
f=fopen(pat,"r");
for(i=0;i<n;i++)
for(j=0;j<n;j++){
fgets(qq,45,f);
m[i][j]=atof(qq);
};
}
void vyv(){ int k;
z=(double**)malloc(n*sizeof(double*));
for(i=0;i<n;i++)
z[i]=(double*)malloc(n*sizeof(double));
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(i==j) z[i][j]=1;
else z[i][j]=0;};
for(i=0;i<n;i++){
for(j=0;j<n;j++){
z[i][j]/=m[i][i];
m[i][j]/=m[i][i];
};
for(j=0;j<n;j++)
if(j!=i)
for(k=0;k<n;k++){
z[j][k]-=m[j][i]*z[i][k];
m[j][k]-=m[j][i]*m[i][k];
};};
for(i=0;i<n;i++){
printf("\n");
for(j=0;j<n;j++)
printf("%6.2f",z[i][j]);};
printf("\n");}
void main()
{ int c=0;
while(c!=4){
printf("\nZNAHODJENNYA OBERNENOYI MATRUCI METODOM GAUSA.\n \
1. Vvid matryci z klaviatury.\n \
2. Vvid matryci z fajlu.\n \
3. Obrahunok obernenoi matryci.\n \
4. Vyhid.\n");
scanf("%d",&c);
if(c==1) kl();
if(c==2) fa();
if(c==3) vyv();};
}
Висновки
У курсовій роботі систематизовано, закріплено та розширено теоретичні і практичні знання з програмування за допомогою застосування різноманітних структур даних та алгоритмів при розв’язуванні конкретних прикладних задач; набуто навики розробки більш складних програмних продуктів і оформлення програмної документації. Моя програма знаходить обернену матрицю методом Гауса.
Список використаної літератури
1. Громов Ю.Ю., Татаренко С.И. Прогаммирование на языке СИ, Учебное пособие, 1995.
2. Маслов А.Н. Введение в язык программирования С, 1991.
3. Страуструп Б. Введение в язык C++, 1985.