有哪位高手帮我分析一下这个c语言程序 尽量详细
#include<stdio.h>
#include<io.h>
#include<string.h>
#include<stdlib.h>
#define L 5
#define H 20000
int hh;
int hjqs,hjqt;
int dsh;//倒数第几个数
void showa(int m,int n, int sz[][L])
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",sz[i][j]);
}
printf("\n");
}
}
void ftoi(char *lj,int sj[][L])
{
FILE *fp;
char tp[100],*p;
int i,n;
fp=fopen(lj,"r+");
for(n=0;feof(fp)==0;n++)
{
tp[0]=0;
fgets(tp,100,fp);
if(strlen(tp)<2)break;
p=&tp[strlen(tp)];
for(i=1;(*p)!='\t';p--)
{
if((*p)>='0'&&(*p)<='9')
{
sj[n][L-i]=(*p)-'0';
i++;
}
}
}
fclose(fp);
hh=n;
}
int chuxian(int a,int n,int *s)//s数组中最后n个数中是否出现a
{
int i;
for(i=L-n;i<L;i++)
{
if(s[i]==a)return 1;
}
return 0;
}
int fun1(int a,int sj[][L])//在每行的最后 3 个数中最多有连续几行没有出现a
{
int n,nn;
int i,j;
n=nn=0;
for(i=0;i<hh;i++)
{
if(chuxian(a,3,sj[i])==0)nn++;
else
{
if(nn>n)n=nn;
nn=0;
}
}
return n>nn?n:nn;
}
struct tt
{
int a[10];
int an;
};
int mfun2(int sj[][L],int n,int *ii)//从第ii行开始往上统计每行最后一个数共出现n个时再上面一行的所有数是否都是已出现过的那n个数;
//成立返回1,不成立返回0,已到达数据顶部,无法再判断返回-1;并返回判断后停留的行号;
{
int i,j;
struct tt hjq={0,1,2,3,4,5,6,7,8,9,0};
for(i=(*ii);1;i--)
{ if(i<0)
{
//printf("-1 %d→%d\n",i,*ii);
return -1;
}
else if(hjq.an==n)break;
if(hjq.a[sj[i][L-dsh]]!=-1)
{
hjq.a[sj[i][L-dsh]]=-1;
hjq.an++;
}
}
//for(j=0;j<L;j++)
//{
if(hjq.a[sj[i][L-dsh]]!=-1)//检查该行倒数第dsh个数
{
//printf("0 %d→%d\n",i,*ii);
*ii=i;
return 0;
}
//}
//printf("1 %d→%d\n",*ii,i);
*ii=i;
return 1;
}
int fun2(int sj[][L],int n)//统计 从最后一行起,每行最后一个数有不同的n个时,再上面一行所有数都是已出现过的数 的情况连续出现最多的次数
{
int i,m;
int x,x0;
int tj=0;
int hjqts,hjqtt,ii[2];
int *cp,nn;
x=x0=0;
cp=(int*)calloc(hh,sizeof(int));
for(i=hh-1;(m=mfun2(sj,n,&i))!=-1;ii[0]=i-1,ii[1]=m,i--)
{
if(m)
{
if(x0==0&&ii[1]==0)
{
hjqts=ii[0];
}
hjqtt=i;
x0++;
tj++;
}
else
{
(*(cp+x0-1))++;
if(x0>x)
{
hjqt=hjqtt;
hjqs=hjqts;
x=x0;
}
x0=0;
}
}
if(m==1) (*(cp+x0-1))++;
for(nn=(x>x0?x:x0);
nn>=1;nn--){
printf("连续%d次不中共有%d次\n",nn,*(cp+nn-1));
}
//free(cp);
//printf("满足条件的有%d条。\n",tj);
return (x>x0?x:(hjqt=hjqtt,hjqs=hjqts,x0));
}
int fun3(int sj[][L],int n,int m)//9个数字中有不同的n个数字,每行读取倒数m个数组成方阵
{
int i,j,q,kj,kj0;
int ii[2]={0,0},sum,sum0;
int hjqss,hjqtt;
sum=sum0=0;
//for(q=hh-1;q>0;q-=m+1)
for(i=hh-1;i>0;)
{
struct tt hjq={0,1,2,3,4,5,6,7,8,9,0};
kj=1;
if(ii[0]==0)
{
if(ii[1]==1)
{
if(sum<sum0){
sum=sum0;
hjqs=hjqss;
hjqt=hjqtt+1;
}
sum0=0;
}
}
else
{
if(ii[1]==0)hjqss=i;
hjqtt=i;
sum0++;
}
ii[1]=ii[0];
kj0=1;
for(;i>0;i--)
{
for(j=L-1;j>=L-m;j--)
{
if(hjq.an==n){kj0=0;break;}
if(hjq.a[sj[i][j]]!=-1){
hjq.a[sj[i][j]]=-1;
hjq.an++;
}
}
if(kj0==0)break;
}
if(hjq.an<n){ii[0]=0;break;}
if(hjq.an>n)
{
ii[0]=0;
continue;
}
for(j=L-1;j>=L-m;j--)
{
if(hjq.a[sj[i][j]]!=-1)
{
ii[0]=0;
kj=0;
break;
}
}
if(kj==1)ii[0]=1;
}
return (sum>sum0?sum:sum0);
}
int main(){
int sj[H][L];
int i,n;
char lj[]="hjq.txt";
if(access(lj,1)!=0)
{
puts("数据文件不存在!\n请将数据放到本程序同一目录下的hjq.txt文件中。\n\n");
//system("pause");
return 0;
}
ftoi(lj,sj);
//printf("%d %d %d %d %d\n",sj[hh-1][0],sj[hh-1][1],sj[hh-1][2],sj[hh-1][3],sj[hh-1][4]);
//showa(hh,L,sj);
puts("");/*
for(i=0;i<=9;i++)
printf("%d 最多连续%d行没有出现。\n",i,fun1(i,sj));
printf("\n\n");
dsh=4;
printf("最多连续不中次数为%d次。\n",fun2(sj,5));
printf("所在行分别为 %d→%d \n\n",hjqs,hjqt);
*/
printf("%d\n",fun3(sj,5,3));
printf("所在行分别为 %d→%d \n\n",hjqs,hjqt);
system("pause");
return 0;
}
[ 本帖最后由 bball27 于 2010-3-29 16:42 编辑 ]