可视化程序设计|| 实验三:C#面向对象编程(二)

一、实验目的

1.加深理解面向对象编程的概念,如类、对象、实例化等。

2.熟练掌握类的封装、继承和多态机制。

3.掌握编程常用的几种排序算法。

4.理解异常的产生过程和异常处理的概念,掌握C#异常处理的方法。

5.能够将面向对象思想应用与编程实践,开发出规模稍大的应用,如图书管理、银行卡存取款业务等。

二、实验内容

【实验3-2】银行卡存取款业务。

实验A:

假设某银行共发出M张储蓄卡,每张储蓄卡拥有唯一的卡号,每天每张储蓄卡至多支持持有者的N笔“存款”或“取款”业务。根据实际发生的业务,实时处理数据,以反映最新情况。

设储蓄卡包含的数据域有:卡号,当前余额,允许当日发生的业务次数(定义成静态变量,为所有Card类所共享),当日实际发生的业务数,以及一个数组记录发生的具体业务。它提供的主要方法有store(),处理判断是否超过当日允许发生的最大笔数,当前余额是否足以取款,以及实时修改当前数据等。

当持卡者输入正确的卡号、存款或取款金额后,程序进行相应的处理;若输入了不正确的数据,程序会提示持卡者重新输入;若输入的卡号为负数,银行终止当日业务。

实验B:

修改Card类,增加每日使用金额额度不超过5000的限制功能。

 再次修改Card类,要求对银行卡进行操作前必须验证用户密码,并且在输入密码时屏幕上用“*”显示。为简单起见,初始密码设为123456。

三、实验步骤

实验A:

1.类:Card,属性:cardNo: long,balance: decimal,currentNum: int, number: static int,currentMoney: decimal[]

2.方法: Card(): 构造函数,初始化currentMoney数组;Card(long No, decimal Balance): 构造函数,初始化cardNo、balance和currentMoney数组;store(decimal Money, out int status): 存款或取款方法,更新balance和currentMoney数组,设置status状态;show(): 显示卡号、余额和存款/取款情况

3.静态属性:Number: 设置number值

4.属性: CardNo: 获取卡号

在EXP3步骤:

Main方法:

  1. 输入当日存款或取款总次数和储蓄卡总数
  2. 创建Card对象数组person
  3. 循环输入每张卡的卡号和余额
  4. 创建Card对象并添加到person数组中

5.进入业务处理循环

    1)输入卡号

    2)如果卡号小于0,结束循环

    3)根据卡号定位到对应的Card对象

    4)输入金额

    5)调用Card对象的store方法进行存款或取款,并获取状态status

    6)根据status打印相应的提示信息

    7)调用Card对象的show方法显示卡号、余额和存款/取款情况

 Locate(Card[] person, long cardNo)方法: 根据卡号定位到对应的Card对象,返回索引值或-1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace EXP3
{class Card{long cardNo;decimal balance;int currentNum;static int number;decimal[] currentMoney;public Card(){currentMoney = new decimal[number];}public Card(long No, decimal Balance){cardNo = No;balance = Balance;currentMoney = new decimal[number];}public void store(decimal Money, out int status){if (currentNum == number){status = 0;return;}if (balance + Money < 0){status = -1;return;}currentMoney[currentNum] = Money;balance += Money;currentNum++;status = 1;}public void show(){Console.WriteLine("卡号:{0},当前余额:{1},当日发生业务的次数:{2}", cardNo, balance, currentNum);for (int i = 0; i < currentNum; i++){Console.WriteLine("当前存款/取款的情况:{0}", currentMoney[i]);}}static public int Number{set{number = value;}}public long CardNo{get{return cardNo;}}}class EXP3{static void Main(string[] args){EXP3 E = new EXP3();Card[] person;int Num, status, k;long CardNo;decimal Balance, Money;Console.Write("请输入允许当日存款或取款的总次数:");string sline = Console.ReadLine();Card.Number = int.Parse(sline);Console.Write("请输入某银行发出的储蓄卡总数:");sline = Console.ReadLine();Num = int.Parse(sline);person = new Card[Num];for(int i = 0; i < Num; i++){Console.Write("请输入卡号:");sline = Console.ReadLine();CardNo = long.Parse(sline);Console.Write("请输入{0} 账户余额:", CardNo);sline = Console.ReadLine();Balance = decimal.Parse(sline);person[i] = new Card(CardNo, Balance);}while (true){Console.WriteLine("现在正在进行存款取款的业务处理,如果输入的卡号<0,则结束业务处理");Console.Write("请输入卡号:");sline = Console.ReadLine();CardNo = long.Parse(sline);if (CardNo < 0)break;k = E.Locate(person, CardNo);if (k == -1){Console.WriteLine("对不起,不存在{0}号的储蓄卡", CardNo);continue;}Console.WriteLine("请输入卡金额(正值代表存款,负值代表取款):");sline = Console.ReadLine();Money = decimal.Parse(sline);person[k].store(Money, out status);switch (status){case -1:Console.WriteLine("存款余额不足,不能完成本次的取款业务");break;case 0:Console.WriteLine("本卡已达到当日允许的业务次数");break;case 1:Console.WriteLine("成功处理完当前业务");person[k].show();break;}}}int Locate(Card[] person,long cardNo){for (int i = 0; i < person.Length; i++){if (person[i].CardNo == cardNo)return i;}return -1;}}
}

 实验B:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace EXP3
{class Card{long cardNo;decimal balance;int currentNum;static int number;decimal[] currentMoney;string password;public Card(){currentMoney = new decimal[number];password = "123456";}public Card(long No, decimal Balance){cardNo = No;balance = Balance;currentMoney = new decimal[number];password = "123456";}public void store(decimal Money, out int status){if (currentNum == number){status = 0;return;}if (balance + Money < 0){status = -1;return;}if (Money > 5000 || Money < -5000){status = -2;return;}currentMoney[currentNum] = Money;balance += Money;currentNum++;status = 1;}public void show(){Console.WriteLine("卡号:{0},当前余额:{1},当日发生业务的次数:{2}", cardNo, balance, currentNum);for (int i = 0; i < currentNum; i++){Console.WriteLine("当前存款/取款的情况:{0}", currentMoney[i]);}}static public int Number{set{number = value;}}public long CardNo{get{return cardNo;}}public bool VerifyPassword(string input){return password == input;}}class EXP3{static void Main(string[] args){EXP3 E = new EXP3();Card[] person;int Num, status, k;long CardNo;decimal Balance, Money;Console.Write("请输入允许当日存款或取款的总次数:");string sline = Console.ReadLine();Card.Number = int.Parse(sline);Console.Write("请输入某银行发出的储蓄卡总数:");sline = Console.ReadLine();Num = int.Parse(sline);person = new Card[Num];for (int i = 0; i < Num; i++){Console.Write("请输入卡号:");sline = Console.ReadLine();CardNo = long.Parse(sline);Console.Write("请输入{0} 账户余额:", CardNo);sline = Console.ReadLine();Balance = decimal.Parse(sline);person[i] = new Card(CardNo, Balance);}while (true){Console.WriteLine("现在正在进行存款取款的业务处理,如果输入的卡号<0,则结束业务处理");Console.Write("请输入卡号:");sline = Console.ReadLine();CardNo = long.Parse(sline);if (CardNo < 0)break;k = E.Locate(person, CardNo);if (k == -1){Console.WriteLine("对不起,不存在{0}号的储蓄卡", CardNo);continue;}Console.WriteLine("请输入密码:");string password = ReadPassword();if (!person[k].VerifyPassword(password)){Console.WriteLine("密码错误");continue;}Console.WriteLine("请输入卡金额(正值代表存款,负值代表取款):");sline = Console.ReadLine();Money = decimal.Parse(sline);person[k].store(Money, out status);switch (status){case -1:Console.WriteLine("存款余额不足,不能完成本次的取款业务");break;case -2:Console.WriteLine("每日使用金额超过限制(5000),不能完成本次的存款或取款业务");break;case 0:Console.WriteLine("本卡已达到当日允许的业务次数");break;case 1:Console.WriteLine("成功处理完当前业务");person[k].show();break;}}}int Locate(Card[] person, long cardNo){for (int i = 0; i < person.Length; i++){if (person[i].CardNo == cardNo)return i;}return -1;}private static string ReadPassword(){string password = "";ConsoleKeyInfo keyInfo;do{keyInfo = Console.ReadKey(true);if (keyInfo.Key != ConsoleKey.Backspace && keyInfo.Key != ConsoleKey.Enter){password += keyInfo.KeyChar;Console.Write("*");}else{if (keyInfo.Key == ConsoleKey.Backspace && password.Length > 0){password = password.Substring(0, (password.Length - 1));Console.Write("\b \b");}}} while (keyInfo.Key != ConsoleKey.Enter);Console.WriteLine();return password;}}
}

四、实验结果展示

实验A:

实验B:

 五、实验小结

该实验在程序开始时,用户需要输入允许当日存款或取款的总次数和某银行发出的储蓄卡总数然后,根据输入的卡号和账户余额创建相应的储蓄卡对象用户可以进行存款或取款的业务处理。用户输入要操作的卡号,如果输入的卡号小于0,则结束业务处理。程序会检查输入的卡号是否存在,并要求输入密码进行验证。然后用户输入要存取的金额,程序会对金额进行合法性检查,如余额是否充足、每日使用金额是否超过限制等。根据检查结果,程序会输出相应的提示信息,并更新储蓄卡的余额和操作次数程序中还包括一个Locate方法,用于根据卡号在储蓄卡数组中查找对应的储蓄卡对象。从时间复杂度的角度来看,该程序的主要操作是在存取款业务处理循环中进行的。在每次循环中,需要进行卡号的查找、密码验证和金额合法性检查等操作,操作的时间复杂度都是O(n),其中n为储蓄卡数组的长度。因此,整个程序的时间复杂度为O(N*M),其中N为储蓄卡总数,M为当日存款或取款的总次数。

通过实验,将面向对象的思想应用于银行卡存取款业务中。这种思想的应用可以使代码更加模块化、可扩展和易维护。在实际开发中,我可以学习将面向对象思想应用于开发规模稍大的应用,如图书管理系统、银行系统等。这样的实际开发中,根据需求设计不同的类和对象,并通过封装、继承和多态来实现复杂的业务逻辑,提高开发效率和代码质量。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32MPU开发之旅:从零开始构建嵌入式Linux镜像

前言 在工业4.0与边缘计算深度融合的今天&#xff0c;STM32MP257F作为意法半导体第二代工业级64位微处理器的旗舰产品&#xff0c;凭借异构计算架构、1.35 TOPS边缘AI算力和军工级安全特性&#xff0c;已成为工业自动化、机器视觉和新能源控制等领域的标杆方案。 性能跃迁的异…

大模型应用开发(PAFR)

Prompt问答 特征:利用大模型推理能力完成应用的核心功能 应用场景&#xff1a; 文本摘要分析 舆情分析 坐席检查 AI对话 AgentFunction Calling 特征&#xff1a;将应用端业务能力与AI大模型推理能力结合&#xff0c;简化复杂业务功能开发 应用场景: 旅行指南 数据…

SpringClound 微服务分布式Nacos学习笔记

一、基本概述 在实际项目中&#xff0c;选择哪种架构需要根据具体的需求、团队能力和技术栈等因素综合考虑。 单体架构&#xff08;Monolithic Architecture&#xff09; 单体架构是一种传统的软件架构风格&#xff0c;将整个应用程序构建为一个单一的、不可分割的单元。在这…

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施&#xff0c;以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中&#xff0c;域&#xff08;realm&#xff09;是一种逻辑上的分组概念&#xff0c;用于对不同的用户群体、应用或者服务进行区…

基于opencv和PaddleOCR识别身份证信息

1、安装组件 pip install --upgrade paddlepaddle paddleocr 2、完整code import cv2 import numpy as np from paddleocr import PaddleOCR# 初始化 PaddleOCR use_angle_clsTrue, lang"ch", det_db_thresh0.1, det_db_box_thresh0.5)def preprocess_image(image…

【6】GD32 高级通信外设 CAN、USBD

高级通信外设&#xff1a;CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用

【LLM+Code】Windsurf Agent 模式PromptTools详细解读

一、前言 https://windsurf.com/ https://windsurf.com/blog/why-we-built-windsurf https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/Windsurf 二、System Prompt 相比于cursor和claude code&#xff0c; windsurf的system prompt非常长&am…

安全性测试常规测试点全解析:从基础到高级的实战指南

引言 安全性测试是保障软件系统免受恶意攻击的核心环节,其目标是识别系统在设计、开发、部署过程中存在的安全漏洞。本文将围绕12大常规安全测试点展开,结合具体测试方法、示例代码及防范建议,帮助读者构建完整的安全测试体系。 一、认证与授权测试 1. 认证机制测试 测试…

OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…

Pycharm(十六)面向对象进阶

一、继承 概述&#xff1a; 实际开发中&#xff0c;我们发现很多类中的步分内容是相似的&#xff0c;或者相同的&#xff0c;每次写很麻烦&#xff0c;针对这种情况&#xff0c; 我们可以把这些相似&#xff08;相同的&#xff09;部分抽取出来&#xff0c;单独地放到1个类中&…

Codeforces Round 1020 (Div. 3)(题解ABCDEF)

A. Dr. TC 有n次翻转&#xff0c;从1到n&#xff0c;0->1,1->0&#xff0c;每次统计1的数量&#xff0c;设cnt1是字符串1的数量&#xff0c;n次就是n*cnt1&#xff0c; 但每个1都会被翻转一次减去一个cnt1,再统计cnt0&#xff0c;每个被翻转一次,答案就是(n-1)*cnt1cnt0…

HTML字符实体和转义字符串

HTML字符实体和转义字符串用于处理特殊字符&#xff0c;确保它们在不同上下文中正确显示或解析。以下是详细总结&#xff1a; HTML字符实体&#xff08;Character Entities&#xff09; ‌定义‌&#xff1a;用于在HTML中表示保留字符或不可见字符&#xff0c;避免与HTML语法…

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…

通过 Tailwind CSS 自定义样式 实现深色模式切换

创建vite项目或者vue-cli配置大同小异 1、当前环境 Vue.js 3.5nuxtjs/tailwindcss 6.13.1nuxt3.15.4node18 这里主要依赖是tailwindcss 因为当前项目是使用nuxt开发。 2、配置颜色模式 在assets/css下创建main.css * {padding: 0;margin: 0;box-sizing: border-box; }[dat…

PWNOS:2.0(vulnhub靶机)

文章目录 靶机地址主机发现、端口扫描web渗透目录探测漏洞利用权限提升 解密工具地址总结 靶机地址 https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z 这里如果是windows系统直接使用vmware或者virtubox打开可以使用,如果是mac系统需再去做一个配置&#xff0c;比较麻烦 这里…

Gartner魔力象限(Gartner Magic Quadrant)

Gartner魔力象限&#xff08;Gartner Magic Quadrant&#xff09;是由全球领先的研究和咨询公司Gartner发布的市场研究报告&#xff0c;广泛应用于IT行业&#xff0c;尤其是在技术供应商评估中。它以图形化的方式展示了不同技术领域中各个供应商的市场表现&#xff0c;帮助企业…

信创时代开发工具选择指南:国产替代背景下的技术生态与实践路径

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

人口老龄化丨AI健康小屋如何实现防病于未然​

随着全球老龄化加剧&#xff0c;“银发浪潮” 对医疗资源、养老护理和健康管理提出了严峻挑战。 由此智绅科技应运而生&#xff0c;七彩喜智慧养老系统构筑居家养老安全网。 AI 健康小屋作为银发科技的创新载体&#xff0c;通过智能化健康监测、精准化风险预警、便捷化医疗衔…

【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 目录 引言&#xff1a;数据库进化的下一站 —— 未来科技的无限可能金仓数据库简介&#xff1a;国…

#什么是爬虫?——从技术原理到现实应用的全面解析 VI

什么是爬虫?——从技术原理到现实应用的全面解析 V 二十六、异构数据采集技术突破 26.1 PDF文本与表格提取 import pdfplumber import pandas as pddef extract_pdf_data(pdf_path):"""从PDF中提取文本和表格数据:param pdf_path: PDF文件路径:return: 包含…