Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

обработка множеств

37K
22 декабря 2008 года
gepa
16 / / 22.12.2008
имеется исходник программы обработки множеств и его внутремашинного представления, который нужно привести в рабочее состояние
Код:
/*Решение уравнения  */
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<io.h>#include<string.h>
#include<alloc.h>
void main(int argc, char* argv[])
{char msA[12], ms[100], tmp[5];
char* m_in, *mout;
int * mnX;
int i, j, r, kA, nA, kB, nB, MA, nX0;
FILE *in, *out;
if( (in = fopen(argv[1], "r")) == NULL )
{ puts("Net vhodnogo faila!"); exit(0);}
m_in = (char*) malloc(400);                               /* Во входном файле 5 строк*/
fgets(ms, 100, in);            /* в первой строке нет информации для уравнения*/
strcat(m_in, ms);
fgets(ms, 100, in);
strcat(m_in, ms);
kA = atoi(ms);    /*по записи числа получаем его внутримашинное представление*/
fgets(ms, 100, in); /*из файла считываем 3-ю строку, содержащую запись множества A*/
strcat(m_in, ms);
r = 0;                                                        /* r – позиция в ms*/
while (ms[r] != '{')   r++;
r++;
msA[0] = atoi(ms+r);
nA = 1<<msA[0];
for(i = 1; i <kA; i++)
    {
while(ms[r]!=',')    r++;
r++;msA = atoi(ms+r);
nA |= 1<<msA;
     }
/*Для отладки программы; после отладки закомментировать*/
printf(“Множество A: “);
for(i=0; i < kA; i++)
printf(“%d “, msA);
printf("nA = %d\n", nA);
/* Считывание и обработка множества B */
fgets(ms, 100, in);                                  /*Считываем 4-ю строку входного файла*/
strcat(m_in, ms);
kB = atoi(ms);
fgets(ms, 100, in);     /*Из файла считываем 5-ю строку, содержащую запись множества B*/
strcat(m_in, ms); /*Теперь в m_in весь входной файл*/
r = 0;
while (ms[r] != '{')   r++;
r++;
nB = 1<< atoi(ms+r);         /* символьный массив для множества B в нашей задаче не нужен*/
for(i = 1; i <kB; i++)
    {
while(ms[r]!=',')    r++;
r++;nB |= 1<< atoi(ms+r);
}
/*Две строки – для отладки программы; после отладки закомментировать*/
printf(“Множество B: “);
printf("nB = %d\n", nB);
fclose(in);
/*Проверка существования решений*/
if(nA & nB != nA)
{puts(“Net reshenyi!”);   exit(0);}
nX0 = nB & (~nA & 4095);          /* X0 = B \ A */
/* Формируем массив mnX */
MA = 1 << kA;
mnX = (int*) malloc(2*MA);            /* 2 – sizeof(int)*/
for(i=0; i < MA; i++)
        {
mnX = 0;
for(j=0; j<kA; j++
if(i&(1<<j))                                                   /* Если j-й бит числа i равен 1*/
mnX |= 1 << msA[j];
mnX |= nX0;
        }
/* Формирование символьного массива mout для выходного файла с использованием массива mnX внутримашинных представлений решений нашей задачи  */
out=fopen(argv[2],"w");
mout=(char*) malloc(strlen(m_in) + MA*(4*kA + 4);  /*Оценка длины массива mout. Функция strlen(ms) возвращает длину строки  ms*/
strcat(mout, m_in);
strcat(mout, “Решениями уравнения   являются следующие множества:”);
for(i=0; i<MA; i++)
  {
sprintf(tmp, "{"); /* Начало записи i-го подмножества*/
strcat(mout, tmp); /* Конкатенация (слияние) строк; к строке mout добавляется строка tmp*/
/* Формирование элементов i-го подмножества*/
for(j=0; j<12; j++)
if(mnX&(1<<j))  /* Если j-й бит внутримашинного представления i-го решения равен 1*/
      {
sprintf(tmp,"%d, ", j);
strcat(mout, tmp);
      }
mout[strlen(mout)-1]='}'; /* конец записи i-го решения*/
/*функция strlen(ms) возвращает длину строки ms*/
sprintf(tmp,"\n"); /* Добавление символа новой строки*/
strcat(mout, tmp);
  }
/* Формирование выходного файла*/
write(fileno(out),mout,strlen(mout));
/* Функция write() записывает в файл символьный массив. Она работает с идентификатором файла, который получается из FILE* с использованием функции fileno().*/
puts("End");
gets(ms);                                          /* Для задержки на экране строки "End"  */
fclose(out);
}


т.е. у нас на вход подается файл со структурой
[HTML]
Иванов И.И., группа , лаб. 1
6
1, 3, 4, 6, 9, 10
8
0, 1, 3, 4, 6, 9, 10, 11
[/HTML]

а в выходном файле мы должны получить
[HTML]
Иванов И.И., группа , лаб. 1
6
1, 3, 4, 6, 9, 10
8
0, 1, 3, 4, 6, 9, 10, 11
Решениями уравнения являются следующие множества:
{0, 11}
{0, 1, 11}
{0, 3, 11}
{0, 1, 3, 11}
{0, 4, 11}
…………
…………
…………
…………

[/HTML]

я ее переделал, однако выходной файл получается не таким каким должен быть

[HTML]НээээРешениями уравнения являются следующие множества:
{1, 2, 3, 5, 6, 7, 9, 10,}
{1, 4, 5, 6, 7, 9,}
{1, 3, 8, 9, 11,}
{5, 9,}
{0, 1, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8, 9, 10,}
{0, 3, 4, 5, 10, 11,}
{4, 5, 10, 11,}
{0, 1, 3, 4, 5, 6, 8,}
{2, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8, 9, 10,}
{0, 3, 4, 5, 10, 11,}
{0, 1, 3, 4, 5, 6, 8,}
{0, 1, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8,}
{0, 2, 3, 4, 5, 6, 9, 11,}
{2, 3, 5,}
{0, 2, 3, 4, 5, 6, 9, 11,}
{2, 3, 5,}
{5, 10,}
{0, 2, 4, 5, 10, 11,}
{4, 5, 10, 11,}
{0, 4, 5, 10, 11,}
{0, 1, 3, 4, 5, 6, 9,}
{0, 1, 4, 5, 10, 11,}
{2, 3, 5, 8, 10, 11,}
{0, 2, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8,}
{0, 2, 3, 4, 5, 6, 9, 11,}
{2, 3, 5,}
{5, 10,}
{0, 2, 4, 5, 10, 11,}
{4, 5, 10, 11,}
{0, 4, 5, 10, 11,}
{0, 1, 3, 4, 5, 6, 10,}
{0, 2, 4, 5, 10, 11,}
{4, 5, 10, 11,}
{0, 4, 5, 10, 11,}
{0, 1, 3, 4, 5, 6,}
{0, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8, 10,}
{1, 2, 4, 5, 10, 11,}
{2, 3, 5, 8, 10, 11,}
{1, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8,}
{5, 8,}
{0, 2, 3, 4, 5, 6, 9, 11,}
{2, 3, 5,}
{5, 8, 10,}
{1, 3, 8, 9, 11,}
{5, 11,}
{0, 3, 4, 5, 10, 11,}
{4, 5, 10, 11,}
{0, 1, 3, 4, 5, 6,}
{0, 1, 4, 5, 10, 11,}
{2, 3, 5,}
{5, 8,}
{5, 8,}
[/HTML]


переделанный исходник
Код:
/*Решение уравнения  */
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<io.h>
#include<string.h>

void main()
{
    char msA[12], ms[100], tmp[10];
    char* m_in, *mout;
    int * mnX;
    int i, j, r, kA, nA, kB, nB, MA, nX0;
    FILE *in, *out;
    if( (in = fopen("1.txt", "r")) == NULL )
        {
            puts("Net vhodnogo faila!"); exit(0);
        }
   
    m_in = new char;       
    fgets(ms, 100, in);            /* в первой строке нет информации для уравнения*/
    strcat(m_in, ms);
    fgets(ms, 100, in);
    strcat(m_in, ms);
    kA = atoi(ms);
    fgets(ms, 100, in); /*из файла считываем 3-ю строку, содержащую запись множества A*/
    strcat(m_in, ms);
    r = 0;                                                        /* r - позиция в ms*/
    for(i = 0; i <kA; i++)
        {
            while(ms[r]!=',')    r++;
            msA = atoi(ms+r);
            nA =1<< msA;
        }
   
    /* Считывание и обработка множества B */
    fgets(ms, 100, in);                                  /*Считываем 4-ю строку входного файла*/
    strcat(m_in, ms);
    kB = atoi(ms); 
    fgets(ms, 100, in);     /*Из файла считываем 5-ю строку, содержащую запись множества B*/
    strcat(m_in, ms); /*Теперь в m_in весь входной файл*/
    r = 0;
    for(i = 0; i <kB; i++)
        {
            while(ms[r]!=',')    r++;
            nB =1<< atoi(ms+r);
        }
   
    fclose(in);
   
    /*Проверка существования решений*/
    if((nA & nB) != nA)
    {
        puts("Net reshenyi!");   exit(0);
    }
    nX0 = nA  & (~nA & 4095);    
    /* Формируем массив mnX */
    MA = 1 << kA;
    mnX = new int;
    for(i=0; i < MA; i++)
        {
        mnX = 0;
        for(j=0; j<kA; j++)
        if(i&(1<<j))                                                   /* Если j-й бит числа i равен 1*/
        mnX = 1 << msA[j];
        mnX = nX0;
        }
    /* Формирование символьного массива mout для выходного файла с использованием массива mnX внутримашинных представлений решений нашей задачи  */
    out=fopen("2.txt","w");
    mout=new char;
    strcat(mout, m_in);
    strcat(mout, "Решениями уравнения   являются следующие множества:\n");
   
    for(i=0; i<MA; i++)
    {
        sprintf(tmp, "{"); /* Начало записи i-го подмножества*/
        strcat(mout, tmp); /* Конкатенация (слияние) строк; к строке mout добавляется строка tmp*/
        /* Формирование элементов i-го подмножества*/
        for(j=0; j<12; j++)
        if(mnX&(1<<j))  /* Если j-й бит внутримашинного представления i-го решения равен 1*/
            {
                sprintf(tmp,"%d, ", j);
                strcat(mout, tmp);
            }
        mout[strlen(mout)-1]='}'; /* конец записи i-го решения*/
       
        sprintf(tmp,"\n"); /* Добавление символа новой строки*/
        strcat(mout, tmp);
    }
    /* Формирование выходного файла*/
    write(fileno(out),mout,strlen(mout));
    /* Функция write() записывает в файл символьный массив. Она работает с идентификатором файла, который получается из FILE* с использованием функции fileno().*/

    fclose(out);
}


вобщем нужна помощь

внизу прикладываю файл с описанием задания
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог