📄 conduct.cpp
字号:
DialogBoxParam(NULL, &InputDlgHeader, InputBoxProc, (LPSTR)(iIndex));
SortAndAddItems(pDlgHeader, IDC_TABLE);
return DEFAULT;
default:
return DEFAULT;
}
break;
default:
return DEFAULT;
}
return DEFAULT;
}
/*
* Function: int FAR ConductMainGUIProc( PGUIINFO pGUIInfo, UINT uMsg, WPARAM wParam, LPARAM lParam)
* The main procedure that process GUI messages.
* Parameters:
* Return:
*/
int FAR ConductMainGUIProc( PGUIINFO pGUIInfo, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char szFileName[_MAX_PATH + 1];
FILE* fp;
OPENFILEBOX OpenFileBox;
char szText[50];
int i;
switch(uMsg)
{
case MSG_COMMAND:
switch (wParam)
{
case IDM_EXIT:
if(MessageBox(pGUIInfo, "是否确定要退出?", szMsgCaption, MB_YESNO | MB_ICONQUESTION) == IDYES)
PostMessage(pGUIInfo, MSG_DESTROY, 0, 0L);
break;
case IDM_ABOUT:
DialogBoxParam( pGUIInfo, GetSysDlgHeader(IDD_SYSABOUTDLG), SysAboutBoxProc, NULL);
break;
case IDM_OPENDATA:
OpenFileBox.fOpen = TRUE;
OpenFileBox.iInitDrive = iWorkDrive;
OpenFileBox.lpInitDir = szWorkDir;
OpenFileBox.lpExt = "*.dat";
OpenFileBox.lpFileName = (LPSTR)szFileName;
GetSysDlgHeader(IDD_OPENFILEDLG)->spCaption = "文件打开";
DialogBoxParam( pGUIInfo, GetSysDlgHeader(IDD_OPENFILEDLG), OpenBoxProc, (LPSTR)(&OpenFileBox));
// set directory to the default directory.
_chdrive(iWorkDrive);
_chdir(szWorkDir);
if(szFileName[0] == '\0')
break;
if(!(fp = fopen(szFileName,"r")))
break;
fscanf(fp, "%s", snin);
fscanf(fp, "%lg", &Rin);
fscanf(fp, "%d", &n);
for(i = 0;i < n; i++)
fscanf(fp, "%lf %lf %lf %lf", &F[i], &U[i], &UI[i], &Tau[i]);
fclose(fp);
for(i = n; i < MAX_POINT_NR; i++)
{ F[i] = 0; U[i] = 0; UI[i] = 0; Tau[i] = 0;}
fflag = FALSE;
DialogBoxParam( pGUIInfo, &EditDlgHeader, EditBoxProc,(LPSTR)(n));
break;
case IDM_SAVEAS:
OpenFileBox.fOpen = FALSE;
OpenFileBox.iInitDrive = iWorkDrive;
OpenFileBox.lpInitDir = szWorkDir;
OpenFileBox.lpExt = "*.dat";
OpenFileBox.lpFileName = (LPSTR)szFileName;
GetSysDlgHeader(IDD_OPENFILEDLG)->spCaption = "文件另存为";
DialogBoxParam( pGUIInfo, GetSysDlgHeader(IDD_OPENFILEDLG), OpenBoxProc, (LPSTR)(&OpenFileBox));
// set directory to the default directory.
_chdrive(iWorkDrive);
_chdir(szWorkDir);
if(szFileName[0] == '\0')
break;
if (!(fp = fopen (szFileName,"w")))
break;
fprintf(fp, "%s\n", sn);
fprintf(fp, "%lg\n", R);
fprintf(fp, "%2d\n", nPt);
for(i = 0; i < nPt; i++)
fprintf(fp, "%10.2lf %10.2lf %10.4lf %10.2lf\n", dF[i], dU[i], dUI[i], dTau[i]);
fclose(fp);
sflag = TRUE;
break;
case IDM_SAVEDATA:
if(fflag == FALSE)
break;
_chdrive(iWorkDrive);
_chdir(szWorkDir);
sprintf(szFileName,"%s.dat",sn);
if (!(fp = fopen (szFileName,"w")))
break;
fprintf(fp, "%s\n", sn);
fprintf(fp, "%lg\n", R);
fprintf(fp, "%2d\n", nPt);
for(i = 0; i < nPt; i++)
fprintf(fp, "%10.2lf %10.2lf %10.4lf %10.2lf\n", dF[i], dU[i], dUI[i], dTau[i]);
fclose(fp);
sflag = TRUE;
break;
case IDM_WIPEFALSE:
if(nPt == 0||fflag == FALSE)
{
MessageBox(NULL,"请先输入实验数据!","错误信息",MB_OK );
break;
}
if(cflag == FALSE)
{
MessageBox(NULL,"请先处理实验数据!","错误信息",MB_OK );
break;
}
WipeFalse();
break;
case IDM_COMPUTE:
if(nPt == 0||fflag == FALSE)
{
MessageBox(NULL,"请先输入实验数据!","错误信息",MB_OK );
break;
}
Compute();
GraphicOutput(pGUIInfo);
break;
case IDM_NEWDATA:
if(sflag == FALSE)
{ sprintf(szText,"是否保存%s所做的修改?",sn);
if(MessageBox(pGUIInfo, szText, "确认保存", MB_YESNO | MB_ICONQUESTION) == IDYES);
SendMessage(pGUIInfo,MSG_COMMAND,IDM_SAVEDATA,0l);
}
cflag = FALSE;
n = 0;
for(i = 0; i <MAX_POINT_NR; i++)
{
F[i] = 0;
U[i] = 0;
UI[i] = 0;
Tau[i] = 0;
}
DialogBoxParam( pGUIInfo, &EditDlgHeader, EditBoxProc, NULL);
break;
case IDM_EDITDATA:
if (n == 0||fflag == FALSE)
{
MessageBox(NULL,"请先输入实验数据","错误信息",MB_OK);
break;
}
DialogBoxParam( pGUIInfo, &EditDlgHeader, EditBoxProc,(LPSTR)(n));
break;
case IDM_TEACHER:
DialogBoxParam(pGUIInfo, &PasswordHeader, PasswordProc,NULL);
break;
case IDM_NOTEACHER:
tflag = FALSE;
break;
}
break;
default:
break;
}
return DefaultGUIProc(pGUIInfo, uMsg, wParam, lParam);
}
void Compute()
{
double sumG, sumB, sumY, sumGG, sumBB, sumGB, sumGY, sumBY;
double L11, L22, L12, L1y, L2y, Lfenmu;
double a0, a1, a2, Sa0;
double Dest;
double diff1, diff2, diff3, diff4;
int i, iPrev1, iNext1, iPrev2, iNext2;
sumG = sumB = sumY = sumGG = sumBB = sumGB = sumGY = sumBY = Dest = 0;
for(i = 0; i < nPt; i++)
{
sumG += dG[i];
sumB += dB[i];
sumY += dY[i];
sumGG += dG[i]*dG[i];
sumBB += dB[i]*dB[i];
sumGB += dG[i]*dB[i];
sumGY += dG[i]*dY[i];
sumBY += dB[i]*dY[i];
}
L11 = sumGG - sumG*sumG/nPt;
L22 = sumBB - sumB*sumB/nPt;
L12 = sumGB - sumG*sumB/nPt;
L1y = sumGY - sumG*sumY/nPt;
L2y = sumBY - sumB*sumY/nPt;
Lfenmu = L11*L22 - L12*L12;
a1 = (L1y*L22 - L12*L2y)/Lfenmu;
a2 = (L2y*L11 - L12*L1y)/Lfenmu;
a0 = (sumY - a1*sumG - a2*sumB)/nPt;
G0 = a1/2;
B0 = a2/2;
r = sqrt(a0 + G0*G0 + B0*B0);
for(i = 0; i < nPt; i++)
Dest += pow(dY[i] - a0 - a1*dG[i] - a2*dB[i],2);
Sy = sqrt(Dest/(nPt - 3));
SG0 = Sy*sqrt(L22/Lfenmu)/2;
SB0 = Sy*sqrt(L11/Lfenmu)/2;
Sa0 = Sy*sqrt((sumGG*sumBB - sumGB*sumGB)/Lfenmu/nPt);
Sr = sqrt(Sa0*Sa0 + 4*G0*G0*SG0*SG0 + 4*B0*B0*SB0*SB0)/r/2;
DELTA = G0 - r;
SDELTA = sqrt(SG0*SG0 + Sr*Sr);
diff1 = diff2 = diff3 = diff4 = 100;
for(i = 0; i<nPt; i++)
{
if(dB[i] > 0)
{ if(dG[i] < G0 && G0 - dG[i] < diff1)
{ iPrev1 = i;
diff1 = G0 - dG[i];
}
if(dG[i] > G0 && dG[i] - G0 < diff2)
{ iNext1 = i;
diff2 = dG[i] - G0;
}
}
if(dB[i] < 0)
{ if(dG[i] < G0 && G0 - dG[i] < diff3)
{ iPrev2 = i;
diff3 = G0 - dG[i];
}
if(dG[i] > G0 && dG[i] - G0 < diff4)
{ iNext2 = i;
diff4 = dG[i] - G0;
}
}
}
f1 = dF[iPrev1] + (dF[iNext1]-dF[iPrev1]) * (G0-dG[iPrev1]) / (dG[iNext1]-dG[iPrev1]);
f2 = dF[iPrev2] + (dF[iNext2]-dF[iPrev2]) * (G0-dG[iPrev2]) / (dG[iNext2]-dG[iPrev2]);
fs = sqrt(f1*f2);
for(i = 0; i <nPt; i++)
if(dG[i] > Gmax)
Gmax = (int)dG[i];
while(Gmax % 4 != 0)
Gmax++;
Gmax = Gmax / 4;
R1 = 1000/2/r - R;
L1 = (R+R1)/(2*PI*(f2-f1));
C1 = 1000000/(4*PI*PI*f1*f2*L1);
C0 = (B0*(R+R1)*1000)/(2*PI*R1*fs);
Qm = sqrt((L1*1000000)/C1)/R1;
cflag = TRUE;
}
void WipeFalse()
{
int i, j;
double yInCircle;
for(i = 0; i < nPt; i++)
{
if((r*r - (dG[i]-G0)*(dG[i]-G0)) < 0)
{
if((dG[i] - G0) > 0)
yInCircle = dB[i]*dB[i] + pow((G0 + sqrt(r*r - (dB[i]-B0)*(dB[i]-B0))),2);
if((dG[i] - G0) <= 0)
yInCircle = dB[i]*dB[i] + pow((G0 - sqrt(r*r - (dB[i]-B0)*(dB[i]-B0))),2);
if(fabs(dY[i] - yInCircle) > 3 * Sy)
{
for(j = i; j < nPt - 1; j++)
{
dF[j] = dF[j+1];
dU[j] = dU[j+1];
dUI[j] = dUI[j+1];
dTau[j] = dTau[j+1];
dG[j] = dG[j+1];
dB[j] = dB[j+1];
dY[j] = dY[j+1];
}
nPt--;
dF[nPt] = 0;
dU[nPt] = 0;
dUI[nPt] = 0;
dTau[nPt] = 0;
i--;
sflag = FALSE;
}
continue;
}
if((dB[i] - B0) > 0)
yInCircle = dG[i]*dG[i] + pow((B0 + sqrt(r*r - (dG[i]-G0)*(dG[i]-G0))),2);
if((dB[i] - B0) <= 0)
yInCircle = dG[i]*dG[i] + pow((B0 - sqrt(r*r - (dG[i]-G0)*(dG[i]-G0))),2);
if(fabs(dY[i] - yInCircle) > 3 * Sy)
{
for(j = i; j < nPt - 1; j++)
{
dF[j] = dF[j+1];
dU[j] = dU[j+1];
dUI[j] = dUI[j+1];
dTau[j] = dTau[j+1];
dG[j] = dG[j+1];
dB[j] = dB[j+1];
dY[j] = dY[j+1];
}
nPt--;
dF[nPt] = 0;
dU[nPt] = 0;
dUI[nPt] = 0;
dTau[nPt] = 0;
i--;
sflag = FALSE;
}
}
n = nPt;
for(i = 0; i < MAX_POINT_NR ; i++)
{ F[i] = dF[i];
U[i] = dU[i];
UI[i] = dUI[i];
Tau[i] = dTau[i];
}
}
void Convert(double x, double y)
{
int x0 = 30;
int y0 = 140;
double convert;
convert = 115/r;
G = int(x0 + x * convert);
B = int(y0 - y * convert);
}
void GraphicOutput(PGUIINFO pGUIInfo)
{
int i;
char szBuff[200];
SetPtrVis(HIDE);
set_cliprgn(0, 0, vc.numxpixels, vc.numypixels);
_setcolor(BkColor);
_rectangle(_GFILLINTERIOR,0, 0, vc.numxpixels, vc.numypixels);
_setcolor(FgColor);
_moveto(10,140);
_lineto(300,140);
_lineto(295,137);
_moveto(300,140);
_lineto(295,143);
_moveto(30,280);
_lineto(30,10);
_lineto(33,15);
_moveto(30,10);
_lineto(27,15);
Convert(G0,B0);
_moveto(G-3,B);
_lineto(G+3,B);
_moveto(G,B-3);
_lineto(G,B+3);
_ellipse(_GBORDER,G - 115,B - 115,G + 115,B + 115);
for(i = 0; i < nPt; i++)
{
Convert(dG[i],dB[i]);
_setpixel(G,B);
_ellipse(_GBORDER,G - 3,B - 3,G + 3,B + 3);
}
set_color(FgColor);
cc_printf("0",20,145);
cc_printf("g(ms)",290,150);
cc_printf("b(ms)",40,10);
sprintf(szBuff, "G0 = %6.2lf(ms)\nB0 = %6.2lf(ms)\nr = %6.2lf(ms)", G0, B0, r);
cc_printf((LPCSTR)(szBuff),90,70);
cc_printf("f(kHz) U(V) UI(V) τ(μs) g(ms) b(ms)",260,185);
for(i = 0; i<nPt; i++)
{
sprintf(szBuff, "%8.2lf%6.2lf%8.4lf%8.2lf%8.2lf%8.2lf\n", dF[i], dU[i], dUI[i], dTau[i], dG[i], dB[i]);
cc_printf((LPCSTR)(szBuff),240,200+12*i);
}
sprintf(szBuff,"f1 = %6.2lf(kHz)\nf2 = %6.2lf(kHz)\nSG0 = %6.2lf(ms)\nSB0 = %6.2lf(ms)\nSr = %6.2lf(ms)\n\nδ = G0-r = %4.2lf(ms)\nSδ = %6.2lf(ms)", f1,f2,SG0,SB0,Sr,G0-r,SDELTA);
cc_printf((LPCSTR)(szBuff),50,280);
cc_printf("压电元件阻抗导纳圆的测量",260,25);
sprintf(szBuff," 学号:%s\n采样电阻值:%4.2lfΩ",sn,R);
cc_printf((LPCSTR)(szBuff),300,60);
for(i = 1; i <= 4; i++)
{
Convert(i*Gmax,0);
_moveto(G,B-1);
_lineto(G,B+1);
set_color(FgColor);
sprintf(szBuff,"%2d",i*Gmax);
cc_printf((LPCSTR)(szBuff),G-5,B+5);
}
for(i = 1; i <= 2; i++)
{
Convert(0,i*Gmax);
_moveto(G-1,B);
_lineto(G+1,B);
set_color(FgColor);
sprintf(szBuff,"%2d",i*Gmax);
cc_printf((LPCSTR)(szBuff),G-25,B-5);
}
for(i = 1; i <= 2; i++)
{
Convert(0,-i*Gmax);
_moveto(G-1,B);
_lineto(G+1,B);
set_color(FgColor);
sprintf(szBuff,"%2d",-i*Gmax);
cc_printf((LPCSTR)(szBuff),G-25,B-5);
}
if(tflag == TRUE)
{
sprintf(szBuff,"R1 = %6.2lf(Ω)\nfs = %6.2lf(kHz)\nL1 = %6.2lf(mH)\nC1 = %6.2lf(nf)\nC0 = %6.2lf(nf)\nQm = %6.2lf",R1,fs,L1,C1,C0,Qm);
cc_printf((LPCSTR)(szBuff),500,60);
}
int ch;
do
{
ch = _getch();
ch = toupper( ch );
} while( ch != 27 );
PostMessage(pGUIInfo, MSG_NCPAINT, 0, 0L);
PostMessage(pGUIInfo, MSG_ERASEBKGND, (WPARAM)(&pGUIInfo->dc.clientrect), 0L);
SetPtrVis(SHOW);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -