回 帖 发 新 帖 刷新版面

主题:如何跳出内循环进入下一个外循环?多谢!!!

求助:当大于或等于4码时输出并跳出内循环进入到外循环的下一次循环对比。
void abc11(int a[][5],int jbb2z)      
{           
    int i,j,counter,s,sum,AA;
    FILE *pf;
    if((pf=fopen("e:\\zFILE522_003z.txt","w"))==NULL)
    {
        printf("Cannot open1 file!");
        return;
    }
   for(i=0;i<jbb2z;i++)                    
    {
        for(s=0;s<okok;s++)
        {
              AA=0;
            for(j=0;j<5;j++)
            {                        
            if(b[s][j]==a[i][j])   //a数组和b数组对比
                AA++;              //有相同的就记数
                if(AA>=4)
                   for(j=0;j<5;j++)
                    a[i][j]=b[s][j];//有等于大于4个数同的将b数组赋予a数组 
            break;                  //跳出内循环转入下一个外循环
              }
             } 
          {    
            for(j=0;j<5;j++)
                fprintf(pf,"%4d",a[i][j]);
            fprintf(pf,"\n");
            jtyyk++;
        }
   }
    fclose(pf);
}

回复列表 (共6个回复)

沙发

不要写这么多层的循环,当循环太多时,做成函数。
修改如下。
[quote]函数f:
for (XX2)
  for (XX3)
    if (XX4)
      return;

主函数:
for (XX1)
  调用f[/quote]

板凳

使用:goto loop后输出也不对,程序中并没有把b数组赋给a数组。郁闷
void abc11(int a[][5],int jbb2z)      
{           
    int i,j,counter,s,sum,AA;
    FILE *pf;
    if((pf=fopen("e:\\zFILE522_003z.txt","w"))==NULL)
    {
        printf("Cannot open1 file!");
        return;
    }
   for(i=0;i<jbb2z;i++)                    
    {
        for(s=0;s<okok;s++)
        {
              AA=0;
            for(j=0;j<5;j++)
            {                        
            if(b[s][j]==a[i][j])   //a数组和b数组对比
                AA++;              //有相同的就记数
                if(AA>=4)
                   for(j=0;j<5;j++)
                    a[i][j]=b[s][j];//有等于大于4个数同的将b数组赋予a数组 
                 goto loop;            //跳出内循环转入下一个外循环
              }
             } 
       loop:
          {    
            for(j=0;j<5;j++)
                fprintf(pf,"%4d",a[i][j]);

            fprintf(pf,"\n");
            jtyyk++;

        }
   }
    fclose(pf);
}

3 楼

几个要注意的地方:
1、每层循环应该使用不同的变量。楼主代码:
[quote]for(j=0;j<5;j++)

  if(b[s][j]==a[i][j]) //a数组和b数组对比
    AA++; //有相同的就记数
  if(AA>=4)
    for(j=0;j<5;j++)[/quote]
两层循环都是用j,这样就乱了。
2、记得打括号{}。楼主代码:
[quote]if(AA>=4)
  for(j=0;j<5;j++)
    a[i][j]=b[s][j];//有等于大于4个数同的将b数组赋予a数组 
goto loop; //跳出内循环转入下一个外循环[/quote]
这里不论if是否成立,都会执行goto。是不是应该修改一下,把for和goto用{}括起来?

楼主可以先学习一下如何进行单步调试,看看程序到底是怎样一步一步执行的。这在初学时很有好处,磨刀不误砍柴工。另外,一定要注意程序代码的格式,要写得整齐,便于自己和别人的阅读。

4 楼

如果循环层数太多了,按2楼的说的写成函数要好得很多。
但lz给的这段代码的数据很特别,内循环只有5次,可以考虑直接展开循环。并且里面的
AA>=4.这也是1个特别的地方,刚好比5少1.如果不考虑可读性的话,写成下面这样子,可能效率要稍微好点。
[code=c]
void 
abc11 (int a[][5], int jbb2z)
{
  int   i, j, s, AA;
  FILE *pf = fopen ("e:\\zFILE522_003z.txt", "w");
  
  if (pf == NULL) {
    printf ("Cannot open1 file!");
    return;
    }
  
  for (i = 0; i < jbb2z; i++)
    for (s = 0; s < okok; s++)
      {
      register int eq,    *pa = a[i];
      int          which, *pb = b[s];
      
#define FOO(n)  (eq=pb[n]==pa[n], AA+=eq, whitch|=(eq-1)&n)
      AA = 0;   which = 0;
      FOO(0);   FOO(1);
      FOO(2);   FOO(3);   FOO(4);
      
      if (AA >= 4) 
        {
        pa[which] = pb[which];
        jtyyk ++; 
        fprintf (pf, "%4d%4d%4d%4d%4d", 
    pa[0], pa[1], pa[2], pa[3], pa[4]);
        }       
      }
      
  fclose(pf);
}
[/code]

5 楼

谢谢楼上“windy0will”的耐心赐教,看到你写的代码我真的很佩服也很惭愧。感到差距好大! 
我在VC6.0上把你写的代码编译,但提示出错了。
以下是VC6.0的错误提示?s
C2065: 'whitch' : undeclared identifier

6 楼

不好意思,英语太烂了,把单词拼错了,哪一个应该是which,这个变量记录的是数组pa和数组pb中哪一个是不同的下标。AA>=4,也就是说只能是4或5:4的时候只要把不同的pb[which]赋值给pa[which];5的时候which等于0,反证都相同,赋一次值也没关系。

我来回复

您尚未登录,请登录后再回复。点此登录或注册