
- •Постановка задачі
- •1. Загальні відомості про слау
- •Методи розв’язування задачі
- •2.Опис роботи програми
- •3. Створення програми.
- •1. Основа програми
- •Функція ділення
- •Функція додавання
- •Роздрук результатів у файл
- •5 . Аналіз введених даних
- •Зміни у коді програми та написання остаточного коду
- •Тестування результатів
- •Висновок
- •Список використаної літератури:
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;
}
-
Зміни у коді програми та написання остаточного коду
Внесемо зміни до функції 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);
}