黄金点游戏代码
#include<stdio.h> #include<stdlib.h> #include<math.h> void Udecide_n(); int Decide_n(); void Delete_n(int n); //申请空间的释放 void Delete_u(); //申请空间的释放 typedef struct Pnode //一个人的信息:输入的数,获得的分数 { float number; //输入的数 float absoluten_n; //与黄金点差的绝对值 int grade; //获得的分数 }Pnode; typedef struct PNode { float number; //输入的数 float absoluten_n; //与黄金点差的绝对值 int grade; //获得的分数 struct PNode * next; }; typedef struct Decide_Node //决定进行游戏轮数的结构体 { float average; //黄金点的值 Pnode *node; // }Decide_Node; typedef struct U_decide_Node //未决定进行游戏轮数的结构体 { float average; //黄金点的值 PNode *node; //每轮数据的成员 struct U_decide_Node *next; }U_decide_Node; Decide_Node *Dhead; //决定游戏使用的是结构数组,结构数组的头部 U_decide_Node *udhead, *udnext, *udtail; //未决定的游戏轮数的,游戏每一局由一个结构体来表示,使用结构的3个指针 PNode *phead, *pnext, *ptail; //每一轮游戏下的,参加的游戏的人是不确定得是,使用结构来表示,这里是表示人结构的3个指针 void main() { int i; int n; //知道游戏轮数的 游戏轮数 printf("\t\t\t\t┌───────┐\n"); printf("\t\t\t\t│ │\n"); printf("\t\t\t\t│ 黄金点游戏 │\n"); printf("\t\t\t\t│ │\n"); printf("\t\t\t\t└───────┘\n");; printf("游戏规则如下:\n"); printf("N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100)"); printf("交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数)," ); printf("得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。\n"); printf("1.没有决定游戏进行几轮,先来一次\n2.决定游戏进行几轮\n3.退出\n"); //每一轮的次数是N次 next2:printf("请选择选项:"); scanf("%d",&i); switch (i) { case 1: Udecide_n(); break; case 2: { n = Decide_n(); break; } case 3:; break; default: { printf("请重新输入\n"); goto next2; } } printf("谢谢惠顾\n"); Delete_n(n); //释放空间 Delete_u(); //释放空间 } void Delete_n(int n) { int i; for (i = 0; i < n;i=0) { free(Dhead[i].node); } free(Dhead); } int Decide_n() { int n; //玩游戏的总轮数 int i; //记录游戏玩到第几轮 int m; //玩一轮游戏,参加游戏的人数 int j; //在一轮游戏中,玩游戏的人 float sum; //一轮游戏中全部输入的数字和,同时也是黄金点的值 float abmax; //输入的数与黄金点相差的绝对值最大值 float abmin; //输入的数与黄金点相差的绝对值最小值 int x; //是否输出每一轮的输入的信息 printf("请输入要进行的轮数:"); scanf("%d", &n); Dhead = (Decide_Node*)malloc(n*sizeof(Decide_Node)); if (Dhead == NULL) { printf("Decide_Node空间申请失败\n"); exit(1); } for (i = 0; i < n; i++) { printf("请输入有几个人进行游戏:"); scanf("%d", &m); Dhead[i].node = (Pnode *)malloc(m*sizeof(Pnode)); if (Dhead[i].node == NULL) { printf("Dhead[%d].node申请空间失败\n", i); exit(1); } sum = 0; for (j = 0; j < m; j++) { printf("请第%d个人输入数字:", j + 1); scanf("%f", &Dhead[i].node[j].number); sum = sum + Dhead[i].node[j].number; } sum = sum / j*0.618; Dhead[i].average = sum; abmax = 0; abmin = 100; for (j = 0; j < m; j++) //计算每一个输入的数字与黄金的绝对值,并且找出最大绝对值和最小绝对值 { Dhead[i].node[j].absoluten_n = abs(Dhead[i].node[j].number - sum); if (abmax < Dhead[i].node[j].absoluten_n) { abmax = Dhead[i].node[j].absoluten_n; } if (abmin>Dhead[i].node[j].absoluten_n) { abmin = Dhead[i].node[j].absoluten_n; } } for (j = 0; j < m; j++) //给每一个参加游戏的人打分 { if (Dhead[i].node[j].absoluten_n == abmax) { Dhead[i].node[j].grade = -2; } else if (Dhead[i].node[j].absoluten_n == abmin) { Dhead[i].node[j].grade = m; } else { Dhead[i].node[j].grade = 0; } } printf("黄金点值:%.2f\n",Dhead[i].average); printf("输出各自的得分情况\n"); for (j = 0; j < m; j++) { printf("第%d个人得分是;%d\n",j+1,Dhead[i].node[j].grade); } next1: printf("是否要输出所有人数的数字\n"); printf("1,是\t\t2,否\n"); printf("请输入选项:"); scanf("%d", &x); switch (x) { case 1: { for (j = 0; j < m; j++) { printf("第%d个人输入的数是:%d\n", j + 1,(int)Dhead[i].node[j].number); } break; } case 2:break; default: { printf("输入无效,请重新输入\n"); goto next1; } } } return n; } void Delete_u() { udnext = udhead->next; while (udnext) { phead = udnext->node; pnext = phead->next; while (pnext) { phead->next == pnext->next; free(pnext); pnext = phead->next; } free(phead); udhead->next = udnext->next; free(udnext); udnext = udhead->next; } free(udhead); } void Udecide_n() { int i; //是否还有下一个人参与游戏在一轮中中的标志 int j; //是否进行下一轮游戏的标志 int n; //每轮游戏参与游戏的人 float sum; //一轮游戏中全部输入的数字和,同时也是黄金点的值 float abmax; //输入的数与黄金点相差的绝对值最大值 float abmin; //输入的数与黄金点相差的绝对值最小值 int x; //是否输出每一轮的输入的信息 udhead = (U_decide_Node *)malloc(sizeof(U_decide_Node)); if (!udhead) { printf("udhead空间申请失败\n"); exit(1); } udtail = udhead; while (1) { udnext = (U_decide_Node *)malloc(sizeof(U_decide_Node)); if (!udnext) { printf("udnext空间申请失败\n"); exit(1); } udnext->next = NULL; udtail->next = udnext; udtail = udnext; phead = (PNode *)malloc(sizeof(PNode)); if (!phead) { printf("phead空间申请失败\n"); exit(1); } phead->next = NULL; udnext->node = phead; ptail = phead; sum = 0; n = 0; printf("请至少输入3个数\n"); while (1) //构建每一轮游戏的链表 { pnext = (PNode *)malloc(sizeof(PNode)); if(!pnext) { printf("pnext空间申请失败\n"); exit(1); } pnext->next = NULL; ptail->next = pnext; ptail = pnext; printf("请第%d个人输入:",n+1); scanf("%f",&pnext->number); n++; sum = sum + pnext->number; if (n >=3) { next3: printf("是否要再输入:\n"); printf("1.是\t\t2.不是\n"); printf("请选择选项:"); scanf("%d", &i); if (i == 2) { break; } else if (i != 1) { printf("输入无效请重新输入\n"); goto next3; } } } sum = sum / n*0.618; udnext->average=sum; abmin = 100; abmax = 0; pnext = phead->next; while (pnext) //计算每一个输入的数字与黄金的绝对值,并且找出最大绝对值和最小绝对值 { pnext->absoluten_n = abs(pnext->number - sum); if (abmax < pnext->absoluten_n) { abmax =pnext->absoluten_n; } if (abmin>pnext->absoluten_n) { abmin = pnext->absoluten_n; } pnext = pnext->next; } pnext = phead->next; while (pnext) // 给每一个参加游戏的人打分 { if (pnext->absoluten_n == abmax) { pnext->grade = -2; } else if (pnext->absoluten_n == abmin) { pnext->grade = n; } else { pnext->grade = 0; } pnext=pnext->next; } printf("黄金点值:%.2f\n", udnext->average); printf("输出各自的得分情况:\n"); pnext = phead->next; n = 0; while(pnext) { printf("第%d个人得分是;%d\n", n+1, pnext->grade); n++; pnext = pnext->next; } next4: printf("是否要输出所有人数的数字:\n"); printf("1,是\t\t2,否\n"); printf("请输入选项:"); scanf("%d", &x); switch (x) { case 1: { for (n = 0,pnext=phead->next; pnext; n++, pnext = pnext->next) { printf("第%d个人输入的数是:%d\n", n + 1, (int)pnext->number); } break; } case 2:break; default: { printf("输入无效,请重新输入\n"); goto next4; } } next5: printf("是否要再进行一轮游戏:\n"); printf("1.是\t\t2.不是\n"); printf("请选择选项:"); scanf("%d", &j); if (j == 2) { break; } else if (j != 1) { printf("输入无效请重新输入\n"); goto next5; } } }
posted on 2016-04-05 22:37 songchengxin 阅读(245) 评论(0) 编辑 收藏 举报