实验6、定时器和随机数
(1)实验目的
通过该实验,让学生掌握定时器和Random类的使用方法。
(2)实验内容
编写WPF应用程序实现以下功能:定义一个RandomHelp类,该类提供一个静态的GetIntRandomNumber方法,一个静态的GetDoubleRandomNumber方法。
在窗体中让用户指定随机数范围,当用户单击开始按钮时,启动定时器,在定时器事件中调用RandomHelp类中的静态方法生成随机数,并在页面中显示出来。当用户单击停止按钮时,停止定时器,然后用比原字体大一倍的字体显示最后生成的随机数。
(3)验收/测试用例
在主窗体中,让用户指定随机数范围,当用户单击【开始】按钮时,启动定时器,在定时器事件中调用RandomHelp类中的静态方法生成随机数,并在窗体上显示出来。当用户单击【停止】按钮时,停止定时器,然后用比原字体大一号的字体显示最后生成的随机数。
运行结果:
窗体界面:
窗体代码:
<Window x:Class="CSharp_RandomNumber.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CSharp_RandomNumber"
mc:Ignorable="d"
Title="RandomNumber" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="23*"/>
</Grid.ColumnDefinitions>
<GroupBox Header="参数" Margin="26,10,26,272" Grid.ColumnSpan="2"/>
<GroupBox Header="结果" Margin="26,244,26,21" Grid.ColumnSpan="2"/>
<Label Content="最小:" HorizontalAlignment="Left" Margin="25,42,0,0" VerticalAlignment="Top" Grid.Column="1"/>
<Label Content="停时器间隔:" HorizontalAlignment="Left" Margin="25,92,0,0" VerticalAlignment="Top" Grid.Column="1"/>
<Label Content="最大:" HorizontalAlignment="Left" Margin="313,42,0,0" VerticalAlignment="Top" Grid.Column="1"/>
<Label x:Name="result" Content="" HorizontalAlignment="Left" Margin="92,264,0,0" VerticalAlignment="Top" Width="447" Height="130" AllowDrop="True" FontSize="30" VerticalContentAlignment="Center" Grid.Column="1" />
<RadioButton x:Name="shishu" Content="生成随机实数" HorizontalAlignment="Left" Margin="577,104,0,0" VerticalAlignment="Top" Grid.Column="1"/>
<RadioButton x:Name="zhengshu" Content="生成随机整数" HorizontalAlignment="Left" Margin="577,43,0,0" VerticalAlignment="Top" IsChecked="True" Grid.Column="1"/>
<TextBox x:Name="min" HorizontalAlignment="Left" Margin="71,46,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Grid.Column="1"/>
<TextBox x:Name="jiange" HorizontalAlignment="Left" Margin="112,101,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="367" Grid.Column="1"/>
<TextBox x:Name="max" HorizontalAlignment="Left" Margin="359,46,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" Grid.Column="1"/>
<Button x:Name="start" Content="开始" HorizontalAlignment="Left" Margin="71,186,0,0" VerticalAlignment="Top" Width="163" Height="43" Grid.Column="1" Click="start_Click_1"/>
<Button x:Name="stop" Content="停止" HorizontalAlignment="Left" Margin="419,186,0,0" VerticalAlignment="Top" Width="186" Height="43" Grid.Column="1" Click="stop_Click"/>
</Grid>
</Window>
操作代码段:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace CSharp_RandomNumber
{
/// <summary>
/// 作者:杨清源
/// 注释:本次实验是河南大学软件学院C#课程的实验六“RandomNumber”
/// 完成时间:2022/9/19
/// </summary>
public partial class MainWindow : Window
{
RandomHelp random1 = new RandomHelp(); //随机数对象
DispatcherTimer timer = new DispatcherTimer(); //计时器对象 //在这里要特别注释到:WPf应用程序取消了timer控件,要使用using System.Windows.Threading;语句调用命名空间。
private void Get(object sender, EventArgs e)
{
if (zhengshu .IsChecked == true)
{
int num1 = int.Parse(min.Text); //获得最小值
int num2 = int.Parse(max.Text); //获得最大值
result.Content = random1.GetIntRandomNUmber(num1, num2).ToString(); //更新随机数
}
else if (shishu.IsChecked == true)
{
double num1 = double.Parse(min.Text); //获得最小值
double num2 = double.Parse(max.Text); //获得最大值
result.Content = random1.GetDoubleRandomNumber(num1, num2).ToString(); //更新随机数
}//通过if_else语句实现对 “选择了哪一个Radio button”的判断
}//在最大值和最小值的textbox里获得随机数范围
private void start_Click_1(object sender, RoutedEventArgs e)
{
double time = double.Parse(jiange.Text);//通过“jiange”textbox 获得timer的时间间隔。 //特别的,这里的时间间隔是以毫秒单位
timer.Interval = TimeSpan.FromMilliseconds(time);//时间间隔
timer.Tick += Get; //每一轮时间间隔结束执行的事件
timer.Start(); //开始计时
}
private void stop_Click(object sender, RoutedEventArgs e)
{
timer.Stop(); //停止计时
}
}
class RandomHelp
{
Random n = new Random();//生成一个random实例
public int GetIntRandomNUmber(int num1, int num2)
{
int number = num1 + n.Next(num2 - num1);
return number;
} //生成int形的随机数n
public double GetDoubleRandomNumber(double num1, double num2)
{
double number = num1 + n.Next((int)(num2 - num1)) + n.NextDouble();
return number;
} //生成double形的随机数n
} //新建一个类,用来实现对不同类型随机数的生成
//特别的,我发现如果使用DLL调用来实现这个功能,可能会出现奇怪的系统报错……
}