⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conduct.cpp

📁 清华魏永名miniGUI dos下的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			    	    
			    	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 + -