/*Решение уравнения */
#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);
}
#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);
}
вобщем нужна помощь
внизу прикладываю файл с описанием задания