希望有C语言大神帮我看一下这个程序。

运行框中输入以上数据之后,就会出现程序停止运行。这种问题出现的原因是什么?
代码如下,希望有人能帮忙解答。#include "conio.h"#include "stdio.h"#include "math.h"float sub1(float);float sub2(float);void outcome(float *,int);void main(){int j,l,i,L,T;int V[100],month[100];float N,q,fm,V0,V1,H,Z1,Z2,Vz,Vs,Vt,dV,dq,x,f,K,NB,NX;float N1[100][100],N2[100];float V0p[100],qp[100],dqp[100],Np[100];float Q[100];printf("\t\t漫湾水电站兴利调度程序\n");printf("输入阶段数,状态数(格点数),末状态及其他原始数据\n");printf("请输入阶段数T=");scanf("%d",&T);printf("请输入格点数L=");scanf("%d",&L);printf("请输入出力系数K=");scanf("%f",&K);printf("请输入正常库容 亿m3 Vz=");scanf("%f",&Vz);printf("请输入死库容 亿m3 Vs=");scanf("%f",&Vs);printf("请输入保证出力 万KW·h NB=");scanf("%f",&NB);printf("请输入限制出力 万KW·h NX=");scanf("%f",&NX);printf("请输入月来水量 m3/s (按顺序输入,末库容确定的为最后一个月)");for(i=0;i<T;i++)scanf("%f",&Q[i]);printf("请输入对应的月份");for(i=0;i<T;i++)scanf("%d",&month[i]);printf("请输入末状态 亿m3 Vt=");scanf("%f",&Vt);V[T-1]=0;fm=0;f=0;x=0;dV=(Vz-Vs)/L;for(j=T;j>=1;j--){ for(l=0;l<=L;l++) { for(i=0;i<=L;i++) { V0=Vs+dV*l; if(j==T) V1=Vt; else V1=Vs+dV*i; Z1=sub1((V0+V1)/2); q=(V0-V1)/0.0263+Q[j-1]; Z2=sub2(q); H=Z1-Z2; N=K*H*q/10000; N1[l][i]=N; if(N<NB) break; if(N>NX) N1[l][i]=NX; if(j==T) break; if(fm<=(N1[l][i]+N2[i]+f)) { fm=N1[l][i]+N2[i]+f; x=N2[i]+f; V[j-1]=i; } } if(j==1) break; } for(l=0;l<=L;l++) N2[l]=N1[l][V[j-1]]; f=x;}
for(j=1;j<=T;j++){
V0=Vs+dV*V[j-2]; if(j==1) V0=Vs; V1=Vs+dV*V[j-1]; Z1=sub1((V0+V1)/2); q=(V0-V1)/0.0675+Q[j-1]; Z2=sub2(q); H=Z1-Z2; N=K*H*q/10000; dq=0; if(N>NX) { N=NX; dq=q-N/K/H*10000; q=N/K/H*10000; } V0p[j-1]=V0; qp[j-1]=q; dqp[j-1]=dq; Np[j-1]=N;}printf("\t\t\t\t\t漫湾水电站优化调度轨迹线\n");printf("月份\t\t");for(j=1;j<=T;j++)printf("%d\t",month[j-1]);printf("\n");printf("入库流量\t");outcome(Q,T);printf("月初蓄水\t");outcome(V0p,T);printf("发电流量\t");outcome(qp,T);printf("弃水量\t\t");outcome(dqp,T);printf("电站出力\t");outcome(Np,T);printf("电站年出力=%f万kW\n",fm);printf("电站设计中水年年发电量为E=%f亿KW·h\n",(fm*730/10000));getch();}
float sub1(float V){ float z; z=120.26*pow(V,0.0902); return z;}float sub2(float q){ float z; z=56.371*pow(q,0.0251); return z;}void outcome(float *dV,int T){ int j; for(j=1;j<=T;j++) printf("%3.2f\t",dV[j-1]); printf("\n");}

这程序写得,可读性太差了,看着头晕。

调试了下,输入数据停止运行的原因是:数组越界访问了。
...
H=Z1-Z2;
N=K*H*q/10000;
N1[l][i]=N; 到这数组越界了

解决办法有两个:
a) 格点数L, 输入时不要超过100
b) 将相关数组定义得足够大
b-1: 在main函数之前定义一常量
#define SIZE 300 /*你想要多大改多大*/
b-2: 修改main 函数中的这些变量定义语句
int V[100],month[100]; 改为 int V[SIZE],month[SIZE];

float N1[100][100],N2[100];
float V0p[100],qp[100],dqp[100],Np[100];
float Q[100];
改为:
float N1[SIZE][SIZE],N2[SIZE];
float V0p[SIZE],qp[SIZE],dqp[SIZE],Np[SIZE];
float Q[SIZE];
b-3: 最后,修改一下这句,提醒输入不要超限制...
printf("请输入格点数L="); 改为:
printf("请输入格点数L=(最大值:%d)", SIZE);

供你参考。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-03
将各个数组的大小设置为200试试(因为你的L输入了200)