Ну я тоже о коде из первого своего сообщения где было написано 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