目录
3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。
编辑5.优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。
6.写个例子展示break、continue、return的区别
1.实现通用打印泛型类,可以打印各个集合中的值,方便调试。
实现通用打印泛型类需要满足三个泛型T:泛型类,参数泛型,变量泛型。T并不是一种类型,它仅代表了某种可能的类型。在定义时,T出现的位置可在使用时用任何类型来替换。
DJUtils.cs
namespace DJProject527
{
internal class DJUtils
{
//通用的打印
//必须继承IEnumberable接口的类,满足它才能迭代
static public void println<T>(IEnumerable<T> collection)
{
foreach (T item in collection)
{
Console.Write(item+" ");
}
Console.WriteLine();
}
}
}
调用实例:
以下实例中,数组、链表、队列、栈在存储时都只要一个值,我们自定义的打印泛型类本身就是一个参数,可以直接打印。
using DJProject527;
using System.Collections;
List<string> nameList = new List<string>();//动态数组
nameList.Add("chenchen");
nameList.Add("chenchuan");
DJUtils.println(nameList);
int[] val = { 1, 2, 3 };//静态数组
DJUtils.println(val);
LinkedList<string> list = new LinkedList<string>();//链表
list.AddFirst("刘备");
list.AddLast("关羽");
list.AddLast("张飞");
DJUtils.println(list);
Queue<string> queue = new Queue<string>();//队列
queue.Enqueue("ye");//入队
queue.Enqueue("chen");
queue.Dequeue();//出队,先进先出
string name = queue.Dequeue();
Console.WriteLine("当前出队人员:" + name);
DJUtils.println(queue);
Stack<string> stack = new Stack<string>();//栈
stack.Push("曹操");//进栈or压栈
stack.Push("孙权");
stack.Push("刘备");
string s = stack.Pop();//出栈or弹栈
Console.WriteLine("当前弹出的人员:" + s);
string s2 = stack.Peek();//栈顶元素检索
Console.WriteLine("显示栈顶元素:" + s2);
Console.WriteLine("是否包含:" + stack.Contains("曹操"));//返回一个布尔类型
DJUtils.println(stack);
哈希表包括Hashtable和HashSet两种,对于HashSet这种只存储一个值的可以直接调用打印泛型类,但是对于这种Hashtable和SortedList需要用foreach循环打印键和值。
HashSet<string> hs = new HashSet<string>();
hs.Add("贾宝玉");
hs.Add("林黛玉");
hs.Add("薛宝钗");
hs.Add("薛宝钗");//增加重复元素
//内容值唯一,如果添加相同的值会覆盖
DJUtils.println(hs);
Hashtable ht = new Hashtable();//哈希表
ht.Add("001", "杨");
ht.Add("002", "陈");
ht.Add("003", "叶");
if (!ht.Contains("003"))
{
ht.Add("003", "赵");//key值冲突会报错
}
foreach (string key in ht.Keys)
{
Console.WriteLine("当前元素的键:{0},值={1}", key, ht[key]);
}
Console.WriteLine(ht["002"]);
SortedList sorted = new SortedList();
sorted.Add("002", "陈");
sorted.Add("003", "叶");
sorted.Add("001", "杨");
foreach (string key in sorted.Keys)
{
Console.WriteLine("键:{0},值:{1}", key, sorted[key]);
}
2.计算遍历目录的耗时。
计算总耗时有两种方法:一种是使用Stopwatch类和使用DatTime的差值计算。Stopwatch适用于需要高精度时间测量的场景,如性能测试和调试;而DateTime则更适用于日期和时间的表示、处理以及不需要特别高精度时间测量的场景。在选择使用哪个类时,应根据具体需求和场景进行权衡。
Stopwatch方法计算总耗时:
在Main函数内部Start()作为起始时间,Stop()作为结束时间,最后打印出总耗时。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
//遍历文件目录
class Program
{
static void Main(string[] args)
{
Stopwatch sw =new Stopwatch();
sw.Start();
string rootDirectory = @"D:\";
// 调用函数,并输出结果
var stats = TraverseDirectory(rootDirectory);
// 输出总文件数
Console.WriteLine($"Total files: {stats.TotalFiles}");
// 输出不同类型文件的统计信息
foreach (var kvp in stats.FileTypeCounts)
{
Console.WriteLine($"Extension: {kvp.Key}, Count: {kvp.Value}");
}
sw.Stop();
Console.WriteLine("Stopwatch方法经历的时间:{0}毫秒",sw.ElapsedMilliseconds);
}
static (int TotalFiles, Dictionary<string, int> FileTypeCounts) TraverseDirectory(string root)
{
var totalFiles = 0;
var fileTypeCounts = new Dictionary<string, int>();
// 遍历目录
Traverse(root, ref totalFiles, fileTypeCounts);
return (totalFiles, fileTypeCounts);
}
static void Traverse(string directory, ref int totalFiles, Dictionary<string, int> fileTypeCounts)
{
try
{
// 获取目录中的文件和子目录
string[] directories = Directory.GetDirectories(directory);
string[] files = Directory.GetFiles(directory);
// 遍历文件
foreach (string file in files)
{
totalFiles++;
string extension = Path.GetExtension(file)?.ToLowerInvariant() ?? "";
if (!fileTypeCounts.ContainsKey(extension))
{
fileTypeCounts[extension] = 0;
}
fileTypeCounts[extension]++;
}
// 递归遍历子目录
foreach (string dir in directories)
{
Traverse(dir, ref totalFiles, fileTypeCounts);
}
}
catch (Exception ex)
{
// 捕获并处理异常,例如权限不足
Console.WriteLine($"Error accessing {directory}: {ex.Message}");
}
}
}
3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。
3.1算术运算符
算术运算符用于执行基本的数学运算,如加、减、乘、除等。
运算符 | 描述 | |
---|---|---|
+ | 加法运算符 | 用于两个数相加 |
- | 减法运算符 | 用于两个数相减 |
* | 乘法运算符 | 用于计算两个数的乘积 |
/ | 除法运算符 | 用于两个数相除 |
% | 取模运算符 | 用于计算两个数相除后的余数 |
++ | 自增运算符 | 用于将变量的值加1 |
-- | 自减运算符 | 用于将变量的值减1 |
3.2关系运算符
关系运算符用于比较两个表达式的值,并返回布尔值(true或false)。
运算符 | 描述 |
---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 |
3.3逻辑运算符
逻辑运算符用于根据操作数的布尔值执行逻辑运算。
运算符 | 描述 |
---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
3.4位运算符
位运算符用于对整数的二进制位进行操作。
运算符 | 描述 |
---|---|
& | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 |
| | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 |
^ | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 |
~ | 按位取反运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0,包括符号位。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 |
3.5赋值运算符
赋值运算符用于给变量赋值。
运算符 | 描述 |
---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 |
<<= | 左移且赋值运算符 |
>>= | 右移且赋值运算符 |
&= | 按位与且赋值运算符 |
^= | 按位异或且赋值运算符 |
!= | 按位或且赋值运算符 |
4.三目表达式举例
固定写法:条件表达式?返回为真时的内容:返回为假时的内容。
//比较两个人的年纪
Console.WriteLine("请输入小明的年纪:");
int mingAge = int.Parse(Console.ReadLine());
Console.WriteLine("请输入小红的年纪:");
int hongAge = int.Parse(Console.ReadLine());
string big = mingAge > hongAge ? "小明大" : "小红大";
string deng = mingAge == hongAge ? "小明和小红一样大" : "小明和小红不一样大";
Console.WriteLine(big);
Console.WriteLine(deng);
//判断成绩是否合格
Console.WriteLine("请输入你的考试成绩:");
int price = int.Parse(Console.ReadLine());
string str = price >= 60 ? "成绩合格" : "成绩不合格";
Console.WriteLine(str);
5.优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。
优先级 | 类别 | 运算符 |
---|---|---|
1 | 基本 | (x) . .(x) [x] ++ x-- new typeof sizeof checked unchecked |
2 | 单目 | + - ! ~ ++ -- (T)x |
3 | 乘法与除法 | * / % |
4 | 加法与减法 | + - |
5 | 移位运算 | << >> |
6 | 关系运算 | < <= > >= is |
7 | 条件等 | == != |
8 | 位逻辑与 | & |
6.写个例子展示break、continue、return的区别
- break:用于中断当前循环,中断后直接跳出循环体。
- continue:跳出当前循环体中的剩下部分,但是仍会继续进行下一次循环。
- return:用于结束当前函数(但不会影响到外层函数)的执行,并返回一个值。
-
int[] number = { 1,2,3,4,5,6,7,8,9 }; //break for (int i = 0; i < number.Length; i++) { if (number[i]==5) { break; } Console.Write(number[i]+" "); } Console.WriteLine(); Console.WriteLine("程序结束"); //continue for (int i = 0; i < number.Length; i++) { if (number[i] == 5) { continue; } Console.Write(number[i] + " "); } Console.WriteLine(); Console.WriteLine("程序结束"); //return for (int i = 0; i < number.Length; i++) { if (number[i] == 5) { return; } Console.Write(number[i] + " "); } Console.WriteLine("程序结束"); Console.WriteLine();
7.写个冒泡排序
- 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
//Sort.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DJProject527
{
internal class Sort
{
static public void sort(int[] num)
{
for (int i = 0; i < num.Length - 1; i++)
{
for (int j = 0; j < num.Length - 1 - i; j++)
{
if (num[j] > num[j + 1])
{
int temp;
temp = num[j + 1];
num[j + 1] = num[j];
num[j] = temp;
}
}
}
}
static public void println(int[] num)
{
for (int i = 0; i < num.Length; i++)
{
Console.Write(num[i] + " ");
}
}
}
}
//Program.cs
using DJProject527;
int[] num = { 4,2,5,8,1,3,9 };
Sort.sort(num);
Sort.println(num);
//输出结果为:1 2 3 4 5 8 9
8.写个九九乘法表
for (int i=1;i<=9;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 Program
{
static void Main()
{
try
{
// 尝试打开一个不存在的文件
string filePath = @"C:\file.txt";
using (StreamReader reader = new StreamReader(filePath))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
catch (FileNotFoundException ex)
{
// 捕获FileNotFoundException异常
Console.WriteLine($"文件未找到: {ex.Message}");
// 这里可以添加额外的错误处理逻辑
}
catch (Exception ex)
{
// 捕获其他类型的异常
Console.WriteLine($"发生了一个错误: {ex.Message}");
}
}
}