西工大2015年计算机机试题

这篇博客主要解析了西工大计算机机试的若干题目,包括求最小数、十进制转二进制、迷宫问题1和2、字符串替换、六数码问题、命题公式真值表计算以及单词计数等。对于迷宫问题,博主分享了解题思路,字符串替换采用了find和replace函数,而其他题目则涉及递归、边界判断和算法应用。
摘要由CSDN通过智能技术生成

题目来源:西工大计算机(微信公众号)

字符串匹配解决方法和连阴雨参考该篇博客

六数码和真值表问题来自该篇博客

第一题:求三个数中最小的一个

   输入样例:5 3 98 
   输出样例:3
#include<iostream>
using namespace std;
int min1(int n1, int n2, int n3)
{
	if (n1 < n2)
	{
		if (n1 < n3)
			return n1;
		else 
			return n3;
	}
	else
	{
		if (n2 > n3)
			return n3;
		else
			return n2;
	}
}
int main()
{
	int a, b, c;
	cout << "Please input:";
	cin >> a >> b >> c;
	cout << min1(a, b, c) << endl;
	return 0;
}

第二题:十进制转化为二进制

 输入样例:1030
 输出样例:10000000110
实际中解决问题时,十进制转换为二进制是通过长除法来实现,本次数制转换也可以通过这种思想,编程解决实际问题。

长除法10进制转换为2进制是将余数写在一侧,商写在底下,计算结束后将余数逆写便为转换而成的目标字符串。递归调用刚好有这一特性,递归结束后,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
void convto(char c[], int n1, int n2)//进制转换函数,n1为待转换数,n2为目标进制,将n1转化为n2进制的数据
{
	int len;       //转换而成的字符串长度;
	char bit[] = { "0123456789ABCDEF" };//最大可转换为16位;
	if (n1 == 0)                         //0转化为空
	{
		strcpy(c, "");
		return;
	}
	convto(c, n1 / n2, n2);      //递归,递归结束之后,逆调用方向输出下列语句;
	len = strlen(c);
	c[len] = bit[n1 % n2];       //bit对应位和目标字符串一一对应
	c[len + 1] = '\0';
}
int main()
{
	char c[20] = {};   //c用来保存转换而成的字符串
	int number;        
	cin >> number;     //输入待转换数字
	convto(c, number, 2);//调用进制转换子函数
	cout << c<<endl;
	return 0;
}

第三题:迷宫问题1

在这里插入图片描述
在这里插入图片描述

思想:刚开始不太明白题目中的迷宫是如何设置的,是什么样式,题目是什么意思?参考别人答案之后意识到迷宫就是n*n的正方形,n为输入的行数;最框是迷宫的边边界,无法行进,在内部是可以自由行走的。根据题目输入样例可以看出,每次输入都是一个值,简单的开关语句便可以实现。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int n;                //n代表输入行数,2 <= n <= 20;
	int m, t;             //坐标位置,行数、列数都从0开始;
	char str;             //代表行走的方向;
	cin >> t;             
	cin >> n >> m;        
	cin >> str;           
	if (str == 'w')       //向上走;
	{
		if (n == 0)       //位于第一行时,边界,无法向上行走,其余方向均可;
			printf("N\n");
		else 
			printf("Y\n");
	}
	else if (str == 's') //向下走;
	{
		if (n == t - 1)  //最后一行不能向下走,其余方向均可行走;
			printf("N\n");
		else 
			printf("Y\n");
	}
	else if (str == 'a') //向左走;
	{
		if (m == 0)      //第一列不可向左走;
			printf("N\n");
		else 
			printf("Y\n");
	}
	else if (str == 'd') //向右走;
	{
		if (m == t - 1)  //最后一列不能向右走;
			printf("N\n");
		else 
			printf("Y\n");
	}
	return 0;
}

第四题:迷宫问题2

在这里插入图片描述
在这里插入图片描述

思想:这道题目比上一题有所改进,上一题迷宫内部可自由行走,边界无法前进;而本题人为输入数据矩阵,矩阵对应迷宫大小,在迷宫内部人为设置障碍。解决方法是在上题基础之上添加判断,上题是根据输入的方向进行判断,行进方向若为边界则不能前进;而本题四个方向都得判断,也就是每次还得判断前进方向是否有障碍。
#include<iostream>
#include<cstring>
using namespace std;
int num[100][100];
bool judge(int n, int n1, int n2, char location)
{
	switch (location)
	{
	case '0'://A             除了判断是否为边界之外,还要判断前进方向是否有障碍
		if (n2 == 0)          //判断是否为边界
			return false;
		else                  //不为边界,判断前进方向是否有障碍
		{
			n2 = n2 - 1;
			if (num[n1][n2] == 0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		break;
	case '1'://S
		if (n1 == n - 1)
			return false;
		else
		{
			n1 = n1 + 1;
			if (num[n1][n2] == 0)
				return true;
			else
				return false;
		}
		break;
	case '2'://D
		if (n2 == n - 1)
			return false;
		else
		{
			n2 = n2 + 1;
			if (num[n1][n2] == 0)
				return true;
			else
				return false;
		}
		break;
	case '3'://W
		if (n1 == 0)
			return false;
		else
		{
			n1 = n1 - 1;
			if (num[n1][n2] == 0)
				return true;
			else
				return false;
		}
		break;
	}
	return true;
}
int main()
{
	int n;                //n代表输入行数,2 <= n <= 20;
	int x, y;             //坐标位置,行数、列数都从0开始;
	char str;             //代表行走的方向;
	cin >> n;  
	cout << "please input 0 or 1" << endl;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> num[i][j];//输入矩阵,人为设置障碍
		}
	}
	cin >> x >> y;        
	cin >> str;   
	if (judge(n,x, y, str))
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
	return 0;
}


第五题:字符串替换

在这里插入图片描述

思想:该题直接实现比较困难,包含字符串匹配算法,但该篇博客使用find函数和replace函数进行快速解决。若为机器测试,则方便快捷;但若人工阅卷,有投机取巧之嫌。
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string a[3];    //3个目标数组
	for (int i = 0; i < 3; i++)
	{
		getline(cin, a[i]);//从键盘读入字符数据流
	}
	int pos = a[0].find(a[1]);//find函数,找到第二个字符数组在第一个字符数组中的起始位置
	a[0].replace(pos, a[1].length(), a[2]);//替换, 用str替换指定字符串从起始位置pos开始长度为len的字符 
	                                               //string& replace(size_t pos, size_t len, const string& str);
	cout << a[0] << endl;
	return 1;
}

在这里插入图片描述

第六题:六数码问题

在这里插入图片描述
在这里插入图片描述

这道题目不会,可参考该篇博客

第七题:输出命题公式的真值表

在这里插入图片描述
在这里插入图片描述

不会,可参考该篇博客

第八题:计算单词的个数

在这里插入图片描述

思想:建立一个字符数组,从键盘读入字符串,对该字符数组逐位进行判断,某一位有字符且下一位为空,则为一个单词;但要设置对最后一个单词的判断,即该位不为空,下一位为结束符,否则很容易导致最后一个单词没有算上。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
int judge(char c[ ])
{
	int count = 0,len,j;
	//len = sizeof(s);                   //str.length()、str.size()、sizeof(str)都可以求字符串长度。
	len = strlen(c);                     //strlen()用来求字符数组个数
	for (int i = 0; i < len; i++)
	{
		j = i + 1;
		if (c[i] != ' ' && c[j] == ' ') //第一种情况,该位不为空,而下一位为空,则单词计数器加1;
			count++;
		else if (c[i] != ' ' && c[j] == '\0')// 第二种情况,该位不为空,而下一位为结束符,意为最后一个单词,加1;
			count++;
		else
			continue; 
	}
	return count;
}
int main()
{
	char s[80] = {};
	cout << "Please input one sentence:" << endl;
	//getline(cin, s);          //一般用作键盘读取字符串输入
	cin.getline(s, 80);
	cout << judge(s) << endl;
	return 0;
}
当然也可以加一个字符判断数组,确定其只能为大小写字母。

第九题:连阴雨

在这里插入图片描述
在这里插入图片描述

暂时不会,可参考该篇博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值