zoukankan      html  css  js  c++  java
  • 黄金分割点(第五周 c语言版)

      在上一周,学习其他课程的同时,用C语言编写了黄金分割点小游戏。因为要做界面需要mfc,当时学的时候还做了个简单的计算器。目前c++的知识忘的差不多了,所以就先用C语言来实现算法。打算接下来的一周复习c++,做界面。以下是代码:

    #include<stdio.h>
    #include<math.h>
    #include"windows.h"

    double getG(int* a,int n);
    void getdif(double* a,double * b,int n);
    void end(double* b,int* compare,int n);
    void rank(int* score,int* c,int* d,int n);


    void main()
    {
    int i,n,m,j;
    double a[20],b[20]; //a保存数字,b保存差值,c保存b数组的值,d为排好序的下标
    int score[20],d[20],c[20];
    int compare[2]={0,0};

    for(i=0;i<20;i++)
    {
    a[i]=0;
    score[i]=0;
    b[i]=0;
    c[i]=0;
    d[i]=0;
    }
    printf("请输入共进行几轮:");
    scanf("%d",&m);
    printf("请输入玩家人数:");
    scanf("%d",&n);
    for(j=0;j<m;j++)
    {
    printf("开始第%d轮游戏 ",j+1);
    for(i=0;i<n;i++)
    {
    printf("请输入第%d个玩家的数字: ",i+1);
    scanf("%lf",&a[i]);

    }


    for(i=0;i<n;i++)//计算分数
    {
    getdif(a,b,n);
    end(b,compare,n);


    if(b[i]==b[compare[0]])
    score[i]=score[i]+n;
    else if(b[i]==b[compare[1]])//注意用else if
    score[i]=score[i]-2;
    printf("%d号玩家分数为:%d ",i+1,score[i]);
    }

    system("pause");
    system("cls");
    }
    printf("-----------成绩总排名----------- ");
    rank(score,c,d,n);
    for(i=0;i<n;i++)
    {
    printf("第%d名:%d号玩家%d ",i+1,d[i],score[i]);
    }


    }



    double getG(double* a,int n) //求G值
    {
    int i;
    double sum=0,ave,G;
    for(i=0;i<n;i++)
    {
    sum=sum+a[i];
    }
    ave=sum/n;
    G=ave*0.618;
    return G;
    }


    void getdif(double* a,double * b,int n) //将差值存在数组b中,defference,val:差值;
    {
    int i;
    double difference,val;
    double c = getG(a,n);
    for(i=0;i<n;i++)
    {
    difference=a[i]-c;
    val=fabs(difference);
    b[i]=val;
    }

    }

    void end(double* b,int* compare,int n) //通过比较差值的大小,选出最小和最大的。保存最小值和最大值的下标
    {
    int i;
    double max,min;
    max=b[0];
    min=b[0];
    for(i=0;i<n;i++)
    {
    if(min>b[i])
    {
    min=b[i];
    compare[0]=i;//小
    }
    if(max<b[i])
    {
    max=b[i];
    compare[1]=i;//大
    }
    }

    }

    void rank(int* score,int* c,int* d,int n)
    {
    int i,q,temp=0;
    for(i=0;i<n;i++)
    {
    c[i]=score[i];
    }
    for(i=1;i<n;i++)
    for(q=0;q<n-i;q++) //冒泡排序
    if(score[q]<score[q+1])
    {
    temp=score[q];
    score[q]=score[q+1];
    score[q+1]=temp;
    }


    for(i=0;i<n;i++)
    { //数组排序并输出原位置
    for(q=0;q<n;q++)
    {
    if(score[i]==c[q])
    {
    d[i]=q+1;
    c[q]=-100;
    break;
    }

    }
    }

    }

    写的时候出现好多问题,传值不匹配,逻辑错误等等。写最后一个对成绩进行排序的子函数时,我的想法是这样的:先将分数存到一个数组里,再对分数进行冒泡排序,最后用排好序的数组对存原分数的数组进行排序,但是结果一直是错误的,如下图:

    想了好久到底是哪里出了问题。。原来我忽略了出现相同分数的问题。于是再改,只需把遍历后的值赋一个大一点的跟正常分数区分开即可。这种方法比较麻烦,但是比较好理解,还可用快速排序。改好的子程序结果如下图:

  • 相关阅读:
    用Java实现一个简单的DBMS(总结)
    Android小记(整理一下自己犯过的错误)
    在华为云上开启FTP服务并建立FTP站点来从本地向服务器发送和下载文件
    AS中使用真机调试时出现解析错误的问题
    AS中加载gradle时出现Gradle sync failed: Could not find com.android.tools.build:gradle.的错误
    解决AS加载gradle时出现的Could not find com.android.tools.build:gradle:3.5.0.的错误
    过滤器
    View的呈现
    Asp.net MVC Action同步异步执行
    Model验证
  • 原文地址:https://www.cnblogs.com/dododoit/p/5352495.html
Copyright © 2011-2022 走看看