char element[40];
int k=0,i=0,j=0,l=1,u=1;
while((i*i)<(razm[nn])*(razm[nn]))//Пока не прошли все элементы
{
if(buf[l]!=' ')
{while(buf[l]!=' ')
{element[k]=buf[l];
k++;
l++;
}
element[k]='\0';//Обрезаем строку
if(nn==0) a[i][j]=atoi(element);
else b[i][j]=atoi(element);
ZeroMemory(element,sizeof(element));
k=0;
j++;
if(j==razm[nn])//Если просмотрена вся строка
{i++;//переходим к следующей
j=0;
}
}
l++;
}
GetOverlappedResult(file,&ov,&dw,TRUE);
}
CloseHandle(file);
}
}
DWORD WINAPI MultiplyMatrix(void* p)
{//создаём матрицу С
if(razm[0]==razm[1])
{
int s;
c=new int* [razm[0]];
for(int i=0;i<razm[0];i++)
c[i]=new int[razm[0]];
for(int i=0;i<razm[0];i++)
for(int j=0;j<razm[0];j++)
{
s=0;
for(int k=0;k<razm[0];k++)
s=s+a[i][k]*b[k][j];
c[i][j]=s;
}
}
else MessageBox(NULL,"Размерности квадратных матриц неодинаковы!",0,MB_OK);
}
Sec.cpp
using namespace std;
static int **c,n=4;
static float det;//Определитель матрицы С
HANDLE hThread1,hThread2;
DWORD WINAPI Determinant(void *p);
DWORD WINAPI Write(void* p);
int main(int argc, char *argv[])
{setlocale(LC_CTYPE,"Russian");
HANDLE hMapping;
void* pMapping;
//Создаём матрицу C
c=new int* [n];
for(int i=0;i<n;i++)
c[i]=new int[n];
//Открываем проекцию
hMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE, "Матрица_С");
if(hMapping!=NULL)
{
pMapping = MapViewOfFile( hMapping, FILE_MAP_READ, 0,0, 0 );
//считываем данные из памяти
int *p;
p=(int*)pMapping;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
c[i][j]=*p;
p++;
}
}
printf("\second.exe получил матрицу С:\n");
for(int i=0;i<n;i++)
{printf("\n");
for(int j=0;j<n;j++)
printf(" %d",c[i][j]);
}
hThread1=CreateThread(NULL,0,Determinant,0,0,NULL);
hThread2=CreateThread(NULL,0,Write,0,0,NULL);
WaitForSingleObject(hThread2,INFINITE);
printf("\nsecond.exe->Определитель матрицы С равен %f \n",det);
printf("second.exe->Данные записаны в файл\n");
}
else
printf("\nОшибка при открытии проекции файла\n");
UnmapViewOfFile(pMapping);
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hMapping);
return EXIT_SUCCESS;
}
DWORD WINAPI Determinant(void *p)
{ float l;
int k;
float cc[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cc[i][j]=c[i][j];
//Метод Гаусса
k=0;
while(k<n-1)
{for (int i=k+1;i<n;i++)//смотрим строку
{l=float(cc[i][k]) / cc[k][k];//вычисляем коэфициент
for (int j=k; j<n;j++) //смотрим столбец
//отнимаем строчку умноженую на коэфициент
cc[i][j]=cc[i][j]-(cc[k][j]*l);
}
k=k+1;//k-показывает из какого столбца начинать вычитать
}
float mul=1;
for(int i=0;i<n;i++)
mul*=cc[i][i];
det=mul;
}
DWORD WINAPI Write(void* p)
{WaitForSingleObject(hThread1,INFINITE);//Ждём посчёта определителя
char buf1[500],buf2[500];//Буффер для записи в файл
HANDLE file1;//Идентификатор файла
DWORD dw1; //Количство прочитаных байт
OVERLAPPED ov1;//Структура OVERLAPPED
ZeroMemory(&buf1,sizeof(buf1));
int ii=0;
int kk=0;
char symb[100];
for(int i=0;i<n;i++)
{for(int j=0;j<n;j++)
{ZeroMemory(symb,sizeof(symb));
sprintf(symb," %d ",c[i][j]);//получаем строку из числа
kk=0;
while(kk<strlen(symb))//посимвольно копируем полученую строку в буфер
{
buf1[ii]=symb[kk];
ii++;
kk++;
}
}
buf1[ii]='\r';
ii++;
buf1[ii]='\n';
ii++;
}
buf1[ii]='\r';
ii++; buf1[ii]='\n';
ii++;
ZeroMemory(symb,sizeof(symb));
kk=0;
sprintf(symb,"Определитель: %f",det);
while(kk<strlen(symb))
{
buf1[ii]=symb[kk];
ii++;
kk++;
}
//Записываем полученные результаты в файл
ZeroMemory(&ov1,sizeof(OVERLAPPED));
ov1.Offset=0;
ov1.hEvent=CreateEvent(NULL,TRUE,FALSE,0);
file1=CreateFile("rez.txt",FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
if(WriteFile(file1,buf1,sizeof(buf1),&dw1,&ov1)|| GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(file1,&ov1,&dw1,TRUE);
}
}
Результаты работы:
Файл1 Файл2
4 4
1 3 5 6 5 3 5 6
9 8 10 5 9 3 10 5
3 1 13 2 1 11 19 2
-3 9 -10 5 -3 9 -20 15
Результирующий файл
19 121 10 121
112 206 215 189
31 173 232 79
41 -47 -215 82
Определитель: 18055420.000000
Вывод: было разработано несколько приложений, осуществляющих совместное решение поставленной задачи. Изучена технология создания проекций файлов и использования их в разных приложениях.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.