C语言 自制新三国杀张昌蒲严教计算器 将函数定义放入头文件

没有改变算法,只是把输入模块完善了下 现在有一个交互界面可以让用户自行输入。

main.c

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include "array.h"
#include "display.h"
#include "char.h"
#define length 20

int main(void) {
	int length_z = 0;
	int length_sgs = 0;
	int length_sgs1 = 0;
	int length_sgs2 = 0;
	short sgs[length] = { 0 };
	short sgs1[length] = { 0 };
	short sgs2[length] = { 0 };

	length_sgs = getnum(sgs, length);
	//读取输入的数组,跳过0,字母,符号,返回数组长度

	diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印初始数组信息

	//按y确定继续,按n返回重新输入,需要一个循环

	rankup(sgs, length_sgs);//对数组非零元素做升序处理
	diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印做升序后数组信息

	length_z = 2 * equal1(sgs, sgs1, sgs2, length_sgs);//对数组做相等替换;
	rankdown(sgs, length_sgs);//对数组做降序处理,把0排到后面
	rankup(sgs, (length_sgs - length_z));//对非0元素做升序处理

	length_sgs = length_sgs - length_z;
	length_sgs1 = length_z / 2;
	length_sgs2 = length_z / 2;

	diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印对sgs数组做相等替换处理后信息

	while (equal2(sgs, sgs1, sgs2, length_sgs, length_sgs1, length_sgs2)) {
		length_sgs -= 3;
		length_sgs1 += 2;
		length_sgs2++;

		rankdown(sgs, length);
		rankup(sgs, length_sgs);//整理sgs数组
	}
	diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印对sgs做b+c=a替换后信息

	while (equal3(sgs, sgs2, length_sgs, length_sgs2)) {
		length_sgs--;
		length_sgs2++;

		rankdown(sgs, length);
		rankup(sgs, length_sgs);//整理sgs数组
	}
	diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印对sgs2做b+c=a替换后信息

	system("pause");
	return 0;
}

array.h

#ifndef _ARRAY_H
#define _ARRAY_H
void exchange(short *array, int m, int n) {
	short temp;
	temp = *(array + m);
	*(array + m) = *(array + n);
	*(array + n) = temp;
}//数组元素交换函数
void rankup(short *array, int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - 1; j++) {
			if (*(array + j) > * (array + j + 1)) {
				exchange(array, j, j + 1);
			}
		}
	}
}//数组元素升序排列函数
void rankdown(short *array, int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - 1; j++) {
			if (*(array + j) < * (array + j + 1)) {
				exchange(array, j, j + 1);
			}
		}
	}
}//数组元素降序排列函数
int equal1(short *array, short *array1, short *array2, int n) {
	int equal = 0;
	for (int i = 0; i < n - 2; i++) {
		if (*(array + i) == *(array + i + 1)) {
			equal++;
			*(array1 + equal - 1) = *(array + i);
			*(array + i) = 0;
			*(array2 + equal - 1) = *(array + i + 1);
			*(array + i + 1) = 0;
		}
	}
	return equal;//返回其中相等的对数,0的个数是其二倍
}//相等替换函数
_Bool equal2(short *array, short *array1, short *array2, int m, int n1, int n2) {
	_Bool equal = false;
	int i, j, z;
	for (i = 0; i < m - 2; i++) {
		for (j = i + 1; j < m - 1; j++) {
			for (z = i + 2; z < m; z++) {
				if (*(array + i) + * (array + j) == *(array + z)) {
					*(array1 + n1) = *(array + i);
					*(array + i) = 0;
					*(array1 + n1 + 1) = *(array + j);
					*(array + j) = 0;
					*(array2 + n2) = *(array + z);
					*(array + z) = 0;
					equal = true;
					break;
				} else
					continue;
			}
			break;
		}
	}
	return equal;
}//对原数组的b+c=a替换
_Bool equal3(short *array, short *array1, int m, int n) {
	_Bool equal = false;
	short temp;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m - 1; j++) {
			if (*(array1 + i) == *(array + j) + * (array + j + 1)) {
				temp = *(array1 + i);
				*(array1 + i) = *(array + j);
				*(array + j) = temp;
				*(array1 + n) = *(array + j + 1);
				*(array + j + 1) = 0;
				equal = true;
				break;
			} else
				continue;
		}
	}
	return equal;
}//对新数组的b+c=a替换
#endif

display.h

#ifndef _DISPLAY_H
#define _DISPLAY_H

void print(short *array, int n) {
	for (int i = 0; i < n; i++) {
		printf("%2d ", array[i]);
	}
}               //定义打印数组函数

void diplay(int length_sgs, int length_sgs1, int length_sgs2, short  sgs[20], short  sgs1[20], short  sgs2[20]) {
	printf("%2d %2d %2d\n", length_sgs, length_sgs1, length_sgs2);
	printf("原数组: ");
	print(sgs, length_sgs);
	printf("\n新数组1:");
	print(sgs1, length_sgs1);
	printf("\n新数组2:");
	print(sgs2, length_sgs2);
	printf("\n");
}
#endif

char.h

#ifndef _CHAR_H
#define _CHAR_H
#define length 20

int getnum(short *array, int n) { //n为数组最大长度,返回数组实际长度
	int i = 0;
	float ch = 1;
	int _ch = 0;

	printf("请依次输入需要算的牌'('不超过20张,数值在1-13之间,整数')',输入0结束输入。\n");
	while (i < n && ch != 0) {
		if ( scanf("%f", &ch) && ( ch == 1 || ch == 2
		                           || ch == 3 || ch == 4 || ch == 5 || ch == 6 || ch == 7
		                           || ch == 8 || ch == 9 || ch == 10 || ch == 11
		                           || ch == 12 || ch == 13 )) {
			_ch = ch;
			*(array + i) = _ch;
			i++;
			printf("还可继续输入%d个数字,或者输入0结束输入!\n", n - i);
			while (getchar() != '\n')//清除键盘缓存
				;
			continue;
		} else if (ch == 0) {
			printf("结束输入!\n");
			break;
		} else {
			while (getchar() != '\n')
				;//清除键盘缓存
			printf("请输入1-13之间的整数!输入0结束输入。\n");
			continue;
		}

	}
	return i;
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值