Dev - C++ - programa matriz inversa

   
Vista:

programa matriz inversa

Publicado por Juan Manuel (3 intervenciones) el 11/05/2015 23:59:37
este es un programa para determinar la matriz inversa por el método de gauss jordan, pero no encuentro donde esta el error, si alguien puede ayudarme se lo agradezco, si, se ve muy grande, pero realmente necesito alguien que me diga donde esta mal, llevo como una semana atorado aquí..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void imprimem(float [10][10]);      //imprime una matriz de forma ordenada
void capturam(float [10][10],int,int);     //captura una matriz n*m
void mid(float x[10][10]);     //encuentra la matriz identidad de n*n
void igualam(float [10][10],float [10][10]);     //iguala una matriz a otra, con el fin de no perder datos
void sumar(float [10][10],float [10][10], float,float,int,int);      //determina si debe sumar o restar un renglón en la matriz inv
void cambiar(float [10][10],float[10][10],int,int);     //cambia 2 renglones de una matriz entre si
void dirc(float [10][10],int,float);     //divide un renglon de una matriz entre una constante
void impriproc(void);     //imprime el estatus de la matriz aumentada
float minv(void);     //determina la inversa, es donde esta el error...
                                  //funciona así, primero verifica que el valor del primer pivote no sea 0, de ser así lo cambia por otro
                                  //después convierte el primer pivote en 1, después suma o resta a los renglones de abajo,
                                  //cambia de pivote y repite los pasos, sumando o restando ahora en los renglones de arriba o abajo
int n,m,o,p,opcion;
float a[10][10],b[10][10],c[10][10],d[10][10];
 
main()
{
	float z;
	system("cls");
	printf("\nDa tamagno de matriz:>");
	scanf("%d",&n);
	m=n;
	system("cls");
	z=minv();
	getche();
	return(0);
}
 
void capturam( float x[10][10],int y,int z)
{
	int i,j;
	for(i=0;i<y;i++)
	{
		for(j=0;j<z;j++)
		{
			printf("\nDa el elemento %d,%d:>",i+1,j+1);
			scanf("%f",&x[i][j]);
		}
	}
	system("cls");
}
 
void imprimem(float x[10][10])
{
	int i,j;
 
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			printf("\t%.2f",x[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");
}
 
void mid(float x[10][10])
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			x[i][j]=0;
			if(i==j)
			{
				x[i][j]=1;
			}
		}
	}
}
 
void igualam(float mo[10][10],float ms[10][10])
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			ms[i][j]=mo[i][j];
		}
	}
}
 
void sumar(float ma[10][10],float mc[10][10], float via,float vic,int fa,int fc)
{
	int j;
	float q;
	q=via*vic;
	for(j=0;j<m;j++)
	{
		if(q>0)
		{
			ma[fa][j]=ma[fa][j]-(via*mc[fc][j]);
			b[fa][j]=b[fa][j]-(via*d[fc][j]);
		}
		else
		{
			ma[fa][j]=ma[fa][j]+(via*mc[fc][j]);
			b[fa][j]=b[fa][j]+(via*d[fc][j]);
		}
	}
}
 
void cambiar(float mo[10][10],float ms[10][10],int fo,int fs)
{
	int j;
	for(j=0;j<m;j++)
	{
		ms[fs][j]=mo[fo][j];
		ms[fo][j]=mo[fs][j];
	}
	igualam(ms,mo);
}
 
void dirc(float x[10][10],int i,float k)
{
	int j;
	for(j=0;j<m;j++)
	{
		x[i][j]=(x[i][j])/k;
	}
}
 
void impriproc(void)
{
	int i,j,k;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			printf("\t%.2f",a[i][j]);
		}
		for(k=0;k<m;k++)
		{
			printf("\t%.2f",b[i][k]);
		}
		printf("\n");
	}
	printf("\n\n");
}
 
float minv(void)
{
	int i,j,k,l,q,r;
	float x=0;
	capturam(a,n,m);
	mid(b);
	igualam(a,c);
	igualam(b,d);
	impriproc();
	for(j=0;j<n;j++)
	{
		if(a[j][j]==0)
		{
			for(i=j;i<n;i++)
			{
				if(a[j][j]==0)     //cambia el renglon por uno diferente de 0
				{
					cambiar(a,c,j,i);
					cambiar(b,d,j,i);
				}
			}
			if(a[j][j]==0)
			{
				printf("\n\t La matriz inversa no existe");
				getche();
				return(x);
			}
		}
		else
		{
			if(a[j][j]!=1)     //convierte el pivote en 1
			{
				dirc(b,j,a[j][j]);
				dirc(a,j,a[j][j]);
				igualam(a,c);
				igualam(b,d);
			}
			i=0;
			while(i!=n)
			{
				if(i==j)
				{
				}
				else
				{
					sumar(a,c,a[i][j],c[j][j],i,j);     //suma o resta al renglon
					igualam(a,c);
					igualam(b,d);
					impriproc();
				}
				i++;
			}
 
		}
	}
	printf("\n\t La matriz inversa es: \n");
	impriproc();
	imprimem(b);
	return(x);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder