admin 管理员组文章数量: 887174
2024年2月18日发(作者:微软泄露源码下载)
====Word行业资料分享--可编辑版本--双击可删====
(一)题型与分值分布
1、填空题(10小题,10分)
2、选择题(12小题,24分)
3、判断题(10小题,10分)
4、问答与分析题(6小题,28分)
5、程序填空题(4小题,18分)
6、程序设计题(1小题,10分)
(二)知识要点
一、C#基础知识
1、C#源文件的扩展名为cs,C#的编译器为csc。
2、C#的数据类型分为两大类:值类型和引用类型。
3、小数类型:double、float、decimal类型。
【例1】 在C#编制的财务程序中,需要创建一个存储流动资金金额的变量theMoney,则应该将该变量定义为__decimal__类型。
4、整数相除的结果为整数,小数相除的结果为小数。
【例2】已知某专业有x名男生,每间宿舍住y个人,使用c#表达式__(x + y - 1) / y_可以用于计算宿舍总数。
【例3】假设变量a、b、c为大于1的整数,则代数式1对应的c#表达式为 _____________1.0 /
abc(a * b * c)。
5、假设有两个整型数x和 y,则表达式 (x ^ y) ^ y值还原为x 。
6、将一个数左移N位相当于将一个数乘以2的n次方。
【例4】1<<8的结果为______256______。
7、基本数据类型的转换:隐式转换、强制转换、数据类型的自动提升。
【例5】设有如下变量说明: ( B )
byte myByte;
int myInt;
long myLong;
float myFloat;
以下赋值语句哪个需要强制转换。
A.myInt = myByte;
B.myInt = myLong;
C.myByte = 3;
D.myFloat = myLong;
【例6】以下代码的输出结果为: ( B )
int a = 3;
ine(" " + 2 + a); // 23
ine(2 + a); // 5
ine(2 + a + ""); // 5
ine(2 + "" + a); // 23
A.第2行出现编译错误
B.输出 23, 5, 5 和23.
C.输出5, 5, 5 和23.
D.输出 5, 5, 23 和23.
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
8、流程控制:if、switch、while、for、break、continue等语句。
【例7】设有如下代码段,当变量x的取值为__2 或3___能使程序输出"Two" 。
switch ( x ){
case 1: ("One");break;
case 2:
case 3: "Two");break;
default: ("end");
}
【例8】以下程序的运行结果为 ( C )
int i,j,k;
for (i = 0; i < 3; i++) // i的范围: 0, 1, 2
for(j=1; j < 4; j++) // j的范围: 1, 2, 3
for(k=2; k<5; k++) // k的范围: 2, 3, 4
if((i == j) && (j==k)) // i = j = k, only 2
ine(i);
A. 0 B. 1 C. 2 D. 3
9、参数传递:
(1) 参数类型为int、double等基本数据类型时,实参与形参之间进行的是值传递。形参的变化不对实参造成影响。
【例9】请分析下面程序的输出结果
class Invoke
{
void Change(int x)
{
x = 3;
}
public static void Main(String[] args)
{
int x = 5;
Invoke e1 = new Invoke();
(x);
ine(x);
}
}
输出:5
(2) 当参数类型为数组,或者对象类型时,实参和形参之间进行地址传递。实参随着形参的变化而变化。
【例10】请分析下面程序的输出结果
class Invoke
{
int x;
void Change(Invoke obj)
{
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
obj.x = 3;
}
public static void Main(String[] args)
{
Invoke e1 = new Invoke();
e1.x = 5;
(e1);
ine(e1.x);
}
}
输出: 3
(3)当参数为基本数据类型时,要使用关键字ref才能实现地址传递。
【例11】请分析下面程序的输出结果
class Test
{
public static void Main(String [] args)
{
int x = 8;
Change(ref x);
ine(x);
}
static void Change(ref int x){
x += 2;
}
}
输出:10
(4)输出型参数(out)用来从函数中返回结果。
10、方法重载指的是,一个类中允许出现多个同名的方法,只要参数个数或参数类型不同,编译器就认为这是两个不同的方法。
【例12】类Test1定义如下:
public class Test1
{
public float aMethod(float a,float b){ return 1; }
//here
}
将以下哪条语句插入here处将出现编译错误( B )
A.public float aMethod(float a, float b,float c){ return 1;}
B.public int aMethod(float a,float b){return 1; }
C.public int aMethod(int a, int b){ return 1; }
D.private float aMethod(int a,int b,int c){ return 1; }
11、字符编码
(1)C#中使用Unicode编码表示字符。
(2)在windows中文操作系统中,使用GBK/GB2312表示字符。
【例13】判断题:在windows中文操作系统中,创建的文本文件采用的默认的编码方案为Unicode。错,是GBK/GB2312
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
二、面向对象程序设计
1、面向对象的基本概念。
【例1】请举例说明面向对象和面向过程思维方式的区别。
面向过程编程先确定算法,再确定数据结构。
面向对象编程先确定数据结构,再确定运算。
S矩算法。2.编写一个计算S矩额方法。3.求面积方法需要两个参数(矩形的长和宽)
面向对象:1.一个矩形可看成一个对象。2.一个矩形有两属性(长宽)和一个行为(求面积)。3.将所有矩形的共性抽取出来设一个矩形类。4.通过矩形对象行为就可以求出某个具体的矩形对象的面积。
【例2】在定义一个类的时候,良好的软件工程的做法是:将成员变量定义为private,被封装的变量通过public的setter和getter取得和设置。请简述原因。
1.可以对赋值进行合法性检查。
2.可以在用户使用格式和私有变量存储格式之间进行转换。
3.当数据的存储格式发生变化时,只需要改动get和set方法中的代码,其余代码不受影响。
4.控制变量的读写权限。
2、Object类是所有类的父类。
3、构造方法:(1)创建对象时被自动调用;(2)与类同名,不具有返回类型;(3)一旦编译器重载了构造方法后,不再自动生成不带参数的构造方法。
4、this关键字:一般用于构造函数,实例方法和实例访问器中访问成员。
5、base关键字:(1)使用base关键字引用父类的成员;(2)还可以通过base(参数列表)引用父类的构造方法。
6、 sealed关键字:(1)sealed类不能被继承;(2)sealed方法不能被重写。
【例3】判断题:在C#中,可以使用sealed关键字修饰抽象类。错,sealed不能被继承,抽象类就是用来被继承的
7、 virtual关键字:定义的方法可以被子类重写。对
8、 abstract关键字:定义的方法为抽象方法;定义的类为抽象类。对
9、 interface关键字:在C#中通过接口的定义实现多继承。对
10、引用类型转换:(1)子类对象可以当成父类对象使用;(2)父类对象只有经过强制转换后才能赋值给子类引用变量;(3)不能通过父类的引用访问子类对象新增加的成员。
【例4】设有如下类定义:
class A : Object
{
public string name = "A";
public void Sleep()
{
ine("I am a " + name);
}
}
class B : A
{
public static void Main(string[] args)
{
//here
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
}
}
以下哪段代码可以位于here处 ( C )
A. Object a = new A(); ();
B.B b = new A(); ();
C. A c = new B(); ();
D.Object b = new B(); ();
11、动态绑定。
【例5】请分析下面程序的输出结果。
using System;
class A
{
public virtual void Func1() { ine("A:Func1() is calling"); }
}
class B : A
{
public override void Func1() { ine("B:Func1() is calling"); }
public void Func2() { ine("B:Func2() is calling"); }
}
class C
{
public static void CallA(A a)
{
if (a is B)
{
B b = (B)a; 1(); 2();
}
else
{
1();
}
}
public static void Main(string[] args)
{
A a = new A();
CallA(a);
ine(a is A);
}
}
输出: A:Func1() is calling
True
请思考:将语句A a = new A()改成A a = new B() 或B a = new B(),对应的输出结果为多少?
当 A a = new A()改成A a = new B() 或B a = new B()
输出: B:Func1() is calling
B:Func2() is calling
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
True
12、异常处理机制: try语句块中包含可能发生异常的代码,catch语句块中包含异常发生时的处理代码,finally语句块中的代码在有无异常的时候都会执行。
【例6】当参数为4和0时,以下程序的执行结果为 ( A )
public static void divide(int a, int b) {
try {
int c = a / b;
} catch (Exception e) {
("Exception ");
return;
} finally {
("Finally");
}
}
A. 输出 Exception Finally B. 输出 Finally
C. 输出 Exception D. 无输出
【例7】下列代码中,哪些行将产生空指针异常。 ( A )
1 string s = null;
2 if ( s != null || > 0)
3 ine("s != null || > 0");
4 if ( s != null | > 0)
5 ine("s != null | > 0");
6 if ( s != null & > 0)
7 ine("s != null & > 0");
8 if ( s != null && > 0)
ine("s != null && > 0");
A.2 4 6 B.2 4 6 8
C.4 6 8 D.2 6 8
13、单例设计模式:饿汉式和懒汉式。在单例设计模式中,懒汉式的代码可能会引发线程不同步的问题。
三、windows窗体设计
1、委托的定义及使用。
委托是一种数据结构,它提供类似C++语言中函数指针功能,委托可指静态方法和对象实例方法。它是完全的面向对象且使用完全类型,程序员可利用委托在执行时期传入方法名称,动态决定调用的方法。
delegate类型的处理函数,并在此函数末。4.创建实例,传入准备调用的方法名。
2、C#使用____委托_____机制实现事件处理。
3、计时器控件。
【例1】在一个窗体应用程序中,需要在一分钟内自动浏览完文件夹中的60张图片,则需要设置计时器控件的Interval属性的值为 ( D )
A.10 B.600 C.100 D.1000
【例2】设有命令按钮btnText的单击事件代码如下,其中openFileDialog1为“打开文件对话框”对象,txtText为文本框对象。请阅读代码,并回答以下问题:(1)请简述该段代码的功能(2)请指出该段代码在执行过程中可能出现的问题,并给出解决办法。
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
private void btnText_Click(object sender, EventArgs e)
{
lDirectory = "c:";
= "文本文件 (*.txt)|*.txt ";
= "打开文本文件";
if (alog() == )
{
= lText(me);
}
}
(1) 功能:通过“打开文件”对话框openFileDialog选择文本文件,并将文本文件的内容显示在txtText文本框中。
(2) 中文乱码问题。
Pvivate viod Fotml_Load(onject sdender, EvenArgs e)
{
//设置文本框为多行文本
ine=true;
//为文本框添加垂直滚动条
Bars=al;
}
Private void btnText_Click(object rgs e)
{
Diretory=”c:”;
=”文本文件
(*.txt)|*.txt|全部文件(*.*)|*.*”
=”打开文本文件”;
if(alog()==)
{
=lText(me,
oding(“GBK”));
//在中文windows操作系统中等价于
t
=lText(me,t);
}
}
四、数据库连接
1、在框架中,通过创建Connection对象建立与数据源之间的连接,通过创建Command对数据源执行各种SQL命令。
【例1】判断题:在框架中,连接SQL Server2005数据库与连接SQL Server Express2005数据库采用的连接符串不同。对
2、当只需要顺序读取数据库中的数据而不需要其他操作时,建议使用DataReader对象。
3、MD5算法。
思考:如何使用后台数据库中的userInfo(userName,userPass)表实现用户的登录与注册?其中,源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
userPass字段中存放的是由MD5算法加密后的用户密码。
/*使用MD5加密字符串的方法*/
public static string GetMd5Str(string myString)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] fromData = es(myString);
byte[] toData = eHash(fromData);
string byteStr = null;
for (int i = 0; i < ; i++)
{
byteStr += toData[i].ToString("x");
}
return byteStr;
}
/* btnAdd_Click 方法实现用户信息的注册*/
private void btnAdd_Click(object sender, EventArgs e)
{
string userName = ();
string userPass = ();
string conStr = "server=.;database = studentcourse;integrated security = True";
SqlConnection sqlCon = new SqlConnection(conStr);
();
SqlCommand checkCmd = Command();
dText = "select * from userInfo where userName = @un ";
hValue("un", userName);
SqlDataReader reader = eReader();
if (())
{
("用户名已经存在");
}
else
{
e();
string sqlStr = "insert into userInfo(userName,userPass)values(@un,@pd)";
SqlCommand sqlCommand = new SqlCommand(sqlStr, sqlCon);
hValue("un", userName);
hValue("pd", GetMd5Str(userPass));
eNonQuery();
("添加成功", "提示");
}
();
}
/* btnOK_Click 方法实现用户的登录/
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
private void btnOK_Click(object sender, EventArgs e)
{
string conStr = "server=.;database = studentcourse;integrated security = True";
SqlConnection sqlCon = new SqlConnection(conStr);
();
string sqlStr = "select userName,userPass from userInfo where userName = @userName";
SqlCommand sqlCommand = new SqlCommand(sqlStr, sqlCon);
hValue("@userName", ());
SqlDataReader reader = eReader();
if (!())
{
("用户名不存在!", "错误");
}
else if (reader["userPass"].ToString().Trim() == GetMd5Str(()))
{
("登录成功", "正确");
}
else
{
("密码错误", "错误");
}
();
}
4、SQL语句的注入攻击。
【例2】请举例说明什么是SQL语句注入攻击?试给出一种预防注入攻击的方法。
答:假设使用如下SQL语句查找给定学号的学生信息,
String s = “select * from student where sno=’” + sno + “’”;
Sno代表用户输入的学号。如果输入的是字符串:’ or ‘1’ =’
那么,执行该语句,将返回student表中的所有的学生信息。即该语句存在SQL语句的注入攻击。
可以采用传入参数的方式预防注入攻击,对应的代码改成:
string sqlStr = "select sno,sname from student where sno = @snoPar";
SqlCommand command = new SqlCommand(sqlStr, sqlCon);
ters. AddWithValue ("@snoPar",sno);
此时,当用户输入字符串:’ or ‘1’ =’ , 上述代码将在student表中查找学号为“:’ or ‘1’ =’”的学生信息,返回结果为空,即预防了上述的注入攻击。
4、数据库系统设计的三层架构:表示层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
【例3】用.net做C/S或者B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
三层。表示层UI:为用户提供交互界面。业务逻辑层BLL:负责关键业务的处理和数据传递。数据访问层DAL:负责数据库数据的访问。业务实体 Model :在各层中传递实体。通用类库Common:通用辅助类,如数据校验、数据加密、缓存处理等。
分层的优点:易于项目的扩展和修改。 易于代码的复用。易于分工协作。
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
(三)程序设计题
1、请编写一个实现闰年测试的代码。闰年为能被4整除却不能被100整除,或能被400整除的年份。
public static bool isLeapYear(int year)
{
Return (year % 4 == 0 && year % 100 != 0 || year % 400 = 0)
}
2、请编写方法,实现一个长整数各位数之和的计算。
public static int sum(long num)
{
int sum = 0;
while (num)
{
sum += num % 10;
num /= 10;
}
return sum;
}
3、请编写一个计算两数最大公约数的方法。
【参考代码】使用递归。
public static int F(int a, int b)
{
int c = a % b;
if (c != 0)
{
return F(b, c);
}
else
{
return b;
}
}
4、找出1~100之间能被2整除的数,并将这些数以每行6个的格式输出。
【参考代码】
int count = 0;
for(int i=1; i<=100; i++)
{
if (i % 2 ==0)
{
(i + "t");
count ++;
if (count % 6 == 0)
ine();
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
}
}
5、编程实现循环打印输出0-19之间的整数。
【参考代码】
using System;
using ing;
class Program
{
static void Main(string[] a1)
{
int i = 0;
ine(i);
while (true)
{
i = (i + 1) % 20;
ine(i);
(500); //设置时间间隔为秒
}
}
}
6、请编写一个方法,对小数进行四舍五入的计算。
【参考代码】
public static int Func(double a)
{
int b = (int)a;
if ((a-b) >= 0.5)
{
if (a > 0.0)
b++;
else
b--;
}
return b;
}
7、请编写一个实现通用函数定积分计算的方法。
【参考代码】
class Integral
{
public delegate double IntegralDelegate(double x);
public static double GetIntegral(double a, double b, IntegralDelegate f)
{
const int section = 1000;
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
double increment = (b - a) / 1000;
double area = 0.0;
for (int i = 0; i <= section; i++)
{
area = area + f(a + increment * i) * increment;
}
return area;
}
}
8、请编写一个通用排序的方法。
【参考代码】
public class BubbleSorter
{
public delegate bool CompareOperation(object objPrev, object objNext);
static public void Sort(Object[] objArr, CompareOperation sortOp)
{
bool flag = false; //交换标志
for (int i = 1; i < ; i++)
{
flag = false;
for (int j = - 1; j >= i; j--)
{
if (sortOp(objArr[j], objArr[j - 1]))
{
object tmpObj = objArr[j];
objArr[j] = objArr[j - 1];
objArr[j - 1] = tmpObj;
flag = true;
}
}
if (!flag) //如果没有发生交换,终止算法
return;
}
}
}
9、请编程实现随机生成1000个0-99之间的整数,并完成每个整数出现的次数的统计。
【参考代码】
static void Main(string[] args)
{
int[] numbers = new int[1000];
Random rand = new Random();
for (int i = 0; i < ; i++)
{
numbers[i] = (100);
}
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
int[] counts = new int[100];
foreach (int n in numbers)
{
++counts[n];
}
for (int i = 0; i < ; i++)
{
ine("数字{0}出现了{1}次", i, counts[i]);
}
y();
}
10、下面代码实现将十进制的整数转换为对应的二进制数串。
【参考代码】
static string ConvertIntToBinary(int n)
{
string binary = ;
int i = n;
int m = 0;
while (i > 1)
{
i = n / 2;
m = n % 2;
binary = ng() + binary;
n = i;
}
if (i > 0) binary = "1" + binary;
return binary;
}
11、请编写一个方法,求两个整数的之和,要求在方法体内不得使用+、-、×、÷。
【参考代码】
static int AddWithoutArithmetic(int num1, int num2)
{
if (num2 == 0)
return num1;
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
return AddWithoutArithmetic(sum, carry);
}
12、假设某公司有几千名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。
【参考代码】该方法用长度为60的整数数组timesOfAge辅助空间,换来了O(n)的时间效率。不论对多少人的年龄进行排序,辅助数组的长度timesOfAge的大小固定,因此它的空间复杂度是个常数,源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
即O(1)。
void SortAges(int []ages)
{
const int oldestAge = 59;
int [] timesOfAge = new int[oldestAge + 1];
//数组timesOfAge统计每个年龄出现的次数
for(int i = 0; i <= oldestAge; i++)
timesOfAge[i] = 0;
for(int i = 0; i < ; i++)
{
int age = ages[i];
++timesOfAge[age];
}
int index = 0;
for(int i = 0; i <= oldestAge; ++ i)
{
for(int j = 0; j < timesOfAge[i]; ++ j)
{
ages[index] = i;
++ index;
}
}
}
13、多态性的应用。
例如:方法重载类
public class MathMtics
{
public int Max(int x, int y)//求两个整数的较大值
{if(x>y)
return x;
else
return y;
}
public char Max(char x,char y)//求两个字符的较大值
{
If(x>y)
return x;
else
return y
}
};
源-于-网-络-收-集
版权声明:本文标题:福建农林大学C#程序设计总复习材料 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1708234720h517156.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论