燕山大学多核程序设计实验报告
燕山大学多核程序设计实验报告
实验一Windows多线程编程一、实验目的与要求了解windows多线程编程机制掌握线程同步的方法二、实验环境和软件WindowsXPVC6.0三、实验内容创建线程:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId);四、实验程序#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>usingnamespacestd;voidThreadFrunc1(PVOIDparam){while(1){Sleep(1000);cout<<"ThisisThreadFrunc1"<<endl;}}voidThreadFrunc2(PVOIDparam){while(1){Sleep(1000);cout<<"ThisiskjjThreadFrunc2"<<endl; }}intmain(){inti=0;_beginthread(ThreadFrunc1,0,NULL);_beginthread(ThreadFrunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return0;}实验结果实验二蒙特卡罗法求PI一、实验目的和要求蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。
多核编程与并行计算实验报告 (1)
多核编程与并行计算实验报告姓名:日期:2014年 4月20日实验一// exa1.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;void ThreadFunc1(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc1"<<endl;}}void ThreadFunc2(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc2"<<endl;}}int main(){int i=0;_beginthread(ThreadFunc1,0,NULL);_beginthread(ThreadFunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return 0;}实验二// exa2.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<iostream>using namespace std;DWORD WINAPI FunOne(LPVOID param){while(true){Sleep(1000);cout<<"hello! ";}return 0;}DWORD WINAPI FunTwo(LPVOID param){while(true){Sleep(1000);cout<<"world! ";}return 0;}int main(int argc, char* argv[]){int input=0;HANDLE hand1=CreateThread (NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED, NULL); HANDLE hand2=CreateThread (NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return 0;}实验三// exa3.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream>using namespace std;int globalvar = false;DWORD WINAPI ThreadFunc(LPVOID pParam){cout<<"ThreadFunc"<<endl;Sleep(200);globalvar = true;return 0;}int main(){HANDLE hthread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);if (!hthread){cout<<"Thread Create Error ! "<<endl;CloseHandle(hthread);}while (!globalvar)cout<<"Thread while"<<endl;cout<<"Thread exit"<<endl;return 0;}实验四:// exa4.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;HANDLE evRead, evFinish;void ReadThread(LPVOID param){WaitForSingleObject (evRead ,INFINITE);cout<<"Reading"<<endl;SetEvent (evFinish);}void WriteThread(LPVOID param){cout<<"Writing"<<endl;SetEvent (evRead);}int main(int argc , char * argv[]){evRead = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;evFinish = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;_beginthread(ReadThread , 0 , NULL) ;_beginthread(WriteThread , 0 , NULL) ;WaitForSingleObject (evFinish,INFINITE) ;cout<<"The Program is End"<<endl;return 0 ;}实验五// exa5.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;int total = 100 ;HANDLE evFin[2] ;CRITICAL_SECTION cs ;void WithdrawThread1(LPVOID param){EnterCriticalSection(&cs) ;if ( total-90 >= 0){total -= 90 ;cout<<"You withdraw 90"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;SetEvent (evFin[0]) ;}void WithdrawThread2(LPVOID param){EnterCriticalSection(&cs) ;if ( total-20 >= 0){total -= 20 ;cout<<"You withdraw 20"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;LeaveCriticalSection(&cs) ;SetEvent (evFin[1]) ;}int main(int argc , char * argv[]){evFin[0] = CreateEvent (NULL,FALSE,FALSE,NULL) ;evFin[1] = CreateEvent (NULL,FALSE,FALSE,NULL) ;InitializeCriticalSection(&cs) ;_beginthread(WithdrawThread1 , 0 , NULL) ;_beginthread(WithdrawThread2 , 0 , NULL) ;WaitForMultipleObjects(2 ,evFin ,TRUE ,INFINITE) ;DeleteCriticalSection(&cs) ;cout<<total<<endl;return 0 ;}实验六:// exa6.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;DWORD ThreadProc(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hMutex;cout << "ThreadProc: " << ThreadNumberTemp << " is running!" << endl;if ((hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { cout << "Open Mutex error!" << endl;}cout << "ThreadProc " << ThreadNumberTemp << " gets the mutex"<< endl;ReleaseMutex(hMutex);CloseHandle(hMutex);return 0;}int main(int argc, char* argv[]){int i;DWORD ID[THREAD_INSTANCE_NUMBER];HANDLE h[THREAD_INSTANCE_NUMBER];HANDLE hMutex;if ( (hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { if ((hMutex = CreateMutex(NULL, FALSE, "Mutex.Test")) == NULL ) { cout << "Create Mutex error!" << endl;return 0;}}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){h[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc,(void *)&ID[i],0,&(ID[i]));if (h[i] == NULL)cout << "CreateThread error" << ID[i] << endl;elsecout << "CreateThread: " << ID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,h,TRUE,INFINITE);cout << "Close the Mutex Handle! " << endl;CloseHandle(hMutex);return 0;}实验七// exa7.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3DWORD foo(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hSemaphore;cout << "foo: " << ThreadNumberTemp << " is running!" << endl;if ((hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Semaphore.Test")) == NULL) {cout << "Open Semaphore error!" << endl;}cout << "foo " << ThreadNumberTemp << " gets the semaphore"<< endl;ReleaseSemaphore(hSemaphore, 1, NULL);CloseHandle(hSemaphore);return 0;}int main(int argc, char* argv[]){int i;DWORD ThreadID[THREAD_INSTANCE_NUMBER];HANDLE hThread[THREAD_INSTANCE_NUMBER];HANDLE hSemaphore;if ((hSemaphore = CreateSemaphore(NULL,0,1, "Semaphore.Test")) == NULL ) { cout << "Create Semaphore error!" << endl;return 0;}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){hThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) foo,(void *)&ThreadID[i],0,&(ThreadID[i]));if (hThread[i] == NULL)cout << "CreateThread error" << ThreadID[i] << endl;elsecout << "CreateThread: " << ThreadID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,hThread,TRUE,INFINITE);cout << "Close the Semaphore Handle! " << endl;CloseHandle(hSemaphore);return 0;}实验八:// exa8.cpp : Defines the class behaviors for the application.//#include"stdafx.h"#include"exa8.h"#include"MainFrm.h"#include"exa8Doc.h"#include"exa8View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CExa8AppBEGIN_MESSAGE_MAP(CExa8App, CWinApp)//{{AFX_MSG_MAP(CExa8App)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// 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 file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CExa8App constructionCExa8App::CExa8App(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CExa8App objectCExa8App theApp;/////////////////////////////////////////////////////////////////////////////// CExa8App initializationBOOL CExa8App::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates// serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CExa8Doc),RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CExa8View));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)// No message handlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// App command to run the dialogvoid CExa8App::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}///////////////////////////////////////////////////////////////////////////// // CExa8App message handlers、实验九:using System;using System.Threading;class Test{static void Main(){ThreadStart threadDelegate = new ThreadStart(Work.DoWork);Thread newThread = new Thread(threadDelegate);newThread.Start();Work w = new Work();w.Data = 42;threadDelegate = new ThreadStart(w.DoMoreWork);newThread = new Thread(threadDelegate);newThread.Start();}}class Work{public static void DoWork(){Console.WriteLine("Static thread procedure.");}public int Data;public void DoMoreWork(){Console.WriteLine("Instance thread procedure. Data={0}", Data);}实验十:using System;using System.Threading;class Test{static int total = 100;public static void WithDraw1(){int n=90;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void WithDraw2()int n = 20;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void Main(){ThreadStart thread1 = new ThreadStart(WithDraw1);Thread newThread1 = new Thread(thread1);ThreadStart thread2 = new ThreadStart(WithDraw2);Thread newThread2 = new Thread(thread2);newThread1.Start();newThread2.Start();}}实验十一:// exa11.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<conio.h>#include<stdio.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;CRITICAL_SECTION cs;DWORD ThreadProc1(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc1: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc1 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}DWORD ThreadProc2(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc2: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc2 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}int main(int argc, char* argv[]){int i;DWORD ID1,ID2;HANDLE h1,h2;InitializeCriticalSection(&cs);printf("Create the critical section \n");h1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc1,(void *)&ID1,0,&(ID1));if (h1 == NULL)printf("CreateThread error %d \n",ID1);elseprintf("CreateThread %d \n",ID1);h2= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc2,(void *)&ID2,0,&(ID2));if (h2== NULL)printf("CreateThread error %d \n",ID2);elseprintf("CreateThread %d \n",ID2);WaitForSingleObject (h1,INFINITE);WaitForSingleObject (h2,INFINITE);printf("Delete the critical section \n");DeleteCriticalSection(&cs);getch();return 0;}。
程序设计实践实验报告
程序设计实践实验报告实验报告课程名称___ 程序设计实践______实验项目_______子程序设计实验仪器_______PC _____系别_ 计算机科学与工程____专业______软件工程__________班级/学号___B软工0701/2007011801学生姓名_____ XX____________实验日期____2009-3-26__________成绩_______________________指导教师_____XX______________.实验二子程序设计一、实验目的1. 学习和掌握参数传递的方法;2.学习和掌握递归调用;3.了解goto语句的使用;4.了解降低嵌套深度的方法;5.了解复杂度的度量。
二、实验要求1.通过编程实现,学习和理解参数传递和递归调用的使用。
2.使用goto语句编写程序,用非goto语句改写程序;3.了解减少嵌套层次和度量复杂度的方法。
三、实验内容和结果1. 参数传递(1)创建控制台应用程序项目(CLR)。
定义函数swap,swap函数有两个整型形参x,y,swap的功能为交换x和y的值,并依次显示出交换后的x,y的值。
主函数定义两个整型变量a,b,并赋不同的初值,依次显示a和b的值,调用swap 函数,a,b作为实参,再在主函数中依次显示a和b的值。
(值传递)编写并运行以上程序,分析运行结果,思考值传递中是否会改变实参的值。
(2)创建控制台应用程序项目,修改(1)中程序,使swap函数的参数为两个指向整型的指针,swap函数中交换指针所指向的内容;主函数中调用swap函数,交换整型变量a和b的值。
编写并运行修改后的程序,比较与(1)中程序运行结果的不同之处及原因。
(3)创建控制台应用程序项目,修改(1)中程序,采用引用方式传递函数的参数。
编写并运行修改后的程序,比较与(1)、(2)中程序运行结果的异同以及(2)、(3)程序中改写的难易程度。
int swap1(int x,int y){int temp;temp=x;x=y;y=temp;return 0;} //实参传递函数int swap2(int &x,int &y){int temp;temp=x;x=y;y=temp;return 0;}//形参传递函数int swap3(int *x,int *y){int temp;temp=*x;*x=*y;*y=temp;return 0;}//指针传递函数int main(){int a,b;Console::WriteLine ("plesae input a and b interger:");a=Int32::Parse(Console::ReadLine());b=Int32::Parse(Console::ReadLine());Console::WriteLine ("实参传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap1(a,b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ("-------------------");Console::WriteLine ("形参传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap2(a,b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ("++++++++++++++++");Console::WriteLine ("指针传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap3(&a,&b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ( "%%%%%%%%%%%%%%%%%" );Console::ReadLine();return 0;}2.递归调用.使用递归时,请注意如下原则:a.确认递归能够停止(子程序中至少含有一条非递归的路径);b.把递归限制在一个子程序内;c.留心栈空间;使用递归前,先考虑可否用其他方式编写程序,可能效果更好。
操作系统课程设计多线程
燕山大学课程设计说明书————操作系统题目:多道程序缓冲区协调操作班级:计算机应用2班开发小组名称:Beyond软件开发小组课题负责人:张鹏课题组成员:姓名学号班级自评成绩张鹏 0901******** 应用2班 A李倩 0901******** 应用2班 B 课题开发日期:2012.1.9—2012.1.131.1课程设计目的本次课程设计的主要目的是通过模拟多道程序缓冲区协调操作,充分理解操作系统中进程、线程及线程间同步和互斥的概念;并通过自己编写程序了解软件开发流程,锻炼自己的编程能力,充分提高自己的综合能力。
1.2主要完成任务模拟设定PUT 、GET 、Move 操作的如下图所示,有多个PUT 操作要不断循环地向Buffer1送数据,有Move1操作和Move2操作要不断地将Buffer1的数据取到Buffer2和Buffer3,有多个GET 操作要不断地从Buff2和Buffer3中取数据。
PUT 、 MOVE 、 GET 每次操作一个数据,为了在操作的过程中要保证数据不丢失, 每个Buffer 每次只能接受一个PUT 或一个Move 或一个Get ,多个操作不能同时操作同一BUFFER 。
PUT MOVE GET 软件能显示各个Buffer 的操作过程和每个Buffer 中的现有数据,放入、取出的总数据,可以设置Buffer 的容量及放入、取出数据的速度 ,设置put 、move 、get 操作的线程数和操作速度,软件结束运行时可以显示汇总数据,并能将统计结果保存到任意的路径下。
1.3解决的主要问题在本次课程设计中解决的重要问题有线程间的同步和互斥问题,java 语言软件设计中面向对象思想各个类的创建方法及类之间互相操作问题,软件界面设计问题。
2. 设计使用的基本概念和原理2.1多道程序多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使他们在管理程序控制下,相互穿插运行。
Get2Put Move2 Buff1 Buff2 Buff3 Move1 Get1进程是并发程序的执行,是多道程序系统中程序的执行过程。
【免费下载】 燕山大学多核程序设计实验报告
产生 2n 个随机数据,范围[0,1],对每个数据点计算其坐标是否满
足 x 2 y 2 1 ,统计满足此关系的点的数量 count,则
1
为 1。正方形面积 S1=1,圆弧内面积 S2= 4
大量点随机落在此正方形区域内,落在圆弧内的点的数量(n2)与点的总 数(n1)的比例与面积成正比关系。即
由此可得
n1 S1 4 n2 S2
4n2
n1
因此,只要计算出落在圆弧内的点的数量在点总数中所占的比例,就能求
出 的值。
1
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
燕山大学软件工程课程设计报告完整版
燕山大学软件工程课程设计报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】燕山大学软件工程课程设计说明书题目:网上书店学院(系):信息科学与工程学院年级专业:10级计算机应用三班学号:学生姓名:方小雨学号:学生姓名:王嘉恺指导教师:邓成玉教师职称:教授燕山大学课程设计(论文)任务书2013年6 月21 日燕山大学课程设计评审日第一章绪论课题背景在网络信息日益发展的今天,网络已经成为人们日常生活的一部分。
网上购物也成为现代社会的趋势和潮流。
而随着互联网的飞速发展以及我国经济的稳步平衡增长,人们对于精神文明也愈加看重,对于知识的追求也却来越高。
因而图书市场开始繁荣起来。
但由于各种各样的原因使得消费者在选购图书时不能迅速找到合意的书籍。
近年来网上书店也在网络经济的刺激下开始发力,各类资本纷纷注入这一充满潜力的新型市场。
由于网上书店图书种类包罗万象,且价格比传统书店便宜不少,以至于越来越多的消费者青睐于网上购书。
1999年,国内真正意义上第一家网上书店——当当网上线。
北京大学社会学专业毕业、从国家机关辞职下海的李国庆,拿着第一笔风险投资的基金开始了自己的网店生涯。
8年后,这家号称全球最大中文网上书店的企业营业额已经达到8个亿。
此后,伴随着世界电子商务浪潮的到来,越来越多的网上书店在国内兴起。
课题目的消费者都想在最短的时间内购买到自己所需的图书。
但现有大型电商平台音像书籍分类下书目繁多,给人们在繁忙的工作生活中购书带来了很大的麻烦,于是如何方便快捷的购买到自己所需的图书就成了人们较为关心的问题。
本小组成员经过网上查询资料和实地调查发现,燕山大学附近只有3家传统书店且规模较小。
稍微上点规模的城市之光也因为盗版原因存在着质量问题,价格也比京东等大型电商高出两成左右。
而大型网上书店虽然品种杂多,但缺少高等院校适用的教材,在快递方面最快也要一天才可到达学校。
燕山大学课程设计说明书
燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作班级:11级计算机应用1班开发小组名称:多道程序缓冲区协调操作的程序设计课题负责人:吴楠课题组成员:姓名吴楠学号 110104010058班级应用1班自评成绩姓名王乐学号 110104010045班级应用1班自评成绩课题开发日期:2014.1.101 概述1.1 课程设计目的通过编写一个生产者消费者的实例,了解多线程的创建,运行原理,通过信号量机制的运用了解各线程间的协调工作机制;通过实现界面编程,了解MFC 编程思想。
1.2 主要完成的任务如下图所示,有多个PUT 操作要不断循环地向Buffer1送字符数据,有Move1操作不断地将Buffer1的数据取到Buffer2,Move2操作不断地将Buffer1的数据取到Buffer3,有多个GET 操作要不断地从Buffer2和Buffer3中取数据。
PUT 、 MOVE 、 GET 每次操作一个数据,为了在操作的过程中要保证数据不丢失, 每个Buffer 每次只能接受一个PUT 或一个Move 或一个Get 。
运用进程同步和互斥机制设计一个多道程序完成上述操作。
图1 Buffer 操作(1) 可以随机产生字符数据,由put 操作放入Buff1,buffer 中容量单位是字符。
(2)提供良好图形界面,显示Buffer 的操作过程。
(3) 可以设定各Buffer 的容量、PUT 、GET 、Move 操作的个数;(4) 可以设定PUT 、GET 、Move 操作的速度;(5) 实时显示每个Buffer 中数据的个数和数据的内容,空闲Buffer 的空间的个数;(6) 实时显示线程、进程所处于等待(阻塞)状态的个数(7)程序运行结束,显示汇总数据:总的运行时间;Buffer 中数据的个数;已放入BUFFER 的数据个数;已取出的数据个数;平均每个buffer 中的数据个数。
Put Move2 Buff1 Buff2 Buff3 Get Move1 Get1.3 课程设计使用的开发语言和工具语言:C++开发环境:Visual Studio 2008及其开发环境下的MFC平台。
多核实验报告
实验报告课程名称:多核多线程技术院(系):信息与控制工程学院专业班级:计算机科学与技术姓名:学号:0906201指导教师:2012年11月21日实验一Windows API多线程编程本实验分为四个模块;分别为基础练习,临界区实验,事件实验,信号量实验。
通过本次实验逐步熟悉和掌握Win32 API多线程编程的语法结构、基本思路和方法。
理解API 之间的调用关系,参数的含义。
一、实验目的1、掌握MS V isual Studio 2010编写编译Win32 API多线程程序的方法;2、掌握Win 32 API编写多线程程序的语法;3、掌握Win 32 API编写多线程程序的思路;4、掌握Win 32多线程API的应用;5、能解决简单的数据竞争。
二、实验环境1、Windows XP系统2、Microsoft Visual Studio 2010三、相关知识1、内核对象的概念:由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。
2、Windows多线程API的基本管理线程的创建:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);线程的终止:VOID ExitThread(DWORD dwExitCode)BOOL CloseHandle (HANDLE hObject)线程的挂起与恢复:DWORD SuspendThread(HANDLE hThread)DWORD ResumeThread(HANDLE hThread)线程间的等待:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD WaitForMultipleObjects (DWORD nCount,CONST HANDLE *lpHandles,BOOL fWaitAll,DWORD dwMilliseconds);3、线程间的同步与临界区相关的API:void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);与事件相关的API:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCSTR lpName);DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD WaitForMultipleObjects (DWORD nCount,CONST HANDLE *lpHandles,BOOL fWaitAll,DWORD dwMilliseconds);BOOL SetEvent(HANDLE event );BOOL ResetEvent(HANDLE event );与信号量相关的API:HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpEventAttributes,LONG lSemInitial,LONG lSemMax,LPCSTR lpSemName);DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG cReleaseCount,LPLONG lpPreviousCount);四、实验原理线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。
燕山大学操作系统课程设计报告说明书
燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作〔模拟生产者消费者问题〕课题负责人:学院:信息科学与工程学院班级::学号:课题开发日期:2021年1月13日自评成绩: A目录1概述--------------------------------------------------------------------------------------31.1 目的--------------------------------------------------------31.2 主要完成的任务----------------------------------------------31.3 使用的开发工具、开发语言------------------------------------31.4 本软件解决的主要问题---------------------------------------42 设计的根本理念、概念和原理------------------------------------------------42.1 设计的根本理念----------------------------------------------42.2 根本概念----------------------------------------------------42.3 根本原理----------------------------------------------------53 总体设计----------------------------------------------------53.1根本的技术路线:面向对象--------------------------------------------------------53.2模块关系及总体流程-------------------------------------------54 详细设计----------------------------------------------------74.1 变量设计----------------------------------------------------74.2 线程的设计--------------------------------------------------74.3 button按钮的设计-------------------------------------------85编码设计----------------------------------------------------95.1开发环境----------------------------------------------------95.2考前须知----------------------------------------------------95.3主要代码设计------------------------------------------------9PUTTER线程的设计---------------------------------------------------9MOVER1线程的设计---------------------------------------------------10GETTER1线程的设计--------------------------------------------------11“开场〞按钮的设计--------------------------------------------------12“完毕〞按钮的设计--------------------------------------------------145.4解决的主要难题----------------------------------------------166测试出现的问题及其解决方案-------------------------------167工程总结----------------------------------------------------168参考文献----------------------------------------------------16多道程序缓冲区协调操作演示程序设计说明书1概述1.1目的计算机操作系统是计算机系统中最不可缺少的,最常用的软件,也是核心的,最接近于计算机硬件的软件。
燕山大学计算机网络程序设计报告
1.基础知识1.1原始套接字创建面向连接的TCP和创建面向无连接的UDP套接字,在接收和发送时只能操作数据部分,而不能对IP首部或TCP和UDP首部进行操作如果想要操作IP首部或传输层协议首部,就需要调用如下socket()函数创建网络层原始套接字。
协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类链路层原始套接字链路层原始套接字调用socket()函数创建。
第一个参数指定协议族类型为PF_PACKET,第二个参数type可以设置为SOCK_RAW或SOCK_DGRAM,第三个参数是协议类型(该参数只对报文接收有意义)。
1.socket(PF_PACKET, type, htons(protocol))参数type设置为SOCK_RAW时,套接字接收和发送的数据都是从MAC首部开始的。
在发送时需要由调用者从MAC首部开始构造和封装报文数据网络层原始套接字socktet(PF_INET, SOCK_RAW, protocol)//接收到的数据网络层原始套接字接收到的报文数据是从IP首部开始的,即接收到的数据包含了IP首部, TCP/UDP/ICMP等首部, 以及数据部分。
//发送的数据网络层原始套接字发送的报文数据,在默认情况下是从IP首部之后开始的,即需要由调用者自行构造和封装TCP/UDP等协议首部这种套接字也提供了发送时从IP首部开始构造数据的功能,通过setsockopt()给套接字设置上IP_HDRINCL选项,就需要在发送时自行构造IP首部。
1.intval = 1;2.setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, &val, sizeof(val));1.2一些函数socket()函数socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数。
创建原始套接字:原始套接字的创建:int socket ( int family, int type, int protocol );参数:family:协议族这里写PF_PACKETtype:套接字类,这里写SOCK_RAWprotocol:协议类别,指定可以接收或发送的数据包类型,不能写“0”,取值如下,注意,传参时需要用htons() 进行字节序转换。
vtune的使用的心得
掌握多核程序设计工具软件的使用; 进行多核程序设计实践; 尝试设计多核程序设计实验; 总结:我毕设的主要目的就是设计一组学生实 验,让学生通过实验来比较单核和多核处理 器,了解多核处理器在性能方面的优越性。
实验平台:Inter多核处理器 实验软件:vs2005 vtune 实验目的:通过一组实验让学生了解单核 与多核性能的差异 实验步骤:通过vs2005编写一个能够改写 成并行程序的程序,该程序要有测试程序 运行时间的函数,将该程序用OpenMP进行 改写,并行化,用vtune软件进行分析,通 过性能分析函数进行计算,并与程序运行 的结果相互比较。
该图是线程柱状图,通 过分析该线程,我们可 以看到哪个线程占用了 cpu大量的时间,结合 源代码,我们能够进行 负载均衡。
module
通过模块图,我们可以 定位该应用程序的热点, 结合源代码,我们可以 分析出程序的瓶颈,即 可以并行化实现这是通过模块定位的源 代码
sampling
基于时间采样的又可以 分为基于哪种事件,一 般我们用于试验的是时 钟周期,指令周期,浮 点数操作,cache命中 率等等 Events=sample*sampl e after value
sampling
sampling
采样收集器收集运行于 系统的所有应用软件的 数据,从进程到应用程 序的线程,到应用程序 每个模块,再到热点, 结合源代码,可以分析 系统的瓶颈,修改源代 码,实现最优化的设置。
void test() { int a=0; clock_t t1=clock(); for(int i=0;i<100000000;i++) { a=i+1; } clock_t t2=clock(); printf(“testtime=%d\n”,t2-t1); } int main(int argc,char *argv[]) { clock_t t1=clock(); // #pragma omp parallel for // for(int j=0;j<2;j++) { test(); } clock_t t2=clock(); printf("total time=%d\n",t2-t1); test(); return 0; }
多核编程实验报告1
实验一:Windows*Threads多线程编程模块一:基础练习1. 编译执行,输出结果:(1)简答与思考:修改后的HelloThreads的代码:1// HelloThreads.cpp : 定¡§义°?控?制?台¬¡§应®|用®?程¨¬序¨°的Ì?入¨?口¨²点Ì?。
¡ê23#include"stdafx.h"4#include<windows.h>5const int numThreads = 4;6DWORD WINAPI helloFunc(LPVOID pArg)7{8int j = *(int *)pArg;9printf("Hello Thread %d\n",j);10return 0;11}12int _tmain(int argc, _TCHAR* argv[])13{14 HANDLE hThread[numThreads];15int tNum[4];16for (int i = 0; i < numThreads; i++)17 { tNum[i]=i;18hThread[i] =19CreateThread(NULL, 0, helloFunc, &tNum[i], 0, NULL );20 }21 WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);22return 0;23}运行结果图:(2)实验总结:模块二:临界区实验1.串行程序编译执行,Pi的值为:(截图)(3) 2.改为并行程序编译执行,Pi的值为:(截图)(4)简答与思考:3.如何进行并行化的?请写出并行化的思路与具体的代码。
多核研究性课题实验报告
辽宁师范大学计算机与信息技术学院综合性实验报告课程名称:多核并行程序设计实验题目:基于主成分分析的并行程序设计学生姓名:孙蕾专业:计算机科学与技术学号: 20101118050005实验日期: 2012年11月25日实验成绩:一、实验目的通过对主成分分析法进行研究,了解主成分分析在生产生活中的重要应用性。
在此基础上找到算法,给出计算对称矩阵特征值的串行算法,并在此基础上利用多核程序设计将其并行化,以优化运行速度。
通过本实验了解并行程序设计原理并达到基本能应用的水平。
二、实验内容1.对主成分分析法进行学习,明白其原理以及在现实生活中的应用方面和实际意义。
2.按照对主成分分析的理解找到计算特征值的算法并完成串行程序。
3.在串行程序的基础上应用多核程序设计的原理将程序并行化,分别对串行程序和并行程序计算运行时间,计算加速比,加深多核程序设计的理解。
4.总结研究中的问题以及克服方法,心得和体会。
三、实验过程(含结果抓图)1.串行程序代码及结果抓图#include<iostream.h>#include<stdlib.h>#include<math.h>#include<iomanip.h>//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //class Matrix定义矩阵类const int Max_xy=20; //矩阵的最大维数class Matrix{private:double data[Max_xy][Max_xy];unsigned x,y; //x,y;public:Matrix(); //默认构造函数Matrix(const Matrix & source); //拷贝构造函数void creat(); //输入矩阵void init();void transpose(); //矩阵转置void show(); //输入此矩阵double mode() const; //求一维矩阵的长度void check_shiduichen(); //检查是否为是对称矩阵void creat_unit(unsigned i); //生成i行单位矩阵void set_x(unsigned xx); //设置行数void set_y(unsigned yy); //设置列数unsigned get_x(); //得到行数unsigned get_y(); //得到列数void shucheng(double changshu); //数乘运算void setdata(unsigned i,unsigned j,double source); //定位输入数据double getdata(unsigned i,unsigned j); //定位得到数据void sturm(); //求特征值unsigned sturm_s(double m); //计算sturm系列的同好数Matrix operator = (const Matrix & right);friend Matrix & operator + (const Matrix & left,const Matrix & right); //重载+号friend Matrix & operator - (const Matrix & left,const Matrix & right); //重载-号friend Matrix & operator * (const Matrix & left,const Matrix & right); //重载乘号friend ostream& operator <<(ostream & os,const Matrix & source); //重载输出friend void Householder(Matrix & source); //用Householde矩阵将实对称矩阵化为三对角矩阵};Matrix temp_Matrix; //全局变量Matrix//===================================================================//--------------------默认构造函数Matrix::Matrix(){init();}//----------------------------拷贝构造函数Matrix::Matrix(const Matrix & source){init();x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];}//------------------------------------------初始化矩阵元素void Matrix::init(){x=y=0;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<Max_xy;j++)data[i][j]=0;}//------------------------------矩阵转置void Matrix::transpose(){double temp;int t;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<=i;j++){temp=data[i][j];data[i][j]=data[j][i];data[j][i]=temp;}t=x;x=y;y=t;}//--------------------------------------求一维矩阵的长度double Matrix::mode() const{double s=0;unsigned i,j;if(x==1)for(i=0,j=0;j<y;j++)s+=data[i][j]*data[i][j];else if(y==1)for(i=0,j=0;i<x;i++)s+=data[i][j]*data[i][j];else{cout<<"\n不是一维的!";exit(0);}s=sqrt(s);return (s);}//----------------------------------------重载=号Matrix Matrix::operator = (const Matrix & source){x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];return *this;}//-------------------------------------------重载+号Matrix & operator + (const Matrix & left,const Matrix & right){if(left.x!=right.x || left.y!=right.y){cout<<"\n维数不相等,不能相加!";exit(0);}for(unsigned i=0;i<left.x;i++)for(unsigned j=0;j<left.y;j++)temp_Matrix.data[i][j]=right.data[i][j] + left.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//---------------------------------------------重载+号Matrix & operator - (const Matrix & left,const Matrix & right){if(left.x!=right.x || left.y!=right.y){cout<<"\n维数不相等,不能相减!";exit(0);}for(unsigned i=0;i<left.x;i++)for(unsigned j=0;j<left.y;j++)temp_Matrix.data[i][j]=left.data[i][j] - right.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//----------------------------------------重载乘号Matrix & operator * (const Matrix & left,const Matrix & right){if(left.y!=right.x){cout<<"\n两个矩阵相乘错误.";exit(0);}temp_Matrix.init();unsigned i,j,k;for(i=0;i<left.x;i++)for(j=0;j<right.y;j++)for(k=0;k<left.y;k++)temp_Matrix.data[i][j]+=left.data[i][k] * right.data[k][j];temp_Matrix.x=left.x;temp_Matrix.y=right.y;return temp_Matrix;}//-------------------------------------------输入矩阵void Matrix::creat(){cout<<"输如行列式:";cout<<"\n行数:";cin>>x;cout<<"列数:";cin>>y;for(unsigned i=0;i<x;i++){cout<<"输入第"<<i+1<<"行:";for(unsigned j=0;j<y;j++)cin>>data[i][j];}}//----------------------------------------------输出矩阵void Matrix::show(){unsigned i,j;cout<<"\n\n矩阵表示如下:";for(i=0;i<x;i++){cout<<endl;for(j=0;j<y;j++)cout<<setw(7)<<setiosflags(ios::left)<<data[i][j];}}//----------------------------------用Householder矩阵化为实对称矩阵void Householder(Matrix & source){unsigned i,lenth,k,m,n,flag;double temp_lie_x[Max_xy],temp_lie_y[Max_xy],temp[Max_xy];double s;for(i=0;i<source.x-2;i++){for(k=0;k<Max_xy;k++){ //初始化为0temp_lie_x[k]=0;temp_lie_y[k]=0;temp[k]=0;}for(lenth=0;lenth+i+1<source.x;lenth++) //提取第data[i+1][i]到data[x-1][i]的数据存到temp_lie[Max_xy];temp_lie_x[lenth]=source.data[lenth+i+1][i];for(k=0,s=0;k<lenth;k++) //j为临时变量的个数.s+=temp_lie_x[k]*temp_lie_x[k];s=sqrt(s);temp_lie_y[0]=-s;for(k=1;k<lenth;k++)temp_lie_y[k]=0;for(k=0;k<lenth;k++)temp[k]=temp_lie_x[k]-temp_lie_y[k];for(k=0,flag=0;k<lenth;k++) //假如以上两个向量相等则退出,则跳出以进行下一次变换if(temp[k]!=0){flag=1;break;}if(flag==0)continue;Matrix part_h,I,x_y; //定义Matrix变量I.creat_unit(lenth);x_y.x=lenth,x_y.y=1;//对x_y赋值for(k=0;k<lenth;k++)x_y.data[k][0]=temp[k];//求x_y的转置Matrix zhuanzhi_x_y( x_y ); //拷贝构造函数zhuanzhi_x_y.transpose();s=2.0 / ( x_y.mode() * x_y.mode() );x_y.shucheng(s);temp_Matrix=x_y * zhuanzhi_x_y;part_h=I- x_y*zhuanzhi_x_y;Matrix H;H.creat_unit(source.x);for(m=i+1;m<source.x;m++)for(n=i+1;n<source.y;n++)H.data[m][n]=part_h.data[m-i-1][n-i-1]; //得到最后的Householder 矩阵source=source * H;source=H * source;}for(i=0;i<source.x;i++)for(k=0;k<source.y;k++)if(fabs(source.data[i][k]) < 1e-13)source.data[i][k]=0;//------------------------------------检查是否为实对称矩阵void Matrix::check_shiduichen(){if(x!=y){cout<<"\n\n不是是对称矩阵(行列不相等)\n\n";exit(0);}for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++){if(data[i][j]!=data[j][i]){cout<<"\n\n不是实对称矩阵!(不对称!)\n\n";exit(0);}}}ostream & operator <<(ostream & os,const Matrix & source){unsigned i,j;for(i=0;i<source.x;i++){os<<"\n";for(j=0;j<source.y;j++)os<<setw(10)<<setiosflags(ios::left)<<source.data[i][j]<<"\t";}os<<endl;return os;}void Matrix::set_x(unsigned xx) //设置行数{x=xx;}void Matrix::set_y(unsigned yy) //设置列数{y=yy;}unsigned Matrix::get_x() //得到行数{return x;}unsigned Matrix::get_y() //得到列数{return y;}double Matrix::getdata(unsigned i,unsigned j) //定位得到数据{return data[i][j];}void Matrix::setdata(unsigned i,unsigned j,double source){data[i][j]=source;if(x<i) x=i;if(y<j) y=j;}void Matrix::creat_unit(unsigned lenth) //生成i行单位矩阵{init();x=y=lenth;for(unsigned i=0;i<lenth;i++)data[i][i]=1;}void Matrix::shucheng(double changshu) //数乘运算{unsigned i,j;for(i=0;i<x;i++)for(j=0;j<y;j++)data[i][j]*=changshu;}void Matrix::sturm(){double s,r,maxhang,a,b;unsigned i,j,m;for(i=0,maxhang=0;i<x;i++){ for( s=0,j=0;j<y;j++)s+=fabs(data[i][j]);if(s>maxhang)maxhang=s;}a=-maxhang;b=maxhang;m=sturm_s(a)-sturm_s(b);for(i=1;i<=m;i++){a=-maxhang;b=maxhang;do{r=0.5*(a+b);if(sturm_s(r)>=i)a=r;elseb=r;}while(fabs(a-b)>1e-11);cout<<"\n特征值"<<i<<": "<<setiosflags(ios::left)<<setw(10)<<setprecision(10) <<setiosflags(ios::fixed)<<0.5*(a+b);}}unsigned Matrix::sturm_s(double r){double p[Max_xy+1];int temp[Max_xy+1];unsigned m,i;p[0]=1;p[1]=data[0][0]-r;for(i=2;i<=x;i++)p[i]=(data[i-1][i-1]-r)*p[i-1]-data[i-2][i-1]*data[i-2][i-1]*p[i-2];temp[0]=1;for(i=1;i<=x;i++)if(p[i]>1e-14)temp[i]=1;else if(p[i]<-1e-14)temp[i]=-1;elsetemp[i]=temp[i-1];for(i=1,m=0;i<=x;i++)if(temp[i]+temp[i-1]!=0)m++;return m;}int _tmain(int argc, _TCHAR* argv[]){double begin,end,time;begin=(double)clock()/(double)CLK_TCK;Matrix a;a.creat();cout<<"输º?入¨?的Ì?矩?阵¨®为a:";cout<<a;a.check_shiduichen();Householder(a);cout<<"用Householder化¡为实对称矩阵为a:";cout<<a;a.sturm();cout<<endl;end=(double)clock()/(double)CLK_TCK;time=end-begin;cout<<"时间是:";cout<<time;return 0;}串行运行结果:2.并行程序代码及结果抓图// bingxing.cpp : 定义控制台应用程序的入口点//// c.cpp : 定义控制台应用程序的入口点//#include "stdafx.h"#include <iostream>#include <stdlib.h>#include <math.h>#include <iomanip>#include <omp.h>using namespace s td;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //class Matrix定¡§义°?矩?阵¨®类¤¨¤const int Max_xy=20;//矩?阵¨®的Ì?最Á?大䨮维?数ºyclass Matrix{private:double data[Max_xy][Max_xy];unsigned x,y; //x,y;public:Matrix(); //默?认¨?构1造¨¬函¡¥数ºyMatrix(const Matrix & source); //拷?贝À¡ä构1造¨¬函¡¥数ºyvoid creat(); //输º?入¨?矩?阵¨®void init();void transpose(); //矩?阵¨®转Áa置?void show(); //输º?入¨?此ä?矩?阵¨®double mode() const; //求¨®一°?维?矩?阵¨®的Ì?长¡è度¨¨void check_shiduichen(); //检¨¬查¨¦是º?否¤?为a是º?对?称?矩?阵¨®void creat_unit(unsigned i); //生¦¨²成¨¦i行D单Ì£¤位?矩?阵¨®void set_x(unsigned xx); //设¦¨¨置?行D数ºyvoid set_y(unsigned yy); //设¦¨¨置?列¢D数ºyunsigned get_x(); //得Ì?到Ì?行D数ºyunsigned get_y(); //得Ì?到Ì?列¢D数ºyvoid shucheng(double changshu); //数ºy乘?运?算?void setdata(unsigned i,unsigned j,double source); //定¡§位?输º?入¨?数ºy据Ydouble getdata(unsigned i,unsigned j); //定¡§位?得Ì?到Ì?数ºy据Yvoid sturm(); //求¨®特¬?征¡Â值¦Ìunsigned sturm_s(double m); //计?算?sturm系¦Ì列¢D的Ì?同ª?好?数ºy Matrix operator = (const Matrix & right);friend Matrix & operator + (const Matrix & left,const Matrix & right); //重?载?+号?friend Matrix & operator - (const Matrix & left,const Matrix & right); //重?载?-号?friend Matrix & operator * (const Matrix & left,const Matrix & right); //重?载?乘?号?friend ostream& operator <<(ostream & os,const Matrix & source); //重?载?输º?出?friend void Householder(Matrix & source); //用®?Householde矩?阵¨®将?实º¦Ì对?称?矩?阵¨®化¡¥为a三¨y对?角?矩?阵¨®};Matrix temp_Matrix; //全¨?局?变À?量¢?Matrix//===================================================================//--------------------默?认¨?构1造¨¬函¡¥数ºyMatrix::Matrix(){init();}//----------------------------拷?贝À¡ä构1造¨¬函¡¥数ºyMatrix::Matrix(const Matrix & source){init();x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];}//------------------------------------------初?始º?化¡¥矩?阵¨®元a素? void Matrix::init(){x=y=0;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<Max_xy;j++)data[i][j]=0;}//------------------------------矩?阵¨®转Áa置?void Matrix::transpose(){double temp;int t;for(unsigned i=0;i<Max_xy;i++)for(unsigned j=0;j<=i;j++){temp=data[i][j];data[i][j]=data[j][i];data[j][i]=temp;}t=x;x=y;y=t;}//--------------------------------------求¨®一°?维?矩?阵¨®的Ì?长¡è度¨¨double Matrix::mode() const{double s=0;unsigned i,j;if(x==1)for(i=0,j=0;j<y;j++)s+=data[i][j]*data[i][j];else if(y==1)for(i=0,j=0;i<x;i++)s+=data[i][j]*data[i][j];else{cout<<"\n不?是º?一°?维?的Ì?!";exit(0);}s=sqrt(s);return (s);}//----------------------------------------重?载?=号?Matrix Matrix::operator = (const Matrix & source){x=source.x;y=source.y;for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++)data[i][j]=source.data[i][j];return *this;}//-------------------------------------------重?载?+号?Matrix & operator + (const Matrix & left,const Matrix & right){ int j;if(left.x!=right.x || left.y!=right.y){cout<<"\n维?数ºy不?相¨¤等̨¨,不?能¨¹相¨¤加¨®!";exit(0);}for(unsigned i=0;i<left.x;i++)#pragma omp parallel for private(j)for( j=0;j<left.y;j++)temp_Matrix.data[i][j]=right.data[i][j] + left.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//---------------------------------------------重?载?-号?Matrix & operator - (const Matrix & left,const Matrix & right){if(left.x!=right.x || left.y!=right.y){cout<<"\n维?数ºy不?相¨¤等̨¨,不?能¨¹相¨¤减?!";exit(0);}for(unsigned i=0;i<left.x;i++)for(unsigned j=0;j<left.y;j++)temp_Matrix.data[i][j]=left.data[i][j] - right.data[i][j];temp_Matrix.x=right.x;temp_Matrix.y=right.y;return temp_Matrix;}//----------------------------------------重?载?乘?号?Matrix & operator * (const Matrix & left,const Matrix & right){if(left.y!=right.x){cout<<"\n两¢?个?矩?阵¨®相¨¤乘?错䨪误¨®.";exit(0);}temp_Matrix.init();unsigned i,j,k;for(i=0;i<left.x;i++)for(j=0;j<right.y;j++)for(k=0;k<left.y;k++)temp_Matrix.data[i][j]+=left.data[i][k] * right.data[k][j];temp_Matrix.x=left.x;temp_Matrix.y=right.y;return temp_Matrix;}//-------------------------------------------输º?入¨?矩?阵¨®void Matrix::creat(){cout<<"输º?如¨?行D列¢D式º?:";cout<<"\n行D数ºy:";cin>>x;cout<<"列¢D数ºy:";cin>>y;for(unsigned i=0;i<x;i++){cout<<"输º?入¨?第̨²"<<i+1<<"行D:";for(unsigned j=0;j<y;j++)cin>>data[i][j];}}//----------------------------------------------输º?出?矩?阵¨®void Matrix::show(){unsigned i,j;cout<<"\n\n矩?阵¨®表À¨ª示º?如¨?下?:";for(i=0;i<x;i++){cout<<endl;for(j=0;j<y;j++)cout<<setw(7)<<setiosflags(ios::left)<<data[i][j];}}//----------------------------------用®?Householder矩?阵¨®化¡¥为a实º¦Ì对?称?矩?阵¨®void Householder(Matrix & source){for(i=0;i<source.x-2;i++){#pragma omp parallel for private(k)for(k=0;k<Max_xy;k++){ //初?始º?化¡¥为a0temp_lie_x[k]=0;temp_lie_y[k]=0;temp[k]=0;}for(lenth=0;lenth+i+1<source.x;lenth++) //提¬¨¢取¨?第̨²data[i+1][i]到Ì?data[x-1][i]的Ì?数ºy 据Y存ä?到Ì?temp_lie[Max_xy];temp_lie_x[lenth]=source.data[lenth+i+1][i];for(k=0,s=0;k<lenth;k++) //j为a临¢¨´时º¡À变À?量¢?的Ì?个?数ºy.s+=temp_lie_x[k]*temp_lie_x[k];s=sqrt(s);temp_lie_y[0]=-s;for(k=1;k<lenth;k++)temp_lie_y[k]=0;for(k=0;k<lenth;k++)temp[k]=temp_lie_x[k]-temp_lie_y[k];for(k=0,flag=0;k<lenth;k++) //假¨´如¨?以°?上¦?两¢?个?向¨°量¢?相¨¤等̨¨则¨°退ª?出?,则¨°跳¬?出?以°?进?行D下?一°?次ä?变À?换?if(temp[k]!=0){flag=1;break;}if(flag==0)continue;Matrix part_h,I,x_y; //定¡§义°?Matrix变À?量¢?I.creat_unit(lenth);x_y.x=lenth,x_y.y=1;//对?x_y赋3值¦Ìfor(k=0;k<lenth;k++)x_y.data[k][0]=temp[k];//求¨®x_y的Ì?转Áa置?Matrix zhuanzhi_x_y( x_y ); //拷?贝À¡ä构1造¨¬函¡¥数ºyzhuanzhi_x_y.transpose();s=2.0 / ( x_y.mode() * x_y.mode() );x_y.shucheng(s);temp_Matrix=x_y * zhuanzhi_x_y;part_h=I- x_y*zhuanzhi_x_y;Matrix H;H.creat_unit(source.x);for(m=i+1;m<source.x;m++)for(n=i+1;n<source.y;n++)H.data[m][n]=part_h.data[m-i-1][n-i-1]; //得Ì?到Ì?最Á?后¨®的Ì?Householder矩?阵¨®source=source * H;source=H * source;}for(i=0;i<source.x;i++)for(k=0;k<source.y;k++)if(fabs(source.data[i][k]) < 1e-13)source.data[i][k]=0;}//------------------------------------检¨¬查¨¦是º?否¤?为a实º¦Ì对?称?矩?阵¨®void Matrix::check_shiduichen(){if(x!=y){cout<<"\n\n不?是º?是º?对?称?矩?阵¨®(行D列¢D不?相¨¤等̨¨)\n\n";exit(0);}for(unsigned i=0;i<x;i++)for(unsigned j=0;j<y;j++){if(data[i][j]!=data[j][i]){cout<<"\n\n不?是º?实º¦Ì对?称?矩?阵¨®!(不?对?称?!)\n\n";exit(0);}}}ostream & operator <<(ostream & os,const Matrix & source){unsigned i,j;for(i=0;i<source.x;i++){os<<"\n";for(j=0;j<source.y;j++)os<<setw(10)<<setiosflags(ios::left)<<source.data[i][j]<<"\t";}os<<endl;return os;}void Matrix::set_x(unsigned xx) //设¦¨¨置?行D数ºy{x=xx;}void Matrix::set_y(unsigned yy) //设¦¨¨置?列¢D数ºy{y=yy;}unsigned Matrix::get_x() //得Ì?到Ì?行D数ºy{return x;}unsigned Matrix::get_y() //得Ì?到Ì?列¢D数ºy{return y;}double Matrix::getdata(unsigned i,unsigned j) //定¡§位?得Ì?到Ì?数ºy据Y {return data[i][j];}void Matrix::setdata(unsigned i,unsigned j,double source){data[i][j]=source;if(x<i) x=i;if(y<j) y=j;}void Matrix::creat_unit(unsigned lenth) //生¦¨²成¨¦i行D单Ì£¤位?矩?阵¨®{init();x=y=lenth;for(unsigned i=0;i<lenth;i++)data[i][i]=1;}void Matrix::shucheng(double changshu) //数ºy乘?运?算?加¨®入¨?并¡é行D语®?句? {int i,j;omp_set_num_threads(3);#pragma omp parallel forfor(i=0;i<x;i++)for(j=0;j<y;j++)data[i][j]*=changshu;}void Matrix::sturm(){double s,r,maxhang,a,b;unsigned i,j,m;for(i=0,maxhang=0;i<x;i++){ for( s=0,j=0;j<y;j++)s+=fabs(data[i][j]);if(s>maxhang)maxhang=s;}a=-maxhang;b=maxhang;m=sturm_s(a)-sturm_s(b);for(i=1;i<=m;i++){a=-maxhang;b=maxhang;do{r=0.5*(a+b);if(sturm_s(r)>=i)a=r;elseb=r;}while(fabs(a-b)>1e-11);cout<<"\n特¬?征¡Â值¦Ì"<<i<<": "<</*setiosflags(ios::left)<<setw(10)<<*/setprecision(10) <<setiosflags(ios::fixed)<<0.5*(a+b);}}unsigned Matrix::sturm_s(double r){double p[Max_xy+1];int temp[Max_xy+1];unsigned m,i;p[0]=1;p[1]=data[0][0]-r;for(i=2;i<=x;i++)p[i]=(data[i-1][i-1]-r)*p[i-1]-data[i-2][i-1]*data[i-2][i-1]*p[i-2];temp[0]=1;for(i=1;i<=x;i++)if(p[i]>1e-14)temp[i]=1;else if(p[i]<-1e-14)temp[i]=-1;elsetemp[i]=temp[i-1];for(i=1,m=0;i<=x;i++)if(temp[i]+temp[i-1]!=0)m++;return m;}int _tmain(int argc, _TCHAR* argv[]){double begin,end,time;begin=(double)clock()/(double)CLK_TCK;Matrix a;a.creat();cout<<"输º?入¨?的Ì?矩?阵¨®为a:";cout<<a;a.check_shiduichen();Householder(a);cout<<"用®?Householder化¡¥为a实º¦Ì对?称?矩?阵¨®为a:";cout<<a;a.sturm();cout<<endl;end=(double)clock()/(double)CLK_TCK;time=end-begin;cout<<"时º¡À间?是º?:êo";cout<<time;return 0;}程序运行结果:四、实验结果分析(运行过程中出现的问题、如何解决的;实验过程中的经验及教训)并行化结果展示:3*3维矩阵串行程序时间:t1=9.81ms并行程序时间:t2=7.612ms加速比=20.81ms/7.612=2.733并行化结果展示:10*10维矩阵串行程序时间:t1=144.581ms并行程序时间:t2=109.699ms加速比=144.581ms/109.699ms=1.317并行化结果展示:15*15维矩阵串行程序时间:t1=365.461ms并行程序时间:t2=290.316ms加速比=365.461ms/290.316ms=1.255体现了并行的优越性。
燕山大学多核程序设计实验报告
实验一Windows多线程编程一、实验目的与要求了解windows多线程编程机制掌握线程同步的方法二、实验环境和软件Windows XPVC 6.0三、实验内容创建线程:HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);四、实验程序#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;void ThreadFrunc1(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFrunc1"<<endl;}}void ThreadFrunc2(PVOID param){while(1){Sleep(1000);cout<<"This is kjj ThreadFrunc2"<<endl;}}int main(){int i=0;_beginthread(ThreadFrunc1,0,NULL);_beginthread(ThreadFrunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return 0;}实验结果实验二蒙特卡罗法求PI 一、实验目的和要求蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。
燕山大学 C++面向对象程序设计实验报告
C++面向对象程序设计实验报告C++ Programming Experiment Report学生所在学院:学生所在班级:学生姓名:____________学号:指导教师:教务处2012年5 月一、程序源代码:#include "iostream"#include "string"using namespace std;class Node{private:char *data;public:Node *prior;Node *next;Node &operator=(Node &b);//解决指针悬挂Node(){data=NULL;prior=NULL;next=NULL;}Node(string datain);Node(const Node &p);~Node();char *&getdata();};Node &Node::operator=(Node &b){if(data) delete[]data;if(b.data){data=new char [strlen(b.data)+1];strcpy(data,b.data);}else data=0;return *this;}Node::Node(string datain){int i;i=datain.length();data=new char[i+1];datain.copy(data,i);data[i]='\0';prior=NULL;next=NULL;}Node::Node(const Node &p){data=new char [strlen(p.data)+1];strcpy(data,p.data);prior=NULL;next=NULL;}Node::~Node(){next=NULL;prior=NULL;delete []data;}//析构函数char *&Node::getdata(){return data;}class List{protected:Node *pHead;Node *pTail;public:List();~List();List(const List &p);int InList();char *GetHead();Node *&GetHeadPos();char *GetTail();Node *&GetTailPos();char *RemoveHead();char *RemoveTail();int AddHead(string s);int AddHead(List b);int AddTail(string s);int AddTail(Node p);int AddTail(List b);int RemoveAll();int InsertBefore();int InsertAfter();char *GetAt(int m);void SetAt(int m);Node *RemoveAt(int m);Node *Find(string s);Node *FindIndex(int x);int GetCount();bool IsEmpty();int Print();int List::PrintH();int List::PrintT();};class Stack:public List{public:int Push(string s){Node *p;if(!pHead){pHead=new Node(s);}else{p=new Node(s);p->next=pHead;pHead=p;}return 0;}int Pop(char *&e){Node *p=pHead;if(!pHead){cout<<"空栈"<<endl;return 1;}pHead=pHead->next;p->next=NULL;e=p->getdata();return 0;}};class Queue:public List{public:int EnQueue(string s){if(!pHead){pHead=new Node(s);pTail=pHead;return 0;}else{pTail->next=new Node(s);pTail=pTail->next;}return 0;}int DeQueue(char *&e){Node *p=pHead;if(!pHead){cout<<"空表"<<endl;return 1;}pHead=pHead->next;p->next=NULL;e=p->getdata();return 0;}};class Set:public List{public:Set();Set(const Set &p);};Set::Set(){pHead=NULL;pTail=NULL;}Set::Set(const Set &p){Node *q=p.pHead;Node *r;if(!p.pHead)pTail=pHead=NULL;else{r=new Node;*r=*p.pHead;pHead=r;pHead->next=NULL;pHead->prior=NULL;q=q->next;while(q){r->next=new Node;*r->next=*q;r->next->prior=r;r=r->next;if(!q->next)pTail=r;q=q->next;}}}Set operator-(Set a,Set b){Node *p,*q,*r;Set c;c=Set(a);q=b.GetHeadPos();while(q){p=c.GetHeadPos();while(strcmp(q->getdata(),p->getdata())){p=p->next;if(!p)break;}if(p){if(p==c.GetHeadPos()) c.RemoveHead();else if(p==c.GetTailPos()) c.RemoveTail();else{r=p;p->prior->next=p->next;p->next->prior=p->prior;p->prior=NULL;p=p->next;r->next=NULL;delete r;}}q=q->next;}return c;}Set operator+(Set a,Set b){Node *p,*q;Set c;c=Set(a);q=b.GetHeadPos();while(q){p=c.GetHeadPos();while(strcmp(q->getdata(),p->getdata())){p=p->next;if(!p)break;}if(!p)c.AddTail(*q);q=q->next;}return c;}Set And(Set a,Set b){Node *p,*q;Set c;q=b.GetHeadPos();while(q){p=a.GetHeadPos();while(strcmp(q->getdata(),p->getdata())){p=p->next;if(!p)break;}if(p){c.AddTail(*p);}q=q->next;}return c;}List::List(){pHead=NULL;pTail=NULL;}//构造函数List::List(const List &p){Node *q=p.pHead;Node *r;if(!p.pHead)pTail=pHead=NULL;else{r=new Node;*r=*p.pHead;pHead=r;pHead->next=NULL;pHead->prior=NULL;q=q->next;while(q){r->next=new Node;*r->next=*q;r->next->prior=r;r=r->next;if(!q->next)pTail=r;q=q->next;}}}List::~List(){}int List::InList(){int num,i=1;string s;Node *p;cout<<"请输入要入链表元素的数目"<<endl;cin>>num;if(0==num) return 0;else{cout<<"请输入第"<<i<<"个元素"<<endl;cin>>s;pHead=new Node(s);pTail=pHead;p=pHead;while(i!=num){i++;cout<<"请输入第"<<i<<"个元素"<<endl;cin>>s;p->next=new Node(s);p->next->prior=p;p->next->next=NULL;p=p->next;}pTail=p;return 0;}}char *List::GetHead(){return pHead->getdata();}Node *&List::GetHeadPos(){return pHead;}char *List::GetTail(){return pTail->getdata();}Node *&List::GetTailPos(){return pTail;}char *List::RemoveHead(){Node *p;p=pHead;pHead=pHead->next;pHead->prior=NULL;return p->getdata();}char *List::RemoveTail(){Node *p;p=pTail;pTail=pTail->prior;pTail->next=NULL;return p->getdata();}int List::AddHead(string s){if(!pHead){pHead=new Node(s);pTail=pHead;}else{pHead->prior=new Node(s);pHead->prior->next=pHead;pHead=pHead->prior;pHead->prior=NULL;}return 0;}int List::AddHead(List b){if(!pHead){pHead=b.pHead;pTail=b.pTail;}else{b.pTail->next=pHead;pHead->prior=b.pTail;pHead=b.pHead;}return 0;}int List::AddTail(string s){if(!pHead){pHead=new Node(s);pTail=pHead;}else{pTail->next=new Node(s);pTail->next->prior=pTail;pTail=pTail->next;pTail->next=NULL;}return 0;}int List::AddTail(Node p){if(!pHead){pHead=new Node;*pHead=p;pHead->next=NULL;pHead->prior=NULL;pTail=pHead;}else{pTail->next=new Node;*pTail->next=Node(p);pTail->next->prior=pTail;pTail=pTail->next;pTail->next=NULL;}return 0;}int List::AddTail(List b){if(!pHead){pHead=b.pHead;pTail=b.pTail;}else{pTail->next=b.pHead;b.pHead->prior=pTail;pTail=b.pTail;}return 0;}int List::RemoveAll(){Node *p=pHead,*q;pHead=pTail=NULL;//p->prior=NULL;while(p){q=p;p=p->next;q->~Node();}return 0;}int List::InsertBefore(){Node *p;int i=1,a;string s;p=pHead;cout<<"请输入要插入元素的位置"<<endl;cin>>a;cout<<"请输入要插入的字符串"<<endl;cin>>s;if(a==1){if(!pHead){pHead=new Node(s);pTail=pHead;}else{p=new Node(s);p->next=pHead;pHead->prior=p;pHead=p;}return 0;}while(i!=a&&p){p=p->next;i++;}p->prior->next=new Node(s);p->prior->next->next=p;p->prior->next->prior=p->prior;p->prior=p->prior->next;return 0;}//InsertBefore 在给定位置之前插入int List::InsertAfter(){Node *p;int i=1,a;string s;p=pHead;cout<<"请输入要插入元素的位置"<<endl;cin>>a;cout<<"请输入要插入的字符串"<<endl;cin>>s;if(0==a){if(!pHead){pHead=new Node(s);pTail=pHead;}else{p=new Node(s);p->next=pHead;pHead->prior=p;pHead=p;}return 0;}while(i!=a){p=p->next;i++;}if(!p->next){p->next=new Node(s);p->next->prior=p;p->next->next=NULL;pTail=p->next;}else{p->next->prior=new Node(s);p->next->prior->next=p->next;p->next=p->next->prior;p->next->prior=p;}return 0;}//InsertAfter在给定位置之后插入char *List::GetAt(int m){if(m<0){cout<<"错误的输入"<<endl;exit(0);}int i=1;Node *p;p=pHead;while(i!=m&&p){p=p->next;i++;}if(i<m){cout<<"超出范围"<<endl;exit(0);}return p->getdata();}void List::SetAt(int m){int i=0;Node *p;string s;p=pHead;while(i!=m&&p){p=p->next;i++;}if(i<m){cout<<"错误的输入"<<endl;exit(0);}cout<<"请输入新元素的值"<<endl;cin>>s;int j;j=s.length();p->getdata()=new char[j+1];s.copy(p->getdata(),j);p->getdata()[j]='\0';}//SetAt m=0为头结点所处位置Node *List::RemoveAt(int m){int i=0;Node *p;string s;p=pHead;while(i!=m&&p){p=p->next;i++;}if(i<m){cout<<"错误的输入"<<endl;exit(0);}if(p==pHead) RemoveHead();else if(p==pTail) RemoveTail();else{p->prior->next=p->next;p->next->prior=p->prior;p->prior=NULL;p->next=NULL;}return p;}Node *List::Find(string s){Node *p=pHead;int l;l=s.length();while(pare(0,l,p->getdata())){p=p->next;if(!p){cout<<"没有找到与输入字符串相等的数据"<<endl;return NULL;}}return p;}Node *List::FindIndex(int x){if(x<-1){cout<<"错误的位置输入"<<endl;return NULL;}Node *p=pHead;int i=0;while(i!=x&&p){p=p->next;i++;}if(!p){cout<<"输入位置超出链表范围"<<endl;return NULL;}return p;}int List::GetCount(){Node *p=pHead;int l=0;while(p){p=p->next;l++;}return l;}bool List::IsEmpty(){if(!pHead) {cout<<"空表"<<endl;return 1;}else {cout<<"链表非空"<<endl;return 0;}}int List::Print(){Node *p;p=pHead;if(!p){cout<<"空表";return -1;}do{cout<<p->getdata()<<" ";p=p->next;}while(p!=NULL);cout<<endl;return 0;}//输出所有数据char *GetNext(Node *&p){if(!p->next){Node *q=p;p=NULL;return q->getdata();}else{p=p->next;return p->prior->getdata();}}//GetNextchar *GetPrev(Node *&p){if(!p->prior){Node *q=p;p=NULL;return q->getdata();}else{p=p->prior;return p->next->getdata();}}//GetPrevint List::PrintH(){Node *p;p=pHead;if(!p){cout<<"空表"<<endl;return -1;}while(p) cout<<GetNext(p)<<" ";cout<<endl;return 0;}int List::PrintT(){Node *p;p=pTail;if(!p){cout<<"空表"<<endl;return -1;}while(p) cout<<GetPrev(p)<<" ";cout<<endl;return 0;}List operator+(List a,List b){a.GetTailPos()->next=b.GetHeadPos();b.GetHeadPos()->prior=a.GetTailPos();a.GetTailPos()=b.GetTailPos();return a;}int main(){List a;int i,m,n,pos;string s;do{cout<<" 请输入要进行的操作"<<endl;cout<<"1:添加节点"<<endl;cout<<"2:输出节点"<<endl;cout<<"3:查询节点"<<endl;cout<<"4:修改节点"<<endl;cout<<"5:删除节点"<<endl;cout<<"0:结束"<<endl;cin>>m;switch(m){case 1:{cout<<"1:为空表输入多个节点"<<endl;cout<<"2:添加一个头结点"<<endl;cout<<"3:把另一个链表添加到头结点位置"<<endl;cout<<"4:添加一个尾节点"<<endl;cout<<"5:把另一个链表添加到尾结点位置"<<endl;cout<<"6:在某个位置之前插入节点"<<endl;cout<<"7:在某个位置之后插入节点"<<endl;do{cout<<"请选择添加节点的方式,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1:{a.InList();a.PrintH();break;}case 2:{cin>>s;a.AddHead(s);a.PrintH();break;}case 3:{cout<<"请输入被添加的链表的数据"<<endl;List b;b.InList();a.AddHead(b);cout<<"添加完毕";a.PrintH();break;}case 4:{cin>>s;a.AddTail(s);a.PrintH();break;}case 5:{cout<<"请输入被添加的链表的数据"<<endl;List b;b.InList();a.AddTail(b);cout<<"添加完毕";a.PrintH();break;}case 6:{a.InsertBefore();a.PrintH();break;}case 7:{a.InsertAfter();a.PrintH();break;}case 0:{n=0;break;}default: cout<<"指令错误请重新输入"<<endl;}}while(n!=0);break;}//case1case 2:{cout<<"1:从头到尾输出"<<endl;cout<<"2:从尾到头输出"<<endl;cout<<"3:输出头结点"<<endl;cout<<"4:输出尾节点"<<endl;do{cout<<"请选择输出节点的方式,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1: a.PrintH();break;case 2: a.PrintT();break;case 3: cout<<a.GetHead()<<endl;break;case 4: cout<<a.GetTail()<<endl;break;case 0: n=0;break;default:cout<<"输入错误请重新输入"<<endl;}}while(n!=0);break;}//case2case 3:{cout<<"1:输入字符串查找"<<endl;cout<<"2:输入位置查找"<<endl;cout<<"3:查询表长"<<endl;cout<<"4:查看表是否为空"<<endl;do{cout<<"请输入要进行的操作,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1:cout<<"请输入一个字符串"<<endl;cin>>s;cout<<a.Find(s)->getdata()<<endl;break;case 2:cout<<"请输入一个位置(头结点为0)"<<endl;cin>>pos;cout<<a.FindIndex(pos)->getdata()<<endl;break;case 3:cout<<a.GetCount()<<endl;break;case 4:cout<<a.IsEmpty();break;case 0:n=0;break;default:cout<<"输入错误请重新输入"<<endl;}}while(n!=0);break;}//case 3case 4: cout<<"请输入要修改元素的位置"<<endl;cin>>pos;a.SetAt(pos);a.PrintH();break; //case4case 5:{cout<<"1:删除头结点"<<endl;cout<<"2:删除尾节点"<<endl;cout<<"3:删除指定位置元素"<<endl;cout<<"4:删除所有节点"<<endl;do{cout<<"请选择删除的方式,返回上一层请输入0"<<endl;cin>>n;switch(n){case 1:a.RemoveHead();a.PrintH();break;case 2:a.RemoveTail();a.PrintH();break;case 3:cout<<"请输入一个位置"<<endl;cin>>pos;a.RemoveAt(pos);a.PrintH();break;case 4:a.RemoveAll();a.RemoveAll();a.PrintH();break;case 0:n=0;break;default:cout<<"输入错误请重新输入"<<endl;}}while(n!=0);break;}//case5case 0:m=0;break;default:cout<<"输入错误请重新输入"<<endl;}//switch(m)}while(m!=0);Stack st;int l=0;char *e;cout<<"请输入栈的长度"<<endl;cin>>l;for(i=1;i<=l;i++){cout<<"请输入入栈元素"<<endl;cin>>s;st.Push(s);}st.Print();cout<<"栈顶元素出栈:"<<endl;st.Pop(e);cout<<e<<endl;Queue qu;cout<<"请输入队列的长度"<<endl;cin>>l;for(i=1;i<=l;i++){cout<<"请输入入队列元素"<<endl;cin>>s;qu.EnQueue(s);}qu.Print();cout<<"元素出队列"<<endl;qu.DeQueue(e);cout<<e<<endl;Set a1,b,c;cout<<"请输入集合A"<<endl;a1.InList();cout<<"请输入集合B"<<endl;b.InList();c=a1-b;cout<<"集合的差:";c.Print();c=a1+b;cout<<"集合的并:";c.Print();c=And(a1,b);cout<<"集合的交:";c.Print();return 0;}二、实验结果:封面设计:贾丽地址:中国河北省秦皇岛市河北大街438号邮编:066004电话:************传真:************网址:。
燕山大学软件项目开发实践报告模板
燕山大学软件项目开发实践设计报告学院信息科学与工程学院(软件学院)指导教师所在组指导教师实习日期2017年7月3日--2017年7月14日摘要摘要正文。
关键词关键词1;关键词2;关键词3;关键词4;关键词x目录目录摘要 (I)第1章需求分析 (1)1.1项目背景 (1)1.2项目意义 (1)1.3 XXXX (1)1.3.1 xxxxx (1)1.3.2 xxxxxx (1)第2章系统分析与设计 (3)2.1 XXXX (3)2.2 XXXX (3)2.2.1 xxxxxx (3)2.2.2 xxxx (3)2.2.3 xxxx (3)2.3本章小结 (4)第3章详细设计 (5)3.1 XXXXX (5)3.2 XXXX (5)3.3本章小结 (6)第4章系统实现 (7)4.1 XXXXX (7)4.2 XXXX (7)4.3本章小结 (7)结论 (9)第1章需求分析第1章需求分析1.1 项目背景此处为正文格式。
要求:语句通顺:标准的书面语。
属于日常应用文写作。
标点准确。
符合中文语法规范。
图表规范。
符合规定。
标准的教科书,反对自己杜撰。
完整。
软件工程过程。
美观。
个人审美。
标题的名称不限制。
具体章节内容安排由学生自定。
1.2 项目意义正文。
1.3 xxxx1.3.1 xxxxx1.3.2 xxxxxx软件项目开发实践设计报告第2章系统分析与设计第2章系统分析与设计2.1 xxxx正文2.2 xxxx2.2.1 xxxxxx2.2.2 xxxx2.2.3 xxxx软件项目开发实践设计报告第3章详细设计第3章详细设计3.1 xxxxx3.2 xxxx图格式如下所述。
ER模型描述如图3-1所示。
图3-1学生作业管理和作业提交ER图表格式如下所述。
如表3-1所示为课程动态基本信息表。
表3-1新闻基本信息表字段名描述类型长度空是否主键NewsID 记录新闻编号Int 否是NewsTitle 课程动态新闻标题varchar 200 否否NewsContent 课程动态新闻内容Text 否否NewsTime 课程动态新闻发表时间varchar 40 否否Browsetime 浏览次数Int 否否软件项目开发实践设计报告3.3 本章小结第4章系统实现第4章系统实现4.1 xxxxx4.2 xxxx4.3 本章小结软件项目开发实践设计报告结论结论软件项目开发实践设计报告。
多核实验
实验一Visual C++集成开发环境的使用一、实验目的1、掌握MS V isual Studio .Net集成开发环境的使用;2、掌握使用MS V isual Studio .Net进行C/C++程序设计、编辑、调试和运行;二、预备知识1、C/C++语言程序设计;2、熟悉MS V isual Studio .Net集成开发环境。
三、实验原理1、创建V isual C++源文件并在命令行上对其进行编译。
2、创建新项目并添加源文件。
四、实验内容1、编写程序求解n阶行列式值的程序,并在V isual Studio 2008上调试、运行输出结果;2、程序基本思路或设计方法:根据行列式的计算方法求解,设计方法采用VC++实验二Windows多线程编程基础一、实验目的1、掌握MS V isual Studio集成开发环境的使用与配置;2、掌握利用Windows API函数进行多线程编程;3、掌握利用MS V isual C++ MFC类库进行多线程编程;4、掌握利用MS V isual Studio集成开发环境编写、调试和运行Windows多线程程序。
二、预备知识1、C/C++语言程序设计;2、熟悉MS V isual Studio .Net集成开发环境。
三、实验原理线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。
一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。
线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完后再执行。
在多核的机器上,调度程序可将多个线程放到不同的处理器核上去运行,这样可使处理器任务平衡,并提高系统的运行效率。
四、实验内容1、按照“附录一”中的要求,配置好Visual Studio编译环境;2、在MS V isual C++集成开发环境中调试\Lab2\ HelloThreads\HelloThreads1,并指出程序的主要功能;3、试根据HelloThreads1改写程序,要求各线程打印输出各自线程号,写出设计思路或方法;4、对于第3节的方法,使用原子操作和临界区两种方法编写多线程程序,计算圆周率π值,并在V isual Studio 2008上调试、运行输出结果;说明程序设计的基本思路,以及如何实现线程的互斥和同步?5、对于第4节的方法,使用原子操作和临界区两种方法编写多线程程序,计算圆周率π值,并在V isual Studio 2008上调试、运行输出结果;说明程序设计的基本思路,以及如何实现线程的互斥和同步?6、读懂程序,说明程序的主要功能,以及所用到的多线程技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一Windows多线程编程一、实验目的与要求了解windows多线程编程机制掌握线程同步的方法二、实验环境和软件WindowsXPVC6.0三、实验内容创建线程:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId);四、实验程序#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>usingnamespacestd;voidThreadFrunc1(PVOIDparam){while(1){Sleep(1000);cout<<"ThisisThreadFrunc1"<<endl;}}voidThreadFrunc2(PVOIDparam){while(1){Sleep(1000);cout<<"ThisiskjjThreadFrunc2"<<endl; }}intmain(){inti=0;_beginthread(ThreadFrunc1,0,NULL);_beginthread(ThreadFrunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return0;}实验结果实验二蒙特卡罗法求PI一、实验目的和要求蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。
本例中,算法随机产生一系列点,模拟这些点落在如下图所示的正方形区域内的情况。
其几何解释如下1轴YX轴 1图1如图1所示,正方形边长为1,左下顶点与原点重合,两边分别与x,y轴重合。
曲线为1/4圆弧,圆心位于原点,与正方形左下定点重合,半径为1。
正方形面积S1=1,圆弧内面积S2= 121r。
算法模拟大量44点随机落在此正方形区域内,落在圆弧内的点的数量(n2)与点的总数(n1)的比例与面积成正比关系。
即n 1 n 2 S1S24(1)由此可得4n2(2)n1因此,只要计算出落在圆弧内的点的数量在点总数中所占的比例,就能求出的值。
由图1可知,所有点均落在正方形范围内,因此点的x坐标满足0x1。
2y2又,当点落在圆弧范围内,则点的二维坐标关系满足x1。
3二、实验环境和软件编译器:MicrosoftVisualStudioC++6.0操作系统:WindowsXP三、实验内容3.1串行算法本项目中使用了标准C语言库中的产生随机数函数。
该函数原型为:intrand(void);此函数产生随机数列,每次调用时均返回0到RAND_MA之X间的一个整数。
voidsrand(unsignedintseed);此函数为rand()函数所生成的伪随机数序列设置起始点,使之产生不同的伪随机数。
算法:产生2n个随机数据,范围[0,1],对每个数据点计算其坐标是否满足2y2x1,统计满足此关系的点的数量count,则count4n3.2并行算法描述算法步骤:1、确定需要产生的点的个数n,参与运行的处理器数m;2、对每一个处理器,生成两个随机数x,y,范围[0,1];2y23、判断两个随机数x,y是否满足x1;4、若满足,则变量COUNTi++;5、重复步骤2-4,直至每个处理器均生成n/m个随机点;6、收集COUNTi的值,并累加至变量COUNT中,此即为随机点落在圆弧内的数量;7、通过(2)式计算的值。
4#include<stdio.h>#include<windows.h>#include<time.h>//#include<process.h>#include<iostream>#include<fstream>#include<stdlib.h>usingnamespacestd;HANDLEevFinish;longcs=0;//总循环次数longcount=0;//主线程有效次数longcount_thread=0;//thread线程有效次数time_tstart,finish;//定义开始结束时间//thread线程计算量为总数的一半DWORDWINAPIthread(LPVOIDparam){inti=0;doublex,y;for(i=0;i<cs/2;i++){x=(longdouble)rand()/(longdouble)RAND_MAX;y=(longdouble)rand()/(longdouble)RAND_MAX;if((x*x+y*y)<=1)count_thread++;//printf("副%d",i);}SetEvent(evFinish);return0;}//主线程计算量为总数的一半intmain(void){evFinish=CreateEvent(NULL,FALSE,FALSE,NULL);printf("请输入总循环次数:");scanf("%d",&cs);cs*=1000000;srand((unsigned)time(NULL));//用时间作随机数种子start=time(NULL);//记录开始时间HANDLEid=CreateThread(NULL,0,thread,NULL,0,NULL);//创建thread线程inti=0;doublex,y;for(i=0;i<cs/2;i++){x=(longdouble)rand()/(longdouble)RAND_MAX;y=(longdouble)rand()/(longdouble)RAND_MAX;if((x*x+y*y)<=1)count++;//printf("主%d",i);//printf("count%d",count);}WaitForSingleObject(evFinish,INFINITE);//两线程同步count+=count_thread;finish=time(NULL);//记录结束时间printf("并行情况:\n\n");printf("用时=%f秒\n",difftime(finish,start));//计算时间差printf("总共的循环次数=%d次\n",cs);printf("线程有效次数=%d次\n",count);printf("pi=%f\n",4*(double)count/(double)cs);printf("串行行情况:\n");count=0;start=time(NULL);//记录开始时间for(i=0;i<cs;i++){x=(longdouble)rand()/(longdouble)RAND_MAX;y=(longdouble)rand()/(longdouble)RAND_MAX;if((x*x+y*y)<=1)count++;//printf("主%d",i);//printf("count%d",count);}finish=time(NULL);//记录结束时间printf("用时=%f秒\n",difftime(finish,start));printf("总共的循环次数=%d次\n",cs);printf("线程有效次数=%d次\n",count);printf("pi=%f\n",4*(double)count/(double)cs);return(0);}实验结果:测试数据集合:由随机数函数产生的数据集合实验三并行排序一、实验目的与要求在单核计算环境中,排序算法关注的核心问题是怎样减少要排序数据之间的比较次数或算法所需要的内存空间。
在多核计算环境中,每个核以线程为执行单元,排序程序可以通过生成相互协作的线程来完成排序。
与单核计算环境不同的是,在多核计算环境中更关注数据集的合理划分,更致力于识别可并行执行的任务。
一旦完成这些工作,程序设计上就可以生成对应的线程去执行任务。
理论上,基于相同的串行算法和相同的c ac h e 命中率,多核计算速度可以无限核计 算速度的P 倍,其中P 为核的数目。
多核上的并行排序算法所面临的问题在于: 1.未排序的数据集合理划分到每个线程后,最后怎么汇合,形成完整的 排好序的数据集呢? 2.怎么保证可并行执行的线程的数目和核的数目相等或稍微多于核的数 目,同时也保证这些线程之间的工作量也尽可能的相同呢? 在这个实验中,串行的算法采用标准C 语言库中的快速排序函数。
并行算法中,先将要处理的数据集均等的分到每个线程中,并使用C 语言 库中的快速排序函数各自排序。
然后所有线程开始根据相同的数对自己的 数据集进行划分,这个数是依据一定的方法选出来的(详见并行算法描述)。
每个线程的数据集都会被分成K 份,(其中P<=K<P2,P 为核的数目), 每份将被称为一桶。
很显然这个过程选出了K 个数,这些数将被成为 bound_value,记为X1,X2,X3⋯⋯XK 。
最后每个线程中小于或等于X1 的数会被一个独立的线程去归并排序,同样小于或等于X2的数也会被另外 一个独立的线程去归并排序,依次类推,直到排好序。
需要指出的是:这个并行版本最消耗时间的部分是一开始每个线程各自的 排序,时间为:O (nlogn );不过其数据划分和线程生成也相对简单。
最 后的归并排序所需时间是线性增长的,即:O (n ),因此即使在最后归并 部分线程执行的任务已经是不均衡的,也不会对整个程序的性能产生很大 的影响。
二、实验环境和软件编译器:MicrosoftVisualStudioC++6.0 操作系统:WindowsXP三、实验内容3.1并行算法描述 算法:将原始待排序的数据分成P 等份,每个处理器上对N0个数据进行排序,称 每个被排序后的子集为B0,⋯,Bp-1 Remain_data=N ,设定第0组归并起始位置全部为0,i=0,设置第0组在目标数组中的起始0 循环直至r emian_data<L(L=N0/P) 3.1选取所有子集中起始位置后续L 个元素的最小值bound_value ,并获 得bound_value 的桶号bucket 3.2在所有子集中从起始位置到后续L 个元素中选取边界位置,使得边界 位置的最后一个元素小于或等于bound_value ,而边界位置后的第一元素 大于bound_value 。