首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 工作总结
  • 工作计划
  • 心得体会
  • 竞聘演讲
  • 会议发言
  • 爱国演讲
  • 就职演说
  • 开业开幕
  • 思想学习
  • 征文演讲
  • 经验材料
  • 述职报告
  • 调研报告
  • 工作汇报
  • 年终总结
  • 申报材料
  • 学习体会
  • 企划方案
  • 活动方案
  • 技巧经验
  • 模板范例
  • 思想宣传
  • 经济工作
  • 工作报告
  • 组织人事
  • 反腐倡廉
  • 慰问贺电
  • 先进事迹
  • 思想汇报
  • 入党申请书
  • 党会发言
  • 先进性教育
  • 入团申请书
  • 个人简历
  • 演讲稿
  • 调查报告
  • 实习报告
  • 和谐社会
  • 观后感
  • 读后感
  • 作文范文
  • 自我鉴定
  • 讲话稿
  • 自查报告
  • 高级语言程序设计实验报告

    时间:2021-03-20 06:10:34 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:高级 实验 语言程序设计

    高级语言程序设计实验报告 本文关键词:高级,实验,语言程序设计,报告

    高级语言程序设计实验报告 本文简介:内蒙古工业大学信息工程学院实验报告课程名称:高级语言程序设计(C)实验名称:循环、数组、函数和结构体程序设计实验类型:验证性□综合性√设计性□实验室名称:校计算机中心机房班级:工业13-1学号:201320106052姓名:王洪卫组别:同组人:成绩:实验日期:2013.11.21/2013.11.2

    高级语言程序设计实验报告 本文内容:

    内蒙古工业大学信息工程学院

    课程名称:高级语言程序设计(C)

    实验名称:循环、数组、函数和结构体程序设计

    实验类型:

    验证性□

    综合性√

    设计性□

    实验室名称:

    校计算机中心机房

    班级:

    工业13-1

    学号:

    201320106052

    姓名:

    王洪卫

    组别:

    同组人:

    成绩:

    实验日期:

    2013.11.21/2013.11.28

    实验报告撰写要求

    一、

    实验前用预习报告纸撰写预习报告,预习报告包括以下内容

    1.

    实验目的

    2.

    实验用仪器设备、器材或软件环境

    3.

    实验原理、方案设计、程序框图、预编程序等

    4.

    实验过程中需要记录的实验数据表格

    二、

    实验过程中,要认真观察,仔细记录

    三、

    完成实验后用实验报告纸撰写实验报告,包括以下内容

    1.

    仪器设备型号及编号

    2.

    实验器材或软件环境

    3.

    实验步骤、程序调试方法

    4.

    实验数据处理及结果分析

    5.

    实验中存在的问题

    6.

    体会及思考题

    四、

    报告撰写时,要求格式规范、书写整齐

    内蒙古工业大学信息工程学院

    预习报告成绩:

    指导教师审核(签名):*年*月*日

    预习报告

    一、

    实验题目:

    有10个学生,每个学生的数据包括学号、姓名,4门课的成绩、总成绩和平均成绩.从键盘输入10个学生的数据(包括学号、姓名以及4门课的成绩),要求打印出每位学生的学号、姓名、四门课的成绩、总成绩和平均成绩,最后再打印出最高分的学生的数据(包括学号,姓名,4门课的成绩、总成绩和平均成绩)以及4门课的总平均成绩.具体要求:

    1.根据学生信息定义一个结构体类型,再说明一个该结构体类型的数组。

    2.用input函数从键盘上输入10个学生的数据。

    3.用average

    函数求出每个学生总成绩、平均成绩和所有学生的总平均成绩。

    4.用maximum

    函数找出最高分的学生的数据;

    5.在主函数中输出每位学生的学号、姓名、4门课的成绩、总成绩和平均成绩,最后再输出最高分学生的数据和总平均成绩。

    输出形式如下:

    NO.

    name

    score1

    score2

    score3

    score4

    total

    average

    1

    wang

    80

    79

    81

    80

    320

    80.00

    2

    li

    91

    88

    89

    92

    360

    90.00

    .

    The

    highest

    score:

    5

    zhang

    96

    91

    93

    88

    368

    92.00

    The

    total

    average=85.00

    二、

    程序流程图(大小控制在一页当中):

    三、

    预编程序:(这个是最开始的程序,允许有错误)

    #include

    #define

    N

    10

    struct

    stu

    {int

    number;

    char

    name[10];

    int

    score[4];

    int

    total;

    float

    average;

    };

    struct

    stu

    students[N]

    struct

    stusp=students;

    input()

    {int

    i;

    printf(“input

    number

    name

    score1

    score2

    score3

    score4:/n“);

    sp=students;

    for(i=0;inumber);

    scanf(“%s“,sp->name)

    scanf(“%d%d%d%d“,}

    }

    float

    average()

    {float

    aver=0.0;

    int

    i;

    for(sp=students,i=0;itotal=sp->score[0]+sp->score[1]+sp->score[2]+sp->score[3];

    sp->average=sp->total/4.0;

    aver=aver+sp->average;

    }

    aver=aver/N;

    return(aver);

    }

    int

    maximum()

    {int

    i=0,j=0;

    int

    max=0;

    for(sp=students,i=0;itotal>max)

    {max=sp->total;

    j=i;

    }

    return(j);

    }

    mian()

    {int

    i,j;

    float

    aver;

    input();

    aver=average();

    j=maximum();

    printf(“no./tname/tscore1/tccore2/tscore3/tscore4/ttotal/taverage:/n“);

    for(sp=students,i=0;inumber,sp->name,sp->score[0],sp->score[1],sp->score[2],sp->score[3],sp->total,sp->average);

    printf(“the

    highest

    score/n“);

    printf(“%d/t%s/t%d/t%d/t%d/t%d/t%d/t%f“,students[j].number,students[j].name,students[j].score[0],students[j].score[1],students[j].score[2],students[j].score[3],students[j].total,students[j].average);

    printf(“/naverage=%f/n“,aver);

    }

    实验报告成绩:

    指导教师审核(签名):*年*月*日

    实验报告

    一、

    实验题目:

    有10个学生,每个学生的数据包括学号、姓名,4门课的成绩、总成绩和平均成绩.从键盘输入10个学生的数据(包括学号、姓名以及4门课的成绩),要求打印出每位学生的学号、姓名、四门课的成绩、总成绩和平均成绩,最后再打印出最高分的学生的数据(包括学号,姓名,4门课的成绩、总成绩和平均成绩)以及4门课的总平均成绩.具体要求:

    1.根据学生信息定义一个结构体类型,再说明一个该结构体类型的数组。

    2.用input函数从键盘上输入10个学生的数据。

    3.用average

    函数求出每个学生总成绩、平均成绩和所有学生的总平均成绩。

    4.用maximum

    函数找出最高分的学生的数据;

    5.在主函数中输出每位学生的学号、姓名、4门课的成绩、总成绩和平均成绩,最后再输出最高分学生的数据和总平均成绩。

    输出形式如下:

    NO.

    name

    score1

    score2

    score3

    score4

    total

    average

    1

    wang

    80

    79

    81

    80

    320

    80.00

    2

    li

    91

    88

    89

    92

    360

    90.00

    .

    The

    highest

    score:

    5

    zhang

    96

    91

    93

    88

    368

    92.00

    The

    total

    average=85.00

    二、

    程序流程图(大小控制在一页当中):

    三、

    程序:(最终正确的程序)

    #include

    #define

    N

    10

    struct

    stu

    {int

    number;

    char

    name[10];

    int

    score[4];

    int

    total;

    float

    average;

    };

    struct

    stu

    students[N];

    struct

    stusp=students;

    input()

    {int

    i;

    printf(“input

    number

    name

    score1

    score2

    score3

    score4:/n“);

    sp=students;

    for(i=0;inumber);

    scanf(“%s“,sp->name);

    scanf(“%d%d%d%d“,}

    }

    float

    average()

    {float

    aver=0.0;

    int

    i;

    for(sp=students,i=0;itotal=sp->score[0]+sp->score[1]+sp->score[2]+sp->score[3];

    sp->average=sp->total/4.0;

    aver=aver+sp->average;

    }

    aver=aver/N;

    return(aver);

    }

    int

    maximum()

    {int

    i=0,j;

    int

    max=0;

    for(sp=students,i=0;itotal>max)

    {max=sp->total;

    j=i;

    }

    return(j);

    }

    main()

    {int

    i,j;

    float

    aver;

    input();

    aver=average();

    j=maximum();

    printf(“no./tname/tscore1/tccore2/tscore3/tscore4/ttotal/taverage:/n“);

    for(sp=students,i=0;inumber,sp->name,sp->score[0],sp->score[1],sp->score[2],sp->score[3],sp->total,sp->average);

    printf(“the

    highest

    score/n“);

    printf(“%d/t%s/t%d/t%d/t%d/t%d/t%d/t%.2f“,students[j].number,students[j].name,students[j].score[0],students[j].score[1],students[j].score[2],students[j].score[3],students[j].total,students[j].average);

    printf(“/naverage=%.2f/n“,aver);

    }

    四、

    运行结果(抓图取得Alt+PrtScr):

    五、

    实验中存在的问题:(实验中遇到的问题及是如何解决的)

    1.程序编写不熟练,部分知识有遗忘,查阅资料才得到解决;

    2.

    经常粗心把主函数“main”写成“mian”;

    3.输入程序时由于粗心大意,经常忘记打分号;

    4.for循环的使用不熟练,经多次上机调试和认真看过课本之后问题得以解决;

    5.输出的形式总是和要求不符,输出后一片混乱。在输出主函数的printf中调整后,输出的效果才与要求一致;

    6.部分下方提示的错误无法及时发现

    六、

    体会和思考:

    通过进行这次实验及此次实验报告的书写,发现我在学习C程序设计中存在很多问题。明白了想要编写程序,就必须对课本内容掌握的非常熟悉与理解。在做每一个实验前都不能盲目的写程序,必须先把输入,输出的结构安排恰当,然后逐一对其进行补充与夯实,直到使其成为一个完整的程序。然后通过电脑的TC进行仔细的检验,最后使其成为一个完整同时有完美的程序。在此过程中,了解到C语言是不光是一门高深的学科,还是一门非常有实用价值的课程。深刻理解到所要求的知识不仅要理论上掌握,而且要上机操作去检验你所学的知识的层次,通过上机实践我们把自己的实践操作能力得到提升,同时也丰富了自己的知识面。只有这样我们才会学得更好,掌握得更透彻,让C语言为我们更好的服务,也让我们通过C语言作出更加完美的程序。

    第-13-页

    篇2:附合导线平差程序设计报告

    附合导线平差程序设计报告 本文关键词:导线,程序设计,报告,附合

    附合导线平差程序设计报告 本文简介:地图学课程设计报告《测量平差程序》课程设计(报告)学生姓名:罗正材学号:1108030128专业:2011级测绘工程指导教师:肖东升目录一、前言…………………………………………………………3二、平差程序的基本要求………………………………………3三、平差程序模块化……………………………………………3四

    附合导线平差程序设计报告 本文内容:

    地图学课程设计报告

    《测量平差程序》课程设计

    (报告)

    学生姓名:罗正材

    号:1108030128

    业:2011级测绘工程

    指导教师:肖

    目录

    一、前言…………………………………………………………3

    二、平差程序的基本要求………………………………………3

    三、平差程序模块化……………………………………………3

    四、平差中的重要函数…………………………………………4

    五、结论…………………………………………………………7

    六、部分源代码…………………………………………………7

    一、前言

    随着测绘科学技术的不断发展,在测量数据的处理中产生很多种平差的方法。在本文中,附合导线近似平差程序是利用C++编程实现的,我们需要将导线网的已知数据信息按照特定的规则输入到.txt文本中,利用C++程序读取文本数据信息后,对其进行一系列的平差计算,最终获得平差后的结果,并以.txt文本的形式输出且保存,这样就可为测量工作提供一定的参考,还能为测绘数据的管理带来帮助。

    二、平差程序的基本要求

    平差程序设计与其它程序设计相同,应当满足一定的要求。

    (1)程序逻辑结构简单,清晰易读,符合结构化程序设计要求,便于扩展;

    (2)运算速度快,占用内存小,内外存之间的交换不宜过于频繁;

    (3)数学模型及计算方法正确、先进,计算结果精度高;

    (4)适应性强,便于移植,充分考虑各种可能形式,尽量满足不同要求与需要;

    (5)方便用户,操作简便。数据输入与用户作业方式与习惯相统一,输出明了、齐全;尽量减少手工处理工作量,操作简便;人机交互性要强。

    上述要求,既体现在平差程序的总体设计中,也贯穿于平差程序设计的各个环节中。

    三、平差程序模块化

    图1

    四、平差中的重要函数

    (一)、角度制与弧度制的相互转化

    C/C++程序设计中,关于角度的计算以弧度制为单位,而在测量以及具体工作中我们通常习惯以角度制为单位。这样,在数据处理中,经常需要在角度制与弧度制之间进行相互转化。这里,我们利用C/C++数学函数库math.h中的相关函数完成这两种功能。

    这里,我们使用double类型数据表示角度制数和弧度制数。例如:123度44分58.445秒,用double类型表示为123.4458445,其中分、秒根据小数位确定。

    在角度制与弧度制的转化中,涉及如下图2所示的两个环节。

    度.分秒

    弧度

    图2

    1.角度化弧度函数

    double

    d_h(double

    angle)

    //角度化弧度

    {

    double

    a,b;

    angle=modf(angle,//a

    为提取的度值(int类型),angle为分秒值(小数)

    angle=modf(angle*100.0,//

    b为提取的分值(int类型),angle为秒值(小数)

    return

    (a+b/60.0+angle/36.0)*(PI+3.0E-16)/180.0;

    }

    2.弧度化角度函数

    double

    h_d(double

    angle)

    //弧度化角度

    {

    double

    a,b,c;

    angle=modf(angle*180.0/(PI-3.0E-16),angle=modf(angle*60.0,angle=modf(angle*60.0,return

    a+b*0.01+c*0.0001+angle*0.0001;

    }

    其中,函数modf(angle,double

    s;

    f

    =

    dms>=0

    ?

    1

    :

    -1;

    //0.001秒

    4.8481368110953599358991410235795e-9弧度

    dms

    +=

    f

    0.0000001;

    d

    =

    (int)dms;

    dms

    =

    (dms

    -

    d)

    100.0;

    m

    =

    (int)dms;

    s

    =

    (dms

    -

    m)

    100.0;

    return

    (d

    +

    m

    /

    60.0

    +

    s

    /

    3600.0)

    _TORAD

    -

    f

    4.8481368110953599358991410235795e-9;

    }

    //弧度转“度分秒”

    double

    RADtoDMS(double

    rad)

    {

    int

    f

    =

    rad

    >=

    0

    ?

    1

    :

    -1;

    //

    符号

    //加0.001秒(用弧度表示),化为度

    rad

    =

    (rad

    +

    f

    4.8481368110953599358991410235795e-9)

    _TODEG;

    int

    d

    =

    (int)rad;

    rad

    =

    (rad

    -

    d)

    60.0;

    int

    m

    =

    (int)rad;

    double

    s

    =

    (rad

    -

    m)

    60.0;

    return

    d

    +

    m

    /

    100.0

    +

    s

    /

    10000.0

    -

    f

    0.0000001;

    }

    //读入已知点的坐标

    void

    ReadKnwData(FILE

    in,DyArray

    array)

    {

    char

    buffer[256];

    double

    dx,dy;

    SurPnt

    pnt;

    while

    (

    !feof(in)

    )

    {

    fgets(buffer,sizeof(buffer),in);

    if

    (

    sscanf(buffer,“%s

    %lf

    %lf“,pnt.name,}

    else

    break;

    }

    dx

    =

    array->elem[1].x

    -

    array->elem[0].x;

    dy

    =

    array->elem[1].y

    -

    array->elem[0].y;

    adj.azi0=atan2(dy,dx)

    +

    (dy

    elem[3].x

    -

    array->elem[2].x;

    dy

    =

    array->elem[3].y

    -

    array->elem[2].y;

    adj.azin=atan2(dy,dx)

    +

    (dy

    elem[1].x;

    adj.y1=array->elem[1].y;

    adj.xn=array->elem[2].x;

    adj.yn=array->elem[2].y;

    Destroy(array);//

    }

    //观测值信息写到动态数组

    void

    ReadObsValue(FILE

    in,DyArray

    array)

    {

    char

    buffer[256];

    double

    dir0,dir1,dist0,dist1;

    SurPnt

    pnt;//用于临时保存点的坐标

    while

    (

    !feof(in)

    )

    {

    fgets(buffer,sizeof(buffer),in);

    if(

    feof(in)

    )

    return;

    if(sscanf(buffer,“%s

    %s

    %lf

    %lf

    %s

    %lf

    %lf“,pnt.name,pnt.dir0.name,pnt.dir0.dist=dist0;

    pnt.dir1.dv=DMStoRAD(dir1);

    pnt.dir1.dist=dist1;

    pnt.b=pnt.dir1.dv-pnt.dir0.dv+(pnt.dir1.dv-pnt.dir0.dvlength;

    i++)

    {

    sumb+=array->elem[i].b;

    }

    adj.fb=adj.azi0+sumb-_PI*array->length-adj.azin;

    adj.v=-adj.fb/array->length;

    adj.fb=adj.fb/_PI*180*3600;

    adj.fr=2*8*sqrt(array->length);

    if

    (abs(adj.fb)

    >=

    adj.fr)

    strcpy(adj.judge,“方位角闭合差超限了!“);

    else

    strcpy(adj.judge,“方位角闭合差没超限“);

    }

    //角度改正

    void

    CorrectAngle(DyArray

    array)

    {

    for

    (int

    i=0;

    ilength;

    i++)

    {

    array->elem[i].b+=adj.v;

    }

    adj.v=adj.v/_PI*180*3600;

    }

    //推算方位角

    void

    Direct(DyArray

    array)

    {

    SurPnt

    pnt;

    //第一个未知边

    pnt.dir1.alfa=adj.azi0+array->elem[0].b-_PI;

    pnt.dir1.dist=(array->elem[0].dir1.dist+array->elem[1].dir0.dist)/2;

    pnt.dir1.dx=pnt.dir1.dist*cos(pnt.dir1.alfa);

    pnt.dir1.dy=pnt.dir1.dist*sin(pnt.dir1.alfa);

    AddDir(array,pnt,0);

    for(int

    i=1;ilength-1;i++)

    {

    pnt.dir1.alfa=array->elem[i-1].dir1.alfa+array->elem[i].b-_PI;

    pnt.dir1.dist=(array->elem[i].dir1.dist+array->elem[i+1].dir0.dist)/2;

    pnt.dir1.dx=pnt.dir1.dist*cos(pnt.dir1.alfa);

    pnt.dir1.dy=pnt.dir1.dist*sin(pnt.dir1.alfa);

    AddDir(array,pnt,i);

    }

    for(i=0;ilength-1;i++)

    {

    array->elem[i].dir1.alfa=RADtoDMS(array->elem[i].dir1.alfa);//alfa转为角度

    }

    }

    //坐标增量改正

    void

    CorrectDirect(DyArray

    array)

    {

    double

    sumx=0.0;

    double

    sumy=0.0;

    double

    sums=0.0;

    for(int

    i=0;ilength-1;i++)

    {

    sumx+=array->elem[i].dir1.dx;

    sumy+=array->elem[i].dir1.dy;

    sums+=array->elem[i].dir1.dist;

    }

    adj.fx=adj.x1+sumx-adj.xn;

    adj.fy=adj.y1+sumy-adj.yn;

    adj.fs=sqrt(adj.fx*adj.fx+adj.fy*adj.fy);

    adj.f=int(sums/adj.fs);//导线全长相对闭合差分母

    for(

    i=0;ilength-1;i++)

    {

    array->elem[i].dir1.dx-=adj.fx*array->elem[i].dir1.dist/sums;//坐标增量改正

    array->elem[i].dir1.dy-=adj.fy*array->elem[i].dir1.dist/sums;

    }

    }

    //解算近似平差坐标

    void

    Coordinate(DyArray

    array)

    {

    SurPnt

    pnt;

    array->elem[0].x=adj.x1;

    array->elem[0].y=adj.y1;

    for(int

    i=0;ilength-2;i++)

    {

    //strcpy(pnt.name,array->elem[i+1].name);

    pnt.x=array->elem[i].x+array->elem[i].dir1.dx;//

    pnt.y=array->elem[i].y+array->elem[i].dir1.dy;

    AddCor(array,pnt,i+1);

    }

    }

    //输出

    void

    Print(DyArray

    array,FILE

    out)

    {

    double

    d,m,s;

    fprintf(out,“方位角闭合差fb=%.0lf秒

    %s

    角度改正v=%.0lf秒/n“,adj.fb,adj.judge,adj.v);

    fprintf(out,“坐标增量闭合差

    fx=%.0lfmm

    fy=%.0lfmm

    fs=%.0lfmm/n“,adj.fx*1000,adj.fy*1000,adj.fs*1000);

    fprintf(out,“导线全长相对闭合差

    fs/∑S=1/%d/n/n“,adj.f);

    fprintf(out,“坐标方位角/n“);

    for

    (int

    i=0;

    ilength-1;

    i++)

    {

    d=array->elem[i].dir1.alfa;

    m=(d-(int)d)*100;

    s=(m-(int)m)*100;

    fprintf(out,“α%s-%s=%.0lf°%.0lf′%.0lf″/n“,array->elem[i].name,array->elem[i+1].name,d,m,s);

    }

    fprintf(out,“/n近似平差坐标/n“);

    for

    (i=1;

    ilength-1;

    i++)

    {

    fprintf(out,“%s

    x=%.3lfm

    y=%.3lfm/n“,array->elem[i].name,array->elem[i].x,array->elem[i].y);

    }

    }

    int

    main(int

    argc,char*

    argv[])

    {

    DyArray

    pnts;

    Init(

    char

    infile[255],outfile[255];

    if

    (argc

    <

    2)

    {

    printf(“Enter

    infile

    name:/n“);

    scanf(“%s“,infile);

    }

    else

    strcpy(infile,argv[1]);

    FILE

    in

    =

    fopen(infile,“r“);

    if(in

    ==

    NULL)

    {

    printf(“File

    %s

    cann

    t

    open!“,infile);

    return

    -1;

    }

    if

    (argc

    <

    3)

    {

    printf(“Enter

    outfile

    name:/n“);

    scanf(“%s“,outfile);

    }

    else

    strcpy(outfile,argv[2]);

    FILE

    out

    =

    fopen(outfile,“w“);

    if(out

    ==

    NULL)

    {

    printf(“File

    %s

    cann

    t

    open!“,outfile);

    return

    -1;

    }

    //读入已知点的坐标

    ReadKnwData(in,Init(

    //观测值信息写到动态数组

    ReadObsValue(in,//求角度闭合差fb

    Fb(

    //角度改正

    CorrectAngle(

    //推算方位角

    Direct(

    //坐标增量改正

    CorrectDirect(

    //解算近似平差坐标

    Coordinate(

    fclose(in);

    //输出

    Print(

    fclose(out);

    Destroy(

    return

    0;

    }

    14

    篇3:里仁多核程序设计实验报告

    里仁多核程序设计实验报告 本文关键词:多核,程序设计,实验,报告

    里仁多核程序设计实验报告 本文简介:多核程序设计实验报告Multi-coreProgrammingExperimentReport学生所在学院:里仁学院学生所在班级:学生姓名:学生学号:指导教师:教务处2014年4月实验一Windows多线程编程模块一:基础练习一.实验目的与要求二.实验环境及软件三.实验内容四.实验代码·#inclu

    里仁多核程序设计实验报告 本文内容:

    多核程序设计实验报告

    Multi-core

    Programming

    Experiment

    Report

    学生所在学院:

    里仁学院

    学生所在班级:

    2014年

    4

    实验一

    Windows多线程编程

    模块一:基础练习

    一.

    实验目的与要求

    二.

    实验环境及软件

    三.

    实验内容

    四.

    实验代码

    ·

    #include

    ·

    #include

    ·

    #include

    ·

    #include

    ·

    void

    test(int

    n)

    ·

    {

    ·

    for

    (int

    i

    =

    0;

    i

    #include

    #include

    #define

    NN

    2000

    int

    A[NN][NN],B[NN][NN];

    long

    long

    C[NN][NN];

    void

    solve(int

    n,int

    num_thread){

    int

    i,j,t,k,paralleltime,serialtime;

    clock_t

    startTime,endTime;

    long

    long

    sum;

    omp_set_num_threads(num_thread);

    //--------------对矩阵A和矩阵B进行初始化-------------

    for

    (i

    =

    0;

    i

    #include

    #include

    #include

    using

    namespace

    std;

    static

    long

    num_steps=1000000000;//定义所分的块数

    #define

    NUM_THREADS

    2

    //定义所开启的线程数

    int

    _tmain(int

    argc,_TCHAR*

    argv[])

    {

    int

    i;

    omp_set_num_threads(NUM_THREADS);//开启线程

    double

    x,sum=0.0,pi;

    clock_t

    start_time,end_time;

    double

    step=1.0/(double)num_steps;

    //并行--------------------------------------

    start_time=clock();

    #pragma

    omp

    parallel

    sections

    reduction(+:sum)

    private(x,i)

    {

    #pragma

    omp

    section

    {

    for

    (i=omp_get_thread_num();i

    #include

    #include

    #include

    #include

    “omp.h“using

    namespace

    std;

    //int

    count=0;

    void

    swap(int

    tmp

    =

    a;

    a

    =

    b;

    b

    =

    tmp;

    }

    void

    quicksort(intA,int

    l,int

    u)

    {

    int

    i,m,k;

    if

    (l

    >=

    u)

    return;

    m

    =

    l;

    for

    (i

    =

    l

    +

    1;

    i

    <=

    u;

    i++)

    if

    (A[i]

    <

    A[l])

    /*不管是选第一个元素作为pivot还是最后一个作为pivot,假如我们想得到的是从小到大的序列,那么最坏的输入情况就是从大到小的;如果我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/

    swap(A[++m],A[i]);

    swap(A[l],A[m]);

    quicksort(A,l,m

    -

    1);

    quicksort(A,m

    +

    1,u);

    }

    void

    main(int

    argc,charargv)

    {

    omp_set_num_threads(2);//----------------设置线程数为2,因为是双核的CPU

    int

    k

    =

    0,i

    =

    0;

    int

    m

    =

    0,n

    =

    0;

    double

    cost

    =

    0;

    int

    len

    =

    10000;

    int

    short_len

    =

    len

    /

    2;

    int

    B[10000],C[10000],D[5000],E[5000];//--------将B[]分为两个小的数组,并行的对他们调用快速排序算法

    #pragma

    omp

    parallel

    default(none)

    shared(B,C,len)

    private(i)//---这个for循环是并行的

    {

    int

    j

    =

    50000;

    #pragma

    omp

    for

    for

    (i

    =

    0;

    i

    i++)

    {

    B[i]

    =

    j--;

    C[i]

    =

    j--;

    //初始化B[],C[]数组

    }

    }

    clock_t

    begin

    =

    clock();//----------------计时开始点

    #pragma

    omp

    parallel

    default(none)

    shared(B,D,E,short_len)

    private(i)//---这个for循环是并行的

    {

    #pragma

    omp

    for

    for

    (i

    =

    0;

    i

    i++)//---这个for循环是并行的

    {

    D[i]

    =

    B[i];//将B[]的前5000个数放入D[]

    E[i]

    =

    B[i

    +

    5000];//将B[]的后5000个数放入E[]

    }

    }

    #pragma

    omp

    parallel

    default(none)

    shared(E,D,short_len)

    //private(i)------快速排序的并行region

    {

    #pragma

    omp

    parallel

    sections

    {

    #pragma

    omp

    section

    quicksort(D,0,short_len

    -

    1);//对D[]排序

    #pragma

    omp

    section

    quicksort(E,0,short_len

    -

    1);//对E[]排序

    }

    }

    for

    (;

    k

    k++)//----------将D[]和E[]进行归并排序放入B[]里面

    {

    if

    (m

    n++;

    }

    else

    {

    B[k]

    =

    E[m];

    m++;

    }

    }

    if

    (m

    ==

    short_len

    ||

    n

    ==

    short_len)

    {

    if

    (m

    ==

    short_len)

    B[k]

    =

    E[m];

    else

    B[k]

    =

    D[n

    -

    1];

    k

    +=

    1;

    break;

    }

    }

    if

    (/*m==short_len

    for

    (int

    p

    =

    0;

    p

    p++)

    {

    B[k]

    =

    D[n];

    n++;

    k++;

    }

    }

    else

    if

    (/*n==short_len

    for

    (int

    q

    =

    0;

    q

    q++)

    {

    B[k]

    =

    E[m];

    m++;

    k++;

    }

    }//----------------------------归并算法结束

    clock_t

    end

    =

    clock();//----------------计时结束点

    cost

    =

    (double)(end

    -

    begin);

    cout

    <<

    “并行时间“<<

    cost

    <<

    endl;

    //串行开始

    begin

    =

    clock();

    quicksort(C,0,len

    -

    1);

    end

    =

    clock();

    cost

    =

    (double)(end

    -

    begin);

    cout

    <<

    “串行时间“<<

    cost

    <<

    endl;

    system(“pause“);

    实验结果:

    封面设计:

    贾丽

    址:中国河北省秦皇岛市河北大街438号

    编:066004

    话:0335-8057068

    真:0335-8057068

    址:http://jwc.ysu.edu.cn

    -

    10

    -

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识