| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 468 人关注过本帖
标题:[求助]VC++软件设置的问题[附完整程序]
只看楼主 加入收藏
crazyrabbit
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:150
专家分:0
注 册:2006-3-15
收藏
 问题点数:0 回复次数:1 
[求助]VC++软件设置的问题[附完整程序]

我做了一个电力方面的程序,用C写的,很简单.
但是不会用VC++,我用的是VC6.0.程序通过运行,没有错误.
可是不能单步运行.是不是VC6.0设置有问题啊.
每次F11到printf("")时,就弹框.
请大侠帮忙调试一下.先谢了!
在线等啊.


/*
* 输入文件要求:节点数不包括0节点,支路可包含0支路且允许有重复
* 的并联支路,所有参数均为标幺值,计算短路电流各节点电压近似取1
*/
#include "stdio.h"
#include "stdlib.h"
#include <conio.h>
#include <string.h>
int main(int argc,char * argv[])
{
float **y=NULL,**yy=NULL,**z=NULL;
char filename[20];
int num[3]; /*num[0]节点数(不包括参考节点,参考节点用0表示),
*num[1]短路节点, num[2]为Y矩阵上三角非0互导纳个数。
*/

//参数说明:y为导纳的对角线元素,yy为导纳的非对角线非零元素,
//ynum为互导纳的大小,n为不包括参考节点的节点数,z用来保存计算所得
//阻抗矩阵,s为短路节电的标号
void readFile(float ***y,float ***yy,int num[3],char*);
void getZ(float ***y,float ***yy,float ***z,int n,int ynum,int s);
void output(float ***z,float ***yy,int n,int ynum,int s);

if(argc<=1)
{
printf("输入文件名:");
scanf("%s",filename) ;
}
else
strcpy(filename,argv[1]);

readFile(&y,&yy,num,filename);
getZ(&y,&yy,&z,num[0],num[2],num[1]);
output(&z,&yy,num[0],num[2],num[1]);
return 0;
}


//--------------------------------------------------------------------------------------
//输入并求Y矩阵
//--------------------------------------------------------------------------------------
/*读取数据,并消除重复的记录,并求Y矩阵*/
void readFile(float ***y,float ***yy,int num[3],char* filename)
{
FILE *fp;
int i,j,k,n,n2=0,prej=0;
float real,imag,m,**p,**Y,**YY; /*p指向输入缓存区,Y指向Y矩阵首址*/
int search(float **p,int k,int i,int len);
printf("\n");
if((fp=fopen(filename,"r+"))==NULL)
{
printf("文件不能打开\n");
exit(0);
}
fscanf(fp,"%d %d %d",&num[0],&n2,&num[1]);
p=(float**)malloc(n2*sizeof(float*));
for(i=0;i<n2&&!feof(fp);i++)
{
p[i]=(float*)malloc(4*sizeof(float));
fscanf(fp,"%f %f %f %f",&p[i][0],&p[i][1],&p[i][2],&p[i][3]); /*角标i,j 数据的实部,虚部*/
}
num[2]=n2;
for(i=0;i<n2;i++)
{
if(p[i][0]==0||p[i][1]==0) num[2]--;
for(j=i+1;j<n2;j++)
{
if(p[j][0]==p[i][0]&&p[j][1]==p[i][1]||p[j][0]==p[i][1]&&p[j][1]==p[i][0])
{
m=(p[j][2]+p[i][2])*(p[j][2]+p[i][2])+(p[j][3]+p[i][3])*(p[j][3]+p[i][3]);
real=(p[j][2]*p[i][2]-p[j][3]*p[i][3])*(p[j][2]+p[i][2])+(p[j][2]*p[i][3]+p[j][3]*p[i][2])*(p[j][3]+p[i][3]);
imag=(p[j][2]*p[i][3]+p[j][3]*p[i][2])*(p[j][2]+p[i][2])-(p[j][2]*p[i][2]-p[j][3]*p[i][3])*(p[j][3]+p[i][3]);
p[i][2]=real/m; p[i][3]=imag/m;
p[j][0]=p[n2-1][0]; p[j][1]=p[n2-1][1];
p[j][2]=p[n2-1][2]; p[j][3]=p[n2-1][3];
n2--; num[2]--;
free(p[n2]);
}
}
}
fclose(fp);

/*求Y矩阵*/
Y=(float**)malloc(num[0]*sizeof(float*)); /*自导纳*/
YY=(float**)malloc(num[2]*sizeof(float*)); /*互导纳*/
j=0; /*指针YY位置*/
m=0; /*记录比i大的节点脚标*/

system("cls");
printf("节点导纳矩阵为:\n");

for(i=1;i<=num[0];i++)
{
k=0; /*指针p位置*/
n=0;
Y[i-1]=(float*)malloc(2*sizeof(float)); /* i节点自导纳实部,虚部*/
Y[i-1][0]=0; Y[i-1][1]=0;
while((n2-k)>0)
{
if((n=search(p,k,i,n2))>=0)
{
real=p[n][2]/(p[n][2]*p[n][2]+p[n][3]*p[n][3]);
imag=-p[n][3]/(p[n][2]*p[n][2]+p[n][3]*p[n][3]);
Y[i-1][0]+=real; Y[i-1][1]+=imag;
if((m=p[n][0])>i||(m=p[n][1])>i)
{
YY[j]=(float*)malloc(4*sizeof(float));
YY[j][0]=(float)i-1; YY[j][1]=m-1; YY[j][2]=-real; YY[j][3]=-imag;
j++;
}
}
else break;
k=(n+1);
}
/*输出y矩阵*/
m=0;
printf("Y%d%d=%.4f",i,i,Y[i-1][0]);
if(Y[i-1][1]>=0)printf("+");
printf("%.4fj\t",Y[i-1][1]);
for(n=prej;n<j;n++)
{
m+=1;
if((int)m%3==0) printf("\n");
printf("Y%.0f%.0f=%.4f",YY[n][0]+1,YY[n][1]+1,YY[n][2]);
if(YY[n][3]>=0)printf("+");
printf("%.4fj\t",YY[n][3]);
}
prej=j;
printf("\n");
}
printf("\n");
num[2]=j;
*y=Y; *yy=YY;

for(i=0;i<n2;i++) free(p[i]);
free(p);
}

int search(float **pp,int k,int i,int len) /* p指向查找首地址,len为p的长度*/
{
int j;
for(j=k;j<len;j++)
{
if(pp[j][0]==i||pp[j][1]==i) return j;
}
return -1;
}
//--------------------------------------------------------------------------------------
//Y矩阵求完
//--------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------
//求Z矩阵
//--------------------------------------------------------------------------------------
void getZ(float ***Y,float ***YY,float ***Z,int n,int ynum,int s)
{
float **f,sumReal,sumIm;//存放因子表中的u
float **y=*Y;
float **yy=*YY;
float **z=NULL;
int prek=0,i,j,k;
struct u
{
int i;
int j;
float real;
float im;
struct u *next;
struct u *pre;
} *head,*myu,*ui,*uj;
head=NULL;myu=NULL;ui=NULL;uj=NULL;
z=(float **)malloc(sizeof(float*)*n);
for(i=0;i<n;i++)
{
z[i]=(float*)malloc(sizeof(float)*2);
sumReal=0;sumIm=0;myu=head;
while(myu!=NULL&&myu->i<i)
{
if(myu->j==i)
{
sumReal+=(myu->real*myu->real-myu->im*myu->im)*y[myu->i][0]-2*myu->real*myu->im*y[myu->i][1];
sumIm+= (myu->real*myu->real-myu->im*myu->im)*y[myu->i][1]+2*myu->real*myu->im*y[myu->i][0];
}
myu=myu->next;
}
y[i][0]=y[i][0]-sumReal;
y[i][1]=y[i][1]-sumIm;//保存dii

for(j=i+1;j<n;j++)
{
sumReal=0;sumIm=0;myu=head;ui=NULL;uj=NULL;
while(myu!=NULL&&myu->i<i)
{
if(myu->j==i) ui=myu;
else if(myu->j==j) uj=myu;
if(uj!=NULL&&ui!=NULL&&ui->i==uj->i)
if(y[ui->i][0]!=0||y[ui->i][1]!=0)
{
sumReal+=-(ui->real*uj->real-ui->im*uj->im)*y[ui->i][0]-(ui->im*uj->real+ui->real*uj->im)*y[ui->i][1];
sumIm+= - (ui->real*uj->real-ui->im*uj->im)*y[ui->i][1]+(ui->im*uj->real+ui->real*uj->im)*y[ui->i][0];
}
myu=myu->next;
}

for(k=prek;k<ynum&&yy[k][0]<=i;k++)
if(yy[k][0]==i&&yy[k][1]==j)
{sumReal+=yy[k][2];sumIm+=yy[k][3];break;}
prek=k;
if(sumReal!=0||sumIm!=0)
{
myu=(struct u*)malloc(sizeof(struct u));
myu->next=NULL;
myu->i=i;myu->j=j;
myu->real=(sumReal*y[i][0]+sumIm*y[i][1])/(y[i][0]*y[i][0]+y[i][1]*y[i][1]);
myu->im=(sumIm*y[i][0]-sumReal*y[i][1])/(y[i][0]*y[i][0]+y[i][1]*y[i][1]);
if(head==NULL)
{
head=myu;
myu->next=NULL;
myu->pre=myu;
}
else
{
head->pre->next=myu;
myu->pre=head->pre;
head->pre=myu;
}
}
}
}//求得因子表

if(head==NULL)
{
z[s][0]=y[s-1][0]/(y[s-1][0]*y[s-1][0]+y[s-1][1]*y[s-1][1]);
z[s-1][1]=-y[s-1][1]/(y[s-1][0]*y[s-1][0]+y[s-1][1]*y[s-1][1]);
}
else
{
f=(float**)malloc((n-s+1)*sizeof(float*));
f[0]=(float *)malloc(2*sizeof(float));
f[0][0]=1;
f[0][1]=0;
ui=head;while(ui!=NULL&&ui->i<s-1){ui=ui->next;}
for(i=1;i<=n-s;i++)
{
myu=ui;sumReal=0;sumIm=0;
f[i]=(float *)malloc(2*sizeof(float));
while(myu!=NULL&&myu->i<i+s-1)
{
if(myu->j==i+s-1)
{
sumReal+=myu->im*f[myu->i-s+1][1]-myu->real*f[myu->i-s+1][0];
sumIm +=-myu->real*f[myu->i-s+1][1]-myu->im*f[myu->i-s+1][0];
}
myu=myu->next;
}
f[i][0]=sumReal;f[i][1]=sumIm;
}//求得f矩阵

myu=head->pre; head->pre=NULL;
for(i=n-1;i>=0;i--)
{
sumReal=0;sumIm=0;

while(myu!=NULL&&myu->i==i)
{
if(myu->j>=i+1)
{
sumReal+=myu->real*z[myu->j][0]-myu->im*z[myu->j][1];
sumIm +=myu->real*z[myu->j][1]+myu->im*z[myu->j][0];
}
myu=myu->pre;
}
if(i<s-1){z[i][0]=-sumReal;z[i][1]=-sumIm;}
else
{
z[i][0]=(y[i][0]*f[i-s+1][0]+y[i][1]*f[i-s+1][1])/(y[i][0]*y[i][0]+y[i][1]*y[i][1])-sumReal;
z[i][1]=(y[i][0]*f[i-s+1][1]-y[i][1]*f[i-s+1][0])/(y[i][0]*y[i][0]+y[i][1]*y[i][1])-sumIm;
}
}
}//求得Z矩阵

for(i=0;i<n;i++)free(y[i]);
free(y);
while(head!=NULL)
{
ui=head;
head=head->next;
free(ui);
}
*Z=z;
}

//--------------------------------------------------------------------------------------
//Z矩阵求完
//--------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------
//计算短路电流,各节点电压,支路电流,并输出
//--------------------------------------------------------------------------------------
void output(float ***Z,float ***YY,int n,int ynum,int s)
{
float **V;
float **z=*Z;
float **yy=*YY;
float I_real=0,I_im=0;
float If[2];
int i=0,j=1;
V=(float **)malloc(sizeof(float*)*(n+1));
V[0]=(float*)malloc(sizeof(float)*2);
V[0][0]=0;V[0][1]=0;
If[0]=z[s-1][0] /(z[s-1][0]*z[s-1][0]+z[s-1][1]*z[s-1][1]);
If[1]=-z[s-1][1] /(z[s-1][0]*z[s-1][0]+z[s-1][1]*z[s-1][1]);
printf("故障点电流If=%.4f",If[0]);
if(If[1]>=0)printf("+");
printf("%.4fj\n\n各节点电压为:\n",If[1]);
for(i=1;i<=n;i++)
{
V[i]=(float*)malloc(sizeof(float)*2);
if(i==s){V[i][0]=V[i][1]=0;continue;}
V[i][0]=1-z[i-1][0]*If[0]+z[i-1][1]*If[1];
V[i][1]= -z[i-1][0]*If[1]-z[i-1][1]*If[0];
printf("V%d=%.4f",i,V[i][0]);
if(V[i][1]>=0)printf("+");
printf("%.4fj\t",V[i][1]);
if(j%3==0)printf("\n");
j++;
}

for(i=0;i<n;i++)free(z[i]);
free(z);
printf("\n\n各支路电流为:\n");
for(i=0;i<ynum;i++)
{
I_real=(V[(int)yy[i][0]+1][1]-V[(int)yy[i][1]+1][1])*yy[i][3]-(V[(int)yy[i][0]+1][0]-V[(int)yy[i][1]+1][0])*yy[i][2];
I_im=-(V[(int)yy[i][0]+1][1]-V[(int)yy[i][1]+1][1])*yy[i][2]-(V[(int)yy[i][0]+1][0]-V[(int)yy[i][1]+1][0])*yy[i][3];
printf("I%d%d=%.4f",(int)yy[i][0]+1,(int)yy[i][1]+1,I_real);
if(I_im>=0)printf("+");
printf("%.4fj\t",I_im);
if((i+1)%3==0)printf("\n");
free(yy[i]);
}
free(yy);
for(i=0;i<=n;i++)free(V[i]);
free(V);

}
//--------------------------------------------------------------------------------------
//短路电流,各节点电压,支路电流计算完
//--------------------------------------------------------------------------------------

[此贴子已经被作者于2006-12-8 13:04:35编辑过]

搜索更多相关主题的帖子: 软件 
2006-12-08 13:03
crazyrabbit
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:150
专家分:0
注 册:2006-3-15
收藏
得分:0 
没有检查出来哪里错了,
可是就没有结果呢.
磁盘文件调用怎么用的啊.
急...........

http://www./bbs/boke.asp?crazyrabbit.index.html 欢迎大家来此讨论问题!
2006-12-08 14:25
快速回复:[求助]VC++软件设置的问题[附完整程序]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026958 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved