C# 第五次作业 0705

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

namespace Djproject
{
    //泛型类
    internal class DJUtils
    {
        //通用的打印
        //必须继承IEnumerable接口的类,满足它才能进行迭代
        static public 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);


LinkedList<string> list = new LinkedList<string>();
list.AddLast("刘备");
list.AddLast("关羽");
list.AddLast("张飞");
DJUtils.println(list);


2.  计算遍历目录的耗时。

代码实现:

namespace Djproject
{
    
    // 定义一个内部类TraverseFile,它不能从当前程序之外被访问  
    internal class TraverseFile
    {
        Stopwatch sw = Stopwatch.StartNew();
        
        // 定义TraverseDirectory方法,它接受一个字符串参数dir,表示要遍历的目录的路径 
        public void TraverseDirectory(string dir)
        {
            sw.Start();
            // 打印一条消息,表明当前开始遍历的目录 
            Console.WriteLine($"遍历开始: {dir}");

            // 使用Directory.GetFiles方法获取指定目录下所有文件的路径,并存储在字符串数组files中  
            string[] files = Directory.GetFiles(dir);

            // 遍历files数组中的每个文件路径 
            foreach (string file in files)
            {
                // 使用file路径创建一个FileInfo对象,以便获取有关文件的更多信息
                FileInfo fileInfo = new FileInfo(file);
                // 使用Console.WriteLine打印文件的名称、扩展名和大小 
                Console.WriteLine($"文件名:{fileInfo.Name}, 扩展名:{fileInfo.Extension}, 文件大小:{fileInfo.Length}");
            }

            // 使用Directory.GetDirectories方法获取指定目录下所有子目录的路径,并存储在字符串数组directory中  
            string[] directory = Directory.GetDirectories(dir);

            // 遍历directory数组中的每个子目录路径 
            foreach (string dry in directory)
            {
                // 递归调用TraverseDirectory方法,传入当前子目录的路径作为参数,以便遍历该子目录及其子目录  
                TraverseDirectory(dry);
            }

            
            // 当所有文件和子目录都被遍历后,打印一条消息表明当前目录的遍历已经结束 
            Console.WriteLine($"遍历结束: {dir}");
            sw.Stop();
            Console.WriteLine("耗时:{0}毫秒", sw.ElapsedMilliseconds);
        }
        
    }
}
//声明了一个TraverseFile类型的变量tD,并通过调用TraverseFile类的构造函数来实例化该变量
TraverseFile tD = new TraverseFile();
//指定了要遍历的目录的路径
tD.TraverseDirectory("D:\\list\\PYTHON\\db");


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

算术运算符:

(1)加法运算符 (+): 用于将两个操作数相加。如果操作数是数字,则执行加法运算;如果操作数是字符串,则执行字符串连接操作。

(2)减法运算符 (-): 用于从第一个操作数中减去第二个操作数。

(3)乘法运算符 (*): 用于将两个操作数相乘。

(4)除法运算符 (/): 用于将第一个操作数除以第二个操作数。结果是一个浮点数或双精度数,具体取决于操作数的类型。

(5)取模运算符 (%): 模运算符或余数运算符,用于求两个数相除后的余数。

(6)递增运算符 (++): 用于将变量的值增加1。它有两种形式:前缀递增(++x)和后缀递增(x++)。前缀递增会先增加变量的值,然后返回新的值;后缀递增会返回变量的当前值,然后再增加变量的值。

(7)递减运算符 (--): 有两种形式:前缀递减(--x)和后缀递减(x--)。

(8)复合赋值运算符: 结合了算术运算符和赋值运算符(=)。例如,+= 是加法和赋值运算符的结合,x += y; 等价于 x = x + y;。类似的运算符还有 -=*=/= 和 %=

关系运算符:

以下是C#中常见的关系运算符:

        (1)等于运算符 (==): 检查两个操作数的值是否相等。如果相等,则表达式的结果为 true;否则为 false

        (2)不等于运算符 (!=): 检查两个操作数的值是否不相等。如果不相等,则表达式的结果为 true;否则为 false

        (3)大于运算符 (>): 检查左操作数的值是否大于右操作数的值。如果是,则表达式的结果为 true;否则为 false

        (4)小于运算符 (<): 检查左操作数的值是否小于右操作数的值。如果是,则表达式的结果为 true;否则为 false

        (5)大于等于运算符 (>=): 检查左操作数的值是否大于或等于右操作数的值。如果是,则表达式的结果为 true;否则为 false

        (6)小于等于运算符 (<=): 检查左操作数的值是否小于或等于右操作数的值。如果是,则表达式的结果为 true;否则为 false

逻辑运算符:

        (1) 逻辑与(&&):也称为短路与运算符。        

                 1)对两个布尔值进行逻辑与运算,如果两个操作数都为true,则结果为true;否则为false

                2)如果第一个操作数为false,则不会评估第二个操作数,因为无论第二个操作数的值是什么,结果都将是false

         (2)逻辑或(||):也称为短路或运算符。

                1)对两个布尔值进行逻辑或运算,如果两个操作数中至少有一个为true,则结果为true;如果两个操作数都为false,则结果为false

                2)如果第一个操作数为true,则不会评估第二个操作数,因为无论第二个操作数的值是什么,结果都将是true

        (3)逻辑非(!):

                1)是一元运算符,用于对其后的布尔值进行取反。

                2)如果操作数为true,则结果为false;如果操作数为false,则结果为true

位运算符:

        (1)与(&)

               1) 对两个数的二进制形式进行逐位与操作。只有当两个相应的二进制位都为1时,结果位才为1,否则为0。

                2)示例:5 & 3(二进制形式为101 & 011)结果为1(二进制001)。

        (2)或(|)

                1)对两个数的二进制形式进行逐位或操作。只要两个相应的二进制位中有一个为1,结果位就为1。

                2)示例:5 | 3(二进制形式为101 | 011)结果为7(二进制111)。

        (3)异或(^)

                1)对两个数的二进制形式进行逐位异或操作。当两个相应的二进制位不相同时,结果位为1;相同时,结果位为0。

                2)示例:5 ^ 3(二进制形式为101 ^ 011)结果为6(二进制110)。

        (4)取反(~)

                1)是一元运算符,用于对其操作数的二进制形式进行逐位取反操作。即0变为1,1变为0。

                2)注意:对于整数,按位取反通常会影响符号位,可能导致正数变成负数,负数变成正数(取决于具体的二进制表示和补码规则)。

        (5)左移(<<)

                1)将数的二进制表示向左移动指定的位数,左侧边缘超出的位将被丢弃,而在右侧边缘新增的位将用0填充。

                2)相当于乘以2的指定次幂。

                3)示例:5 << 2(二进制形式为101 << 2)结果为20(二进制10100)。

        (6)右移(>>)

                1)将数的二进制表示向右移动指定的位数,右侧边缘超出的位将被丢弃。

                2)相当于除以2的指定次幂,但结果总是向下取整。

                3)示例:5 >> 2(二进制形式为101 >> 2)结果为1(二进制001)。

赋值运算符:

        (1)普通赋值(=):

                1)将右侧表达式的值赋给左侧的变量或属性。

                2)示例:int a = 5;

        (2)算术复合赋值运算符(=):

                这些运算符结合了赋值和算术操作(加、减、乘、除)。
                加法赋值(+=):a += 5; 等同于 a = a + 5;
                减法赋值(-=):a -= 3; 等同于 a = a - 3;
                乘法赋值(*=):a *= 2; 等同于 a = a * 2;
                除法赋值(/=):a /= 2; 等同于 a = a / 2;
                求余赋值(%=):a %= 3; 等同于 a = a % 3;
        (3)位复合赋值运算符:
                这些运算符结合了赋值和位操作(与、或、异或、左移、右移)。
                位与赋值(&=):a &= b; 等同于 a = a & b;
                位或赋值(|=):a |= b; 等同于 a = a | b;
                位异或赋值(^=):a ^= b; 等同于 a = a ^ b;
                左移赋值(<<=):a <<= 2; 等同于 a = a << 2;
                右移赋值(>>=):a >>= 2; 等同于 a = a >> 2;
        (4)字符串连接赋值(+=,特定于字符串):
                当用于字符串时,+= 运算符将右侧的字符串连接到左侧的字符串末尾,并将结果赋给左侧的字符串变量。
                示例:string s = "Hello, "; s += "World!"; 结果是 s 变为 "Hello, World!"
        (5)空合并赋值运算符(??=):
                如果左侧的变量为 null,则将其设置为右侧表达式的值;否则,不改变左侧变量的值。
                示例:int? a = null; a ??= 5; 结果是 a 变为 5
 

4.  三目表达式举例

        三目运算符(也称为条件运算符)是一种简洁的表达式,用于根据条件选择两个值中的一个。

        它的语法形式为 条件 ? 表达式1 : 表达式2 如果条件为真(true),则整个表达式的结果是表达式1的结果;如果条件为假(false),则结果是表达式2的结果。

        举例:

int a = 10;
int b = 20;

// 使用三目运算符来比较a和b,并根据结果打印不同的字符串  
string result = (a > b) ? "Hello World" : "Hello China";

Console.WriteLine(result); // 输出: Hello China

// 使用三目运算符直接赋值给变量  
int max = (a > b) ? a : b;

Console.WriteLine("得到的值: " + max); // 输出: The max value is: 20  

// 嵌套的三目运算符示例  
string grade = (a > 90) ? "A" : (a > 60) ? "B" : "C";

Console.WriteLine("输出: " + grade);

        结果:


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

        括号 ((){}[]):首先计算括号内的表达式。

        乘除模取余 (*, /, %):接下来进行乘法、除法和取余运算。

        加减 (+, -):然后进行加法和减法运算。

        位移 (<<>>):接着进行左移和右移操作。

        比较 (<><=>=isas):之后是比较运算,包括关系比较和类型检查。

        相等不等 (==!=):进行相等性和不等性的判断。

        逻辑与 (&):然后是按位与(虽然这里也提到了逻辑与,但&&是逻辑与,用于短路求值,优先级低于&)。

        逻辑异或 (^):进行按位异或操作。

        逻辑或 (|):然后是按位或(同样,||是逻辑或,用于短路求值,优先级低于|)。

        条件运算符 (?:):使用条件运算符(三元运算符)进行条件选择。

        赋值 (=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=):最后进行赋值操作,包括各种复合赋值。

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

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// 使用break  
Console.WriteLine("Using break:");
foreach (var number in numbers)
{
    if (number == 5)
    {
        break; // 退出循环  
    }
    Console.WriteLine(number);
}

// 使用continue  
Console.WriteLine("\nUsing continue:");
foreach (var number in numbers)
{
    if (number % 2 == 0)
    {
        continue; // 跳过当前迭代,继续下一次迭代  
    }
    Console.WriteLine(number);
}

Console.WriteLine("\nUsing return:");
DemoReturn(numbers);

static void DemoReturn(int[] numbers)
{
    foreach (var number in numbers)
    {
        if (number > 7)
        {
            return; // 退出方法  
        }
        Console.WriteLine(number);
    }
    Console.WriteLine("如果return没有被执行,这段代码将被执行");
}

7.  写个冒泡排序

int[] arr = { 64, 34, 25, 12, 22, 11, 90 };
int n = arr.Length;

Console.WriteLine("原始数组:");
PrintArray(arr);

BubbleSort(arr);

Console.WriteLine("排序后的数组:");
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 i in arr)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();
}


8.  写个九九乘法表

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= i; j++)
    {
        // 打印每一项,后面跟一个空格  
        Console.Write("{0}x{1}={2}\t",j,i,i*j);
    }
    // 每完成一行后换行  
    Console.WriteLine();
}


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

string DatePath = @"D:\list\PYTHON\db\b.txt"; // 假设这个文件不存在  

try
{
    // 尝试打开文件  
    //using 语句是一种确保资源被正确释放的模式,无论是否发生异常
    //FileStream:通过它读取文件内容、写入文件内容、以及执行其他文件操作
    //filePath:表示要打开文件的路径
    //FileMode.Open:表示文件必须存在,且文件将被打开以进行读取、写入或两者。如果文件不存在,将抛出 FileNotFoundException 异常
    using (FileStream fileStream = new FileStream(DatePath, FileMode.Open))
    {
        // 如果文件成功打开,可以在这里处理文件  
        Console.WriteLine("文件已成功打开!");
    }
}
//FileNotFoundException:专门用于表示尝试访问的文件或目录未找到的情况,当尝试打开或访问一个不存在的文件时,FileStream、File 等类的方法通常会抛出这个异常。
//ex:引用了捕获到的 FileNotFoundException 实例
catch (FileNotFoundException ex)
{
    // 如果文件不存在,将捕获FileNotFoundException异常  
    Console.WriteLine($"无法找到文件,请检查路径是否正确:{DatePath},\n错误详情:{ex.Message}");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值