• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

vasco16

[Ajuda] Pequena ajuda em c..

1 mensagem neste tópico

este programa tem de ler ler um programa de uma netlist e com transportar os valores para o programa e carregalos numa matriz, de acordo com a classificaçao de cada ramo (resistivo, capacitivo, etc) tem de calcular os valores das tensoes e currentes.

#include <stdio.h>

#define NUMLINHAS 50

void iniciavectorint(int tamanho, int num[]){
int i;
for(i=0;i<=tamanho;i++)
num=0;
}
void iniciavectorfloat(int tamanho, float num[]){
int i;
for(i=0;i<=tamanho;i++)
num=0.0;
}

void inicializavectorbi(float y[3][3])
{ int i,j;
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
y[j]=0.0;
}

void multicomplex(float ar, float ai, float br,float bi ,float *real, float *imag)
{
*real=0;
*imag=0;
*real=ar*br;
*imag=ai*bi;
}


void linha(){
printf("\n\n...............................\n\n");
}

void main(){

FILE *fp;
int poslinha=0,no1[NUMLINHAS],no2[NUMLINHAS],i=0,k=0,j=0,cont=0;
char s[100],tipoaux[3],tipo[60][1],ref[NUMLINHAS],refaux[2];
float v1[NUMLINHAS],v2[NUMLINHAS],v3[NUMLINHAS],fase[NUMLINHAS],omega,teste=0;
float matrizar[3][3];//Matriz A parte Reais
float matrizai[3][3];//Matriz A parte Imaginária
float matrizb[3];//Matriz B
float ra,rb,rc,zk,zm,lv1,cv1,iv1,urv1;//valores para efectuar os calculos

float real=0,imag=0,aei1,aer,aeii,aeir,dhi,dhr,dhci,dhcr,gbfr,gbfi,gbi,gbr,cei,cer; //variaveis auxiliares para o calculo do DETERMINANTE
float cegi,cegr,fhi,fhr,fhai,fhar,ibi,ibr,ibdi,ibdr,detr,deti,det1r,det1i,det2r,det2i; //variaveis auxiliares para o calculo do DETERMINANTE






/*Pede o nome e caminho do ficheiro ao utilizador */
printf("Intruduza o Nome do Ficheiro:");gets(s);

/*Abre o Ficheiro*/
fp=fopen(s,"r");

/*Verifica se a abertura foi feita com sucesso*/
if(fp==NULL)
printf("Impossivel Abrir o Ficheiro %s \n\n\n",s);
else{
	printf("Ficheiro %s Aberto com Sucesso!\n\n\n",s);
}


/*IniciaVectores*/
iniciavectorint(NUMLINHAS,no1);
iniciavectorint(NUMLINHAS,no2);
iniciavectorfloat(NUMLINHAS,v1);
iniciavectorfloat(NUMLINHAS,v2);
iniciavectorfloat(NUMLINHAS,v3);
iniciavectorfloat(NUMLINHAS,fase);
iniciavectorfloat(NUMLINHAS,matrizb);
inicializavectorbi(matrizar);
inicializavectorbi(matrizai);

/*Leitura da netlist e armazenamento dos dados nos respectivos vectores*/
while(fscanf(fp,"%s",tipoaux)!=EOF){
	if(tipoaux[0]=='W' || tipoaux[0]=='w'){
		fscanf(fp,"%f",ω); //Não é necessario colocar o W num vector pois so existe um omega, estando identificado como tal
		printf("%s %f\n",tipoaux,omega);

	}else if(tipoaux[0]=='U' || tipoaux[0]=='u'){
		tipo[poslinha][1]=tipoaux[0];
		printf("%c ",tipo[poslinha][1]);
		fscanf(fp,"%s %d %d %f %f %f",refaux,&no1[poslinha],&no2[poslinha],&v1[poslinha],&v2[poslinha],&v3[poslinha]);
		ref[poslinha]=refaux[0];
		printf("%c %d %d %f %f %f\n",ref[poslinha],no1[poslinha],no2[poslinha],v1[poslinha],v2[poslinha],v3[poslinha]);

	}else if(tipoaux[0]=='R' || tipoaux[0]=='r'){
		tipo[poslinha][1]=tipoaux[0];
		printf("%c ",tipo[poslinha][1]);
		fscanf(fp,"%s %d %d %f",refaux,&no1[poslinha],&no2[poslinha],&v1[poslinha]);
		ref[poslinha]=refaux[0];
		printf("%c %d %d %f\n",ref[poslinha],no1[poslinha],no2[poslinha],v1[poslinha]);

	}else if(tipoaux[0]=='L' || tipoaux[0]=='l'){
		tipo[poslinha][1]=tipoaux[0];
		printf("%c ",tipo[poslinha][1]);
		fscanf(fp,"%s %d %d %f",refaux,&no1[poslinha],&no2[poslinha],&v1[poslinha]);
		ref[poslinha]=refaux[0];
		printf("%c %d %d %f\n",ref[poslinha],no1[poslinha],no2[poslinha],v1[poslinha]);

	}else if(tipoaux[0]=='I' || tipoaux[0]=='i'){
		tipo[poslinha][1]=tipoaux[0];
		printf("%c ",tipo[poslinha][1]);
		fscanf(fp,"%s %d %d %f %f",refaux,&no1[poslinha],&no2[poslinha],&v1[poslinha],&fase[poslinha]);
		ref[poslinha]=refaux[0];
		printf("%c %d %d %f %f\n",ref[poslinha],no1[poslinha],no2[poslinha],v1[poslinha],fase[poslinha]);

	}else if(tipoaux[0]=='C' || tipoaux[0]=='c'){
		tipo[poslinha][1]=tipoaux[0];
		printf("%c ",tipo[poslinha][1]);
		fscanf(fp,"%s %d %d %f",refaux,&no1[poslinha],&no2[poslinha],&v1[poslinha]);
		ref[poslinha]=refaux[0];
		printf("%c %d %d %f\n",ref[poslinha],no1[poslinha],no2[poslinha],v1[poslinha]);


	}
	poslinha++;
}
fclose(fp);
/* Fim da Leitura e Passagem dos dados da NETLIST para a estruturas de dados */

//Inicio dos calculos dos valores lidos da netlist para as matriazes A e B
//Na Matriz A os valores serão dividos em duas matrizes auxiliares, na matriz "matrizar" serão guardados os valores reais e na matriz "matrizai" serão guardados os valores imaginarios

//Para encontramos os valores nos vectores, vamos ter de fazer pequenas procuras para obter os valores pretendidos
i=0;
for(i=0;i<=poslinha;i++){
	if(tipo[1]=='U' || tipo[1]=='u'){
		ra=v3;
		urv1=v1;
	}

	if(tipo[1]=='R' || tipo[1]=='r' && ref=='b'){
		if(ref=='B' || ref=='b'){
			rb=v1;
		}
		if(ref=='C' || ref=='c'){
			rc=v1;
		}
	}
	if(tipo[1]=='L' || tipo[1]=='l'){
		lv1=v1;
	}
	if(tipo[1]=='C' || tipo[1]=='c'){
		cv1=v1;
	}
	if(tipo[1]=='I' || tipo[1]=='i'){
		iv1=v1;
	}
}

/*Colocar os valores calculados nas matrizes*/
zk=omega*lv1;
zm=-1/(omega*cv1);

/*MATRIZ A REAIS*/
matrizar[1][1]=-((1/ra)+(1/rb)+(1/rc));
matrizar[1][2]=1/rb;
matrizar[2][1]=1/rb;
matrizar[2][2]=-(1/rb);
matrizar[1][3]=1/rc;
matrizar[3][3]=-(1/rc);
matrizar[3][1]=1/rc;
matrizar[3][2]=0.0;

/*MATRIZ A COMPLEXOS*/
matrizai[2][2]=1/zk;
matrizai[2][3]=-(1/zk);
matrizai[3][2]=-(1/zk);
matrizai[3][3]=-(1/zk)+(1/1/zm); //ATENÇÃO O VALOR DE ZK E ZM ESTÁ A DAR CONFLITO, LOGO ESTÃO ERRADOS


/*MATRIZ B*/
matrizb[1]=(urv1/ra);
matrizb[2]=iv1;
matrizb[3]=0;

linha();

//Escrever no Ecrã as Matrizes
//matriz A Reais
printf("\nMatriz A Reais\n");
for(i=1;i<=3;i++){
	for(j=1;j<=3;j++){
		cont++;
		if(cont==3){
			printf("%2.4f\t",matrizar[j]);
			printf("\n");
			cont=0;

		}else{
			printf("%2.4f\t",matrizar[j]);
		}
	}
}


//matriz A Imaginarios
printf("\nMatriz A Imaginarios\n");
cont=0;
for(i=1;i<=3;i++){
	for(j=1;j<=3;j++){
		cont++;
		if(cont==3){
			printf("%2.4f\t",matrizai[j]);
			printf("\n");
			cont=0;

		}else{
			printf("%2.4f\t",matrizai[j]);
		}
	}
}
linha();
cont=0;
printf("\nMatriz A\n");
for(i=1;i<=3;i++){
	for(j=1;j<=3;j++){
		cont++;
		if(cont==3){
			if(matrizar[j]!=0)
			printf("%2.4f",matrizar[j]);
			if(matrizai[j]!=0){
				if(matrizai[j]>0){
					printf("+%2.4fj",matrizai[j]);
				}else{
					printf("%2.4fj",matrizai[j]);
				}
			}
			printf("\t\t\n");
			cont=0;
		}else{
			if(matrizar[j]!=0)
			printf("%2.4f",matrizar[j]);
			if(matrizai[j]!=0){
				if(matrizai[j]>0){
					printf("+%2.4fj",matrizai[j]);
				}else{
					printf("%2.4fj",matrizai[j]);
				}
			}
			printf("\t\t");
		}
	}
}

/*Matriz B*/
printf("\nMatriz B\n");
for(i=1;i<=3;i++)
printf("%f\n",matrizb);


/*Calculo do determinante


a b c Tendo esta matriz , para sabermos o determinantes basta seguir esta formula
d e f determinante=(aei + dhc + gbf)-(ceg + fha + ibd)
g h i

Para o calculo do determinante, foi criado um procedimento que faz a multiplicação de dois numeros complexos
*/
linha();
//DETERMINANTE

//Calculo de AEI
multicomplex(matrizar[1][1],matrizai[1][1],matrizar[2][2],matrizai[2][2],ℜ,&imag);
aer=real;
aei1=imag;
multicomplex(aer,aei1,matrizar[3][3],matrizai[3][3],ℜ,&imag);
aeir=real;
aeii=imag;

//Calculo de DHC
multicomplex(matrizar[2][1],matrizai[2][1],matrizar[3][2],matrizai[3][2],ℜ,&imag);
dhr=real;
dhi=imag;
multicomplex(dhr,dhi,matrizar[1][3],matrizai[1][3],ℜ,&imag);
dhcr=real;
dhci=imag;

//Calculo de GBF
multicomplex(matrizar[3][1],matrizai[3][1],matrizar[1][2],matrizai[1][2],ℜ,&imag);
gbr=real;
gbi=imag;
multicomplex(gbr,gbi,matrizar[2][3],matrizai[2][3],ℜ,&imag);
gbfr=real;
gbfi=imag;

//Calculo de CEG
multicomplex(matrizar[1][3],matrizai[1][3],matrizar[2][2],matrizai[2][2],ℜ,&imag);
cer=real;
cei=imag;
multicomplex(cer,cei,matrizar[3][1],matrizai[3][1],ℜ,&imag);
cegr=real;
cegi=imag;

//Calculo de FHA
multicomplex(matrizar[2][3],matrizai[2][3],matrizar[3][2],matrizai[3][2],ℜ,&imag);
fhr=real;
fhi=imag;
multicomplex(fhr,fhi,matrizar[1][1],matrizai[1][1],ℜ,&imag);
fhar=real;
fhai=imag;

//Calculo de IBD
multicomplex(matrizar[3][3],matrizai[3][3],matrizar[1][2],matrizai[1][2],ℜ,&imag);
ibr=real;
ibi=imag;
multicomplex(ibr,ibi,matrizar[2][1],matrizai[2][1],ℜ,&imag);
ibdr=real;
ibdi=imag;

det1r=aeir+dhcr+gbfr;
det1i=aeii+dhci+gbfi;

det2r=cegr+fhar+ibdr;
det2i=cegi+fhai+ibdi;

detr=det1r-det2r;
deti=det1i-det2i;

printf("DETERMINANTE: %f %fj",detr,deti);


getchar();getchar();
}

esta forma nao é a melhor para calcular a inversa da matriz, a melhor é usar um metodo de eleminaçao de gauls, que serve para todas as matrizes!!

EDIT (TheDark): Tomei a liberdade de indentar o teu código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora