您的位置:首页 > 编程语言 > C#

一道笔试题:C#下十进制转十六进制

2013-03-30 17:43 246 查看
    作为电子专业的学生,我发现越来越多的同学转向软件开发方向,虽然我们专业跟软件没沾多少边。以下是我同学发给我的一道笔试题,让我周一前写完,以下是详细内容,权当做学习一下吧。

笔试题

    题干

    选择一门熟悉的语言,请用此语言编写如下函数, 采用自己的算法,不要使用 printf, sprintf, Format, toString, itoa, toHex,等函数。

    函数名称

     TQ_GetHexStringEx

    参数

    整数 iNumber

    整数 iCount

    返回值

    字符串类型

    函数描述

    获得表示iNumber十六进制字符串,宽度不足iCount 时,前面补0。

    举例

    TQ_GetHexStringEx(12,2); 返回 “0C”

    TQ_GetHexStringEx(12,8); 返回 “000000C”

实现

    题干理解

    题干说的大意比较清晰,但是细节方面没什么规定,大意是:输入一个10进制的数和一个位数限制,如果转换后位数不足,前面补0。

    界面图

        


    代码

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{

}
/// <summary>
/// 获取初始值,并运算
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int iNumber = int.Parse(txt10.Text);
int iCount = int.Parse(txtNum.Text);
string n = TQ_GetHexStringEx(iNumber, iCount);
txt16.Text = n;
}

/// <summary>
/// 根据输入的十进制数和规定的位数,返回16进制字符串
/// </summary>
/// <param name="iNumber">十进制数字</param>
/// <param name="iCount">规定的位数</param>
/// <returns>转换完毕的字符串</returns>
public string TQ_GetHexStringEx(int iNumber, int iCount)
{
try
{
string strReturn="";
//数字小于16时
if (iNumber<16)
{
//数字字符个数大于iCount时,直接返回
if (iNumber.ToString().Length >= iCount)
{
strReturn =iNumber.ToString();
}
//数字小于十六,字符数小于iCount时,补充0
else
{
//获取需要补充的0的个数
int  intDif = iCount - iNumber.ToString().Length;
strReturn =FillString(iNumber.ToString(), intDif);
}
}
//数字大于16时
else
{
string strTemp=Convery(iNumber);
//  转换出来的字符串个数大于所给个数时
if (strTemp.Length > iCount)
{
strReturn = strTemp ;
}
//  转换出来的字符个数小于所给个数时,补充0
else
{
int intDif = iCount - (Convery(iNumber)).Length;
strReturn = FillString(strTemp, intDif);
}

}
return strReturn;
}
catch (Exception e)
{
throw e;
}
finally
{
//TODO:如果此处涉及废弃内容,删除它们
}
}
/// <summary>
/// 给出需要补充的字符串和需要补充0的个数,补充字符串
/// </summary>
/// <param name="strPre">原字符串</param>
/// <param name="intNeed">需要补充0的个数</param>
/// <returns>补充完毕的字符串</returns>
public string FillString(string strPre, int intNeed)
{
try
{
string strTemp = "";
string strFinal = "";
//字符串前补充0
for (int i = 0; i < intNeed ; i++)
{
strTemp = strTemp + "0";
}
strFinal = strTemp + strPre.ToString();
return strFinal;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 返回数字对应的16进制字符
/// </summary>
/// <param name="strNum">10进制数字</param>
/// <returns>对应的A-F字符</returns>
public string ToLetter(int intNum)
{
try
{
string  strTemp = "";
//如果小于10不用转换,直接返回
if (intNum<10)
{
strTemp = intNum.ToString();
return strTemp;
}
//如果是10-15,则转换
switch (intNum)
{
case 10:
strTemp= "A";
break;
case 11:
strTemp= "B";
break;
case 12:
strTemp= "C";
break;
case 13:
strTemp= "D";
break;
case 14:
strTemp= "E";
break;
case 15:
strTemp= "F";
break;
}
return strTemp;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 输入大于16的10进制数,转换为16进制
/// </summary>
/// <param name="intNum">10进制数</param>
/// <returns></returns>
public string Convery(int intNum)
{
try
{
string x = "";
int c; //用于存放除以16后的数
int s = 0;//数组容量
int n = intNum;//用于确定数组容量
//获取数组容量
while (n >= 16)
{
s++;
n = n / 16;
}
//建立数组
string[] m = new string[s+1];

//填充数组
int i = 0;
do
{
c = intNum / 16;
//判断是否大于10,如果大于10,则转换为A~F的格式
m[i++] = ToLetter(intNum % 16);
intNum = c;
} while (c >= 16);
x = ToLetter(intNum);
//拼接字符串
for (int j = m.Length - 1; j >= 0; j--)
{
x += m[j];
}
return x;
}
catch (Exception e)
{
throw e;
}
}
}


    运行结果

    


    很显然,实现起来不难,就算是有些小问题,网上解决方案也很多,但是……我把代码注释写的尽量详细,也提醒了一下同学多理解一下代码,希望不要仅仅为了找工作而学编程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: