如何写出一个返回多个值的c语言子函数

今天跟以往一样刷水题,因为水题没有刷完。我发现刷水题还是有用的,自己没有理解清楚的c的知识,等你写的代码报错后,你就能都弄懂了。结果今天这题目引发我了我的一个问题,题目如下:

描述
设计一个从5个整数中取最小数和最大数的程序
输入
输入只有一组测试数据,为五个不大于1万的正整数
输出
输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开。
样例输入
1 2 3 4 5
样例输出
1 5
我的思路是利用三个数比大小的子函数,然后返回min,max,然后接着调用子函数,这次包含了min和max,然后再调用一次,真正的min和max 不就有了,当我写代码时候,发现我的子函数要返回两个值,我就发现这个地方可以好好想一想。

方法1:全局变量

实例如下:

#include <stdio.h>
int min, max;
int min_max(int a, int b, int c)
{
	int t;
	if(a > b)
	{
		t = a;
		a = b;
		b = t;
	}
	if(a > c)
	{
		t = a;
		a = c;
		c = t;
	}
	if(b > c)
	{
		t = b;
		b = c;
		c = t;
	}
	min = a;
	max = c;
}
int main()
{
	int a, b, c, d, e;
	scanf("%d%d%d%d%d",&a, &b, &c, &d, &e);
	min_max(a,b,c);
	min_max(min,max,d);
	min_max(min,max,e);
	printf("%d %d",min, max);
	return 0;
}

方法2:传递数组指针

#include <stdio.h>
 
void min_max(int *ptr,int n)
{
	int *temp;
	for(int i = 0; i < 5; i++)
	{
		if(*(ptr) > *(ptr+i))
		{
			*temp = *(ptr);
			*(ptr) = *(ptr+i);
			*(ptr+i) = *temp;
		}
		if(*(ptr + n-1) < *(ptr + i) )
		{
			*temp = *(ptr+n-1);
			*(ptr+n-1) = *(ptr+i);
			*(ptr+i) = *temp;
		}
	}
 } 
int main()
{
	int a[5];
	for(int i = 0; i < 5 ; i++)
	scanf("%d",&a[i]);
	min_max(a,5);
	printf("%d %d",a[0], a[4]);
	return 0;
 } 

方法3:传递结构体指针

这题觉得没有必要这么写,等下次遇到合适得例子,我就再补上。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
棋是一种比较复杂的棋类游戏,评估函数的编需要考虑多种情况,下面是一个比较复杂的六棋评估函数C语言实现: ```c int evaluate(int board[15][15], int player) { int score = 0; int i, j, k, m, n, cnt; int weight[6] = {0, 1, 10, 100, 1000, 10000}; // 横向 for (i = 0; i < 15; i++) { for (j = 0; j < 10; j++) { cnt = 0; for (k = 0; k < 6; k++) { if (board[i][j + k] == player) { cnt++; } else if (board[i][j + k] == 3 - player) { cnt = 0; break; } } if (cnt == 6) { score += weight[cnt]; } else { score += weight[cnt] / 2; } } } // 竖向 for (i = 0; i < 10; i++) { for (j = 0; j < 15; j++) { cnt = 0; for (k = 0; k < 6; k++) { if (board[i + k][j] == player) { cnt++; } else if (board[i + k][j] == 3 - player) { cnt = 0; break; } } if (cnt == 6) { score += weight[cnt]; } else { score += weight[cnt] / 2; } } } // 正斜线 for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { cnt = 0; for (k = 0; k < 6; k++) { if (board[i + k][j + k] == player) { cnt++; } else if (board[i + k][j + k] == 3 - player) { cnt = 0; break; } } if (cnt == 6) { score += weight[cnt]; } else { score += weight[cnt] / 2; } } } // 反斜线 for (i = 0; i < 10; i++) { for (j = 14; j >= 5; j--) { cnt = 0; for (k = 0; k < 6; k++) { if (board[i + k][j - k] == player) { cnt++; } else if (board[i + k][j - k] == 3 - player) { cnt = 0; break; } } if (cnt == 6) { score += weight[cnt]; } else { score += weight[cnt] / 2; } } } return score; } ``` 这个函数的实现中,使用了四个循环来遍历棋盘中的所有可能的连续六个棋的情况,分别是横向、竖向、正斜线和反斜线。对于每种情况,计算了连续六个棋中属于当前玩家的个数,以及其中有多少个空位。然后根据连续棋的数量和空位的数量来计算得分。其中,权重数组表示连续棋数量对应的得分,越多的棋得分越高,空位越少得分越高。最终将四个方向的得分累加起来作为评估函数的结果返回。 需要注意的是,这个评估函数只是一个简单的示例,实际上六棋的评估函数还需要考虑更多的情况,如棋的位置、棋的分布、棋的形状等等,才能更准确地评估当前局面的好坏。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值