Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Створення програми.doc
Скачиваний:
4
Добавлен:
28.10.2018
Размер:
143.36 Кб
Скачать

5 . Аналіз введених даних

Можна помітити, що програма ніде не перевіряє ділення на елемент, який дорівнює 0.

Тому напишемо ще 2 функції. Перша шукає нульові строчки та видаляє їх, а інша міняє місцями строчку з нульовим елементом mas[i][i] на останню.

Розглянемо функцію pusto() типу int . За формальній параметр вводимо лічильник i . Вона шукає у i-тій строчці нульові елементи та рахує їх кількість. Якщо їх кількість дорівнює N вона міняє цю строчку з останньою місцями і декременує n (тобто фактично «видаляє» останню строчку и записує її на місце нульової). Якщо нульова строчка і є останньою, вона просто видаляється і функція завершує свою роботу. Функція повертає саму себе щоб знову зробити перевірку i-ту строчку, якщо вона не нульова, функція завершує свою роботу і повертає 0. Також функція друкує у файл res.txt яка строчка нульова.

pusto(int i){

t=0;

for(k=0;k<N;k++) if(mas[i][k]==0) t++;

if((i==(n-1))&&(t==N)) {

n--;

fprintf(cool,"%i stro4ka nulevaya \n \n",i+1);

return 0;

}

if (t==N) {

for(k=0;k<N;k++) mas[i][k]=mas[n-1][k];

n--;

fprintf(cool,"%i stro4ka nulevaya \n \n",i+1);

}

else return 0;

return pusto(i);

}

Функція error() типу int міняє строчку з останньою, якщо елемент mas[i][i] дорівнює 0. Вона досить проста. Створюємо нову змінну-лічильник t для того, щоб закінчити цикл пошуку не нульового елементу с строчці, коли кількість ітерацій більше кількості строчок, зменшених на 1 (щоб не міняло з першою строчкою). Якщо після роботи програми елемент залишається нульовим, функція повертає саму себе, але зменшує кількість строчок на 1 (локально, тобто лише у цій функції). Якщо він не нульовий, функція завершує свою роботу.

int error(int n,int i) {

int r;

for(r=0;r<N;r++) {

y=mas[i][r];

mas[i][r]=mas[n-1][r];

mas[n-1][r]=y;

}

t++;

if(t>(n-1)) return 0;

if(mas[i][i]==0) return error(n--,i);

else return 0;

}

  1. Зміни у коді програми та написання остаточного коду

Внесемо зміни до функції delenie(). Перевіряється, чи дорівнює нулю елемент. Якщо розглядаэться не остання строчка, то виконується функція error(). Робиться перевірка елемента і після виконання error(). Спочатку лічильник кількості ітерацій функції error() прирівнюється до 0.

int delenie(int i){

t=0;

if((mas[i][i]==0)&&(i!=(n-1))) error(n,i);

if(mas[i][i]==0) return 0;

y=mas[i][i];

for(k=0;k<N;k++) mas[i][k]=mas[i][k]/y;

return 0;

}

Допишемо код головної функції. Спочатку перевіряємо весь масив на пусті строчки, виводимо у файл масив, який буде розглядатись програмою. Далі для кожної строчки проводиться ділення на і-тий елемент та додавання її до інших строчок. Зазначимо, що у функції slojenie() проводиться перевірка, чи дорівнює елемент 0. Тому зробимо цю перевірку ззовні, у функції main(). І якщо елемент не дорівнює 0, у файл виводяться усі дії, які мі проводили зі строчкою. Виводимо остаточну матрицю и закриваємо потоки.

void main(){

FILE *fp;

fp=fopen("text.txt","r");

cool=fopen("res.txt","w");

puts("kol-vo strok \n");

scanf("%i",&n);

puts("kol-vo neizv. \n");

scanf("%i",&N);

N++;

for(i=0;i<n;i++) for(j=0;j<N;j++) fscanf(fp,"%f",&mas[i][j]);

vivod();

for(i=0;i<n;i++) pusto(i);

vivod();

for(i=0;i<n;i++) {

if(mas[i][i]!=0) fprintf(cool,"delim %i stro4ku na %.3f \n",i+1,mas[i][i]);

delenie(i);

if(mas[i][i]!=0) viv(i);

if(mas[i][i]!=0) slojenie(i);

vivod();

pusto(i);

}

vivod();

fclose(cool);

fclose(fp);

}

І остаточний код вийшов таким:

#include <stdio.h>

float mas[15][15],y,x[15];

FILE *cool;

int i,j,k,n,N,t=0;

void viv(int i){

for(j=0;j<n;j++) if(i!=j) fprintf(cool,"umnojaem %i stro4ku na %.3f i skladivaem s %i stro4koi \n",i+1,-(mas[j][i]),j+1);

}

int pusto(int i){

t=0;

for(k=0;k<N;k++) if(mas[i][k]==0) t++;

if((i==(n-1))&&(t==N)) {

n--;

fprintf(cool,"%i stro4ka nulevaya \n \n",i+1);

return 0;

}

if (t==N) {

for(k=0;k<N;k++) mas[i][k]=mas[n-1][k];

n--;

fprintf(cool,"%i stro4ka nulevaya \n \n",i+1);

}

else return 0;

return pusto(i);

}

int error(int n,int i) {

int r;

for(r=0;r<N;r++) {

y=mas[i][r];

mas[i][r]=mas[n-1][r];

mas[n-1][r]=y;

}

t++;

if(t>(n-1)) return 0;

if(mas[i][i]==0) return error(n--,i);

else return 0;

}

int delenie(int i){

t=0;

if((mas[i][i]==0)&&(i!=(n-1))) error(n,i);

if(mas[i][i]==0) return 0;

y=mas[i][i];

for(k=0;k<N;k++) mas[i][k]=mas[i][k]/y;

return 0;

}

void slojenie(int i){

for(k=0;k<n;k++) {

y=mas[k][i];

for(t=0;t<N;t++) if(k!=i) mas[k][t]=mas[k][t]-mas[i][t]*(y/mas[i][i]);

}

}

void vivod(){

for(k=0;k<n;k++) {

for(j=0;j<N;j++) {

if(j==(N-1)) fprintf(cool,"\t || ");

fprintf(cool,"%.3f ",mas[k][j]);

}

fprintf(cool,"\n");

}

fprintf(cool,"\n");

}

void main(){

FILE *fp;

fp=fopen("text.txt","r");

cool=fopen("res.txt","w");

puts("kol-vo strok \n");

scanf("%i",&n);

puts("kol-vo neizv. \n");

scanf("%i",&N);

N++;

for(i=0;i<n;i++) for(j=0;j<N;j++) fscanf(fp,"%f",&mas[i][j]);

vivod();

for(i=0;i<n;i++) pusto(i);

if(n<0) fprintf(cool,"pustaya matrica \n");

vivod();

for(i=0;i<n;i++) {

if(mas[i][i]!=0) fprintf(cool,"delim %i stro4ku na %.3f \n",i+1,mas[i][i]);

delenie(i);

if(mas[i][i]!=0) viv(i);

if(mas[i][i]!=0) slojenie(i);

vivod();

pusto(i);

}

vivod();

fclose(cool);

fclose(fp);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]