C#作业7.5

目录

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

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

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

 3.1算术运算符

3.2关系运算符

3.3逻辑运算符

3.4位运算符

3.5赋值运算符

4.三目表达式举例

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

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

7.写个冒泡排序

8.写个九九乘法表

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


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}");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值