C#第六周第二节课的作业讲解

本周有两项作业,一个是要去除数组中的某个元素,另一个是将一个数组逆序排列。从本周开始,一些基础的算法(比如排序,枚举等)应该会渐渐步入我们的课堂。在初步的掌握判断,选择,循环语句后,我们已经初步的拥有了用代码去表达思想的能力。正如语言的学习,先认识常见单词,再学习基础的语法,然后再试着用这些基础的元素去表达自己的想法。计算机语言也是如此。学习语言的初衷是表达,我们当然不能等学会所有的单词和语法再去说话写作。而我们表达好坏,也与单词和语法的难度没有关联。时至今日,我们依然能看到许多关于 “哪种语言最强的” 无意义争论,也依然能看到许多人对于所谓 “最强算法” 或者 “最前沿算法” 的吹捧和令人不知所以的对比。笔者对计算机的了解不算深入,在很多算法前面也只能算个门外汉。但笔者认为,编程不应拘于程序语言本身。程序语言只是我们表达想法解决问题的媒介,而不是关键。许多人编程的入门,在语言选择的徘徊中戛然而止。也有许多人,匆匆的学完基础的语法后,便将这门语言抛于脑后。编程之路十分艰辛,编程之外的人生也往往充满坎坷和荆棘,这一点我能理解。但如果诸位对着编程尚还存有兴趣,尚还有着用它去解决问题,创造价值的想法,我会在这里为大家鼓励和提供力所能及的帮助。这里送给大家一句话:

“Toutes les actions et toutes les pensées vraiment grandes ont un commencement dérisoire.”

下面开始对本周作业进行讲解。

本周的第一个任务,就是要自己写个函数,用它去删去数组中指定位置的元素。如果讲的更详细一些,我们需要做的就是去掉指定位置的那个元素,并把指定位置后的那个元素向前移动一位,而指定位置之前的那些元素无需改变。根据这个思路,我们大概可以绘制出一幅这样的流程图:

删除数组函数的流程图

那么根据这个流程图,我们应该就能得到下文的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace 删除数组函数
{
internal class Program
{
static string[] DelArrayElement(string[] ArrayBom, int ser)
{
int length = ArrayBom.Length;
string[] ans = new string[length - 1]; //这里对长度值减一,因为我们从原数组中删除了一个元素
if (ser >= length) //这里的判断,可以防止输入数据有误造成的崩溃问题
ser = length - 2;
for (int i = 0; i < length; i++)
{
if (i == ser)
continue;
if(i < ser)
ans[i] = ArrayBom[i];
if(i > ser)
ans[i - 1] = ArrayBom[i];
}
return ans;
}
static void Main(string[] args)
{
string[] s = new string[8];
s[0] = "Hello";
s[1] = "Big";
s[2] = "Head";
s[3] = "Fish";
s[4] = "!";
s = DelArrayElement(s, 2);
for(int i = 0; i < s.Length; i++)
{
Console.WriteLine(s[i]);
}
Console.WriteLine("Hello, World!");
}
}
}

下面我们再来看第二项作业。

第二项作业要求我们,用课上讲的选择排序算法,对一个数组进行降序排序。课上讲的是升序排序的写法,其实降序的思路也是一样的。如果你懒得动脑,你可以直接复制粘贴课上的代码,让后把它进行一下顺序转换就能解决问题,当然这样肯定不是最佳的解法。如果课上听懂了升序选择排序的思想,那么降序的代码其实也很好完成。在写升序代码时,我们会在遍历数组的过程中,记录下我们遇到的最小值,再在遍历完之后,将当前值与这个最小值交换,然后再继续遍历。这里用到了双重遍历——也就是写一个循环的嵌套,让循环的过程如同走楼梯一般,第一次循环 n 次,第二次循环 n - 1 次……以此类推。每一次循环之后,我们都会把那次循环后找到的最小值与循环开始时的元素交换,这样带来的影响就是,当我们进行第 k 次循环后,我们得到的最小值,一定要比第 k - 1 次的值要大。而当我们进行完这一整套循环(包括最外层的循环),假设我们的数组名字叫 a ,那么我们任取 a[k], a[k] 一定要大于 a[k - 1],由此,我们实现了升序选择排列的算法。

那么降序应该如何实现呢?与升序的思想也很相似,降序排列后的最终结果,应该是我们从数组 a 中任取一个元素 a[k] , a[k] 一定要小于 a[k - 1] , 那么我们对程序所要进行的变换其实就很明显了,升序时,我们需要记录下循环过程中遇到的最小值再进行交换,那么在降序时,我们是不是只需要把寻找的目标改为最大值就可以了?这里读者假如还不理解,可以自己写几个数,按照刚才所讲的思路进行模拟,进行过几轮后,大概就能对这个算法有更深的认识。

下面就是降序选择排序的算法实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
namespace 降序选择排序
{
internal class Program
{
static void Main(string[] args)
{
int[] arr = new int[] { 122, 45, 23, 89, 67, 45, -10 };
Console.WriteLine("原数组:");
foreach (int i in arr)
{
Console.WriteLine(i + " ");
}
Console.WriteLine();
for (int i = 0; i < arr.Length - 1; i++)
{
int num_max = i; //看,这里我们做了一个修改,我们记录下的是最大值的位置
for (int j = i; j < arr.Length; j++)
{
if (arr[j] > arr[num_max]) //除去那个变量名的变化,我们改变的应该只有这里判断的符号
num_max = j;
}
int temp = arr[i]; //这里需要进行交换
arr[i] = arr[num_max];
arr[num_max] = temp;
}
Console.WriteLine("排序后数组:");
foreach (int i in arr)
{
Console.WriteLine(i + " ");
}
Console.WriteLine();
Console.WriteLine("Hello, World!");
}
}
}

以上就是我对本周作业的一个讲解,鉴于我的表达能力比较拙劣,或许很多地方表达的还不是太清楚。如果各位还有什么问题,欢迎来问我,我一定会努力给出详细的解答。


C#第六周第二节课的作业讲解
https://leoeightxuan.github.io/2025/03/30/C-第六周第二节课的作业讲解/
作者
Leoeight
发布于
2025年3月30日
许可协议