📄 smallwe001view.cpp
字号:
// smallwe001View.cpp : implementation of the CSmallwe001View class
//
#include "stdafx.h"
#include "smallwe001.h"
#include "smallwe001Doc.h"
#include "smallwe001View.h"
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<stdio.h>
#include"math.h"
#define N 4608
#define TRUE 1
#define FALSE 0
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// CSmallwe001View
IMPLEMENT_DYNCREATE(CSmallwe001View, CView)
BEGIN_MESSAGE_MAP(CSmallwe001View, CView)
//{{AFX_MSG_MAP(CSmallwe001View)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSmallwe001View construction/destruction
CSmallwe001View::CSmallwe001View()
{
// TODO: add construction code here
}
CSmallwe001View::~CSmallwe001View()
{
}
BOOL CSmallwe001View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSmallwe001View drawing
void CSmallwe001View::OnDraw(CDC* pDC)
{
CSmallwe001Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
void gauss(float *p[],int *s_exist);
void pivot(float *p[N],
int i , int *piv_found);
void gen_G(float *p[N],float g[][2*N]) ;
void xch(char c[],float aug[][2*N]);
void xch2(float *g[],int f[6*N]);
float aug[N][2*N],g[N][2*N]; /*aug作为原始的数组,g为生成的树组*/
char *arr; /*定义指针作数组去应用数据*/
char arry[4*6*N]; /*定义arr的初地址*/
int f[6*N]; /*得到最后结果中1的列数传给xch函数*/
int s_exist;
int i;
float *p[N]; /*定义一指针数组作为数据的主单元*/
/*对文件库中的数据进行引用*/
FILE *in;
FILE *out;
arr=arry;
if((in=fopen("data.txt","r"))==NULL)
{
exit(0);
}
while(!feof(in))
*(arr++)=fgetc(in);
fclose(in);
*(++arr)='\0';
/*程序开始*/
xch(arr,aug);
for(i=0;i<N;++i)
p[i]=aug[i];
gauss(p,&s_exist);
gen_G(p,g);
for(i=0;i<N;++i)
p[i]=g[i];
xch2(p,f);
arr=arry;
if((out=fopen("data000.txt","w"))==NULL)
{
exit(0);
}
for(i=0;i<10;++i)
fputc('c',out);
fclose(out);
}
/*gauss子程序*/
void gauss(float *p[N],int *s_exist)
{
int i,j,k,m,n;
float r_rece,xmult;
*s_exist=TRUE;
for(k=0;*s_exist&&k<(N-1);++k)
{
pivot(p,k,s_exist);
/* for(m=0;m<N;++m)
{for(n=0;n<2*N;++n)
printf("%6.2f",p[m][n]);
printf("\n");}
printf("%d\n",*s_exist); */
if(*s_exist) /*主元素行标准化*/
{r_rece=1.0/p[k][k+N];
p[k][k+N]=1.0;
for(j=0;j<N;++j)
p[k][j]*=r_rece;
for(j=k+1;j<N;++j)
p[k][j+N]*=r_rece;
/*消去主元素下面的系数*/
for(i=k+1;i<N;++i)
{if(p[i][k+N])
{xmult=-p[i][k+N];
p[i][k+N]=0;
for(j=0;j<N;j++)
p[i][j]+=xmult*p[k][j];
for(j=k+1;j<N;++j)
p[i][j+N]+=xmult*p[k][j+N];
}
}
/*消去主元素上面的系数*/
for(i=k-1;i>=0;--i)
{if(p[i][k+N])
{xmult=-p[i][k+N];
p[i][k+N]=0;
for(j=0;j<N;j++)
p[i][j]+=xmult*p[k][j];
for(j=k+1;j<N;++j)
p[i][j+N]+=xmult*p[k][j+N];
}
}
}
}
/*若最后系数为零,则没有唯一解*/
if(p[N-1][2*N-1]==0)
*s_exist=FALSE;
else if(*s_exist) /*最后一行标准化*/
{r_rece=1.0/p[N-1][2*N-1];
p[N-1][2*N-1]=1.0;
for(i=0;i<N;++i)
p[N-1][i]*=r_rece;
for(i=N-2;i>=0;--i)
{if(p[i][2*N-1])
{xmult=-p[i][2*N-1];
p[i][2*N-1]=0;
for(j=0;j<N;++j)
p[i][j]+=xmult*p[N-1][j];
}
}
}
}
/*gauss_pivot子程序*/
void pivot(float *p[],
int i , int *piv_found)
{float xmax;
int j=0,k=0;
float *exchange;
/*找出最大主元素*/
xmax=fabs(p[i][i+N]);
printf("%f\n",xmax);
for(j=i+1;j<N;++j)
{
if (fabs(p[j][i+N])>xmax)
{
xmax=fabs(p[j][i+N]);
k=j;
}
}
if(xmax==0)
*piv_found=FALSE;
else
{exchange=p[k];
p[k]=p[i];
p[i]=exchange;
}
}
void gen_G(float *p[N],float g[][2*N])
{int i,j;
for(i=0;i<N;++i)
{ for(j=0;j<N;++j)
{ g[i][j]=0;
g[i][j+N]=p[j][i];
}
g[i][i]=1;
}
}
#define M 6
void xch(char c[],float aug[][2*N])
{
char *p;
int test[6*N],i,k,j,sum,b;
p=c;
for(i=0;i<N;++i)
{ j=0;
while(*p!=32&&*p!='\0')
{++p;
++j;
}
b=1;
for(k=1,b=1,sum=0;k<=j;++k)
{sum+=((*(p-k)-48)*b);
b=b*10;
}
test[i]=sum-1;
++p;
}
for(i=0;i<N;++i)
for(j=0;j<2*N;++j)
aug[i][j]=0;
for(i=0;i<N;++i)
for(j=0;j<M;++j)
aug[i][test[6*i+j]]=1;
}
void xch2(float *g[N],int f[6*N])
{int i,j,k=0;
for(i=0;i<N;++i)
for(j=0;j<2*N;++j)
if(g[i][j]==1)
{f[k]=j;
++k;
}
}
/////////////////////////////////////////////////////////////////////////////
// CSmallwe001View printing
BOOL CSmallwe001View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSmallwe001View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSmallwe001View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CSmallwe001View diagnostics
#ifdef _DEBUG
void CSmallwe001View::AssertValid() const
{
CView::AssertValid();
}
void CSmallwe001View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSmallwe001Doc* CSmallwe001View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSmallwe001Doc)));
return (CSmallwe001Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSmallwe001View message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -