Conan ama Lana
27-06-2003, 09:50
Qualcuno potrebbe gentilmente compilarmi questo codice sorgente in ANSI-C per un programmino che calcola le velocità critiche di un rotore con il metodo di PRHOL ?
Mi serve urgentemente ma non ho idea di come si faccia?
Grazie mille!
Ovviamente verrete ricompensati!
Per favore non chiudetemi questo topic almeno x qualche ora è una cosa veramente vitale! Grazie!
Attenzione: le righine all'inizio e alla fine toglietele! Il file si chiamava PROHL.C
---------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define max 150 //numero max di stazioni
// registrabili le prime 20 velocit… critiche
double OM,OM1,OM2,H,l[max],m[max],FI[max],V[20];
char L,N,jj;
const double PGR=3.141592654;
const double E=2100000000.*9.81;
void Stampa(void);
void Scritta(void);
void Disegnino(void);
void Visualizza_Dati(void);
void Inserimento_Dati(void);
void Visualizza_Vcrit(void);
void CreaMatrice(double mat[4][4],int a,int b);
void main()
{
char corretto,segno,segnop,fine,siono;
double A1[4][4],A2[4][4],S;
int ch;
//Valori di default sono quelli della tavola 9 però l'uso degli indici è quello
//dei lucidi del corso, quindi l[n] è la lunghezza del tratto che separa la
//stazione n dalla n+1 e FI[n] il diametro del tratto di collegamento tra
//la stazione n e la n+1. Invece nella stampata a video e nella stampa è usata
//la notazione secondo cui l[n] è la lunghezza del tratto che separa la
//stazione n dalla n-1 e FI[n] il diametro del tratto di collegamento tra
//la stazione n e la n-1
//
OM1=5; OM2=1000; H=1; N=11; L=3;
m[0]=.562; l[0]=.103; FI[0]=.042;
m[1]=1.125; l[1]=.103; FI[1]=.052;
m[2]=1.342; l[2]=.092; FI[2]=.06;
m[3]=6.064; l[3]=.132; FI[3]=.147;
m[4]=16.838; l[4]=.175; FI[4]=.147;
m[5]=31.; l[5]=.152; FI[5]=.06;
m[6]=14.378; l[6]=.108; FI[6]=.127;
m[7]=7.023; l[7]=.025; FI[7]=.052;
m[8]=7.323; l[8]=.155; FI[8]=.05;
m[9]=1.959; l[9]=.06; FI[9]=.052;
m[10]=1.371; l[10]=.094; FI[10]=.052;
m[11]=.618;
fine=1;
while(fine)
{
jj=0;
corretto=1;
clrscr();
Scritta();
while(corretto)
{
Disegnino();
Inserimento_Dati();
clrscr();
Visualizza_Dati();
siono=1;
while(siono)
{
printf("Sono esatti i dati? s/n: ");
fflush(stdin);
ch = getc(stdin); /* accetta la selezione dalla tastiera */
fflush(stdin);
if((ch=='s')||(ch=='S')||(ch=='n')||(ch=='N')) siono=0;
} /*siono*/
if((ch=='s')||(ch=='S'))corretto=0;
} /*corretto*/
OM=OM1;
while(OM<=OM2)
{
CreaMatrice(A1,L,0);
CreaMatrice(A2,N,L);
if(L==0)
S=A2[0][1]*A2[3][2]-A2[0][2]*A2[3][1];
else
if(L==N)
S=A1[0][0]*A1[1][1]-A1[0][1]*A1[1][0];
else
{
S= A1[0][0]*(A2[0][1]*A1[1][1]+A2[0][3]*A1[3][1])*A2[3][2];
S=S-A1[0][0]*(A2[3][1]*A1[1][1]+A2[3][3]*A1[3][1])*A2[0][2];
S=S-A1[0][1]*(A2[0][1]*A1[1][0]+A2[0][3]*A1[3][0])*A2[3][2];
S=S+A1[0][1]*(A2[3][1]*A1[1][0]+A2[3][3]*A1[3][0])*A2[0][2];
}
if(OM==OM1) //la prima volta
if(S>=0) segno=1;
else segno=0;
else //dopo la prima volta
{
segnop=segno;
if(S>=0) segno=1;
else segno=0;
if(segno!=segnop)
{
V[jj]=OM;
jj=jj+1;
}
if(jj==20) OM=OM2; /*forza l'uscita se il vettore delle velocit…*/
/*critiche è pieno*/
}
OM=OM+H;
}/*OM<=OM2*/
Visualizza_Vcrit();
siono=1;
while(siono)
{
printf("\n\nStampare il risultato? s/n: ");
fflush(stdin);
ch = getc(stdin); /* accetta la selezione dalla tastiera */
fflush(stdin);
if((ch=='s')||(ch=='S')||(ch=='n')||(ch=='N')) siono=0;
} /*siono*/
if((ch=='s')||(ch=='S')) Stampa();
siono=1;
while(siono)
{
printf("\n\nUscire? s/n: ");
fflush(stdin);
ch = getc(stdin); /* accetta la selezione dalla tastiera */
fflush(stdin);
if((ch=='s')||(ch=='S')||(ch=='n')||(ch=='N')) siono=0;
} /*siono*/
if((ch=='s')||(ch=='S')) fine=0;
}/*fine*/
}/*main*/
double ins_double(double defa)
{
int sal; /*indica il numero di elementi salvati da sscanf */
char str[80];
double x;
printf("[%f] ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%lf", &x);
fflush(stdin);/*in caso di input errato*/
while(!(sal==1))
{
printf("Riprova[%g]: ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%lf", &x);
fflush(stdin);/*in caso di input errato*/
}
return x;
}
int ins_int(int defa)
{
int sal; /*indica il numero di elementi salvati da sscanf */
char str[80];
int x;
printf("[%d] ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%d", &x);
fflush(stdin);/*in caso di input errato*/
while(!(sal==1))
{
printf("Riprova[%d]: ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%d", &x);
fflush(stdin);/*in caso di input errato*/
}
return x;
}
void Disegnino(void)
{
printf("\n\n"
" 0 1 2 ... L-1 L ... N-1 N \n"
" \n"
" O------O-------O---//-----O-------O------//-------O-------O \n"
" l1 l2 lL lN \n"
" / / \n"
" / / \n"
" (stazione primo appoggio) (stazione secondo appoggio) \n") ;
}
void Visualizza_Dati(void)
{
char i;
printf("\n\n"
"\tÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
"\t³ TABELLA RIASSUNTIVA ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Numero delle stazioni : %2d ³\n"
"\t³ Stazione del primo appoggio : %2d ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Stazione ³ Distanza [m] ³ Diametro [m] ³ Massa [Kg] ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n",N+1,L);
for(i=0;i<=N;i++)
if(i==0)printf(""
"\t³ %2d ³ ---- ³ ---- ³ %10.3f ³\n",i,m[i]);
else
printf(""
"\t³ %2d ³ %10.3f ³ %10.3f ³ %10.3f ³\n"
"",i,l[i-1],FI[i-1],m[i]);
printf(""
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Intervallo di calcolo : %10.3f -%10.3f rad/s ³\n"
"\t³ Incremento di velocit…: %10.3f rad/s ³\n"
"\tÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
"",OM1,OM2,H);
}
void Inserimento_Dati(void)
{
double dato;
int i,a;
printf("\n\nInserire N, numero delle stazioni: ");
do
a=ins_int(N);
while( !( a>0 && a<=max ) );
N=a;
printf("Inserire L, numero della stazione del primo appoggio: ");
do
a=ins_int(L);
while( !( a>=0 && a<=max ) );
L=a;
for(i=0;i<=N;i++)
{
printf("\nInserire massa [Kg] per la stazione %d: ",i);
do
dato=ins_double(m[i]);
while( !( dato>.0 && dato<=1e38 ) );
m[i]=dato;
if(i!=0) //per la stazione 0 non occorrono FI e l
{
printf("Inserire distanza [m] tra la stazione %d e la %d: ",i,i-1);
do
dato=ins_double(l[i-1]);
while( !( dato>.0 && dato<=1e38 ) );
l[i-1]=dato;
printf("Inserire diametro del rotore [m] tra la stazione %d e la %d: ",i,i-1);
do
dato=ins_double(FI[i-1]);
while( !( dato>.0 && dato<=1e38 ) );
FI[i-1]=dato;
}
}
printf("\nInserire velocit… angolare iniziale [rad/s]: ");
do
dato=ins_double(OM1);
while( !( dato>.0 && dato<=1e38 ) );
OM1=dato;
printf("Inserire velocit… angolare finale [rad/s]: ");
do
dato=ins_double(OM2);
while( !( dato>.0 && dato<=1e38 ) );
OM2=dato;
printf("Inserire incremento velocit… angolare [rad/s]: ");
do
dato=ins_double(H);
while( !( dato>.0 && dato<=1e38 ) );
H=dato;
}
void Visualizza_Vcrit(void)
{
char i;
float h1,h2;
if(jj==0)printf("\nNon ci sono velocit… critiche.");
else
{
if(jj==1)
{
printf("\nC'Š una velocit… critica nell'intervallo considerato.\n");
h1=V[0]-H;h2=V[0];
printf("\nLa velocit… critica Š tra %6.2f e %6.2f rad/s",h1,h2);
h1=h1*9.54929;h2=h2*9.54929;
printf(" (tra %6.1f e %6.1f rpm)",h1,h2);
}
else
{
printf("\nCi sono %d velocit… critiche nell'intervallo considerato.\n",jj);
for(i=0;i<jj;i++)
{
h1=V[i]-H;h2=V[i];
printf("\nVelocit… critica %d tra %6.2f e %6.2f rad/s",i+1,h1,h2);
h1=h1*9.54929;h2=h2*9.54929;
printf(" (tra %6.1f e %6.1f rpm)",h1,h2);
}
}
}
}
//ad es. con a=4 b=1 restituisce matA = matA4' x matA3 x matA2 x matA1
void CreaMatrice(double mat[4][4],int a,int b)
{
double C[4][4],R[4][4],RP[4][4],I,W;
int ii;
char i,j,k;
for(ii=a-1;ii>=b;ii--)
{
I=pow(FI[ii],4)/64.*PGR;
W=m[ii]*pow(OM,2);
C[0][0]=1.+((pow(l[ii],3)*W)/(6.*E*I)); C[0][1]=-l[ii];
C[0][2]=-(pow(l[ii],3))/(6*E*I); C[0][3]=-(pow(l[ii],2))/(2*E*I);
C[1][0]=-W*pow(l[ii],2)/(2*E*I); C[1][1]=1.;
C[1][2]=pow(l[ii],2)/(2*E*I); C[1][3]=l[ii]/(E*I);
C[2][0]=-W; C[2][1]=0.;
C[2][2]=1.; C[2][3]=0.;
C[3][0]=-W*l[ii]; C[3][1]=0.;
C[3][2]=l[ii]; C[3][3]=1.;
/*
//questa è la matrice che c'è sui lucidi del prof.
//a me non tornano i segni il risultato è però identico
C[0][0]=1.+((pow(l[ii],3)*W)/(6.*E*I));C[0][1]=l[ii];
C[0][2]=-(pow(l[ii],3))/(6*E*I); C[0][3]=-(pow(l[ii],2))/(2*E*I);
C[1][0]=W*pow(l[ii],2)/(2*E*I); C[1][1]=1.;
C[1][2]=-pow(l[ii],2)/(2*E*I); C[1][3]=-l[ii]/(E*I);
C[2][0]=-W; C[2][1]=0.;
C[2][2]=1.; C[2][3]=0.;
C[3][0]=-W*l[ii]; C[3][1]=0.;
C[3][2]=l[ii]; C[3][3]=1.; */
if(ii==a-1) //al primo passaggio inizializza la matrce RP
for(j=0;j<=3;j++)
for(k=0;k<=3;k++) RP[j][k]=C[j][k];
else
{
for(i=0;i<=3;i++) //matR=0
for(j=0;j<=3;j++) R[i][j]=0;
for(i=0;i<=3;i++) // matR=matRP*matC
for(k=0;k<=3;k++)
for(j=0;j<=3;j++) R[i][k]=R[i][k]+RP[i][j]*C[j][k];
for(i=0;i<=3;i++)
for(j=0;j<=3;j++) RP[i][j]=R[i][j];
}
}
//questa è la matrice che trasforma le caratterstiche di sollecitazione
//da sinistra a destra dell'ultima sezione considerata
C[0][0]=1; C[0][1]=0.;
C[0][2]=0.; C[0][3]=0.;
C[1][0]=0.; C[1][1]=1.;
C[1][2]=0.; C[1][3]=0.;
C[2][0]=-m[a]*pow(OM,2); C[2][1]=0.;
C[2][2]=1.; C[2][3]=0.;
C[3][0]=0.; C[3][1]=0.;
C[3][2]=0.; C[3][3]=1.;
for(i=0;i<=3;i++) //matR=0
for(j=0;j<=3;j++) R[i][j]=0;
for(i=0;i<=3;i++) // matR=matC*matRP
for(k=0;k<=3;k++)
for(j=0;j<=3;j++) R[i][k]=R[i][k]+C[i][j]*RP[j][k];
for(i=0;i<=3;i++)
for(j=0;j<=3;j++) mat[i][j]=R[i][j];
}
void Scritta(void)
{
clrscr();
printf(""
"\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n"
"\tº º\n"
"\tº PROGRAMMA PER IL CALCOLO DELLE VELOCITA' º\n"
"\tº CRITICHE DI UN ROTORE CON IL METODO º\n"
"\tº DI PROHL SEMPLIFICATO º\n"
"\tº º\n"
"\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n");
}
void Stampa(void)
{
char i;
fprintf(stdprn,"\n"
"\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n"
"\tº º\n"
"\tº PROGRAMMA PER IL CALCOLO DELLE VELOCITA' º\n"
"\tº CRITICHE DI UN ROTORE CON IL METODO º\n"
"\tº DI PROHL SEMPLIFICATO º\n"
"\tº º\n"
"\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n");
fprintf(stdprn,"\n\n"
"\tÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
"\t³ TABELLA RIASSUNTIVA ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Numero delle stazioni : %2d ³\n"
"\t³ Stazione del primo appoggio : %2d ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Stazione ³ Distanza [m] ³ Diametro [m] ³ Massa [Kg] ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n",N+1,L);
for(i=0;i<=N;i++)
if(i==0)fprintf(stdprn,""
"\t³ %2d ³ ---- ³ ---- ³ %10.3f ³\n",i,m[i]);
else
fprintf(stdprn,""
"\t³ %2d ³ %10.3f ³ %10.3f ³ %10.3f ³\n"
"",i,l[i-1],FI[i-1],m[i]);
fprintf(stdprn,""
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Intervallo di calcolo : %10.3f -%10.3f rad/s ³\n"
"\t³ Incremento di velocit…: %10.3f rad/s ³\n"
"\tÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
"",OM1,OM2,H);
if(jj==0)fprintf(stdprn,"\n\n\t Non ci sono velocit… critiche.");
else
{
if(jj==1)
{
fprintf(stdprn,"\n\t C'Š una velocit… critica nell'intervallo considerato.");
fprintf(stdprn,"\n\t La velocit… critica Š tra %6.2f e %6.2f rad/s",V[0]-H,V[0]);
fprintf(stdprn," (tra %6.1f e %6.1f rpm)",(V[0]-H)*9.54929,V[0]*9.54929);
}
else
{
fprintf(stdprn,"\n\t Ci sono %d velocit… critiche nell'intervallo considerato.",jj);
for(i=0;i<jj;i++)
{
fprintf(stdprn,"\n\t Velocit… critica %d tra %6.2f e %6.2f rad/s",i+1,V[i]-H,V[i]);
fprintf(stdprn," (tra %6.1f e %6.1f rpm)",(V[i]-H)*9.5492,V[i]*9.5492);
}
}
}
}
------------------------------------------------------------------
Mi serve urgentemente ma non ho idea di come si faccia?
Grazie mille!
Ovviamente verrete ricompensati!
Per favore non chiudetemi questo topic almeno x qualche ora è una cosa veramente vitale! Grazie!
Attenzione: le righine all'inizio e alla fine toglietele! Il file si chiamava PROHL.C
---------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define max 150 //numero max di stazioni
// registrabili le prime 20 velocit… critiche
double OM,OM1,OM2,H,l[max],m[max],FI[max],V[20];
char L,N,jj;
const double PGR=3.141592654;
const double E=2100000000.*9.81;
void Stampa(void);
void Scritta(void);
void Disegnino(void);
void Visualizza_Dati(void);
void Inserimento_Dati(void);
void Visualizza_Vcrit(void);
void CreaMatrice(double mat[4][4],int a,int b);
void main()
{
char corretto,segno,segnop,fine,siono;
double A1[4][4],A2[4][4],S;
int ch;
//Valori di default sono quelli della tavola 9 però l'uso degli indici è quello
//dei lucidi del corso, quindi l[n] è la lunghezza del tratto che separa la
//stazione n dalla n+1 e FI[n] il diametro del tratto di collegamento tra
//la stazione n e la n+1. Invece nella stampata a video e nella stampa è usata
//la notazione secondo cui l[n] è la lunghezza del tratto che separa la
//stazione n dalla n-1 e FI[n] il diametro del tratto di collegamento tra
//la stazione n e la n-1
//
OM1=5; OM2=1000; H=1; N=11; L=3;
m[0]=.562; l[0]=.103; FI[0]=.042;
m[1]=1.125; l[1]=.103; FI[1]=.052;
m[2]=1.342; l[2]=.092; FI[2]=.06;
m[3]=6.064; l[3]=.132; FI[3]=.147;
m[4]=16.838; l[4]=.175; FI[4]=.147;
m[5]=31.; l[5]=.152; FI[5]=.06;
m[6]=14.378; l[6]=.108; FI[6]=.127;
m[7]=7.023; l[7]=.025; FI[7]=.052;
m[8]=7.323; l[8]=.155; FI[8]=.05;
m[9]=1.959; l[9]=.06; FI[9]=.052;
m[10]=1.371; l[10]=.094; FI[10]=.052;
m[11]=.618;
fine=1;
while(fine)
{
jj=0;
corretto=1;
clrscr();
Scritta();
while(corretto)
{
Disegnino();
Inserimento_Dati();
clrscr();
Visualizza_Dati();
siono=1;
while(siono)
{
printf("Sono esatti i dati? s/n: ");
fflush(stdin);
ch = getc(stdin); /* accetta la selezione dalla tastiera */
fflush(stdin);
if((ch=='s')||(ch=='S')||(ch=='n')||(ch=='N')) siono=0;
} /*siono*/
if((ch=='s')||(ch=='S'))corretto=0;
} /*corretto*/
OM=OM1;
while(OM<=OM2)
{
CreaMatrice(A1,L,0);
CreaMatrice(A2,N,L);
if(L==0)
S=A2[0][1]*A2[3][2]-A2[0][2]*A2[3][1];
else
if(L==N)
S=A1[0][0]*A1[1][1]-A1[0][1]*A1[1][0];
else
{
S= A1[0][0]*(A2[0][1]*A1[1][1]+A2[0][3]*A1[3][1])*A2[3][2];
S=S-A1[0][0]*(A2[3][1]*A1[1][1]+A2[3][3]*A1[3][1])*A2[0][2];
S=S-A1[0][1]*(A2[0][1]*A1[1][0]+A2[0][3]*A1[3][0])*A2[3][2];
S=S+A1[0][1]*(A2[3][1]*A1[1][0]+A2[3][3]*A1[3][0])*A2[0][2];
}
if(OM==OM1) //la prima volta
if(S>=0) segno=1;
else segno=0;
else //dopo la prima volta
{
segnop=segno;
if(S>=0) segno=1;
else segno=0;
if(segno!=segnop)
{
V[jj]=OM;
jj=jj+1;
}
if(jj==20) OM=OM2; /*forza l'uscita se il vettore delle velocit…*/
/*critiche è pieno*/
}
OM=OM+H;
}/*OM<=OM2*/
Visualizza_Vcrit();
siono=1;
while(siono)
{
printf("\n\nStampare il risultato? s/n: ");
fflush(stdin);
ch = getc(stdin); /* accetta la selezione dalla tastiera */
fflush(stdin);
if((ch=='s')||(ch=='S')||(ch=='n')||(ch=='N')) siono=0;
} /*siono*/
if((ch=='s')||(ch=='S')) Stampa();
siono=1;
while(siono)
{
printf("\n\nUscire? s/n: ");
fflush(stdin);
ch = getc(stdin); /* accetta la selezione dalla tastiera */
fflush(stdin);
if((ch=='s')||(ch=='S')||(ch=='n')||(ch=='N')) siono=0;
} /*siono*/
if((ch=='s')||(ch=='S')) fine=0;
}/*fine*/
}/*main*/
double ins_double(double defa)
{
int sal; /*indica il numero di elementi salvati da sscanf */
char str[80];
double x;
printf("[%f] ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%lf", &x);
fflush(stdin);/*in caso di input errato*/
while(!(sal==1))
{
printf("Riprova[%g]: ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%lf", &x);
fflush(stdin);/*in caso di input errato*/
}
return x;
}
int ins_int(int defa)
{
int sal; /*indica il numero di elementi salvati da sscanf */
char str[80];
int x;
printf("[%d] ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%d", &x);
fflush(stdin);/*in caso di input errato*/
while(!(sal==1))
{
printf("Riprova[%d]: ",defa);
gets(str);
if(str[0]=='\x0')return defa;
sal=sscanf(str, "%d", &x);
fflush(stdin);/*in caso di input errato*/
}
return x;
}
void Disegnino(void)
{
printf("\n\n"
" 0 1 2 ... L-1 L ... N-1 N \n"
" \n"
" O------O-------O---//-----O-------O------//-------O-------O \n"
" l1 l2 lL lN \n"
" / / \n"
" / / \n"
" (stazione primo appoggio) (stazione secondo appoggio) \n") ;
}
void Visualizza_Dati(void)
{
char i;
printf("\n\n"
"\tÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
"\t³ TABELLA RIASSUNTIVA ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Numero delle stazioni : %2d ³\n"
"\t³ Stazione del primo appoggio : %2d ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Stazione ³ Distanza [m] ³ Diametro [m] ³ Massa [Kg] ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n",N+1,L);
for(i=0;i<=N;i++)
if(i==0)printf(""
"\t³ %2d ³ ---- ³ ---- ³ %10.3f ³\n",i,m[i]);
else
printf(""
"\t³ %2d ³ %10.3f ³ %10.3f ³ %10.3f ³\n"
"",i,l[i-1],FI[i-1],m[i]);
printf(""
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Intervallo di calcolo : %10.3f -%10.3f rad/s ³\n"
"\t³ Incremento di velocit…: %10.3f rad/s ³\n"
"\tÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
"",OM1,OM2,H);
}
void Inserimento_Dati(void)
{
double dato;
int i,a;
printf("\n\nInserire N, numero delle stazioni: ");
do
a=ins_int(N);
while( !( a>0 && a<=max ) );
N=a;
printf("Inserire L, numero della stazione del primo appoggio: ");
do
a=ins_int(L);
while( !( a>=0 && a<=max ) );
L=a;
for(i=0;i<=N;i++)
{
printf("\nInserire massa [Kg] per la stazione %d: ",i);
do
dato=ins_double(m[i]);
while( !( dato>.0 && dato<=1e38 ) );
m[i]=dato;
if(i!=0) //per la stazione 0 non occorrono FI e l
{
printf("Inserire distanza [m] tra la stazione %d e la %d: ",i,i-1);
do
dato=ins_double(l[i-1]);
while( !( dato>.0 && dato<=1e38 ) );
l[i-1]=dato;
printf("Inserire diametro del rotore [m] tra la stazione %d e la %d: ",i,i-1);
do
dato=ins_double(FI[i-1]);
while( !( dato>.0 && dato<=1e38 ) );
FI[i-1]=dato;
}
}
printf("\nInserire velocit… angolare iniziale [rad/s]: ");
do
dato=ins_double(OM1);
while( !( dato>.0 && dato<=1e38 ) );
OM1=dato;
printf("Inserire velocit… angolare finale [rad/s]: ");
do
dato=ins_double(OM2);
while( !( dato>.0 && dato<=1e38 ) );
OM2=dato;
printf("Inserire incremento velocit… angolare [rad/s]: ");
do
dato=ins_double(H);
while( !( dato>.0 && dato<=1e38 ) );
H=dato;
}
void Visualizza_Vcrit(void)
{
char i;
float h1,h2;
if(jj==0)printf("\nNon ci sono velocit… critiche.");
else
{
if(jj==1)
{
printf("\nC'Š una velocit… critica nell'intervallo considerato.\n");
h1=V[0]-H;h2=V[0];
printf("\nLa velocit… critica Š tra %6.2f e %6.2f rad/s",h1,h2);
h1=h1*9.54929;h2=h2*9.54929;
printf(" (tra %6.1f e %6.1f rpm)",h1,h2);
}
else
{
printf("\nCi sono %d velocit… critiche nell'intervallo considerato.\n",jj);
for(i=0;i<jj;i++)
{
h1=V[i]-H;h2=V[i];
printf("\nVelocit… critica %d tra %6.2f e %6.2f rad/s",i+1,h1,h2);
h1=h1*9.54929;h2=h2*9.54929;
printf(" (tra %6.1f e %6.1f rpm)",h1,h2);
}
}
}
}
//ad es. con a=4 b=1 restituisce matA = matA4' x matA3 x matA2 x matA1
void CreaMatrice(double mat[4][4],int a,int b)
{
double C[4][4],R[4][4],RP[4][4],I,W;
int ii;
char i,j,k;
for(ii=a-1;ii>=b;ii--)
{
I=pow(FI[ii],4)/64.*PGR;
W=m[ii]*pow(OM,2);
C[0][0]=1.+((pow(l[ii],3)*W)/(6.*E*I)); C[0][1]=-l[ii];
C[0][2]=-(pow(l[ii],3))/(6*E*I); C[0][3]=-(pow(l[ii],2))/(2*E*I);
C[1][0]=-W*pow(l[ii],2)/(2*E*I); C[1][1]=1.;
C[1][2]=pow(l[ii],2)/(2*E*I); C[1][3]=l[ii]/(E*I);
C[2][0]=-W; C[2][1]=0.;
C[2][2]=1.; C[2][3]=0.;
C[3][0]=-W*l[ii]; C[3][1]=0.;
C[3][2]=l[ii]; C[3][3]=1.;
/*
//questa è la matrice che c'è sui lucidi del prof.
//a me non tornano i segni il risultato è però identico
C[0][0]=1.+((pow(l[ii],3)*W)/(6.*E*I));C[0][1]=l[ii];
C[0][2]=-(pow(l[ii],3))/(6*E*I); C[0][3]=-(pow(l[ii],2))/(2*E*I);
C[1][0]=W*pow(l[ii],2)/(2*E*I); C[1][1]=1.;
C[1][2]=-pow(l[ii],2)/(2*E*I); C[1][3]=-l[ii]/(E*I);
C[2][0]=-W; C[2][1]=0.;
C[2][2]=1.; C[2][3]=0.;
C[3][0]=-W*l[ii]; C[3][1]=0.;
C[3][2]=l[ii]; C[3][3]=1.; */
if(ii==a-1) //al primo passaggio inizializza la matrce RP
for(j=0;j<=3;j++)
for(k=0;k<=3;k++) RP[j][k]=C[j][k];
else
{
for(i=0;i<=3;i++) //matR=0
for(j=0;j<=3;j++) R[i][j]=0;
for(i=0;i<=3;i++) // matR=matRP*matC
for(k=0;k<=3;k++)
for(j=0;j<=3;j++) R[i][k]=R[i][k]+RP[i][j]*C[j][k];
for(i=0;i<=3;i++)
for(j=0;j<=3;j++) RP[i][j]=R[i][j];
}
}
//questa è la matrice che trasforma le caratterstiche di sollecitazione
//da sinistra a destra dell'ultima sezione considerata
C[0][0]=1; C[0][1]=0.;
C[0][2]=0.; C[0][3]=0.;
C[1][0]=0.; C[1][1]=1.;
C[1][2]=0.; C[1][3]=0.;
C[2][0]=-m[a]*pow(OM,2); C[2][1]=0.;
C[2][2]=1.; C[2][3]=0.;
C[3][0]=0.; C[3][1]=0.;
C[3][2]=0.; C[3][3]=1.;
for(i=0;i<=3;i++) //matR=0
for(j=0;j<=3;j++) R[i][j]=0;
for(i=0;i<=3;i++) // matR=matC*matRP
for(k=0;k<=3;k++)
for(j=0;j<=3;j++) R[i][k]=R[i][k]+C[i][j]*RP[j][k];
for(i=0;i<=3;i++)
for(j=0;j<=3;j++) mat[i][j]=R[i][j];
}
void Scritta(void)
{
clrscr();
printf(""
"\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n"
"\tº º\n"
"\tº PROGRAMMA PER IL CALCOLO DELLE VELOCITA' º\n"
"\tº CRITICHE DI UN ROTORE CON IL METODO º\n"
"\tº DI PROHL SEMPLIFICATO º\n"
"\tº º\n"
"\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n");
}
void Stampa(void)
{
char i;
fprintf(stdprn,"\n"
"\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n"
"\tº º\n"
"\tº PROGRAMMA PER IL CALCOLO DELLE VELOCITA' º\n"
"\tº CRITICHE DI UN ROTORE CON IL METODO º\n"
"\tº DI PROHL SEMPLIFICATO º\n"
"\tº º\n"
"\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n");
fprintf(stdprn,"\n\n"
"\tÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
"\t³ TABELLA RIASSUNTIVA ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Numero delle stazioni : %2d ³\n"
"\t³ Stazione del primo appoggio : %2d ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Stazione ³ Distanza [m] ³ Diametro [m] ³ Massa [Kg] ³\n"
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n",N+1,L);
for(i=0;i<=N;i++)
if(i==0)fprintf(stdprn,""
"\t³ %2d ³ ---- ³ ---- ³ %10.3f ³\n",i,m[i]);
else
fprintf(stdprn,""
"\t³ %2d ³ %10.3f ³ %10.3f ³ %10.3f ³\n"
"",i,l[i-1],FI[i-1],m[i]);
fprintf(stdprn,""
"\tÃÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
"\t³ Intervallo di calcolo : %10.3f -%10.3f rad/s ³\n"
"\t³ Incremento di velocit…: %10.3f rad/s ³\n"
"\tÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
"",OM1,OM2,H);
if(jj==0)fprintf(stdprn,"\n\n\t Non ci sono velocit… critiche.");
else
{
if(jj==1)
{
fprintf(stdprn,"\n\t C'Š una velocit… critica nell'intervallo considerato.");
fprintf(stdprn,"\n\t La velocit… critica Š tra %6.2f e %6.2f rad/s",V[0]-H,V[0]);
fprintf(stdprn," (tra %6.1f e %6.1f rpm)",(V[0]-H)*9.54929,V[0]*9.54929);
}
else
{
fprintf(stdprn,"\n\t Ci sono %d velocit… critiche nell'intervallo considerato.",jj);
for(i=0;i<jj;i++)
{
fprintf(stdprn,"\n\t Velocit… critica %d tra %6.2f e %6.2f rad/s",i+1,V[i]-H,V[i]);
fprintf(stdprn," (tra %6.1f e %6.1f rpm)",(V[i]-H)*9.5492,V[i]*9.5492);
}
}
}
}
------------------------------------------------------------------