目录
3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。
5.优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。
6.写个例子展示break、continue、ruturn的区别
1.实现通用打印泛型类,可以打印各个集合中的值,方便调试。
打印泛型类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DJConsoleProject { //自定义工具类 internal class DJUtils { //通用的打印 //必须继承IEnumerable接口的类,满足它才能进行迭代 //泛型方法 public static void println<T>(IEnumerable<T> collection) { foreach (T item in collection) { Console.Write(item+" "); } Console.WriteLine(); } } }
调用:
List<string> nameList = new List<string>(); nameList.Add("陈晨"); nameList.Add("陈川"); DJUtils.println(nameList); //输出:陈晨 陈川 int[] val = { 1, 2, 3 }; DJUtils.println(val); //输出:1 2 3 LinkedList<string> list = new LinkedList<string>(); list.AddFirst("刘备"); list.AddLast("关羽"); list.AddLast("张飞"); DJUtils.println(list); //输出:刘备 关羽 张飞
2.计算遍历目录的耗时。计算耗时的方法(推荐使用Stopwatch):
(1)使用两个DateTime的now方法相减
(2)TimeSpan
TimeSpan
是一个结构体(struct),用于表示时间间隔或持续时间。它可以存储以天、小时、分钟、秒以及毫秒为单位的时间长度。TimeSpan
不代表任何特定时刻,而只表示两个时刻之间的差异。它通常用于计算两个日期或时间点之间的差值,或者用于添加或减去一个时间间隔到某个日期上。(3)Stopwatch
Stopwatch
是一个类,位于System.Diagnostics
命名空间中,用于高精度地测量一小段代码的执行时间。它能够提供比TimeSpan
更精确的测量,因为它使用了操作系统提供的高分辨率性能计数器。Stopwatch
可以启动、停止、重置,并读取经过的时间,这使得它非常适合用于基准测试或性能分析。TimeSpan和Stopwatch的区别:
TimeSpan
是用来表示持续时间的长度,而Stopwatch
是用来测量实际经过的时间,通常用于性能监控。两者结合使用时,你可能会先用Stopwatch
测量一段代码的执行时间,然后将这个时间作为TimeSpan
对象进行存储、显示或进一步的计算。代码实现
- 在这个例子中,
TraverseDirectory
方法会递归地遍历指定目录及其所有子目录。Stopwatch
的Start
和Stop
方法分别在遍历开始和结束时被调用,从而可以准确地测量出整个遍历过程所消耗的时间。using System; using System.Diagnostics; using System.IO; class Program { static void Main() { string path = @"D:"; // 指定要遍历的目录路径 // 创建一个Stopwatch实例 Stopwatch stopwatch = new Stopwatch(); // 开始计时 stopwatch.Start(); // 使用递归方法遍历目录 TraverseDirectory(path); // 停止计时 stopwatch.Stop(); // 输出所花费的时间 Console.WriteLine("耗时:{0}毫秒", stopwatch.ElapsedMilliseconds); } static void TraverseDirectory(string directoryPath) { try { // 获取当前目录中的所有文件 foreach (var file in Directory.GetFiles(directoryPath)) { // 在这里你可以对文件做任何操作 } // 获取当前目录中的所有子目录 foreach (var subDir in Directory.GetDirectories(directoryPath)) { // 递归调用自身以遍历子目录 TraverseDirectory(subDir); } } catch (Exception ex) { // 处理任何可能出现的异常 Console.WriteLine($"无法访问目录 {directoryPath}: {ex.Message}"); } } }
3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。算术运算符
算术运算符用于执行基本的数学运算,具体包括:
+
加法:将两个数值相加。-
减法:从一个数值中减去另一个数值。*
乘法:两个数值相乘。/
除法:一个数值除以另一个数值,如果操作数是整型,结果将向下取整。%
模运算(取余):返回除法的余数。++
自增:将变量的值增加1。可以是前置(++x
)或后置(x++
)。--
自减:将变量的值减少1。同样有前置(--x
)和后置(x--
)形式。关系运算符
关系运算符用于比较两个值,结果为布尔值
true
或false
:
==
等于:检查两个值是否相等。!=
不等于:检查两个值是否不相等。<
小于:检查左边的值是否小于右边的值。>
大于:检查左边的值是否大于右边的值。<=
小于等于:检查左边的值是否小于或等于右边的值。>=
大于等于:检查左边的值是否大于或等于右边的值。逻辑运算符
逻辑运算符用于组合布尔表达式,结果也是布尔值:
&&
逻辑与:如果两个操作数都是true
,结果为true
。||
逻辑或:如果至少有一个操作数为true
,结果为true
。!
逻辑非:反转操作数的布尔值,true
变为false
,反之亦然。位运算符
位运算符用于按位操作整数的二进制表示:
~
按位非:反转一个整数的每一位(0变1,1变0)。&
按位与:当两个对应的二进制位都是1时,结果位为1。|
按位或:当两个对应的二进制位中至少有一个是1时,结果位为1。^
按位异或:当两个对应的二进制位不同时,结果位为1。<<
左移:将一个二进制数的所有位向左移动指定的位数,高位丢失,低位补零。>>
右移:将一个二进制数的所有位向右移动指定的位数,对于无符号数和正数,高位补0;对于负数,高位补1(算术右移)。赋值运算符
赋值运算符用于将一个值赋给变量:
=
简单赋值:将右边的值赋给左边的变量。+=
加法赋值:将左边的变量与右边的值相加,结果再赋给左边的变量。-=
减法赋值:从左边的变量中减去右边的值,结果再赋给左边的变量。*=
乘法赋值:将左边的变量与右边的值相乘,结果再赋给左边的变量。/=
除法赋值:将左边的变量除以右边的值,结果再赋给左边的变量。%=
模运算赋值:左边的变量与右边的值取模,结果再赋给左边的变量。&=
按位与赋值:将左边的变量与右边的值进行按位与操作,结果再赋给左边的变量。|=
按位或赋值:将左边的变量与右边的值进行按位或操作,结果再赋给左边的变量。^=
按位异或赋值:将左边的变量与右边的值进行按位异或操作,结果再赋给左边的变量。<<=
左移赋值:将左边的变量左移右边指定的位数,结果再赋给左边的变量。>>=
右移赋值:将左边的变量右移右边指定的位数,结果再赋给左边的变量。
4.三目表达式举例a>b? a : b
解释:判断a是否大于b,如果a>b,返回a,如果a<=b,则返回b(返回较大的那个数)
int a = 10, b = 20; int max = (a > b) ? a : b; // 如果a大于b,max等于a,否则max等于b Console.WriteLine("The maximum value is: " + max);
5.优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。以下是C#中运算符的优先级列表,从最高到最低排列:
组内运算符
()
表示函数调用或括号表达式的分组。[]
数组索引。.
成员访问。->
结构指针成员访问(主要用于指针)。后缀运算符
++
后置自增。--
后置自减。一元运算符
++
前置自增。--
前置自减。+
一元正号。-
一元负号。!
逻辑非。~
按位非。typeof
类型查询。sizeof
类型大小查询。*
取指针所指内容(解引用)。&
取地址。new
对象或数组实例化。乘除模运算符
*
乘法。/
除法。%
取模。加减运算符
+
加法。-
减法。+
字符串连接(仅字符串)。-
字符串连接的减法运算符重载(一些框架中可用)。位移运算符
<<
左移。>>
右移。比较运算符
<
小于。>
大于。<=
小于等于。>=
大于等于。==
等于。!=
不等于。按位与运算符
&
按位与。按位异或运算符
^
按位异或。按位或运算符
|
按位或。逻辑与运算符
&&
逻辑与(短路与)。逻辑或运算符
||
逻辑或(短路或)。条件运算符(三元运算符)
?:
条件运算符。赋值运算符
=
简单赋值。*=
乘法赋值。/=
除法赋值。%=
取模赋值。+=
加法赋值。-=
减法赋值。<<=
左移赋值。>>=
右移赋值。&=
按位与赋值。^=
按位异或赋值。|=
按位或赋值。逗号运算符
,
逗号运算符,用于序列表达式。注意,在同一优先级水平上的运算符按照从左到右的顺序进行计算,除非另有说明(例如,赋值运算符是从右到左)。使用括号可以显式地改变运算符的优先级,使某些表达式先于其他表达式计算。
6.写个例子展示break、continue、ruturn的区别using System; class Program { static void Main() { // 使用 break 跳出循环 Console.WriteLine("Break example:"); for (int i = 0; i < 10; i++) { if (i == 5) { //当i=5时,跳出循环体,执行循环体之后的下一条语句 break; } Console.Write(i + " "); //输出:0 1 2 3 4 } Console.WriteLine(); // 使用 continue 忽略循环中的当前迭代 Console.WriteLine("Continue example:"); for (int i = 0; i < 10; i++) { if (i % 2 == 0) { //当i为偶数时,跳出当前循环,进行下一轮循环 //也就是说,只在控制台打印出奇数 continue; } Console.Write(i + " "); //输出:1 3 5 7 9 } Console.WriteLine(); // 使用 return 从方法中返回 Console.WriteLine("Return example:"); int result = ReturnExample(); Console.WriteLine("函数的返回值:"+result); //输出:6 } static int ReturnExample() { for (int i = 0; i < 10; i++) { if (i == 3) { //当i=3时,直接结束该方法,且该方法的返回值为6 Console.WriteLine(); return i * 2; // 返回i的两倍作为结果 } Console.Write(i + " "); //输出:0 1 2 } return -1; // 如果没有提前return,则在循环结束后返回-1 } }
7.写个冒泡排序冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素,也就是说该数列已经排序完成。
以下是冒泡排序的具体步骤:
比较相邻的元素:如果第一个比第二个大(升序排序的情况下),就交换它们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的一个关键特性是它是一个稳定的排序算法,这意味着相等的元素保持它们原来的顺序。冒泡排序的时间复杂度在最好情况下为 O(n),当输入数组已经是排序好的时候;在最坏和平均情况下,时间复杂度为 O(n^2)。空间复杂度为 O(1),因为它是一个原地排序算法,不需要额外的存储空间。
//冒泡排序 static void BubbleSort(int[] a) { for(int i = 0; i < a.Length; i++) { bool swaped = false; for(int j = i; j < a.Length; j++) { if (a[j] > a[j+1]) { int tmp = a[j]; a[j] = a[j+1]; a[j + 1] = tmp; swaped = true; } } //如果该遍历过程中没有发生位置交换,说明该数组已经排序完成,可以直接退出循环 if (!swaped) { break; } } } int[] a = { 1, 9, 7, 8, 3, 2, 5, 6, 4, 0 }; BubbleSort(a); for (int i = 0; i < a.Length; i++) { Console.Write(a[i]+" "); //输出:0 1 2 3 4 5 6 7 8 9 }
8.写个九九乘法表代码:
for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) { Console.Write("{0}*{1}={2}\t", j, i, i * j); } Console.WriteLine(); }
输出:
9.实现文件找不到抛出异常using System; using System.IO; class FileCheck { static void Main() { string filePath = @"C:\path\to\your\file.txt"; // 检查文件是否存在 if (!File.Exists(filePath)) { // 文件不存在,抛出FileNotFoundException throw new FileNotFoundException("指定的文件未找到。", filePath); } // 文件存在,继续执行其他操作... Console.WriteLine("文件存在,可以进行后续处理。"); } }