黄金分割点作业进度

  结对编程的作业:

黄金点游戏

黄金点游戏是一个数字小游戏,其游戏规则是:

N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。

现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:

1、本作业属于结对编程项目,必须由二人共同完成,并分别将本次作业过程发到博客,同时将本次作业源代码提交到codeing系统;

2、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交的数字;

3、如果采用单机方式实现的话,需要为用户提供便利的输入界面;

4、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。

进行情况:

黄金分割点0.0

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
void Game( );

struct Player
{
    int num;     //玩家编号
    float score;    //玩家输入的数据
    float modulus;       //绝对值数据
}m[10];

void Game()
{
    struct Player m[10];
    int i,j;
    float avescore;     //平均值
    float gloden_score;   //黄金分割点
    struct Player t;
    bool flag;
    int a;

while(flag)
{
    system("cls");       //清屏函数
    avescore=0;
    printf("\n\n\n\n\n");
    for (i=0;i<10;i++)
    {
        m[i].num = i+1;
        printf ("                    第%d位玩家输入的数据:",m[i].num);
        scanf ("%f",&m[i].score);
        avescore +=m[i].score;
    }
    avescore /=10;             //求十个数的平均值
    gloden_score=avescore*0.618;       //求黄金分割点

    printf("\n\n\n\n\n");
    printf ("                   黄金分割点的值:%f\n",gloden_score);  

    printf("\n\n\n\n\n");
    for (i=0;i<10;i++)
    {
        m[i].modulus=fabs (gloden_score-m[i].score);      //求绝对值
        printf("               第%d位玩家与黄金分割点的差是:%f\n",m[i].num, m[i].modulus);
    }

    printf("\n\n\n\n\n");
    for(i=1;i<10;i++)
        for(j=0;j<10-i;j++)
        if (m[j].modulus>m[j+1].modulus)
        {
            t=m[j];
            m[j]=m[j+1];
            m[j+1]=t;
        }
        printf("   游戏排行(排行顺序由高到低):\n");
        for(i=0;i<10;i++)
            printf ("        玩家%d\n",m[i].num);         //冒泡排序 

        printf("                   Do you want try again ?\n");     //判断是否继续游戏
        printf("                   Yes choose 1,No choose 2\n");
        printf("                   你的选择是:");
        scanf("%d",&a);
        if (a==1)
            flag=true;
        else
            break;
}
    return 0;
}

这是最初的版本。

遇到的问题及解决方法

(1)问题:最开始使用的是一维数组,比较简单能进行玩家数据的存储,但玩家与数据不能一一对应,提取很不方便。

方案:用结构体进行数据的存储,可以是玩家和输入的数据进行一一对应,并且提取方便。

  《基本实现了十个人玩一轮游戏的功能》

黄金分割点1.0

#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
int Game();
void Introduce();

#define NUM 100

struct Player
{
    int num;     //玩家编号
    float score;    //玩家输入的数据
    float modulus;       //绝对值数据
}m[NUM];

void main(int argc, char* argv[])
{
    int choose=0;
    int flag01;
    while (1)
    {
        system("cls");
        printf("\n\n\n\n\n\n\n");
        printf("               请选择您要进行的操作:\n");
        printf("                               1.开始游戏\n");
        printf("                               2.游戏介绍\n");
        printf("               请输入您进行操作的序号:");
        fflush(stdin);
        flag01=scanf ("%d",&choose);
        switch (choose)
        {
        case 1:
            system("cls");
            Game();
            break;
        case 2:
            system("cls");
            Introduce();
            system("pause");
            break;
        default:
            printf("输入错误,请重新输入!");
            break;
        }
    }
}

int Game()
{
    struct Player m[NUM];
    int i,j,k,flag01;
    int    Player_num;     //玩家人数
    int Time;            //游戏次数
    float avescore;     //平均值
    float gloden_score;   //黄金分割点
    struct Player t;
    bool flag;
    int a;

    while(flag)
    {
            system("cls");
            printf("\n\n\n\n\n");
            printf("          有几个小伙伴要试试呀!(童鞋,少于是10个人不够运费~) \n");
            printf("                     ");
            fflush(stdin);
            flag01=scanf ("%d",&Player_num);                 //错误数据处理
            if(Player_num>=10)
            {
                flag=false;
            }
    }

    flag=true;

    while(flag)
    {
            system("cls");
            printf("\n\n\n\n\n");
            printf("          童鞋你想玩儿几轮???(勇者,你必须至少玩儿10轮哦)\n");
            printf("                     ");
            fflush(stdin);
            flag01=scanf("%d",&Time);          //错误数据处理
            if(Time>=10)
            {
                flag=false;
            }
    }

       for (k=0;k<Time;k++)
       {
            system("cls");      //清屏函数
            avescore=0;
             printf("\n\n\n\n\n");
            for (i=0;i<Player_num;i++)
            {
                m[i].num = i+1;
                printf ("                    第%d位玩家输入的数据:",m[i].num);
                scanf ("%f",&m[i].score);
                avescore +=m[i].score;
            }
            avescore /=Player_num;             //求十个数的平均值
            gloden_score=avescore*0.618;       //求黄金分割点
            printf("\n\n\n\n\n");
            printf ("                   黄金分割点的值:%f\n",gloden_score);  

            printf("\n\n\n\n\n");
            for (i=0;i<Player_num;i++)
            {
                 m[i].modulus=fabs (gloden_score-m[i].score);      //求绝对值
                printf("               第%d位玩家与黄金分割点的差是:%f\n",m[i].num, m[i].modulus);
            }

            printf("\n\n\n\n\n");
            for(i=1;i<Player_num;i++)
                for(j=0;j<10-i;j++)
                if (m[j].modulus>m[j+1].modulus)
                {
                       t=m[j];
                     m[j]=m[j+1];
                      m[j+1]=t;
                }
                printf("   游戏排行(排行顺序由高到低):\n");
                for(i=0;i<Player_num;i++)
                    printf ("        玩家%d\n",m[i].num);          //冒泡排序 

                printf("                   Do you want try again ?\n");     //判断是否继续游戏
                printf("                   Yes choose 1,No choose 2\n");
                printf("                   你的选择是:");
                scanf("%d",&a);
                if (a==2)
                {
                    printf("童鞋,游戏不符合心意吗?真要狠心抛弃哦?");
                    scanf("%d",&a);
                    if(a==2)
                        break;
                }
       }

           return 0;
}

void Introduce()
{
    printf ("   黄金点游戏是一个数字小游戏,其游戏规则是:\n");
    printf("   N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,");
    printf("裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。");
    printf("提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。");
    printf(" 玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。\n");

}

经过对版本0.0进行测试之后,主要存在以下几个问题

1.如果玩家数据输入的不是数字,程序会崩溃。


改进方法:目前还没有进展,有方法可以完成必须输入数字但情况有点不同,还在探讨中。。。。

2.玩家人数固定,不能由用户自己选择。

  while(flag)
    {
            system("cls");
            printf("\n\n\n\n\n");
            printf("          有几个小伙伴要试试呀!(童鞋,少于是10个人不够运费~) \n");
            printf("                     ");
            fflush(stdin);
            flag01=scanf ("%d",&Player_num);                 //错误数据处理
            if(Player_num>=10)
            {
                flag=false;
            }
    }

改进方法:在程序中加入选择模块,人数必须十人以上,才能跳出循环,而且可以容错。当你输入的不是数字时程序也可以识别出来。

错误数据处理利用的是输入缓存区处理。下面是具体解释:

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为scanf("%d", &i);只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:

int fflush(FILE *stream);

如果 stream 指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么 fflush 函数将把这个流中任何待写数据传送至宿主环境(host environment)写入文件。否则,它的行为是未定义的。

3.游戏不能自己进行十轮以上
改进方法:与玩家人数的改进方法类似,就不再多加解释了。附上代码

 while(flag)
    {
            system("cls");
            printf("\n\n\n\n\n");
            printf("          童鞋你想玩儿几轮???(勇者,你必须至少玩儿10轮哦)\n");
            printf("                     ");
            fflush(stdin);
            flag01=scanf("%d",&Time);          //错误数据处理
            if(Time>=10)
            {
                flag=false;
            }
    }
时间: 2024-08-05 06:39:54

黄金分割点作业进度的相关文章

白盒测试实践作业进度报告——Day 3

今天的任务是完成测试总结报告和组员各自的个人完成情况说明,并在spoc上提交作业,结束白盒测试实践作业. 任务完成人冯满满,任务完成情况,顺利完成. 总结此次任务的完成情况,总体而言顺利完成,但中间过程比如各阶段进度和理想的不太一样.遇到的困难主要有以下几点: 一是对工具的不熟悉,如Junit. 二是对待测系统源码不熟悉. 三是对测试标准不了解需提前了解代码规范. 至此,白盒测试实践作业全部完成!

web测试实践作业进度报告三

进度列表 时间 任务 人员        星期五         阅读wen测试实践作业要求,明确任务目标,完成任务分工 全部人员        星期六 各自对本人任务进行详细规划,如制作调查问题,选取并熟悉前端性能分析工具, 详细了解使用所选待测产品和竞品产品等 全部人员        星期天 按阶段分工完成案例分析报告,并最终整理归档 全部人员 截至目前,此次web测试任务已经全部完成,所有材料均按要求整理完毕,并已在spoc中提交. 原文地址:https://www.cnblogs.com

个人作业进度(一)

第一次个人作业(一) 任务: 1.统计文件的字符数: 2.统计文件的单词总数: 3.统计文件的总行数: 4.统计文件中单词频率,输出频率最高的前十个: 5.统计两个单词(词组)在一起的频率,输出频率最高的前10个. 6.对给定文件夹及其递归子文件夹下的所有文件进行统计 7.在Linux系统下,进行性能分析,过程写到blog中(附加题) 进度: 实际上昨天晚上就已经开始写个人作业了,到目前为止基本完成前三个功能,也已经和同学进行过一些简单的测试 规划: 第四个功能本来打算用二维字符数组来存储单词,

个人作业进度(四)

第一次个人作业(四)            进度: 今天下午将输出词组做好了,不知道与助教是不是一样,因为还没遍历文件夹,本来打算晚上将遍历文 件夹做好,可是由于助教说要在ubuntu的g++上 做测试,于是就装了一个系统,由于从来没用过ubuntu,所 以拜托同学在上面先检测代码是否运行,结果出了无数个bug,原因是g++上读我的代码每个字母之间有空格, 找了好久原因,加了好多头文件结果仍然有错误,现在还是不知道任何原因,好像与tchar.h有关,就是Linux与 windows之间跨平台的话

五班二组黑盒测试实践作业进度报告(1)

周五(2017.11.24) 周五课上老师公布作业后,小组在当节课下课后进行了小组会议.内容如下 (1)小组成员一起阅读老师题目的要求,有疑问的地方就提出来,相互讨论,找到解决方案. (2)在了解题目要求后,大家进行了一下分工,为作业的进行基础的准备.根据如下图所涉及的测试工具每个人(杨显,易爽,田永涛,刘少威)选择两款在网上进行查找资料,熟悉了解安装过程以及操作流程,最后进行讨论选择一款方便简单的测试工具. (3)周杨负责查找一款采用Java开发的Web应用系统,作为测试工具测试的对象. 周六

黑盒测试实践作业进度报告(周日)

由于本次实践作业内容较多,首先小组成员一起仔细阅读了作业要求期望所有人都能明确作业内容. 首先,分解任务,并给任务排序.因为本次实践依托于javaweb项目,所以首先得找到一个合适的javaweb项目, 且后续作业依然会使用到这个javaweb项目,因此我们讨论将寻找一个合适的javaweb项目作为第一梯度的任务: 第二,了解各种流行的自动化测试工具,分析其特点,结合选定的javaweb项目选取最合适的自动化测试工具. 这两个任务可以同步进行. 分工,冯满满和游聪负责javaweb项目部分,赵奇

黑盒测试实践作业进度报告(周六)

做黑盒测试实践首先肯定得掌握好黑盒测试技术基本原理, 经过小组讨论,决定今天温习老师的教学视频. 除了强化边界值分析,等价类划分,场景法的训练,也去学习了课堂上讲述的正交表和决策表. 结合MOOC上的作业实际检测了组员的黑盒测试技术是否过关. 并且对接下来的白盒测试技术进行了预习. 总地来说,今天,每个组员都对黑盒测试技术进行了更加深入的学习,为接下来的实践打下了基础.

五班二组黑盒测试实践作业进度报告(3)

星期三(2017.11.29) 1.问题1:测试工具与web系统不同步 今天二组同学在测试的时候遇到了一个问题,导致他们测试无法进行下去.问题描述为:当用测试工具测试web系统的时候,测试工具会报如下的错: 就是某个测试元素找不到.我们之前也遇到过这样的问题,当时是因为左侧的菜单栏在每次打开后会发生变化导致之前的测试工具无法定位到原先的位置,才导致这样的错误出现.我们已经在昨天的工作中将这个问题更改了.于是测试小组就将问题反映到小组QQ群里,与开发组的同学进行讨论.由于大家都是第一次遇到这样的问

个人作业进度(五)

           进度:                     文件夹遍历已经搞定了,今晚准备在ubuntu上搞定代码.                              前三项不一样也不知道是什么原因,可能跟不同开发环境有关,今晚在ubantu上编译一下,看结果是不是一样 规划: 明天补读书笔记和报告. 原文地址:https://www.cnblogs.com/jahnson/p/8671079.html