NFT鏈上鑄造交易智慧合約模式系統開發詳情介紹

Lyr96246466發表於2023-03-13

  Web(World Wide Web)即全球廣域網,開發+ I8I鏈上合約- 259l智慧合約 3365也稱為全球資訊網,它是一種基於超文字和

HTTP的、全球性的、動態互動的、跨平臺的分散式圖形資訊系統。是建立在Internet上的一種網路服務,為瀏覽者在Internet

上查詢和瀏覽資訊提供了圖形化的、易於訪問的直觀介面,其中的檔案及超級連結將Internet上的資訊節點組織成一個互為關聯

的網狀結構。


  Web 1.0是關於獲取和閱讀資訊的。


  Web 2.0是關於閱讀、建立、分享以及與使用者的互動。Web 3.0是第三代全球資訊網,一個執行在“區塊鏈”技術之上的“去中

心化”網路。Web1.0時代Web 1.0是全球資訊網發展的第一階段。大致是從1991年到2004年。在Web 1.0時代只有少數內容生產者

,絕大多數使用者是內容的消費者。個人網頁很常見,主要由託管在ISP執行的Web伺服器或免費Web託管服務上的靜態頁面組成

.


  Web 1.0是一種內容分發網路(CDN),可以在網站上展示資訊。可以用作個人網站,根據檢視的頁面向使用者收費,具有使用

戶能夠檢索特定資訊的目錄。


/*

author: cclplus

date : 2018 / 12 / 09

if you think it is necessary to reward me,

my alipay account number is 707101557@qq.com

*/

#include "pch.h"

#include "matrix.h"

using std::endl;

using std::cout;

using std::istream;

const double EPS = 1e-10;

void Matrix::initialize() {//初始化矩陣大小

p = new double*[rows_num];//分配rows_num個指標

for (int i = 0; i < rows_num; ++i) {

p[i] = new double[cols_num];//為p[i]進行動態記憶體分配,大小為cols

}

}

//宣告一個全0矩陣

Matrix::Matrix(int rows, int cols)

{

rows_num = rows;

cols_num = cols;

initialize();

for (int i = 0; i < rows_num; i++) {

for (int j = 0; j < cols_num; j++) {

p[i][j] = 0;

}

}

}

//宣告一個值全部為value的矩陣

Matrix::Matrix(int rows, int cols, double value)

{

rows_num = rows;

cols_num = cols;

initialize();

for (int i = 0; i < rows_num; i++) {

for (int j = 0; j < cols_num; j++) {

p[i][j] = value;

}

}

}

 

//解構函式

Matrix::~Matrix() {

 for (int i = 0; i < rows_num; ++i) {

delete[] p[i];

}

delete[] p;

}

//實現矩陣的複製

Matrix& Matrix::operator=(const Matrix& m)

{

if (this == &m) {

return *this;

}

 

if (rows_num != m.rows_num || cols_num != m.cols_num) {

for (int i = 0; i < rows_num; ++i) {

delete[] p[i];

}

delete[] p;

 

rows_num = m.rows_num;

cols_num = m.cols_num;

initialize();

}

 

for (int i = 0; i < rows_num; i++) {

for (int j = 0; j < cols_num; j++) {

p[i][j] = m.p[i][j];

}

}

return *this;

}

//將陣列的值傳遞給矩陣(要求矩陣的大小已經被宣告過了)

Matrix& Matrix::operator=(double *a){

for(int i=0;i<rows_num;i++){

for(int j=0;j<cols_num;j++){

p[i][j]= *(a+i*cols_num+j);

}

}

return *this;

}

//+=操作

Matrix& Matrix::operator+=(const Matrix& m)

{

for (int i = 0; i < rows_num; i++) {

for (int j = 0; j < cols_num; j++) {

p[i][j] += m.p[i][j];

}

}

return *this;

}

//實現-=

Matrix& Matrix::operator-=(const Matrix& m)

{

for (int i = 0; i < rows_num; i++) {

for (int j = 0; j < cols_num; j++) {

p[i][j] -= m.p[i][j];

}

}

return *this;

}

//實現*=

Matrix& Matrix::operator*=(const Matrix& m)

{

Matrix temp(rows_num, m.cols_num);//若C=AB,則矩陣C的行數等於矩陣A的行數,C的列數等於B的列數。

for (int i = 0; i < temp.rows_num; i++) {

for (int j = 0; j < temp.cols_num; j++) {

for (int k = 0; k < cols_num; k++) {

temp.p[i][j] += (p[i][k] * m.p[k][j]);

}

}

}

*this = temp;

return *this;

}

//實現矩陣的乘法

Matrix Matrix::operator*(const Matrix & m)const{

Matrix ba_M(rows_num,m.cols_num,0.0);

for(int i=0;i<rows_num;i++){

for(int j=0;j<m.cols_num;j++){

for(int k=0;k<cols_num;k++){

ba_M.p[i][j]+=(p[i][k]*m.p[k][j]);

}

}

}

return ba_M;

}

 

//解方程Ax=b

Matrix Matrix::Solve(const Matrix &A, const Matrix &b)

{

//高斯消去法實現Ax=b的方程求解

for (int i = 0; i < A.rows_num; i++) {

if (A.p[i][i] == 0) {

 

cout << "請重新輸入" << endl;

}

for (int j = i + 1; j < A.rows_num; j++) {

for (int k = i + 1; k < A.cols_num; k++) {

A.p[j][k] -= A.p[i][k] * (A.p[j][i] / A.p[i][i]);

if (abs(A.p[j][k]) < EPS)

A.p[j][k] = 0;

}

b.p[j][0] -= b.p[i][0] * (A.p[j][i] / A.p[i][i]);

if (abs(A.p[j][0]) < EPS)

A.p[j][0] = 0;

A.p[j][i] = 0;

}

}

 

// 反向代換

Matrix x(b.rows_num, 1);

x.p[x.rows_num - 1][0] = b.p[x.rows_num - 1][0] / A.p[x.rows_num - 1][x.rows_num - 1];

if (abs(x.p[x.rows_num - 1][0]) < EPS)

x.p[x.rows_num - 1][0] = 0;

for (int i = x.rows_num - 2; i >= 0; i--) {

double sum = 0;

for (int j = i + 1; j < x.rows_num; j++) {

sum += A.p[i][j] * x.p[j][0];

}

x.p[i][0] = (b.p[i][0] - sum) / A.p[i][i];

if (abs(x.p[i][0]) < EPS)

x.p[i][0] = 0;

}

 

return x;

}

 

//矩陣顯示

void Matrix::Show() const {

//cout << rows_num <<" "<<cols_num<< endl;//顯示矩陣的行數和列數

for (int i = 0; i < rows_num; i++) {

for (int j = 0; j < cols_num; j++) {

cout << p[i][j] << " ";

}

cout << endl;

}

cout << endl;

}

//實現行變換

void Matrix::swapRows(int a, int b)

{

a--;

b--;

double *temp = p[a];

p[a] = p[b];

p[b] = temp;

}

//計算矩陣行列式的值

double Matrix::det(){

//為計算行列式做一個備份

double ** back_up;

back_up=new double *[rows_num];

for(int i=0;i<rows_num;i++){

back_up[i]=new double[cols_num];

}

for(int i=0;i<rows_num;i++){

for(int j=0;j<cols_num;j++){

back_up[i][j]=p[i][j];

}

}

if(rows_num!=cols_num){

std::abort();//只有方陣才能計算行列式,否則呼叫中斷強制停止程式

}

double ans=1;

for(int i=0;i<rows_num;i++){

//透過行變化的形式,使得矩陣對角線上的主元素不為0

if(abs(p[i][i])<=EPS){

bool flag=false;

for(int j=0;(j<cols_num)&&(!flag);j++){

//若矩陣的一個對角線上的元素接近於0且能夠透過行變換使得矩陣對角線上的元素不為0

if((abs(p[i][j])>EPS)&&(abs(p[j][i])>EPS)){

flag=true;

//注:進行互換後,p[i][j]變為p[j][j],p[j][i]變為p[i][i]

//對矩陣進行行變換

double temp;

for(int k=0;k<cols_num;k++){

temp=p[i][k];

p[i][k]=p[j][k];

p[j][k]=temp;

}

}

}

if(flag)

return 0;

}

}

for(int i=0;i<rows_num;i++){

for(int j=i+1;j<rows_num;j++){

for(int k=i+1;k<cols_num;k++){

p[j][k]-=p[i][k]*(p[j][i]*p[i][i]);

}

}

}

for(int i=0;i<rows_num;i++){

ans*=p[i][i];

}

for(int i=0;i<rows_num;i++){

for(int j=0;j<cols_num;j++){

p[i][j]=back_up[i][j];

}

}

return ans;

}

//返回矩陣第i行第j列的數

double Matrix::Point(int i, int j) const{

return this->p[i][j];

}

//求矩陣的逆矩陣

Matrix Matrix::inv(Matrix A){

if(A.rows_num!=A.cols_num){

std::cout<<"只有方陣能求逆矩陣"<<std::endl;

std::abort();//只有方陣能求逆矩陣

}

double temp;

Matrix A_B=Matrix(A.rows_num,A.cols_num);

A_B=A;//為矩陣A做一個備份

Matrix B=eye(A.rows_num);

//將小於EPS的數全部置0

for (int i = 0; i < A.rows_num; i++) {

for (int j = 0; j < A.cols_num; j++) {

if (abs(A.p[i][j]) <= EPS) {

A.p[i][j] = 0;

}

}

}

//選擇需要互換的兩行選主元

for(int i=0;i<A.rows_num;i++){

if(abs(A.p[i][i])<=EPS){

bool flag=false;

for(int j=0;(j<A.rows_num)&&(!flag);j++){

if((abs(A.p[i][j])>EPS)&&(abs(A.p[j][i])>EPS)){

flag=true;

for(int k=0;k<A.cols_num;k++){

temp=A.p[i][k];

A.p[i][k]=A.p[j][k];

A.p[j][k]=temp;

temp=B.p[i][k];

B.p[i][k]=B.p[j][k];

B.p[j][k]=temp;

}

}

}

if(!flag){

std::cout<<"逆矩陣不存在\n";

std::abort();

}

}

}

//透過初等行變換將A變為上三角矩陣

double temp_rate;

for(int i=0;i<A.rows_num;i++){

for(int j=i+1;j<A.rows_num;j++){

temp_rate=A.p[j][i]/A.p[i][i];

for(int k=0;k<A.cols_num;k++){

A.p[j][k]-=A.p[i][k]*temp_rate;

B.p[j][k]-=B.p[i][k]*temp_rate;

}

A.p[j][i]=0;

}

}

//使對角元素均為1

for(int i=0;i<A.rows_num;i++){

temp=A.p[i][i];

for(int j=0;j<A.cols_num;j++){

A.p[i][j]/=temp;

B.p[i][j]/=temp;

}

}

//std::cout<<"演演算法可靠性檢測,若可靠,輸出上三角矩陣"<<std::endl;

//將已經變為上三角矩陣的A,變為單位矩陣

for(int i=A.rows_num-1;i>=1;i--){

for(int j=i-1;j>=0;j--){

temp=A.p[j][i];

for(int k=0;k<A.cols_num;k++){

A.p[j][k]-=A.p[i][k]*temp;

B.p[j][k]-=B.p[i][k]*temp;

}

}

}

std::cout<<"演演算法可靠性檢測,若可靠,輸出單位矩陣"<<std::endl;

for(int i=0;i<A.rows_num;i++){

for(int j=0;j<A.cols_num;j++){

printf("%7.4lf\t\t",A.p[i][j]);

}

cout << endl;

}

A=A_B;//還原A

return B;//返回該矩陣的逆矩陣

}

//製造一個單位矩陣

Matrix Matrix::eye(int n){

Matrix A(n,n);

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

if(i==j){

A.p[i][j]=1;

}else{

A.p[i][j]=0;

}

}

}

return A;

}

//讀取矩陣行列數

int Matrix::row() const{

return rows_num;

}

int Matrix::col() const{

return cols_num;

}

//實現矩陣的轉置

Matrix Matrix::T(const Matrix & m)

{ int col_size=m.col();

int row_size=m.row();

Matrix mt(col_size, row_size);

for (int i = 0; i <row_size; i++) {

for (int j = 0; j <col_size; j++) {

mt.p[j][i] = m.p[i][j];

}

}

return mt;

}

//高斯消元法

Matrix Matrix::gaussianEliminate()

{

Matrix Ab(*this);

int rows = Ab.rows_num;

int cols = Ab.cols_num;

int Acols = cols - 1;

 

int i = 0; //跟蹤行

int j = 0; //跟蹤列

while (i < rows)

{

bool flag = false;

while (j < Acols && !flag)

{

if (Ab.p[i][j] != 0) {

flag = true;

}

else {

int max_row = i;

double max_val = 0;

for (int k = i + 1; k < rows; ++k)

{

double cur_abs = Ab.p[k][j] >= 0 ? Ab.p[k][j] : -1 * Ab.p[k][j];

if (cur_abs > max_val)

{

max_row = k;

max_val = cur_abs;

}

}

if (max_row != i) {

Ab.swapRows(max_row, i);

flag = true;

}

else {

j++;

}

}

}

if (flag)

{

for (int t = i + 1; t < rows; t++) {

for (int s = j + 1; s < cols; s++) {

Ab.p[t][s] = Ab.p[t][s] - Ab.p[i][s] * (Ab.p[t][j] / Ab.p[i][j]);

if (abs(Ab.p[t][s]) <EPS)

Ab.p[t][s] = 0;

}

Ab.p[t][j] = 0;

}

}

i++;

j++;

}

return Ab;

}

//實現矩陣的輸入

istream& operator>>(istream& is, Matrix& m)

{

for (int i = 0; i < m.rows_num; i++) {

for (int j = 0; j < m.cols_num; j++) {

is >> m.p[i][j];

}

}

return is;

}

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012429/viewspace-2939323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章