广东理工职业学院
第三届程序设计大赛试题
2011-6-9
学号: 姓名: 班级: 成绩:
注意事项:
为保证竞赛顺利进行,正式答题之前,请严格按照如下步骤操作:
第一步:在E:\下创建一个考生文件夹,文件夹名称为:学号+姓名。例如张为的学号是0123456,则文件夹名称为:01123456张为。
第二步:在考生文件夹内为每一道题创建一个子文件夹,子文件夹名称分别为Exam1、Exam2、Exam3、、、,用于存放与该题目相关的所有程序文件。
本次竞赛一共5道试题,满分100分。考试时间为150分钟。评分时以程序运行结果以及算法优劣为准。
题目:
1. 有数列1/1+2/1+3/2+5/3+8/5+13/8+21/13+……。请观察其规律,并求出该数列的前30项之和,将计算结果从控制台中输出,结果要求保留四位小数
decimal dSum = 0 ;
for ( int i = 1 ; i <= 30 ; i ++ )
{
dSum += a / b;
a = a + b;
b = a - b;
}
Console.WriteLine(dSum.ToString( " #.#### " ));
答案:48.2226
2. 古罗马有一种加密技术,曾在战争的情报工作中发挥过巨大的贡献,它是一种替换加密的技术。即明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
现在你作为战斗的情报官员,截获了一份来自敌方的情报“fyyfhy GJLNSX FY KNAJ!”,但是它是由密文构成的,并且你掌握了其破译的方法:密文是在明文的基础上,每个字母向后移动了五位,即明文a变成了密文f,以此类推。这份情报将关系到战争的最终胜利方归属,请你赶紧进行破译这段密文情报fyyfhy GJLNSX FY KNAJ!。并输出显示密文及破解后的明文。
图1 密码破译输入及输出示例
string strMingWen = String.Empty;
// int a;
char z;
foreach ( char c in strMiwen)
{
// ASCII码
// if ((int)c >= 65 && (int)c <= 90 || (int)c >= 97 && (int)c <= 122)
// {
// a = (int)c + 5;
// if (a >= 91 && a <= 95 || a >= 123 && a <= 127)
// {
// a -= 26;
// }
// strMingWen += Convert.ToChar(a);
// }
// else
// {
// strMingWen += c;
// }
if (Char.IsLetter(c))
{
z = Convert.ToChar(( int )c + 5 );
if ( ! Char.IsLetter(z))
{
z = Convert.ToChar(( int )z - 26 );
}
strMingWen += z;
}
else
{
strMingWen += c;
}
}
Console.WriteLine( " 加密后的密文为: " + strMiwen + Environment.NewLine + " 解密后的密文为: " + strMingWen);
3. 串口是一种被广泛应用的通信接口,通常用于两台计算机(或设备)之间进行数据传输,大多数计算机主板都配有串口。利用串口进行数据传输时,首先需要将待传输的数据按字节存储在输出缓冲区中,然后由串口依次传输到接收端。
小王正在给用户开发一个“温室环境监控系统”,系统结构如图所示:
图2 温室环境监控系统结构图
传感器采集到的数据汇集到本地计算机后,上传给控制中心,控制中心通过计算决定如何对温室环境参数进行调节,以利于作物生长。
小王决定采用串口来实现本地计算机与运程控制中心计算机之间的通信。他的设计方案是:
为保证数据传输不出现差错,双发约定如下通信规则(即通信协议):
本地计算机传给远程控制中心按帧来传输数据,每帧数据包括16个字节,如表1:
表1 帧内容定义
字节序号 | 内容 | 说明 |
1 | 0xAA | 数据起始标志,1字节 |
2 | 温度 | 范围:0-100,1字节 |
3 | 湿度 | 范围:0-100,1字节 |
4 | 钾浓度 | 范围:0-1000,4字节 |
5 | ||
6 | ||
7 | ||
8 | 磷浓度 | 范围:0-1000,4字节 |
9 | ||
10 | ||
11 | ||
12 | 氮浓度 | 范围:0-1000,4字节 |
13 | ||
14 | ||
15 | ||
16 | 0xFF | 结束标志,1字节 |
注意:
¨ 0x前缀表示十六进制,如0xAA对应的十进制数为170
¨ 一个字节表示的数据范围为0-255,钾浓度、磷浓度、氮浓度范围为0-1000, 超过了1字节,因此需要用4字节表示
(1) 利用数组来表示输入缓冲区,将所有采集到的数据按照(1)的通信规则转换成字节数据存放到数组中
例如:如果传感器检测的参数为:
温度 | 湿度 | 钾浓度 | 磷浓度 | 氮浓度 |
35 | 60 | 432 | 552 | 684 |
则封装后,缓冲区中的数据为:
170 35 60 176 1 0 0 40 2 0 0 172 2 0 0 255
如果用16进制表示则为:
AA 23 3C B0 01 00 00 28 02 00 00 AC 02 00 00 FF
现在请你按照以上方案,替小王写出数据封装的程序,要求:
输入:在控制台中依次输入温度、湿度、钾浓度、磷浓度、氮浓度,如下图所示
输出:在控制台中输出封装后的结果,如下图所示
输入示例
输出示例
{
int Temperature, Humidity, K, P, N;
string strMessage = "" ;
Console.Write( " 温度= " );
// Temperature = Int32.Parse(Console.ReadLine());
do
{
Temperature = GetReadLineNumberMax100();
} while (Temperature < 0 || Temperature > 100 );
Console.Write( " 湿度= " );
do
{
Humidity = GetReadLineNumberMax100();
} while (Humidity < 0 || Humidity > 100 );
Console.Write( " 钾浓度= " );
do
{
K = GetReadLineNumber();
} while (K < 0 || K > 1000 );
Console.Write( " 磷浓度= " );
do
{
P = GetReadLineNumber();
} while (P < 0 || P > 1000 );
Console.Write( " 氮浓度= " );
do
{
N = GetReadLineNumber();
} while (N < 0 || N > 1000 );
strMessage += " 170 " ;
strMessage += " " + Temperature.ToString();
strMessage += " " + Humidity.ToString();
strMessage += ConvertIntTo0x(K);
strMessage += ConvertIntTo0x(P);
strMessage += ConvertIntTo0x(N);
strMessage += " " + 255 ;
Console.WriteLine( " 封装后的数据为: " + Environment.NewLine + strMessage);
}
public static string ConvertIntTo0x( int temp)
{
string strTemp = "" ;
strTemp = " " + (temp / 256 / 256 / 256 % 256 ).ToString();
strTemp = " " + (temp / 256 / 256 % 256 ).ToString() + strTemp;
strTemp = " " + (temp / 256 % 256 ).ToString() + strTemp;
strTemp = " " + (temp % 256 ).ToString() + strTemp;
return strTemp;
}
public static int GetReadLineNumberMax100()
{
int i;
string strRead = Console.ReadLine();
while ( ! Int32.TryParse(strRead, out i))
{
strRead = Console.ReadLine();
}
return i;
}
public static int GetReadLineNumber()
{
int i;
string strRead = Console.ReadLine();
while ( ! Int32.TryParse(strRead, out i))
{
strRead = Console.ReadLine();
}
return i;
}
4. 数学上有一种矩阵叫旋转矩阵,非常的有意思,所谓旋转矩阵,就是在N阶矩阵中,起始数1置于方阵的左上角,然后从起始数开始依次递增,按顺时针方向从外向里旋转填数而成。
要求输入阶数N(1≤N≤10),输出对应的N阶旋转矩阵。
输入及输出示例:
N=8:
N=5:
{
int N, Number;
do
{
N = GetReadLineNumber();
} while (N < 1 || N > 10 );
int [,] a = new int [N, N];
Number = 1 ; // 显示的数字(每次传值后自增1)
#region 给旋转矩阵复制
for ( int i = 0 ; i < N / 2 ; i ++ )
{
// 第一行
for ( int j = i; j < N - i; j ++ )
{
a[i, j] = Number ++ ;
}
// 最后一列
for ( int k = i + 1 ; k < N - i - 1 ; k ++ )
{
a[k, N - i - 1 ] = Number ++ ;
}
// 最后一行
for ( int l = N - i - 1 ; l > i - 1 ; l -- )
{
a[N - i - 1 , l] = Number ++ ;
}
// 第一列
for ( int m = N - i - 2 ; m > i; m -- )
{
a[m, i] = Number ++ ;
}
}
#endregion
#region 如果N为单数,则给正中点的数赋值
if (N % 2 == 1 )
{
a[N / 2 , N / 2 ] = Number;
}
#endregion
#region 显示
for ( int i = 0 ; i < N; i ++ )
{
for ( int j = 0 ; j < N; j ++ )
{
switch (a[i, j].ToString().Length)
{
case 1 :
Console.Write( " " );
break ;
case 2 :
Console.Write( " " );
break ;
default :
break ;
}
Console.Write(a[i, j]);
}
Console.WriteLine(Environment.NewLine);
}
#endregion
}
public static int GetReadLineNumber()
{
int i;
string strRead = Console.ReadLine();
while ( ! Int32.TryParse(strRead, out i))
{
strRead = Console.ReadLine();
}
return i;
}
5. 一根27公分的细杆子左右平放,两端开口,上面有五只蚂蚁,分别在3公分、7公分、11公分、17公分、23公分的地方,木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当两只蚂蚁碰头时,它们会同时调头朝反方向走。假设蚂蚁的爬行速度都一样,1公分/秒。
编写程序,求所有五只蚂蚁全部从杆子上爬出来的最短时间,最长时间各是多少?
decimal Length = 27 ; // 细杆子长度
decimal Speed = 1 ; // 速度:1公分/秒
int [] Location = { 3 , 7 , 11 , 17 , 23 }; // 蚂蚁的位置
decimal MinTime; decimal MaxTime; // 最短时间与最长时间
// 求出最短时间:先求出离中点最近的蚂蚁,因为该蚂蚁决定着最短时间
decimal MinMiddleOne = Location[ 0 ]; // 记录距离中点最近的蚂蚁的位置
decimal MinMiddleMile = Length / 2 ; // 离中点最近的距离
decimal MinMiddleTemp; // 记录当前蚂蚁离中点最近的距离
for ( int i = 0 ; i < Location.Length; i ++ )
{
MinMiddleTemp = Math.Abs(Length / 2 - Location[i]);
if (MinMiddleTemp < MinMiddleMile)
{
MinMiddleMile = MinMiddleTemp;
MinMiddleOne = Location[i];
}
}
MinTime = Math.Min(MinMiddleOne / Speed, Length - MinMiddleOne / Speed);
// 求出最长时间:先求出离其中一个终点最远的蚂蚁,因为该蚂蚁决定着最长时间
decimal MaxEndOne = Location[ 0 ]; // 记录距离其中一个终点最远的蚂蚁的位置
decimal MaxEndMile = 0 ; // 离其中一个终点的最远的距离
decimal MaxEndTemp; // 记录当前蚂蚁离其中一个终点的最远的距离
for ( int i = 0 ; i < Location.Length; i ++ )
{
MaxEndTemp = Math.Max(Location[i], Length - Location[i]);
if (MaxEndTemp > MaxEndMile)
{
MaxEndMile = MaxEndTemp;
MaxEndOne = Location[i];
}
}
MaxTime = Math.Max(MaxEndMile / Speed, (Length - MaxEndMile) / Speed);
Console.WriteLine( " 最短时间: " + MinTime + " 秒 " + Environment.NewLine + " 最长时间: " + MaxTime + " 秒 " );
PS:所有答案为本人为打发时间而做出来,非官方。。。