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

Sign in to follow this  
vasco16

Pequena ajuda em c..

Recommended Posts

vasco16

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.