Home [C# 筆記]基礎知識複習+練習 15-24
Post
Cancel

[C# 筆記]基礎知識複習+練習 15-24

練習15:取得字串陣列中最長的字

1
2
3
4
5
6
7
8
9
10
11
12
13
string[] names = { "馬蓋先", "關羽", "雷吉米勤", "科比布萊恩特" };
Console.WriteLine(GetLongest(names));
Console.ReadKey();

static string GetLongest(string[] names)
{
    string max = names[0];
    for (int i = 0; i < names.Length; i++)
    {
        if (names[i].Length > max.Length) max = names[i];
    }
    return max;
}

練習16:計算整數陣列的平均值

要求:計算結果如果有小數,則顯示小數點後兩位(四捨五入)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[] nums = { 1, 2, 3, 65, 77, 879, 5, 43 };
decimal avg = Convert.ToDecimal(GetAvg(nums).ToString("0.00"));
Console.WriteLine(avg);
Console.ReadKey();

static decimal GetAvg(int[] nums)
    {
        decimal sum = 0;
        for (int i = 0; i < nums.Length; i++)
        {
            sum += nums[i];
        }
        return sum / nums.Length;
    }

練習17:使用冒泡排序對整數陣列實現升序排序

{1,5,3,90,2,4,6,8,10}

  • Array.Sort()升序
  • Array.Reverse反轉

工作用

1
2
3
4
5
6
7
8
int[] nums = { 1, 5, 3, 90, 2, 4, 6, 8, 10 };
Array.Sort(nums); //升序
Array.Reverse(nums); //反轉

//輸出看結果
for (int i = 0; i < nums.Length; i++) {
    Console.WriteLine(nums[i]);
}

筆試用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int[] nums = { 1, 5, 3, 90, 2, 4, 6, 8, 10 };
for (int i = 0; i < nums.Length - 1; i++)
{
    for (int j = 0; j < nums.Length - 1 - i; j++)
    {
        //跟後一位比
        if (nums[j] > nums[j + 1])
        {
            int temp = nums[j];
            nums[j] = nums[j + 1];
            nums[j + 1] = temp;
        }
    }
}
//輸出看結果
for (int i = 0; i < nums.Length; i++) {
    Console.WriteLine(nums[i]);
}

練習18:給陣列隨機賦值並計算平均

使用一個陣列儲存30個學生的考試成績,並給每個陣列元素指定一個1-100的隨機值,然後計算平均成績

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int[] scores = new int[30];//宣告長度為30的整數陣列,用來存放學生的考試成績
Random r = new Random();//建立產生隨機數物件

//通過循環給每一個元素賦值
for (int i = 0; i < scores.Length; i++) {
    scores[i] = r.Next(1,101);//1-100的隨機值
}

//計算平均成績
decimal sum = 0;
for (int i = 0; i < scores.Length; i++)
{
    sum += scores[i];
}
decimal avg = sum / scores.Length;
avg = Convert.ToDecimal(avg.ToString("0.00"));
Console.WriteLine(avg);
Console.ReadKey();

練習19:統計字串出現的次數&位置

有如下字元串:【”患者:“大夫,我咳嗽得很重。” 大夫:“你多大年記?” 患者:“七十五歲。” 大夫:“二十歲咳嗽嗎”患者:“不咳嗽。” 大夫:“四十歲時咳嗽嗎?” 患者:“也不咳嗽。” 大夫:“那現在不咳嗽,還要等到什麼時咳嗽?””】。 需求:

  1. 請統計出該字元中“咳嗽”一詞的出現次數,以及每次“咳嗽”出現的索引位置。
  2. 擴展(*):統計出每個字元的出現次數。

IndexOf找不到會返回-1

1
2
3
4
5
6
第一次出現"咳嗽"的索引位置:8
第二次找的時候,要從第9個索引開始找:8+1 => index+1

所以,每一次要找的時候,都要從上一次的索引值加1開始找

找不到的時候,index會返回-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string s = "患者:“大夫,我咳嗽得很重。” 大夫:“你多大年記?” 患者:“七十五歲。” 大夫:“二十歲咳嗽嗎”患者:“不咳嗽。” 大夫:“四十歲時咳嗽嗎?” 患者:“也不咳嗽。” 大夫:“那現在不咳嗽,還要等到什麼時咳嗽?";

int index = s.IndexOf("咳嗽"); //第一次出現"咳嗽"的索引位置
Console.WriteLine($"第一次出現\"咳嗽\"的索引位置 {index}"); //8, 第二次找的時候要從第9個索引開始找8+1 => index+1

int i = 1; //記錄找的次數,因為前面己經找過一次所以i=1
while (index != -1) //找不到index會返回-1
{
    i++; //每找一次i就加1
    index = s.IndexOf("咳嗽", index + 1); //從上一次出現的index+1開始找,找完之後,再重新賦值給index
    if (index == -1) break; //-1是代表找不到了
    Console.WriteLine($"第{i}次找到「咳嗽」的位置是 {index}");
}
Console.ReadKey();
1
2
3
4
5
6
7
8
第一次出現"咳嗽"的索引位置 8
第2次找到「咳嗽」的位置是 46
第3次找到「咳嗽」的位置是 55
第4次找到「咳嗽」的位置是 68
第5次找到「咳嗽」的位置是 80
第6次找到「咳嗽」的位置是 93
第7次找到「咳嗽」的位置是 103
第8次找到「咳嗽」的位置是 -1

-1是說明找不到「咳嗽」了,所以要加這段 if (index == -1) break; //-1是代表找不到了

練習20:字串處理Trim()、Split、string.Join()

將字元串” hello world,你 好 世界 ! “兩端空格去掉,並且將其中的所有其他空格都替換成一個空格,輸出結果為:”hello world,你 好 世界 !”

使用到三個方法: Trim() Split string.Join()

1
2
3
4
5
6
7
8
9
10
string s = " hello      world,你 好 世界 ! ";
s = s.Trim(); //兩端空格去掉

//先把全部的空格去掉
string[] sNew = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

//把分隔符空格放到陣列sNew裡面去
string strNew = string.Join(" ", sNew);
Console.WriteLine(strNew);
Console.ReadKey();

練習21:接收連續輸入姓名,quit結束後,計算總數和輸出每個姓名

製作一個控制台小程式。要求:用戶可以在控制台輸入每個學生的姓名,當用戶輸入quit(不區分大小寫)時,程式停止接受用戶的輸入,並且顯示出用戶輸入的學生的個數,以及每個學生的姓名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//儲存用戶輸入的姓名
List<string> list = new List<string>();
while (true)
{
    Console.WriteLine("請輸入學生姓名,輸入quit退出");
    string name = Console.ReadLine();
    if (name.ToLower() == "quit") break; //當用戶輸入quit跳出循環
    list.Add(name);
}

Console.WriteLine($"你一共輸入了:{list.Count}個學生,姓名分別為:");
foreach (var item in list) {
    Console.WriteLine(item);
}
Console.ReadKey();

練習22:承上,顯示姓王的同學的個數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//儲存用戶輸入的姓名
List<string> list = new List<string>();
while (true)
{
    Console.WriteLine("請輸入學生姓名,輸入quit退出");
    string name = Console.ReadLine();
    if (name.ToLower() == "quit") break; //當用戶輸入quit跳出循環
    list.Add(name);
}
Console.WriteLine($"你一共輸入了:{list.Count}個學生,姓名分別為:");

//記錄姓王的同學個數
int count = 0; 
foreach (var item in list)
{
    if (item[0] == '王') count++;
    Console.WriteLine(item);
}
Console.WriteLine($"姓王的同學有{count}個");

練習23:字串陣列內容反轉(不能用Reverse())

請將字符串數組{ “中國”, “美國”, “巴西”, “澳大利亞”, “加拿大” }中的內容反轉。然後輸出反轉後的數組。不能用數組的Reverse()方法。

要自己動手寫的話,需要透過循環,反轉需要Length/2次 (冒泡排序)

1
2
3
4
5
6
7
8
9
10
11
12
13
string[] names = { "中國", "美國", "巴西", "澳大利亞", "加拿大" };
for (int i = 0; i < names.Length / 2; i++) //反轉需要Length/2次
{
    string temp = names[i];
    names[i] = names[names.Length - 1 - i];
    names[names.Length - 1 - i] = temp;
}

//轉出看結果
foreach (var item in names) {
    Console.WriteLine(item);
}
Console.ReadKey();

練習24:物件導向-繼承、屬性、重寫、virtual方法

創造一個Person類,其包含:屬性: 姓名、性別、年齡,方法:SayHi()。
再創造一個Employee類繼承Person類,擴展屬性Salary,重寫SayHi()方法

  • 要能重寫方法,必須要標記為虛方法virtual或是抽象方法abstract
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//創造一個Person類,其包含:屬性: 姓名、性別、年齡,方法:SayHi()。 
public class Person
{
    public string Name { get; set; }
    public char Gender { get; set; }
    public int Age { get; set; }

    public virtual void SayHi() //標記為virtual
    {
        Console.WriteLine($"父類打招呼");
    }
}

//再創造一個Employee類繼承Person類,擴展屬性Salary,重寫SayHi()方法
public class Employee : Person
{
    public decimal Salary { get; set; }
    public override void SayHi()
    {
        Console.WriteLine("子類重寫父類方法-員工打招呼");
    }
}

冒泡排序

This post is licensed under CC BY 4.0 by the author.