一、简答题
1、简述成员变量和局部变量的区别?
【1】成员变量(字段)在类中、方法外定义;局部变量在方法体内定义(包括形参:接收实参,生命周期为在方法调用的时候)
【2】成员变量随着对象创建而存在,随着对象的消失而消失;局部变量随着方法调用而存在,随着方法的调用完毕而消失
【3】成员变量默认初始化值,默认数值类型为0,引用类型为null;局部变量没有默认初始化值,必须在定义的时候赋值,才能使用,否则会产生编译错误
【4】局部变量和成员变量的名称可以相同,同一个作用域或方法中不能有两个相同的局部变量,在方法中使用时采用就近原则(也就是方法中的变量)
2、假设同一个类中定义了成员变量string name;且方法中定义局域变量string name=2,请问方法体内调用name和this.name分别代表什么意思?
name表示局部变量,this.name表示成员变量
3、请简述在方法中使用return关键词的规则?
【1】return 语句终止当前方法的执行,并将控制权(方法得出的值)返回给调用方(如主方法)
【2】public后加某种数据类型时,return 可以返回值,后面加常量、变量、表达式、方法等;
public 后加void 时,return可以不写,也可以写,但不能写返回值
4、简述引用传参和值传参的概念,说说你对引用传参中ref和out关键词的理解?
【1】引用传递传递的是地址,值传递传递的是内容
【2】ref 参数在传递之前要初始化,out不需要,out 参数在返回时必须赋值,ref 在定义变量的时候要重新赋值
5、简述字段与属性的区别以及this关键词在类中的做作用?
【1】字段:对内(类的内部)
属性:对外;可以做一些过滤(本质上也是一种方法)
二者都属于对象,均可用this 调用
【2】this:字段、属性、方法都可以通过this 的方法在本类中使用
6、访问修饰符是否可以标识局部变量?谈谈访问修饰符public 与 private的使用含义?
访问修饰符不可以标识局部变量
配置信息类才会用静态标识
7、简述你对static关键词的作用和理解?
【1】static 修饰的内容,如:主方法、全局变量、静态方法等;全局变量(public static string name = "学生管理")在本项目的任意地方使用
【2】静态类变量,无需创建对象,可直接通过其类名引用
二、编程题
1、添加学生类(Student)包含字段学号、姓名、年龄、班级名称, 添加学生业务类(StudentBiz)添加一个全局的对象数组。添加AddStudent、删除(DelStudent)、修改(ModifyStudent)、显示学生信息(ShowStudent)。创建测试类(Program)调用以上四种功能方法。
//创建一个学生类
namespace demo9
{
/// <summary>
/// 学生类
/// </summary>
public class Student
{
public int StuNo { get; set; }//学号
public string StuName { get; set; }//年龄
public int StuAge { get; set; }//年龄
public string StuClass { get; set; }//班级
}
}
//创建一个学生业务类
namespace demo9
{
/// <summary>
/// 学生业务类
/// </summary>
public class StudentBiz
{
/// <summary>
/// 用于存放学生的数组
/// </summary>
public Student[] students = new Student[30];//0 1 2 3 .... 29
/// <summary>
/// 添加学生
/// </summary>
/// <param name="stu"></param>
public void AddStudent(Student stu)//包括四个属性
{
for (int i = 0; i < students.Length; i++)
{
if (students[i] == null)
{
students[i] = stu;//保存好之后,跳出(终止)循环
break;
}
}
}
/// <summary>
/// 显示学生信息
/// </summary>
public void ShowStudent()
{
for (int i = 0; i < students.Length; i++)
{
Student stu =students[i];//创建一个学生对象(简写)
//不必每次去数组中寻找,便于打断点
if (stu != null)
{
Console.WriteLine($"学号:{stu.StuNo},姓名:{stu.StuName}," +
$"年龄:{stu.StuAge},班级:{stu.StuClass}");
}
}
}
/// <summary>
/// 根据学号删除学生信息
/// </summary>
/// <param name="stuno"></param>
/// <returns></returns>
public bool DelByStuno(int stuno) //1001
{
bool result = false;//默认删除失败
for (int i = 0; i < students.Length; i++)//循环查找
{
if (students[i] != null)
{
if (students[i].StuNo == stuno)
{
students[i] = null;//由于数组长度不可变
result = true;//删除成功
break;
}
}
}
return result;
}
/// <summary>
/// 修改学生信息
/// </summary>
/// <param name="stu"></param>
public void ModifyStudent(Student stu)//传入的是修改后的信息
{
for (int i = 0; i < students.Length; i++)
{
if (students[i] != null)
{
//判断是否找到
if (students[i].StuNo == stu.StuNo)
{
//替换信息
students[i] = stu;//认为就是此人,将修改后的信息替换过去
break;
}
}
}
}
/// <summary>
/// 根据学生编号查询对应的学生
/// </summary>
/// <param name="stuno"></param>
/// <returns></returns>
public Student GetStuByStuNo(int stuno)
{
Student stu = null;
for (int i = 0; i < students.Length; i++)
{
if (students[i] != null)
{
if (students[i].StuNo == stuno)
{
stu = students[i];//找到该学生后,将这个学生的信息赋给stu这个对象
break;
}
}
}
return stu;
}
}
}
//在main()方法中调用
namespace demo9
{
class Program
{
static void Main(string[] args)
{
StudentBiz studentBiz = new StudentBiz();
//添加
studentBiz.AddStudent(new Student() { StuNo = 1001, StuName = "lily", StuAge = 21, StuClass = "17信管1班" });
studentBiz.AddStudent(new Student() { StuNo = 1002, StuName = "john", StuAge = 19, StuClass = "17信管2班" });
studentBiz.AddStudent(new Student() { StuNo = 1003, StuName = "sharry", StuAge = 23, StuClass = "17信管3班" });
//显示
studentBiz.ShowStudent();
//删除前
Console.WriteLine("删除前:");
studentBiz.ShowStudent();
//删除
bool result = studentBiz.DelByStuno(1002);//1002为实参
if (result)
{
Console.WriteLine("删除成功!");
}
else
{
Console.WriteLine("删除失败!查无此人!");
}
//删除后
Console.WriteLine("删除后:");
studentBiz.ShowStudent();
//修改学号为1003的学生信息
studentBiz.ModifyStudent(new Student() { StuNo = 1003, StuName = "king", StuAge = 23, StuClass = "17信管4班" });
Console.WriteLine("修改后:");
studentBiz.ShowStudent();
//查询某一学生
Student stu = studentBiz.GetStuByStuNo(1001);
Console.WriteLine($"找到了学号为{stu.StuNo}的学生信息:姓名:{stu.StuName},年龄:{stu.StuAge},班级:{stu.StuClass}");
Console.ReadLine();
}
}
}
2、实现银行系统中登录与转账的业务,首先初始化三个账号信息,然后使用其中一个账号登录,实现给另外一位用户转账,转行成功之后显示结果信息。如图所示:
//创建银行信息表
namespace demo9_2
{
/// <summary>
/// 银行卡类
/// </summary>
public class Account
{
/// <summary>
/// 银行账号表
/// </summary>
public string Name { get; set; }//账户姓名
public string AccountNo { get; set; }//账号
public double Money { get; set; }//存款余额
public string Password { get; set; }//密码
public string CardId { get; set; }//身份证号
}
}
//创建ATM服务类
namespace demo9_2
{
/// <summary>
/// ATM机服务类
/// </summary>
public class ATMService
{
Account[] accounts = new Account[3];//在ATM机上创建3个银行账号
/// <summary>
/// 登录人
/// </summary>
Account LoginAccount;//若要使用户登录后能够进行存款、取款、转账等功能,就不能把其放在某一方法中,而是将其提取为成员变量
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
accounts[0] = new Account() { AccountNo = "179708064356", Name = "王丽丽",Money = 1000, Password = "1234", CardId = "210050619890808185" };
accounts[1] = new Account() { AccountNo = "179708064359", Name = "张颖颖",Money = 2000, Password = "4321", CardId = "510010619891231127" };
accounts[2] = new Account() { AccountNo = "179708064368", Name = "刘华",Money = 8000, Password = "4567", CardId = "410207198904051271" };
Show();
int i = 1;//定义登录次数
while(!Login())//Login()的结果为true时不进入,为false时才进入
{
Console.WriteLine($"账号或密码错误{i}次,请重新输入!");
if (i > 3)
{
Console.WriteLine("密码错误3次!请等待10分钟后重新操作!");
return;//Init()方法结束
}
i++;
}
Console.WriteLine("====================================欢迎使用自动银行服务===================================");
Console.WriteLine("1:存款 2:取款 3:转账 4:查询余额 5:退出");
Console.WriteLine("===========================================================================================");
int result = int.Parse(Console.ReadLine());
switch(result)
{
case 3:
Transfer();
break;
default:
Console.WriteLine("银行尚未开通此业务,敬请期待!");
break;
}
}
/// <summary>
/// 登录
/// </summary>
/// <returns></returns>
public bool Login()
{
Console.WriteLine("======================================欢迎进入登陆界面=====================================");
bool result = false;
Console.WriteLine("请输入账号:");
string accountNo = Console.ReadLine();//用户输入的账号
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();//用户输入的密码
for (int i = 0; i < accounts.Length; i++)
{
Account account = accounts[i];
if (account.AccountNo == accountNo && account.Password == password)
{
LoginAccount = account;
result = true;
break;
}
}
return result;
}
/// <summary>
/// 显示
/// </summary>
public void Show()
{
for (int i = 0; i < accounts.Length; i++)
{
Account account = accounts[i];
Console.WriteLine($"账户姓名:{account.Name},账号:{account.AccountNo},存款余额:{account.Money},密码:{account.Password},身份证号:{account.CardId}");
}
}
/// <summary>
/// 转账
/// </summary>
public void Transfer()
{
Console.WriteLine("======================================欢迎进入转账界面=====================================");
Console.WriteLine("请输入收款人账号:");
string accountNo = Console.ReadLine();
Console.WriteLine("请输入收款金额:");
double money = double.Parse(Console.ReadLine());
for (int i = 0; i < accounts.Length; i++)
{
Account account = accounts[i];
if (account.AccountNo == accountNo)
{
account.Money += money;
LoginAccount.Money -= money;
break;
}
}
Show();
}
}
}
//在mian()方法中调用
namespace demo9_2
{
class Program
{
static void Main(string[] args)
{
ATMService service = new ATMService();
service.Init();
Console.ReadLine();
}
}
}