编程题(共3题,第一题20分,第二题30分,第三题50分,共100分。请上机编写程序,按题目要求提交文件。
本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。
1、 排序算法(20分)
l 问题描述
将给定的无序整数数组降序排列后输出,输入的无序数组长度为N,类型为unsigned int
l 要求实现函数
void DscSort (const int InputArray[], unsigned int n, int OutputArray[])
【输入】InputArray: 给定的无序数组
n: 数组长度
【输出】OutputArray: 排序后的数组
【返回】无
l 示例
输入:InputArray={1,5,4,8,3,2,9,6,7,0}
输出:OutputArray={9,8,7,6,5,4,3,2,1,0}
2、查找最大的不重复数(30分)
l 问题描述
如果一个数字十进制表达时,不存在连续两位相同,则称之为“不重复数”。例如,105、1234和12121都是“不重复数”,而11、100和1225不是。给定一个正整数A,返回大于A的最小“不重复数”。A小于100000
l 要求实现函数
unsigned int GetNotRepeatNum(unsigned int lValue)
【输入】lValue: 给定的数字,返回大于该值的最小不重复数
【输出】无
【返回】大于iValue的最小不重复数
l 示例
输入:iValue =54
返回: 56
输入:iValue =10
返回: 12
输入:iValue =98
返回: 101
输入:iValue =21099
返回: 21201
3、字符串匹配(50分)
l 问题描述
判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有‘*’和‘?’,且通配符不会连续出现 。(要求完全匹配,而不是包含)
其中,通配符‘*’:代替0个或多个字符,通配符‘?’:代替一个字符
l 要求实现函数
int GetMatchStr (const char *ArrStr, const char *KeyStr)
【输入】 ArrStr: 给定的字符串
KeyStr: 包含通配符的匹配字符串
【输出】无
【返回】是否匹配,匹配返回1,不匹配返回0
l 示例
输入:” abcdefg”, “a*'”
返回:1
输入:“tommababcabc” , t?m*ab*abc
返回:1
现在附上第三题的答案:
int GetMatchStr (const char *ArrStr, const char *KeyStr)
{
//先确定两个形参指针是否为空
assert( ArrStr!= NULL && KeyStr!= NULL);
int len=strlen(ArrStr);
int i=0;
switch (*KeyStr)
{
case '\0':
return (*ArrStr=='\0')? 1:0;
case '?':
return (*ArrStr=='\0')? 0:GetMatchStr(ArrStr+1,KeyStr+1);
case '*':
for(i=0;i<len;i++)
{
int matchNum=GetMatchStr(ArrStr+i,KeyStr+1);
if(matchNum==1)
{
return 1;
break; //此处的break中止的上一层的for循环,如果for放在if判断语句的外面,则不满足matchNum==1时,也执行循环的中止
}
}
default:
return (*ArrStr!=*KeyStr)? 0:GetMatchStr(ArrStr+1,KeyStr+1);
}
}