c#第五次作业

目录

1. 实现通用打印泛型类,可以打印各个集合中的值,方便调试

2. 计算遍历目录的耗时

3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符

1)算术运算符

2)关系运算符

3)逻辑与运算符

4)位运算符

5)赋值运算符

4. 三目表达式举例

5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件

6. 写个例子展示break、continue、ruturn的区别

7. 写个冒泡排序

8. 写个九九乘法表

9. 实现文件找不到抛出异常


1. 实现通用打印泛型类,可以打印各个集合中的值,方便调试

        在C#中,实现一个通用的打印泛型类,用于打印各种集合中的值,是一个很好的调试辅助工具。我在 DJUtils 类中定义了一个静态泛型方法 println<T>,该方法旨在遍历并打印实现了 IEnumerable<T> 接口的集合中的每个元素。

  • println<T> 是一个泛型方法,它使用泛型类型参数 T。这意味着这个方法可以处理任何实现了 IEnumerable<T> 接口的集合,无论集合中元素的类型是什么。
  • 方法接受一个类型为 IEnumerable<T> 的参数 CollectionIEnumerable<T> 是一个接口,表示一个可以逐个遍历其成员的集合。通过实现这个接口,集合类型(如List<T>、Array等)提供了遍历其元素的能力。
  • 方法体内部,使用了一个 foreach 循环来遍历集合中的每个元素。对于集合中的每个元素(类型为 T),它都会将该元素转换为字符串(通过 item + " "),并写入到控制台

DJUtils.cs

namespace DJConsoleProject
{//自定义工具类class DJUtils{//通用的打印//必须继承IEnumerable接口的类,满足它才能进行迭代//泛型方法static public void println<T>(IEnumerable<T> Collection){foreach (T item in Collection){Console.Write(item + " ");}Console.WriteLine();}}
}

Program.cs

//动态数组
List<string> nameList = new List<string>();
nameList.Add("陈晨");
nameList.Add("陈川");
DJUtils.println(nameList);
//链表
LinkedList<string> list = new LinkedList<string>();
list.AddFirst("刘备");
list.AddLast("关羽");
list.AddLast("张飞");
DJUtils.println(list);

2. 计算遍历目录的耗时

        这个使用了Stopwatch类来测量时间,这是.NET中用于高精度时间测量的类。

        在遍历开始前,我们启动了Stopwatch实例来记录时间。遍历完成后,我们停止Stopwatch并输出遍历整个目录结构所花费的时间(以毫秒为单位)。

class Program
{static void Main(string[] args){string directoryPath = @"C:\Users\Acer\source\repos\DJConsoleProject";Stopwatch sw = Stopwatch.StartNew();sw.Start();// 调用递归函数开始遍历  TraverseDirectory(directoryPath);sw.Stop();Console.ReadKey();Console.WriteLine("总耗时:{0}毫秒",sw.ElapsedMilliseconds);}// 递归遍历目录  static void TraverseDirectory(string path){try{// 获取指定目录下的所有文件和子目录  string[] files = Directory.GetFiles(path);string[] dirs = Directory.GetDirectories(path);// 遍历文件  foreach (var file in files){FileInfo fileInfo = new FileInfo(file);Console.WriteLine($"文件名: {fileInfo.Name}, 扩展名: {fileInfo.Extension}, 文件大小: {fileInfo.Length} 字节");}// 遍历子目录  foreach (var dir in dirs){Console.WriteLine($"进入目录: {dir}");TraverseDirectory(dir); // 递归调用  Console.WriteLine($"离开目录: {dir}");}}catch (UnauthorizedAccessException){Console.WriteLine($"无法访问目录 {path},权限不足。");}catch (Exception ex){Console.WriteLine($"遍历目录时发生错误: {ex.Message}");}}
}

结果如图:

3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符

1)算术运算符

算术运算符用于执行基本的数学运算,如加、减、乘、除等。

运算符描述示例
+加法int a = 5; int b = 3; int c = a + b; // c = 8
-减法int a = 5; int b = 3; int c = a - b; // c = 2
*乘法int a = 5; int b = 3; int c = a * b; // c = 15
/除法int a = 10; int b = 2; int c = a / b; // c = 5
%取余int a = 10; int b = 3; int c = a % b; // c = 1
2)关系运算符

关系运算符用于比较两个值,并返回一个布尔值(true 或 false)。

运算符描述示例
==等于int a = 10; int b = 10; bool c = a == b; // c = true
!=不等于int a = 10; int b = 5; bool c = a != b; // c = true
<小于int a = 5; int b = 10; bool c = a < b; // c = true
<=小于或等于int a = 5; int b = 5; bool c = a <= b; // c = true
>大于int a = 10; int b = 5; bool c = a > b; // c = true
>=大于或等于int a = 10; int b = 10; bool c = a >= b; // c = true
3)逻辑运算符

逻辑运算符用于根据一个或多个条件的布尔值来执行复杂的逻辑运算。

运算符描述示例
&&逻辑与bool a = true; bool b = false; bool c = a && b; // c = false
||逻辑或bool a = true; bool b = false; bool c = a || b; // c = true
!逻辑非bool a = false; bool b = !a; // b = true
//逻辑运算符
//逻辑与,当两个条件都为真,结果为真
Console.WriteLine(true && true);
Console.WriteLine(true && false);
Console.WriteLine(false && true);
Console.WriteLine(false && false);
Console.WriteLine();
//逻辑或,有一个条件为真,结果为真
Console.WriteLine(true || true);
Console.WriteLine(true || false);
Console.WriteLine(false || true);
Console.WriteLine(false || false);
4)位运算符

位运算符在整数类型上操作,按位执行运算。

运算符描述示例
~位逻辑非int a = 5; int b = ~a; // b = -6
&位逻辑与int a = 5; int b = 3; int c = a & b; // c = 1
|位逻辑或int a = 5; int b = 3; int c = a | b; // c = 7
^位逻辑异或int a = 5; int b = 3; int c = a ^ b; // c = 6
<<位左移int a = 5; int b = a << 2; // b = 20
>>位右移int a = 8; int b = a >> 2; // b = 2
//左移性能高,左移一位,等价*2
int num = 1;
int times = 10000*10000; //编译器优化,编译后直接使用计算结果
//打印执行的时间,stopwatch
Stopwatch sw = new Stopwatch();
sw.Start(); //计时开始
for (int i = 0; i < times; i++)
{num *= 2;
}
sw.Stop(); //计时结束
Console.WriteLine("耗时:{0}毫秒",sw.ElapsedMilliseconds);
sw.Restart(); //重置
sw.Start ();
for (int i = 0; i < times; i++)
{num <<= 1; //左移一位,等价*2
}
sw.Stop ();
Console.WriteLine("耗时:{0}毫秒", sw.ElapsedMilliseconds);
5)赋值运算符

赋值运算符用于给变量赋值。C# 还支持复合赋值运算符,它们结合了算术、位或逻辑运算符与赋值操作。

运算符描述示例
=赋值int a; a = 5; // a = 5
+=加后赋值int a = 5; a += 3; // a = 8
-=减后赋值int a = 5; a -= 3; // a = 2
*=乘后赋值int a = 5; a *= 3; 

4. 三目表达式举例

        C# 中的三目表达式(也称为条件运算符)是一种简洁的编写条件判断语句的方式。它的基本形式是 条件 ? 表达式1 : 表达式2。如果条件为真(非零或非空),则计算并返回表达式1的结果;如果条件为假(零或空),则计算并返回表达式2的结果。

我们写一个三目表达式用于比较两个整数 a 和 b 的大小,并将较大的数赋值给变量 max:

class Program
{static void Main(){int a = 10;int b = 20;// 使用三目表达式比较a和b,将较大的值赋给变量max  int max = a > b ? a : b;Console.WriteLine($"较大的数是: {max}");}
}

5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件

        在C#(以及大多数编程语言)中,运算符的优先级遵循一定的规则,这些规则通常基于数学和逻辑运算的常规顺序。

下面是一个简化的表格,展示了C#中一些运算符的优先级(从高到低):

优先级运算符类别示例
1括号(a + b) * c
2成员访问、数组索引、方法调用、后置递增/递减obj.Method()arr[index]x++x--
3前置递增/递减、一元运算符(包括逻辑非!、按位非~、正号+、负号-等)++x--x!flag~bitMask+value-value
4乘除、取余、类型转换a * ba / ba % b(int)value
5加减、字符串连接a + b"Hello " + "World"
6位移a << ba >> b
7关系比较a > ba < ba == ba != b
8等号运算符a = b
9位逻辑与a & b
10位逻辑异或a ^ b
11位逻辑或a | b
12逻辑与a && b
13逻辑或a || b
14条件运算符a ? b : c
15赋值运算符a = ba += b

此外,当运算符具有相同优先级时,它们的操作顺序是从左到右(除了赋值运算符,它是从右到左的,但通常与表达式中的其他元素一起评估时,这种差异不会直接影响结果)。在存在疑问的情况下,可以使用括号来明确指定运算的顺序。

6. 写个例子展示break、continue、ruturn的区别

        在C#中,breakcontinuereturn是控制流语句,用于在循环或方法体中改变正常的执行流程。

  1. break:用于立即退出包含它的最内层循环或switch语句。

  2. continue:用于跳过当前迭代中剩余的语句,并继续下一次迭代(如果有的话)。

  3. return:用于从当前方法中返回,并将控制权交还给方法的调用者。return可以返回一个值给调用者(如果方法签名声明了返回类型),或者在没有返回值的情况下(如void方法)用于退出方法。

下面通过一个例子来展示它们之间的区别。

using System;  class Program  
{  static void Main(string[] args)  {  // 演示break、continue和return  Console.WriteLine("演示break、continue和return:");  // 假设我们要遍历一个数组,并根据条件执行不同的控制流语句  int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  // 使用for循环遍历数组  for (int i = 0; i < numbers.Length; i++)  {  if (numbers[i] == 5)  {  // 当元素为5时,使用break退出循环  Console.WriteLine($"遇到5,使用break退出循环。当前元素:{numbers[i]}");  break;  }  else if (numbers[i] % 2 == 0)  {  // 当元素为偶数时,使用continue跳过当前迭代  Console.WriteLine($"跳过偶数:{numbers[i]}");  continue;  }  // 否则,打印当前元素  Console.WriteLine($"处理元素:{numbers[i]}");  // 注意:这里不会执行到return,因为return用于从方法中返回  // 但为了演示,我们可以假设有一个条件会在某个点触发return  if (numbers[i] == 10)  {// 在Main中不能直接return,除非返回类型为void或特定类型并返回相应值  // return; // 但为了说明return的概念,我们可以调用一个返回的方法  ReturnDemo();  }  }  // 演示从方法中返回  Console.WriteLine("调用ReturnDemo()后继续执行。");  }  // 一个演示return的方法  static void ReturnDemo()  {  // 注意:由于这个方法是void类型,所以我们只能使用return来退出方法,而不返回任何值  Console.WriteLine("从ReturnDemo()中返回,但不退出Main方法。");  // return; // 实际上这个return是隐式的,因为方法已经执行完毕  }  
}

7. 写个冒泡排序

        冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这意味着数列已经排序完成。

冒泡排序的时间复杂度:O(n^2),其中n是数组的长度

冒泡排序的空间复杂度:O(1)

进行两层嵌套的循环遍历数组,外层循环控制排序的总轮数,内层循环负责在每一轮中进行实际的元素比较和交换。

using System;  class Program  
{  static void Main(string[] args)  {  int[] arr = { 64, 34, 25, 12, 22, 11, 90 };  int n = arr.Length;  Console.WriteLine("原始数组:");  PrintArray(arr);  BubbleSort(arr);  Console.WriteLine("\n排序后的数组:");  PrintArray(arr);  }  // 冒泡排序函数  static void BubbleSort(int[] arr)  {  int n = arr.Length;  for (int i = 0; i < n-1; i++)  {  for (int j = 0; j < n-i-1; j++)  {  if (arr[j] > arr[j+1])  {  // 交换 arr[j] 和 arr[j+1]  int temp = arr[j];  arr[j] = arr[j+1];  arr[j+1] = temp;  }  }  }  }  // 打印数组函数  static void PrintArray(int[] arr)  {  foreach (int num in arr)  {  Console.Write(num + " ");  }  Console.WriteLine();  }  
}

结果如图:

8. 写个九九乘法表

写九九乘法表,我们使用了两个for循环:

  • 外层循环(由变量i控制)遍历从1到9的每个数字,代表乘法表的每一行。
  • 内层循环(由变量j控制)遍历从1到当前外层循环的索引i的每个数字,代表当前行中的每一列。这样做可以确保每一行的列数与行号相匹配(即第一行有1列,第二行有2列,依此类推)。
 static void Main(){for (int i = 1; i <= 9; i++){for (int j = 1; j <= i; j++){int a = i * j;//Console.Write("{0} * {1} = {2}\t", i, j, a);Console.Write($"{i} * {j} = {i * j} ");}Console.WriteLine();}}

结果如图:

9. 实现文件找不到抛出异常

         在C#中,当访问到一个不存在的文件时,并不需要手动“抛出”FileNotFoundException异常,因为这个异常是由.NET Framework在底层自动抛出的。但是,可以通过编写代码来“触发”这个异常的发生,并在上层捕获并处理它。

        我们使用File.Open方法打开一个指定的文件。由于这个文件不存在,因此File.Open将抛出FileNotFoundException异常。我们通过try-catch块来捕获这个异常,并在捕获到它时打印出一条错误消息。这样,即使文件不存在,我们的程序也不会崩溃,而是会优雅地处理这个错误情况。

class Program
{static void Main(string[] args){// 假设我们要访问的文件路径  string filePath = @"C:\ddd.txt";try{// 尝试打开文件  using (FileStream fs = File.Open(filePath, FileMode.Open)){Console.WriteLine("文件成功打开");}}catch (FileNotFoundException ex){// 如果文件不存在,将捕获FileNotFoundException异常  Console.WriteLine($"文件未找到:{ex.Message}");// 这里可以添加更多处理异常的逻辑  }catch (Exception ex){// 捕获其他类型的异常  Console.WriteLine($"发生错误:{ex.Message}");}Console.ReadKey();}
}

结果如图:

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

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

相关文章

电商数据仓库

目录 1.数据仓库的数据来源为业务数据库&#xff08;mysql&#xff09; 初始化脚本 2.通过sqoop将mysql中的业务数据导入到大数据平台&#xff08;hive&#xff09; 在hive中建立映射的数据库 导入数据 3.通过hive进行数据计算和数据分析 形成数据报表 补全用户信息表中的…

【密码学】流密码的基本概念

在介绍流密码之前&#xff0c;我们先来弄明白一个基础前置知识点——异或运算。 一、异或运算&#xff08;XOR&#xff09; 运算规则&#xff1a;相同为0&#xff0c;不同为1 特点&#xff1a;一个比特进行两次异或运算&#xff0c;可以恢复成原来的比特。 明文&#xff1a;110…

降Compose十八掌之『飞龙在天』| Layout

公众号「稀有猿诉」 原文链接 降Compose十八掌之『飞龙在天』| Layout 页面布局是GUI应用开发的核心&#xff0c;决定着一个UI具体如何实现。今天将延着路线图来练习『降Compose十八掌』的第二招式&#xff0c;学习一下如何使用Compose中的布局来构建页面。 基础骨架 基…

Jenkins教程-15-常用插件-Blue Ocean

上一小节我们学习了Jenkins定时任务构建的方法&#xff0c;本小节我们讲解一下Jenkins常用插件Blue Ocean的使用方法。 Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。 Blue Ocean 特性&#xff1a; 流水线编辑器&#xff1a;用于创建贯穿始终的持续交…

游戏软件缺少d3dx9_42.dll怎么修复?五种方法助你轻松解决

D3DX9_42.dll的丢失是一种常见的操作系统异常问题&#xff0c;由于日常使用电脑时的不当操作&#xff0c;可能会导致一些dll文件的丢失&#xff0c;D3DX9_42.dll就是其中之一。对于这种情况&#xff0c;我们可以通过谨慎的修复来解决。以下是一种科学的解决D3DX9_42.dll丢失的方…

小白学C++(第一天)基础入门

温馨提醒&#xff1a;本篇文章&#xff0c;请各位c基础不行的童鞋不要贸然观看 C的第一个程序 第一个关键字namespace namespace 是定义空间的名字的关键字&#xff0c;使用格式格式如下&#xff1a; namespace 空间名 { } 其中{ }内的命名空间的成员&#xff0c;可以定义…

初识数组!

目录 1.概念 2.一维数组的创建和初始化 1&#xff09;数组创建 2&#xff09;数组的初始化 3&#xff09;数组的类型 3.一维数组的使用 1) 数组下标 2) 数组元素的打印 3) 数组的输入 4.一维数组在内存中的存储 5.sizeof计算数组元素个数 6.二维数组的创建 1.概念 …

【qt】获取主机信息系统

话不多说,先一睹芳颜! 如果你也想达到这种效果,那咱们就开始吧! 目录 一.登录界面设计1.ui登录设计 二.加载界面1.lineEdit的密码输入模式2.lineEdit按回车跳转的信号3.密码的判断4.创建加载界面5.创建定时器来进行进度条的移动6.定时器执行的槽函数 三.主机信息界面1.主机信息…

解析java128陷阱

一、提要 在java开发时&#xff0c;由于基本类型不能调用方法&#xff0c;在某些方面很不方便&#xff0c;因此产生了包装类。我们把基本类型和对应的包装类的转换叫装箱、拆箱。 1.装箱 基本类型转成包装类对象 关键字valueOf->装箱,可以指定进制&#xff1a; Integer…

非参数检测5——双输入检测系统

在很多情况下&#xff0c;信号常常存在于两个带有独立噪声的信道中。所以很有必要研究双输入系统。双输入系统广泛应用于无线电天文学、水下声波检测和地球物理学等领域。

视频融合共享平台LntonCVS视频监控汇聚平台工业视频监控系统

LntonCVS是一款功能强大、灵活部署的安防视频监控平台&#xff0c;具备广泛的扩展性和视频能力。它支持多种主流标准协议&#xff0c;如国标GB28181、RTSP/Onvif、RTMP&#xff0c;同时还能兼容厂家的私有协议和SDK&#xff0c;如海康Ehome、海大宇等。除了传统的安防监控功能外…

HSG金属表面缺陷检测

HSG金属表面缺陷检测 1. 项目背景1.1 项目简述1.2 项目目标 2. 解决方案3. 数据集3.1 收集各种缺陷的图片3.2 利用有限图片创造更多可能3.3 分割图像3.4 打标签 4. 部分代码4.1 数据集划分4.2图像分割4.3 训练模型4.4 预测 5. 预测结果 1. 项目背景 1.1 项目简述 iPad HSG 的…

Qt json和xml操作

学习目标&#xff1a; 认识json和xml读写操作 前置环境 运行环境:qt creator 4.12 学习内容 XML XML&#xff08;Extensible Markup Language&#xff09;是一种标记语言,是一种用于描述数据结构的语言。它非常适合用于存储和传输数据。 XML 的主要特点如下: 可扩展性:XM…

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

项目一单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型&#xff1a; Jave:LNMT PHP:LNMP Python: LNMU 项目部署&#xff1a; 1.项目的类型&#xff08;项目的开发语言&#xff09; 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…

leetcode:编程基础0到1

文章目录 交替合并字符串str.length();StringBuilder类型 ,toString()append() &#xff0c;chatAt()题目描述 交替合并字符串 str.length(); 输出字符串str的长度 StringBuilder类型 ,toString() append() &#xff0c;chatAt() 题目描述 class Solution {public String …

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序 1、流程 1、获取文件绝对路径下的所有文件 2、通过os.path.getmtime获取每个文件的修改时间,并与文件组成元组,方便后续排序 3、默认按照时间戳降序,否则按照按修改时间排序文件列表(从最晚到最早)…

开个技术外挂|用技术轻松实现GPU显卡冷却风扇噪声控制

GPU显卡冷却风扇噪声分析 游戏玩家可能有这样的体验&#xff1a;当显卡卖力工作的时候&#xff0c;明显感觉到从机箱传来的噪声变大了。这是因为系统监测到芯片有过热风险&#xff0c;从而自动提升了冷却风扇的转速。 如下图所示&#xff0c;当GPU显卡处于 20C 时&#xff0c;风…

212.贪心算法:跳跃游戏(力扣)

代码解决 class Solution { public:bool canJump(vector<int>& nums) {int cover 0; // 初始化覆盖范围if (nums.size() 1) return true; // 如果数组长度为1&#xff0c;直接返回 true// 遍历数组&#xff0c;直到当前覆盖范围for (int i 0; i < cover; i…

【易捷海购-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…