实用程序工具包

//utility.h

 

 

#ifndef __UTILITY_H__                               // 如果没有定义__UTILITY_H__

#define __UTILITY_H__                              // 那么定义__UTILITY_H__

 

// 实用程序工具包

 

#ifdef _MSC_VER                                                   // 表示是Visual C++

#if _MSC_VER == 1200                                   // 表示Visual C++6.0

 

// 标准库头文件

#include <string.h>                                       // 标准串和操作

#include <iostream.h>                                 // 标准流操作

#include <limits.h>                                       // 极限

#include <math.h>                                           // 数据函数

#include <fstream.h>                                      // 文件输入输出

#include <ctype.h>                                 // 字符处理

#include <time.h>                                       // 日期和时间函数

#include <stdlib.h>                                 // 标准库

#include <stdio.h>                                        // 标准输入输出

#include <iomanip.h>                                      // 输入输出流格式设置

#include <stdarg.h>                                       // 支持变长函数参数     

#include <assert.h>                                               // 支持断言

 

#else                                                                              // 其它版本的Visual C++

 

// ANSI C++标准库头文件

#include <string>                                              // 标准串和操作

#include <iostream>                                              // 标准流操作

#include <limits>                                               // 极限

#include <cmath>                                             // 数据函数

#include <fstream>                                      // 文件输入输出

#include <cctype>                                             // 字符处理

#include <ctime>                                           // 日期和时间函数

#include <cstdlib>                                         // 标准库

#include <cstdio>                                    // 标准输入输出

#include <iomanip>                                // 输入输出流格式设置

#include <cstdarg>                                         // 支持变长函数参数     

#include <cassert>                                 // 支持断言

using namespace std;                                     // 标准库包含在命名空间std中

 

#endif                                                                           // _MSC_VER == 1200

#else                                                                             // 非Visual C++

 

// ANSI C++标准库头文件

#include <string>                                             // 标准串操作

#include <iostream>                                       // 标准流操作

#include <limits>                                              // 极限

#include <cmath>                                            // 数据函数

#include <fstream>                                // 文件输入输出

#include <cctype>                                            // 字符处理

#include <ctime>                                    // 日期和时间函数

#include <cstdlib>                                         // 标准库

#include <cstdio>                                     // 标准输入输出

#include <iomanip>                                      // 输入输出流格式设置       

#include <cstdarg>                                               // 支持变长函数参数   

#include <cassert>                                       // 支持断言

using namespace std;                                     // 标准库包含在命名空间std中

 

#endif                                                                           // _MSC_VER

 

// 实用函数

char GetChar(istream &inStream = cin); // 从输入流inStream中跳过空格及制表符获取一字符

bool UserSaysYes();                // 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回false

// 函数模板

template <class ElemType >

void Swap(ElemType &e1, ElemType &e2);     // 交换e1, e2之值

template<class ElemType>

void Display(ElemType elem[], int n);       // 显示数组elem的各数据元素值

 

// 实用类

class Timer;                                    // 计时器类Timer

class Error;                                     // 通用异常类

class Rand;                                            // 随机数类Rand

 

char GetChar(istream &in)         // 从输入流in中跳过空格及制表一字符

{

         char ch;                                                    // 临时变量

        

         while ((ch = in.peek()) != EOF   // 文件结束符(peek()函数从输入流中接受1

                   // 字符,流的当前位置不变)

                   && ((ch = in.get()) == ' '   // 空格(get()函数从输入流中接受1字符,流

                   // 的当前位置向后移1个位置)

                   || ch == '\t'));                         // 制表符

         return ch;                                                        // 返回字符

}

bool UserSaysYes() // 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回false

{

         char ch;                                                  // 用户回答字符

         bool initialResponse = true; // 初始回答

        

         do

         {                                  // 循环直到用户输入恰当的回答为止

                   if (initialResponse) cout << "(y, n)?"; // 初始回答

                   else cout << "用y或n回答:";                           // 非初始回答

                   while ((ch = GetChar()) == '\n');       // 跳过空格,制表符及换行符获取一字符

                   initialResponse = false;                                    // 非初始回答

         } while (ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N');

         while (GetChar() != '\n');                                // 跳过当前行后面的字符

        

         if (ch == 'y' || ch == 'Y') return true;         // 肯定回答返回true

         else return false;                                                             // 否定回答返回false

}

template <class ElemType >

void Swap(ElemType &e1, ElemType &e2)             // 交换e1, e2之值

{

         ElemType temp;                                                             // 临时变量

         temp = e1; e1 = e2; e2 = temp;                 // 循环赋值实现交换e1, e2

}

template<class ElemType>

void Show(ElemType elem[], int n)            // 显示数组elem的各数据元素值

{

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

         {        // 显示数组elem

                   cout << elem[i] << "  ";              // 显示elem[i]

         }

         cout << endl;                                                    // 换行

}

// 计时器类Timer

class Timer

{

private:

         // 数据成员

         clock_t startTime;

public:

         //  方法声明

         Timer(){ startTime = clock(); }                    // 构造函数, 由当前时间作为开始时间构造对象

         double ElapsedTime() const                                // 返回已过的时间

         {

                   clock_t endTime = clock();                                    // 结束时间

                   return (double)(endTime - startTime) / (double)CLK_TCK;// 计算已过时间

                  

         }

         void Reset(){ startTime = clock(); }     // 重置开始时间

};

 

#define MAX_ERROR_MESSAGE_LEN 100

class Error// 通用异常类Error

{

private:

         // 数据成员

         char message[MAX_ERROR_MESSAGE_LEN];        // 异常信息

public:

         //  方法声明

         Error(char mes[] = "一般性异常!"){ strcpy(message, mes); }       

         // 构造函数

         void Show() const{ cout << message << endl; }                 // 显示异常信息

}; 

 

class Rand// 随机数类Rand

{

public:

         //  方法声明

         static void SetRandSeed(){ srand((unsigned)time(NULL)); }   

         // 设置当前时间为随机数种子

         static int GetRand(int n){ return rand() % n; }

         // 生成0 ~ n-1之间的随机数

         static int GetRand(){ return rand(); }       // 生成0 ~ n-1之间的随机数

};

#endif

 

 

//main.cpp

 

#include"utility.h"

void main()

{

         try{

                   bool tag=true;

                   while(tag)

                   {

                            int n;

                            cout<<"请输入方阵的阶数"<<endl;

                            cin>>n;

                            if(n>1000)

                                     throw Error("阶数太大了");

                            int **a,**b,**c;

                            Timer objTimer;

                            int i,j,k;

                            a=new int*[n+1];//分配矩阵的行(每行是个一位数组)

                            b=new int*[n+1];

                            c=new int *[n+1];

                            for(i=1;i<=n;i++)

                            {

                                     a[i]=new int[n+1];//位矩阵的第i行分配存储空间

                                     b[i]=new int[n+1];

                                     c[i]=new int[n+1];

                            }

                            Rand::SetRandSeed();

                            objTimer.Reset();

                            for(i=1;i<=n;i++)

                                     for(j=1;j<=n;j++)

                                     {

                                               a[i][j]=Rand::GetRand();

                                               b[i][j]=Rand::GetRand();

                                     }

                            for(i=1;i<=n;i++)//c=ab

                                     for(j=1;j<=n;j++)

                                     {

                                               c[i][j]=0;

                                               for(k=1;k<=n;k++)

                                                        c[i][j]=c[i][j]+a[i][k]*b[k][j];

                                     }

 

 

                            for(i=1;i<=n;i++)//释放矩阵第i行所占用存储空间

                            {

                                     delete []a[i];

                                     delete []b[i];

                                     delete []c[i];

                            }

                            delete []a;//释放矩阵所占用的所有存储空间

                            delete []b;

                            delete []c;

                            cout<<"用时"<<objTimer.ElapsedTime()<<"秒"<<endl;

                            cout<<"是否继续";

                            tag=UserSaysYes();

                   }

         }

         catch(Error err)

         {

                   err.Show();

         }

         system("pause");

}

 

posted @ 2012-11-23 22:17  ♂咱說 ろ算  阅读(347)  评论(0编辑  收藏  举报