Ну я тоже о коде из первого своего сообщения где было написано for(j=1;j<=(1 << (m+1));j++), тогда как должно было быть for(j=1;j<=(1 << m);j++)
-- 08.05.2014, 01:25 --fscanf не читает пробелы, а пропускает их.
у меня он читает пробелы, так как я считываю по формату %c (в коде из первого сообщения). Я это уже проверял в других задачах как и писал выше. Если считывать по формату %s или %d например, то пробелы пропускаются автоматически.
-- 08.05.2014, 01:34 --У меня к вам другой вопрос: не могли бы вы мне помочь с функциями переходов второго автомата? Для первого я сделал, работает все правильно, а для второго что то не получется. Вот мой код: (привожу полностью, нужную область выделил)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int task_02_3_03(const char* inFile, const char* outFile);
//===================================================================================
//===================Структура для хранения автомата=================================
typedef struct _task_02_3_03_auto
{
 int *v;
}
AUTO;
//===================================================================================
//===================================================================================
int task_02_3_03(const char* inFile, const char* outFile)
{
 AUTO *A, *B, *C;
 int i, j, ij, ii, n, nn, m, rn, k, qt, xt, l;
 char *ch, *chh;
 FILE *f, *ff;
 //===================================================================================
 f=fopen(inFile, "rt");
 if(f==NULL){return -1;} 
 ff=fopen(outFile, "wt");
 //===================================================================================
 //===========================Задаем первый автомат===================================
 fscanf(f, "%d", &n);
 A=(AUTO*)malloc((n+2)*sizeof(AUTO));
 A[0].v=(int*)malloc((n+1)*sizeof(int));
 A[0].v[0]=n;
 ch=(char*)malloc((1 << (n+1))*sizeof(char));
 fscanf(f, "%s", ch);
 for(i=1;i<=n;i++)
 {
  A[0].v[i]=ch[i-1]-'0';
 }
 //===================================================================================
 for(i=1;i<=n+1;i++)
 {
  fscanf(f, "%d", &m);
  fscanf(f, "%d", &m);
  A[i].v=(int*)malloc((1 << m)*sizeof(int));
  A[i].v[0]=m;
  fscanf(f, "%s", ch);
  for(j=1;j<=(1 << m);j++)
  {
   A[i].v[j]=ch[j-1]-'0';
  }
 }
 //===================================================================================
 //===========================Задаем второй автомат===================================
 fscanf(f, "%d", &nn);
 B=(AUTO*)malloc((nn+2)*sizeof(AUTO));
 B[0].v=(int*)malloc((nn+1)*sizeof(int));
 B[0].v[0]=nn;
 chh=(char*)malloc((1 << (nn+1))*sizeof(char));
 fscanf(f, "%s", chh);
 for(i=1;i<=nn;i++)
 {
  B[0].v[i]=chh[i-1]-'0';
 }
 //===================================================================================
 for(i=1;i<=nn+1;i++)
 {
  fscanf(f, "%d", &m);
  fscanf(f, "%d", &m);
  B[i].v=(int*)malloc((1 << m)*sizeof(int));
  B[i].v[0]=m;
  fscanf(f, "%s", chh);
  for(j=1;j<=(1 << m);j++)
  {
   B[i].v[j]=chh[j-1]-'0';
  }
 }
 /*
 printf("%d ", B[0].v[0]);
 for(i=1;i<=nn;i++)
  printf("%d", B[0].v[i]);
 printf("\n");
 for(i=1;i<=nn+1;i++)
 {
  printf("2 ");
  printf("%d ", B[i].v[0]);
  for(j=1;j<=(1 << (nn+1));j++)
  {
   printf("%d", B[i].v[j]);
  }
  if(i<nn+1)printf("\n");
 }
 getchar();getchar();
 */
//====================================================================================
//===========================Строим суперпозицию автоматов============================
 rn=n+nn;
 C=(AUTO*)malloc((rn+2)*sizeof(AUTO));
 C[0].v=(int*)malloc((rn+1)*sizeof(int));
 C[0].v[0]=rn;
 for(i=1;i<=n;i++)
  C[0].v[i]=A[0].v[i];
 for(i=n+1;i<=rn;i++)
  C[0].v[i]=B[0].v[i-n];
 //===================================================================================
 for(i=1;i<=rn+1;i++)
 {
  C[i].v=(int*)malloc((1 << (rn+1))*sizeof(int));
  C[i].v[0]=rn+1;
 }
 //=====================Задаем функцию значений автомата С============================
 k=1;
 for(i=1;i<=(1 << (n+1));i+=2)
 {
  for(j=1;j<=(1 << (nn+1));j+=2)
  {
   C[rn+1].v[k]=B[nn+1].v[j+A[n+1].v[i]];
   C[rn+1].v[k+1]=B[nn+1].v[j+A[n+1].v[i+1]];
   k+=2;
  }
 }
 /*
 for(i=1;i<=(1<<(rn+1));i++)
  printf("%d", C[rn+1].v[i]);
 getchar();getchar();
 */
 //====================Задаем функции переходов автомата С============================
 for(ij=1;ij<=n;ij++)
 {
  for(j=1;j<=(1 << (rn+1));j++)
  {
   xt=(j-1)&1;
   qt=(j-1)&(1 << (rn-ij+1));if(qt!=0)qt=1;
   l=qt*(1 << (n-ij+1))+xt;
   C[ij].v[j]=A[ij].v[l+1];
  }
 }
 // до этого места все работает правильно
  for(ij=n+1;ij<=rn;ij++)
 {
  for(j=1;j<=(1 << (rn+1));j++)
  {
   xt=(j-1)&1;l=0;
   for(ii=1;ii<=n;ii++)
   {
    qt=(j-1)&(1 << (rn-ij+1));if(qt!=0)qt=1;
    l+=qt*(1 << (n-ij+1));
   }
   l+=xt;
   xt=A[n+1].v[l+1];
   qt=(j-1)&(1 << (rn-ij+1));if(qt!=0)qt=1;
   l=qt*(1 << (nn-ij+1+n))+xt;
   C[ij].v[j]=B[ij-n].v[l+1];
  }
 }/////после этого места тоже все правильно работает
 //===================================================================================
 //=================================Вывод автомата С==================================
 fprintf(ff, "%d ", C[0].v[0]);
 for(i=1;i<=rn;i++)
  fprintf(ff, "%d", C[0].v[i]);
 fprintf(ff, "\n");
 for(i=1;i<=rn+1;i++)
 {
  fprintf(ff, "2 ");
  fprintf(ff, "%d ", C[i].v[0]);
  for(j=1;j<=(1 << (rn+1));j++)
  {
   fprintf(ff, "%d", C[i].v[j]);
  }
  if(i<rn+1)fprintf(ff, "\n");
 }
 //===================================================================================
 fclose(f); fclose(ff);
 return 0;
 }
-- 08.05.2014, 01:36 --На вот таких входных данных
1 0
2 2 0101
2 2 0011
1 0
2 2 1010
2 2 0110
выдает
2 00
2 3 01010101
2 3 11101110
2 3 00111100
тогда как правильно было бы
2 00
2 3 01010101
2 3 11110000
2 3 00111100