C#-Z5

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

namespace ConsoleApp1
{
     class DJUtils
    {
        static public void println<T>(IEnumerable<T> collection) { 
            foreach(T item in collection)
            {
            Console.Write(item+ " ");
            }
            Console.WriteLine(); }
    }
}

//调用测试
using ConsoleApp1;
List<string> list = new List<string> { "陈晨", "陈川" };
DJUtils.println(list);

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

using System;
using System.Diagnostics;
using System.IO;

class TraverseAndMeasureTime
{
    static void Main()
    {
        string directoryPath = @"D:\BaiduNetdiskDownload\dj0527"; // 更改为你的目录路径
        Stopwatch stopwatch = new Stopwatch();

        // 开始计时
        stopwatch.Start();

        // 遍历目录并处理文件
        TraverseDirectory(directoryPath);

        // 停止计时
        stopwatch.Stop();

        // 输出耗时
        TimeSpan elapsed = stopwatch.Elapsed;
        Console.WriteLine($"遍历并处理文件耗时:{elapsed.TotalMilliseconds} 毫秒");
    }

    private static void TraverseDirectory(string directoryPath)
    {
        // 检查目录是否存在
        if (!Directory.Exists(directoryPath))
        {
            Console.WriteLine("指定的目录不存在。");
            return;
        }

        // 获取目录中的所有文件
        string[] files = Directory.GetFiles(directoryPath);

        foreach (string filePath in files)
        {
            FileInfo fileInfo = new FileInfo(filePath);
            // 在这里处理每个文件,例如打印文件名或读取文件内容
            Console.WriteLine($"正在处理文件:{fileInfo.Name}");
            // 你可以添加更多的处理逻辑,例如读取文件内容等
        }
    }
}


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

运算符类型运算符描述
算术运算符+加法
-减法
*乘法
/除法
%取模(求余数)
++前置或后置自增(增加1)
--前置或后置自减(减少1)
关系运算符<小于
<=小于等于
>大于
>=大于等于
==等于
!=不等于
逻辑运算符&&逻辑与(AND)
||逻辑或(OR)
!逻辑非(NOT)
位运算符&位与
|位或
^位异或
~位非
<<左移
>>右移
赋值运算符=简单赋值
+=加法赋值
-=减法赋值
*=乘法赋值
/=除法赋值
%=取模赋值
&=位与赋值
|=位或赋值
^=位异或赋值
<<=左移赋值
>>=右移赋值


4.        三目表达式举例

三目表达式,也称为条件运算符,是在许多编程语言中提供的一种紧凑的if-else语句的替代方式。它接受三个参数:一个布尔表达式,一个当表达式为真时返回的值,以及一个当表达式为假时返回的值。其基本语法如下:

条件 ? 值1 : 值2;

如果条件为真,则整个表达式的值为值1;如果条件为假,则值为值2

以下是一些使用C#编写的三目表达式的示例:

示例1:基于年龄判断是否成年
int age = 17;
string status = (age >= 18) ? "成年" : "未成年";
Console.WriteLine(status); // 输出 "未成年"
示例2:确定两个数中的最大值
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
Console.WriteLine(max); // 输出 20
示例3:根据成绩给出字母等级
int score = 85;
string grade = (score >= 90) ? "A" :
               (score >= 80) ? "B" :
               (score >= 70) ? "C" :
               (score >= 60) ? "D" : "F";
Console.WriteLine(grade); // 输出 "B"
示例4:计算折扣价格
double price = 100.0;
double discountRate = 0.1;
double discountedPrice = (price > 50.0) ? price * (1 - discountRate) : price;
Console.WriteLine(discountedPrice); // 输出 90.0
示例5:检查空值并提供默认值
string name = null;
string defaultName = name ?? "匿名用户";
Console.WriteLine(defaultName); // 输出 "匿名用户"

请注意,在最后一个示例中,?? 运算符是一个特殊的三目运算符,用于在 C# 中处理 null 值。如果左侧的操作数为 null,则返回右侧的操作数;否则,返回左侧的操作数。这是 null 合并运算符的一个应用,可以看作是三目运算符的一种变形。


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

  1. 有括号先括号

    • 圆括号 ()、方括号 [] 和花括号 {} 内的表达式优先计算。括号可以嵌套,最内层的括号最先计算。
  2. 后乘除再加减

    • 乘法 * 和除法 / 的优先级高于加法 + 和减法 -
    • 在同一优先级内,从左到右计算。
  3. 然后位移再关系

    • 位移运算符 << 和 >> 的优先级高于关系运算符 <<=>>===!=
    • 关系运算符用于比较,决定两个值之间的大小或相等性。
  4. 逻辑完后再条件

    • 逻辑运算符 &&|| 的优先级低于关系运算符,高于条件(三目)运算符 ? :
    • 条件运算符用于基于条件选择两个可能的值之一。
  5. 赋值最后

    • 赋值运算符 = 和复合赋值运算符 +=-=*=/=, 等的优先级是最低的。


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

  1. break

    • 用途break语句用于立即退出最内层的循环(forwhiledo-while)或switch语句。
    • 效果:当break被执行时,程序控制将立即跳转到循环或switch语句之后的第一条语句。
    • 示例:假设我们要寻找数组中的第一个负数,一旦找到,就停止搜索并报告该数。
      using System;
      
      public class BreakDemo
      {
          public static void Main()
          {
              int[] numbers = { 1, 3, 5, -2, 8, 10, -1 };
              
              foreach (int number in numbers)
              {
                  if (number < 0)
                  {
                      Console.WriteLine("找到了第一个负数:" + number);
                      break; // 一旦找到第一个负数,就退出循环
                  }
              }
          }
      }
  2. continue

    • 用途continue语句用于跳过循环体中当前迭代剩余的部分,直接开始下一次迭代。
    • 效果:当continue被执行时,循环中的任何后续代码都不会运行,而是直接跳转到循环的开始,进行条件检查或更新循环变量(对于for循环)。
    • 示例:假设我们要打印一个数组中的所有正数,忽略所有的负数。
      using System;
      
      public class ContinueDemo
      {
          public static void Main()
          {
              int[] numbers = { 1, -3, 5, -2, 8, 10, -1 };
              
              foreach (int number in numbers)
              {
                  if (number < 0)
                  {
                      continue; // 忽略负数,跳过当前迭代
                  }
                  Console.WriteLine(number);
              }
          }
      }
  3. return

    • 用途return语句用于从一个函数或方法中返回,并可选择性地带回一个值给调用者。
    • 效果return语句不仅结束当前函数的执行,还可以向调用者传递一个值。如果没有值跟在return后面,那么函数将返回其声明的默认返回类型(例如,在C#中,如果函数声明为void,则不返回任何值)。
    • 示例:假设我们有一个方法,用来查找数组中的最小值,一旦找到就立即返回。
      using System;
      
      public class ContinueDemo
      {
          public static void Main()
          {
              int[] numbers = { 1, -3, 5, -2, 8, 10, -1 };
              
              foreach (int number in numbers)
              {
                  if (number < 0)
                  {
                      continue; // 忽略负数,跳过当前迭代
                  }
                  Console.WriteLine(number);
              }
          }
      }


7.        写个冒泡排序

  • 冒泡排序原理

冒泡排序的基本思想是通过不断地比较相邻的两个元素,如果它们的顺序错误就把它们交换过来,这样较大的值会逐渐“浮”到数组的末尾,就像水中的气泡上升一样,故名冒泡排序。

  • 工作过程

冒泡排序的过程可以分为多个“趟”(pass)。每一趟都会将当前未排序部分的最大值冒泡到数组的末尾。以下是具体步骤:

  1. 初始化:假设有一个待排序的数组。

  2. 第一趟排序

    • 比较第1个和第2个元素,如果第1个比第2个大,就交换它们的位置。
    • 接着比较第2个和第3个元素,继续这个过程直到比较最后一个元素前的一个元素。
    • 结束时,最大的元素会被放置在数组的最后位置。
  3. 第二趟排序

    • 重复上述过程,但这次忽略已知最大且已排序的最后一个元素。
    • 这次比较和交换会使第二大的元素冒泡到最后剩下的位置。
  4. 重复过程:重复上述过程,每次忽略已排序的元素,直到整个数组都排序完毕。

  • 优化

在传统的冒泡排序中,每一趟都会遍历整个未排序部分。但是,如果在一趟遍历过程中没有发生任何交换,这意味着数组已经是有序的,没有必要再进行更多的遍历。因此,可以通过设置一个标志位来优化冒泡排序,如果在某趟遍历中没有发生交换,就可以提前终止排序。

  • 时间复杂度

冒泡排序的时间复杂度分析如下:

  • 最好情况:如果输入数组已经是排序好的,算法只需要进行一次遍历来确认这一点,时间复杂度为O(n)。
  • 最坏情况:如果输入数组是逆序的,那么每一对元素都需要交换,时间复杂度为O(n^2)。
  • 平均情况:时间复杂度也为O(n^2)。
  • 总结

冒泡排序是一种简单直观的排序算法,适用于小型数据集或教学目的,但在处理大规模数据时效率较低,因为其时间复杂度较高。不过,通过引入标志位的优化措施,可以在数据接近有序的情况下显著提高性能。

  • 源码
using System;

public class BubbleSortExample
{
    public static void Main()
    {
        int[] array = { 64, 34, 25, 12, 22, 11, 90 };
        BubbleSort(array);
        Console.WriteLine("Sorted array is:");
        PrintArray(array);
    }

    static void BubbleSort(int[] arr)
    {
        int n = arr.Length;
        bool swapped;
        for (int i = 0; i < n - 1; i++)
        {
            swapped = false;
            for (int j = 0; j < n - i - 1; j++)
            {
                if (arr[j] > arr[j + 1])
                {
                    // Swap arr[j] and arr[j + 1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }

            // If no two elements were swapped by inner loop, then break
            if (!swapped)
                break;
        }
    }

    static void PrintArray(int[] arr)
    {
        foreach (int element in arr)
        {
            Console.Write(element + " ");
        }
        Console.WriteLine();
    }
}


8.        写个九九乘法表

using System;

class MultiplicationTable
{
    static void Main()
    {
        // 外层循环控制行
        for (int i = 1; i <= 9; i++)
        {
            // 内层循环控制列
            for (int j = 1; j <= i; j++)
            {
                Console.Write($"{j} * {i} = {j * i}\t"); // 输出乘法表达式和结果,\t用于添加制表符空格
            }
            Console.WriteLine(); // 每完成一行输出后换行
        }
    }
}


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

using System;
using System.IO;

class FileReadingExample
{
    public static string ReadFileContent(string filePath)
    {
        try
        {
            return File.ReadAllText(filePath);
        }
        catch (FileNotFoundException ex)
        {
            // 抛出一个包含自定义错误消息的新异常
            throw new ApplicationException($"文件 {filePath} 未找到。", ex);
        }
    }

    static void Main()
    {
        //string filePath = "C:\\Users\\K\\Desktop\\nonexistent_file.txt";
        string filePath = "C:\\nonexistent_file.txt";
        try
        {
            string content = ReadFileContent(filePath);
            Console.WriteLine(content);
        }
        catch (ApplicationException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

未找到文件抛出异常

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值