c#第五次作业

news2024/9/24 11:28:33

目录

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.coloradmin.cn/o/1906184.html

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

相关文章

我国静止无功发生器(SVG)市场规模逐渐扩大 高压SVG为主流产品

我国静止无功发生器&#xff08;SVG&#xff09;市场规模逐渐扩大 高压SVG为主流产品 静止无功发生器&#xff08;SVG&#xff09;又称为静止同步补偿器、先进静止补偿器、静止调相机等&#xff0c;是利用全控型功率器件组成的桥式变流器来实现动态无功调节的一种先进无功自动补…

医学图像分割论文:Learnable Ophthalmology SAM

文章目录 0. Abstract1. Introduction2. Learnable Ophthalmology(眼科学) SAM2.1 Preliminaries(预先)2.2 Learnable Prompt Layer3. Experiment3.1 Datasets3.2 Evaluation Metrics(指标)3.3 Implement Details3.4 Experimental Results3.5 Generalization4. Discussion5. …

【JavaWeb程序设计】JSP访问数据库(二)

目录 一、编写一个网页&#xff0c;实现根据输入学生姓名的模糊查询&#xff0c;如果查找不到就显示“查无此人” 1. 运行截图 2. 建表 3. JSP页面主要代码&#xff08;inquire.jsp&#xff09; 4. Bean实体类 5. DAO层 6. Service层&#xff08;模糊查询&#xff09; …

展厅AI数字人:实现智慧园区与数字孪生的高效交互展示

随着人工智能技术的飞速发展&#xff0c;智慧园区和数字孪生技术已经成为展厅管理和规划的重要工具&#xff0c;展厅AI数字人可以提供沉浸式的展览体验。 展厅大屏幕支持与AI数字人连接&#xff0c;用户可以直接通过语音交互的形式操作大屏幕显示的内容&#xff0c;实现对大屏…

ELFK 8.12.2 部署 -- docker部署方式⚽

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Mysql系列-Binlog主从同步

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/669450627 一、主从同步概述 mysql主从同步&#xff0c;即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主 从同步功能&#xff0c;经过配置&#xff0c;可以实现基于库、表…

如何降低亚马逊测评风险?掌握这些技巧就够了!

无论是初涉亚马逊测评领域的新手还是经验丰富的老手&#xff0c;都不可避免地会面临各种风险挑战。为了将这些风险降至最低&#xff0c;我们需掌握一系列高效且安全的测评策略。以下是一些关键的亚马逊测评技巧与策略&#xff1a; 亚马逊测评优化策略 1. 真实购买与国外账号&a…

​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​

五、IS-IS报文 1、IS-IS报文格式 IS-IS报文是直接封装在数据链路层的帧结构中的。 PDU(Protocol Data Unit&#xff0c;协议数据单元): 报文头(IS-IS Header) 变长字段(Variable Length Fields )。 IS-IS Header: 通用头部(PDU Common Header) 专用头部(PDU Specific H…

javaIO流(2)

一.字符流 字符流对数据的操作是以一个个字符为单位的,字符流只能读文本文件,并将读到的字节按照编码表转为对应的字符,Reader和Writer是字符流的两个最大的抽象类,InputStreamReader和OutputStreamWriter分别继承了Reader和Writer,它俩的功能就是将读取到的字节转换为字符,所…

实验代码结构介绍

提高模型复用性&#xff0c;让模型对应的配置更加清晰&#xff0c;代码书写条理 学习自https://zhuanlan.zhihu.com/p/409662511 Project ├── checkpoints # 存放模型 ├── data # 定义各种用于训练测试的数据集 ├── eval.py # 测试代码 ├── loss.py # 定义的…

CSS 后代选择器正确写法 爸爸儿子之间有代沟

CSS 后代选择器正确写法 爸爸儿子之间有代沟 example&#xff1a; > <body> > <div class"outer"> > <span class"inner"></span> > </div> > </body> > <head> > <style>…

如何选择快手矩阵源码:关键因素解析

在短视频行业迅速发展的今天&#xff0c;快手平台已成为众多内容创作者和企业的重要阵地。为了有效管理和运营多个快手账号&#xff0c;快手矩阵源码成为了一个关键工具。然而&#xff0c;市场上的快手矩阵源码种类繁多&#xff0c;选择一个合适的源码并非易事。本文将探讨选择…

【QT】多元素控件

多元素控件 多元素控件1. List Widget2. Table Widget3. Tree Widget 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别&#xff0c;以 QTableWidget 和 QTableView 为例&#xff1a; …

WPS提示打印机异常,但是任然可以打印

故障现象 使用WPS在打印预览页时&#xff0c;打印机有小橙点提示&#xff0c;点击打印时会报错&#xff0c;提示&#xff1a; 打印机异常&#xff0c;打印机状态出现异常&#xff0c;请检查打印机是否开机并且联机 但是点击确定后&#xff0c;可以继续打印&#xff0c;而且其他…

企业微信hook接口协议,聊天标签中的联系人变动通知

聊天标签中的联系人变动通知 返回示例 {"send_time":1699256104,"flag":0,"receiver":0,"sender":10014,"referid":0,"sender_name":"","app_info":"0FUGGXUfQ0G7nPh","rea…

收藏!2024年程序员的实用神器_new relic idea

前言 Chat GPT的升级节奏让人们越来越惊讶的同时&#xff0c;也让大家感觉到了压力&#xff0c;在如此快节奏的互联网世界中&#xff0c;开发人员需要不断学习与更新知识&#xff0c;保持领先地位并高效地交付高质量软件。 无论是集成开发环境 (IDE)、版本控制系统、测试工具…

“除了C盘都不见了“:现象解析、恢复策略与预防之道

现象概述&#xff1a;非系统盘突然消失之谜 在日常的计算机使用中&#xff0c;不少用户可能遭遇过一个令人措手不及的问题——“除了C盘都不见了”。这一现象发生时&#xff0c;用户惊讶地发现除了作为系统盘的C盘外&#xff0c;原本存放着各类文档、图片、视频等个人资料的D盘…

得帆荣获中国信通院低代码标准参编专家认证和低代码白皮书参编单位认可

2024年6月26日&#xff0c;由中国通信标准化协会主办&#xff0c;中国通信标准化协会云计算标准和开源推进委员会承办的2024低代码无代码产业大会在北京召开&#xff0c;大会以“智融低无码&#xff0c;模创新未来”为主题&#xff0c;发布领域研究成果&#xff0c;交流行业前沿…

使用dd命令简单测试磁盘I/O

本文所有测试使用的均是Oracle公有云OCI上的计算实例的启动盘。 第1轮测试使用的是默认的启动盘参数。第2轮测试使用的是自动调整的启动盘参数&#xff08;如下图&#xff09;&#xff0c;性能更高。 第1轮测试 顺序I/O 运行以下命令5次&#xff0c;dsync表示不使用cache&…

【MySQL05】【 undo 日志】

文章目录 一、前言二、undo 日志&#xff08;回滚日志&#xff09;1. 事务 id2. undo 日志格式2.1 INSERT 对应的 undo 日志2.2 DELETE 对应的 undo 日志2.3 UPDATE 对应的 undo 日志2.3.1 不更新主键2.3.2 更新主键 2.3 增删改操作对二级索引的影响2.4 roll_pointer 3. FIL_PA…