这两天的两道面试上机题 C#
简单的上机操作。希望对新人有所帮助。
分享出来希望有面试的朋友看看:
1计算器 很简单 实现连+ - * / 界面: namespace WindowsFormsApplication1 { enum Opration { /// <summary> /// 没有操作 /// </summary> None, /// <summary> /// 加 /// </summary> Add, /// <summary> /// 减 /// </summary> Sub, /// <summary> /// 乘 /// </summary> Mul, /// <summary> /// 除 /// </summary> Div } /// <summary> /// 计算器状态 /// </summary> enum CalcState { /// <summary> /// 初始状态 /// </summary> None, /// <summary> /// 运算过程中 /// </summary> InProcess } /// <summary> /// 计算器 /// </summary> public partial class MainForm : Form { /// <summary> /// 当前操作(加减乘除) /// </summary> private Opration currentOp = Opration.None; /// <summary> /// 当前状态(是否在计算中) /// </summary> private CalcState currentState = CalcState.None; /// <summary> /// 操作数1 /// </summary> private double num1 = 0F; /// <summary> /// 操作数2 /// </summary> private double num2 = 0F; /// <summary> /// 是否需要清除文本框内容 /// </summary> private bool needClear = false; public MainForm() { InitializeComponent(); } private void button_Click(object sender, EventArgs e) { //如果需要清除文本框内容 if (needClear) { txtValue.Text = ""; needClear = false; } //点击数字键 //得到点击的数字 Button button = sender as Button; string value = txtValue.Text + button.Text; double val; //只有在数值合法的情况下才能输入 if (double.TryParse(value, out val)) { txtValue.Text = val.ToString(); } //如果状态为计算中,则用户输入的数值赋给num2,否则赋给num1 if (currentState == CalcState.InProcess) { num2 = val; } else { num1 = val; } } /// <summary> /// 计算数值 /// </summary> private void Calc() { double value = 0F; switch (currentOp) { case Opration.Add: { value = num1 + num2; break; } case Opration.Sub: { value = num1 - num2; break; } case Opration.Mul: { value = num1 * num2; break; } case Opration.Div: { value = num1 / num2; break; } } //计算结果显示在文本框中 txtValue.Text = value.ToString(); //并且将结果赋值给num1 num1 = value; } /// <summary> /// 点击操作按钮的处理过程 /// </summary> private void DoOpration() { if (currentState == CalcState.InProcess) { Calc(); } currentState = CalcState.InProcess; needClear = true; } /// <summary> /// 点击加号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAdd_Click(object sender, EventArgs e) { DoOpration(); currentOp = Opration.Add; } /// <summary> /// 点击减号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSub_Click(object sender, EventArgs e) { DoOpration(); currentOp = Opration.Sub; } /// <summary> /// 点击乘号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnMul_Click(object sender, EventArgs e) { DoOpration(); currentOp = Opration.Mul; } /// <summary> /// 点击除号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDiv_Click(object sender, EventArgs e) { DoOpration(); currentOp = Opration.Div; } /// <summary> /// 点击等号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnResult_Click(object sender, EventArgs e) { Calc(); currentState = CalcState.None; } } } 2。Socket通信 我的这个是在一个项目下分别做一个服务端和一个客户端,这个只能一个客户端对应一个服务器发送 不能N个客户对一个服务。水平有限。。。。IP地址写自己本机的IP 。 服务端: namespace SocketServer { //声明委托用于在线程中访问界面元素 delegate void SetMessage(string message); public partial class ServerForm : Form { //缓冲区最大长度 private const int MAX_BUFFER_SIZE = 1024 //声明本地IP地址类 private IPAddress ipAddress; //需要监听的端口号 private int port; //本机节点 private EndPoint endPoint; //用于监听连接的Socket private Socket listenSocket; //用于发送&接收信息的Socket private Socket acceptSocket; public ServerForm() { InitializeComponent(); } /// <summary> /// 为用户界面中的文本框赋值 /// </summary> /// <param name="message"></param> private void SetTextMessage(string message) { txtMessage.Text = txtMessage.Text + message; } private void btnBeginListen_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(BeginListen)); thread.Start(); btnBeginListen.Enabled = false; btnStopListen.Enabled = true; } private void BeginListen() { //IP地址 ipAddress = IPAddress.Parse(txtServerAddress.Text); //端口号 port = Convert.ToInt32(txtServerPort.Text); //本机节点 endPoint = new IPEndPoint(ipAddress, port); //声明监听Socket的实例 listenSocket = new Socket(AddressFamily.InterNetwork, //网络寻址方式 SocketType.Stream, //通信流 ProtocolType.Tcp); //通信协议 //绑定Socket与本机IP listenSocket.Bind(endPoint); //开始监听 listenSocket.Listen(10); //10 为最大排队数(有多少个连接正在等待) //等待连接,当有客户端连接时,分配一个Socket实例与客户端通信,此操作会阻塞当前线程执行 acceptSocket = listenSocket.Accept(); //声明网络流用于读取&写入数据 NetworkStream stream = new NetworkStream(acceptSocket); //声明字节数,用于从流中读取数据 byte[] buffer = new byte[MAX_BUFFER_SIZE]; int readLength; do { //从流中读取数据,此操作会阻塞当前线程执行 readLength = stream.Read(buffer, 0, buffer.Length); if (readLength == 0) { break; } //将字节数组解码,得到传输内容 string message = Encoding.BigEndianUnicode.GetString(buffer); //string message = Encoding.Default.GetString(buffer); //显示内容 //制定委托调用SetTextMessage方法 SetMessage setMessage = new SetMessage(SetTextMessage); //调用委托 this.Invoke(setMessage, message); } while (readLength != 0); //最后关闭流 stream.Close(); //关闭Socket acceptSocket.Close(); //关闭监听Socket listenSocket.Close(); } } } 客户端 namespace SocketClient { public partial class ClientForm : Form { public ClientForm() { InitializeComponent(); } Socket socket; private void btnConnect_Click(object sender, EventArgs e) { //服务器地址 IPAddress ipAddress = IPAddress.Parse(txtServerAddress.Text); //服务器端口号 int port = Convert.ToInt32(txtPort.Text); //声明服务器端点实例 EndPoint endPoint = new IPEndPoint(ipAddress, port); //声明Socket实例 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Socket连接到服务端 socket.Connect(endPoint); //如果连接成功,设置按钮状态 if (socket.Connected) { btnConnect.Enabled = false; btnSendMessage.Enabled = true; } } private void btnSendMessage_Click(object sender, EventArgs e) { //得到要发送的消息 string message = txtMessage.Text; //将消息转换成为字节数组 byte[] buffer = Encoding.BigEndianUnicode.GetBytes(message); //声明网络流并且关联Socket NetworkStream stream = new NetworkStream(socket); //向流中写入数据 stream.Write(buffer, 0, buffer.Length); //关闭流 stream.Close(); //关闭Socket socket.Close(); } } } |