20170305-今天的C#实验报告

实验目标: 掌握C#的基本用法
实验人: ZhangSiyang
实验内容: [C#特性演示,C#实现的冒泡排序,矩形每行成员及行内最大值的输出]

目录

C#特性演示

代码

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using System;
namespace ConsoleApplication1
{
class Program
{
static int Main(string[] args)
{
Program n = new Program(); //写的方法,马马虎虎的,仅作试水
Console.WriteLine("即将演示数字 A 与 B 的交换");
n.swap(3, 7);
Console.ReadLine();
//清屏
Console.WriteLine("即将演示 串的输入与输出");
n.xingminghenianling();
Console.ReadLine();
Console.WriteLine("即将演示 用 If 判断成绩");
n.panduanjige_if();
Console.ReadLine();
Console.WriteLine("即将演示 用 Switch 判断成绩");
n.panduanjige_switch();
Console.ReadLine();
Console.WriteLine("即将演示 用 Switch 判断该月天数");
n.panduantianshu();
Console.ReadLine();
Console.WriteLine("即将演示 分段函数");
n.fenduanhanshu();
Console.ReadLine();
Console.Write("演示完成,按任意键以退出");
Console.Read();
return 0;
}
public int swap(int a, int b)
{
Console.WriteLine("A IS: {0}, B IS: {1}.", a, b);
a = a * b; //也可以交换,就是这两个数不能太大,b还不能为0
b = a / b;
a = a / b;
Console.WriteLine("A IS: {0}, B IS: {1}.", a, b);
return 0;
}
public int xingminghenianling()
{
Console.Write("Please Input Your Name:");
string xingming = Console.ReadLine();
Console.Write("Please Input Your Eage:");
int nianling = int.Parse(Console.ReadLine());
Console.WriteLine("Your Name Is:{0},Eage Is:{1}", xingming, nianling);
return 0;
}
public int fengefu()
{
Console.WriteLine("------------------------"); //被弃用的分隔符
return 0;
}
public int panduanjige_if()
{
Console.Write("Please Input Your Score:");
double get = double.Parse(Console.ReadLine());
int score = -1;
if (get >= 0 && get <= 100)
{
score = (int)get / 10;
if (score > 8)
Console.WriteLine("Nice!!!");
else if (score > 5)
Console.WriteLine("Good!!");
else
Console.WriteLine("It's Time To Learn.");
}
else
Console.WriteLine("大哥你这不按套路出牌啊!");
return score;
}
public int panduanjige_switch()
{
Console.Write("Please Input Your Score:");
double get = double.Parse(Console.ReadLine());
int score = -1;
string flag;
if (get >= 0 && get <= 100)
{
score = (int)get / 10;
switch (score)
{
case 10:
case 9: flag = "Nice!!!"; break;
case 7:
case 8:
case 6: flag = "Good!!"; break;
default: flag = "It's Time To Learn."; break;
}
}
else
flag = "大哥你这不按套路出牌啊!";
Console.WriteLine(flag);
return score;
}
public int panduantianshu()
{
int mouth;
Console.WriteLine("What time is it today?");
mouth = int.Parse(Console.ReadLine());
string flag;
switch (mouth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: flag = "31"; break;
case 4:
case 6:
case 9:
case 11: flag = "30"; break;
case 2: flag = "28 OR 29"; break;
default: flag = "你进入了异世界"; break;
}
Console.WriteLine(flag);
if (flag == "28 OR 29")
flag = "28";
if (flag == "你进入了异世界")
flag = "0";
return int.Parse(flag);
}
public int fenduanhanshu()
{
double x;
int y;
Console.Write("Please Input X:");
x = (int)double.Parse(Console.ReadLine());
if (x > 0)
y = 1;
else if (x == 0)
y = 0;
else
y = -1;
Console.WriteLine("{0}", y);
return y;
}
}
}

运行

我们来做好朋友吧
这种行为就不好了

编写思路与难题

这道题是我写的第一个 C# 程序,再往前只有课上的纸上代码,不算是写程序。现在回头来但的话大概有一下几个特点:

分模块书写,制成方法体[体?]

一开始我也是打算写成一大坨代码的,写着写着感觉 C# 比 C 啰嗦多了,十四寸的本上翻页翻得我直着急。所以……当然是写成函数方法啦!还能以后再用,虽然不大可能……

更多的考虑到了意外情况

其实之前我在编写 C 程序时也有这方面的考虑,但是写十行代码其中有九行都是数据检查未免太让人感觉尴尬了,代码也不够高效。但是最近又在想,现在电脑性能这么好,简单的程序错误却可能导致用户流失,我还是把心中所想放到代码之中吧。心中没有想到的当然也就没有进行检查了

想不到检查方法的也没有写,检查方法忒复杂的也没有写……

编写时遇到的的困难

  1. 写成的方法不知道怎么被 Main 调用; 这个在 Google 之后解决了,但也只是照猫画虎
  2. 该怎么输入与存储成绩才好?一开始是用 int score = int.Parse(Console.ReadLine()) / 10 的,可那样无法解决带小数成绩的录入以及对数据合法性的判断。
    为了带小数成绩我写出了 int score = (int)double.Parse(Console.ReadLine()) 这样的方法,但这样还是无法解决数据合法性[ 102 居然是合法数据,你信吗?],综合考虑之后,下面的解决方案诞生:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public int panduanjige_switch()
    {
    Console.Write("Please Input Your Score:");
    double get = double.Parse(Console.ReadLine());
    int score = -1;
    string flag;
    if (get >= 0 && get <= 100)
    {
    score = (int)get / 10;
    switch (score)
    {
    case 10:
    case 9: flag = "Nice!!!"; break;
    case 7:
    case 8:
    case 6: flag = "Good!!"; break;
    default: flag = "It's Time To Learn."; break;
    }
    }
    else
    flag = "大哥你这不按套路出牌啊!";
    Console.WriteLine(flag);
    return score;
    }
  3. 对!还有问题。我想把某一个月份含有的天数返回给主调函数,当遇上 2 月时,怎么办?!!!

    1
    2
    3
    4
    5
    6
    Console.WriteLine(flag);
    if (flag == "28 OR 29")
    flag = "28";
    if (flag == "你进入了异世界")
    flag = "0";
    return int.Parse(flag);

收获

  1. Program n = new Program();
  2. Console.Clear
  3. 有时候,把程序写的复杂点也不是什么什么坏事儿

C#-冒泡排序

代码

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
40
41
42
43
44
45
46
47
48
49
50
51
using System;
namespace Bubble_Sort
{
class Program
{
static void Main(string[] args)
{
Random rd = new Random(); //为随机赋值做准备[这个过程不知道叫什么]
int[] box = new int[27];
for (int i = 0; i < 27; i++)
{
box[i] = rd.Next(1000); //随机赋值
}
int s; //交换用的空盒子
for (int i = 0; i < 27; i++)
{
Console.Write("{0:D3} ", box[i]); //以宽度为三的格式输出
if ((i + 1) % 5 == 0) //逢五换行
Console.Write("\n");
}
Console.WriteLine("\n\n以上是初始数组,下面是排序之后的数组\n");
for (int i=0;i<26;i++) //冒泡排序
{
for(int j=i+1;j<27;j++)
{
if(box[j]>box[i])
{
s = box[i]; //数值交换
box[i] = box[j]; //数值交换
box[j] = s; //数值交换
}
}
}
for (int i = 0; i < 27; i++) //交换完成,输出
{
Console.Write("{0:D3} ", box[i]);
if ((i+1) % 5 == 0)
Console.Write("\n");
}
Console.Write("\n按任意键以退出");
Console.ReadLine();
}
}
}

运行

Bubble_Sort

编写思路与难题

写这道题的时候已经熟练了不少了,因此也没太多值得说的

  1. Random.Next() 返回的值随机性太差了,只能用来做范例
  2. 换行这样做:

    1
    2
    if ((i + 1) % 5 == 0) //逢五换行
    Console.Write("\n");

    大概没有更好的方法了吧

  3. 格式化表示法变了,有点不适应, Google 解决
  4. 也许可以自制一个退出提示,为了命令提示符下运行的用户
    1
    2
    Console.Write("\n按任意键以退出");
    Console.ReadLine();

收获

  1. for 循环的效率比 foreach 高一点点
  2. Console.Write("{0:D3} ", box[i]);
  3. Console.Write("{0:000.000} ", box[i]);

多维数组相关操作

代码

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
using System;
namespace ShuchuJuzhenZuidazhi
{
class Program
{
static void Main(string[] args)
{
Random rd = new Random();
double[,] box = new double[8,8];
int add;
for(int i=0;i<8;i++)
{
for (int n = 0; n < 8; n++)
box[i,n] = rd.Next(1000) / 7.0;
}
for (int i = 0; i < 8; i++)
{
add = 0;
for (int n = 0; n < 8; n++)
{
Console.Write("{0:000.000} \t", box[i, n]);
if (box[i, n] > box[i, add])
add = n;
}
Console.WriteLine("\t\t### MAX IS {0:.000}", box[i, add]);
}
}
}
}

运行

数组相关

编写思路与难题

  1. 定义多重数组,并为之赋值
  2. 每行成员以及行内最大值的输出
    困难:越到最后越是没有什么话说,这里主要遇到的是数组的声明及使用。嘛,也很简单 box[i, n]

    收获

  3. 多多思考程序的界面设计,不要看起来一片模糊
  4. Console.Write("{0:000.000} \t", box[i, n]);
  5. Console.WriteLine("\t\t### MAX IS {0:.000}", box[i, add]);