您的当前位置:首页正文

合工大.net程序设计与系统开发实验报告

2023-01-23 来源:榕意旅游网


《.NET程序设计与系统开发》课程实验报告

姓名(学号) 分工 成绩

实验时间 2016 实验地点

专业电子商务13-01班 所在学院管理学院 指导老师

一、实验目的

实验一:C#语法基础实验

配合课程教学,通过实际上机练习,熟练掌握和运用C#基本语法,能运用它进行控制台应用程序设计;熟悉VISUAL STUDIO.NET开发平台;熟悉控制台应用程序的调试经验和技巧。

实验二:C#语法高级实验

进一步熟悉和掌握C#语言,增强程序调试经验和技巧;锻炼综合运用所学知识能力,能设计和解决适当问题。

二、实验要求

实验一:C#语法基础实验

实现实验内容提要中规定的各项需求;独立(或合作或在别人协助下或老师指导下)创造性地完成实验,严禁抄袭;实验结束,提交实验报告。

基于VISUAL STUDIO.NET平台开展实验,学会如何建立控制台应用的项目工程。 掌握以下语法知识: (1)数据类型;

(2)运算符、表达式、语句; (3)数组、字符串、迭代器; (4)异常处理与预处理指令; (5)类与接口; (6)事件与委托。 实验二:C#语法高级实验

实现实验内容提要中规定的各项需求;独立(或合作或在别人协助下或老师指导下)创造性地完成实验,严禁抄袭;实验结束,提交实验报告。所建工程类型可以为:控制台应用、windows窗体应用、ASP.NET web应用。

三、实验内容

实验一:C#语法基础实验

任务1 判断每个输入的数是否可被3,5和7整除,并将整除状态输出。 要求:

(1) 掌握VISUAL C#.NET的基本调试技巧。演示调试情况,会跟踪变量的值,会设置和取

消断点,会跟踪如何进入函数内部

(2) 对每个输入数,分别输出对3,5和7的整除状态; (3) 能实现多次输入输出,最好能有一些输入提示; (4) 亦可同时输入和处理多个数,并输出多个数的整除状态。 (5) 考虑使用switch 或if。

任务2 练习使用for、while、do while、foreach in等循环语句。 要求:

(1) 上述循环语句至少使用1次; (2) 至少有1题采用了string类实现; (3) 至少有1题采用了集合类实现; 任务3 绘图输出y=a*sin(c*x + b)

输出字符三角形

A AAA AAAAA AAAAAAA AAAAAAAAA

B BBB BBBBB 输出字符菱形

A AAA AAAAA AAAAAAA AAAAAAAAA AAAAAAA AAAAA AAA A B BBB BBBBB BBB B

输出背靠背字符三角形

W W WW WW WWW WWW WWWW WWWW B B BB BB BBB BBB

输出交替字符倒三角形

STSTS STS S

STSTSTSTSTSTSTSTSTS STSTSTSTSTSTSTSTS STSTSTSTSTSTSTS STSTSTSTSTSTS STSTSTSTSTS STSTSTSTS STSTSTS STSTS STS S

要求:

(1) 系数a, b和c是可以变化的,可考虑是从键盘输入的,或通过Main方法参数传递的; (2) x的取值范围在0~4π之间,x,y值采用四舍五入;

提示:根据输入参数,先生成一组数据(x, y),可考虑循环生成,四舍五入;在相应位置输出*或#。

任务4 练习使用文件操作(选做) 要求:

(1)采用程序生成杨辉三角,在屏幕上显示; (2)创建目录,并将文件存入硬盘; (3)读取文件并在屏幕上显示;

(4)复制文件、获取文件属性和其所在驱动器信息,并在屏幕上显示; (5)创建目录列表,并在屏幕上显示; 提示:

(1) 使用.NET框架中的相关操作类。

实验二:C#语法高级实验 任务1实验结果分析。

遗传算法(genetic algorithm)是模仿生物进化的智能算法,广泛用于组合优化等各类优化问题。其过程包括编码(coding)、初始化(initialization)、选择selection/reproduction、交叉(crossover)、变异(mutation)、解码(decoding)、评估(evaluation)等过程,其中交叉算子、选择方式和适应度值的定标处理对算法的性能有很大影响。通常,针对不同问题选择不同组合,才能更好地解决问题。

常用的交叉算子、选择方式和定标处理方法如表1-3所示。下面文件(scheme48.dat)是为了

* * * * * * *

* * * * * * * * * * # # #

# # # # # #

测试某一组合优化问题的最佳参数组合得到,参数组合的个数为4*6*5=120,每个组合运行10次,得到该文件,示例如下: 50612.9(最小值)

OnePointCrossover,GARouletteWheelSelector,GANoScaling(参数组合) run no. gen value(第几次运行 最佳个体首次出现代 适应度值) 0 757 50626.9 1 537 50612.9 2 720 50612.9 3 615 50626.9 4 722 50612.9 5 738 50626.9 6 672 50626.9 7 770 50612.9 8 505 50612.9 9 704 50626.9

OnePointCrossover,GARouletteWheelSelector,GALinearScaling run no. gen value 0 746 50612.9 1 636 50612.9 „

试进行以下分析:

 统计每个组合的10次运行中,达到最小值的次数;

 每个组合的10次运行中,最佳个体首次出现代的最大、最小、平均值及方差; 要求:

(6) 掌握VISUAL C#.NET的基本调试技巧。演示调试情况,会跟踪变量的值,会设置和取消断点,会跟踪如何进入函数内部

(7) 为简化输出,根据表1-3中的简写,简写每个参数组合,如: OnePointCrossover,GARouletteWheelSelector,GANoScaling的简写是cO,rW,sN (8) 输出格式要求如下: The minimal is 50612.9. num min max mean fdev cO,rW,sN: 5 505 770 650 120.704 cO,rW,sL: 7 570 800 697 81.8199 cO,rW,sP: 9 475 792 658 108.15 cO,rW,sT: 7 419 749 557 130.321 cO,rW,sS: 6 445 780 625 119.749 cO,rT,sN: 8 451 764 640 125.493 cO,rT,sL: 8 290 800 610 191.336 cO,rT,sP: 8 174 795 481 277.053 cO,rT,sT: 10 63 784 425 228.205 cO,rT,sS: 7 293 700 509 172.407 数字为右对齐

num min max mean fdev分别表示10次运行中达最小值的次数、最小代、最大代、达最小值代的平均值以及方差。

(9) 将结果存入文件,输入和输出文件名均采用键盘输入方式,即使用main函数的参数实现;

(10) 程序要通用,可处理类似问题。 提示:

(1) 需采用循环读入方式,如for;

(2) 每读完12行做1次处理,第一次是读13行,可通过增加1循环状态变量实现; (3) 使用System.IO.File类/StreamWriter/ StreamReader进行文件操作 (4) 采用集合类,如List, ArrayList等;

(5) 使用字符串函数IndexOf、LastIndexOf、StartsWith、EndsWith、substr; (6) 使用数学函数:幂函数Pow(x,y)、平方根Sqrt(x); (7) 输出方式控制WriteLine,

(8) 集合类中的Equals和CompareTo方法实现比较和排序 (9) 标准方差和均值的计算公式如下:

表1交叉算子一览表 交叉算子 英文 简称 单点 OnePointCrossover cO 两点 TwoPointCrossover cT 均匀 UniformCrossover cU 奇偶 EvenOddCrossover cE 表2选择方式一览表 选择方式 英文 简称 赌轮 GARouletteWheelSelector rW 联赛 GATournamentSelector rT 排序 GARankSelector rR 均匀 GAUniformSelector rU

确定性采样 GADSSelector, deterministic sampling selector rD 随机余数采样 GASRSSelector, stochastic remainder sampling selector rS 表3适应度值定标处理方法一览表 定标处理方法 英文 简称 无定标 GANoScaling sN 线性 GALinearScaling sL 幂函数 GAPowerLawScaling sP σ截断 GASigmaTruncationScaling sT 适应值共享 GASharing fitness sharing sS

任务2 日期处理类的设计、实现与测试 基本描述

有许多日期处理的工作需要做。 1)统计天数

旅游公司要统计每个人出差在外的总天数,手头上有每个人出差在外的起始和回来的考勤时间,给定一堆日期区间,将其所有的天数统计出来。 2)推排日期

旅游公司要估计某个导游何时可以接受下一次任务,并开列了一张当前导游们还需要几天才

能将手头工作做完的清单,请按接受任务的早晚列出导游名字和可以接受任务的日期。 3)确定天数

某月某日是个重要的旅游旺日,为了准备迎接这个日子,须知道该日子离现在还有几天,以便倒计时。 4)星期几

某个日子是星期几,这是首先应该知道的,甚至是几年以后的某一天也不例外。 5)安排会议

会议议程横跨某个时间区间,但是已经有一些日子安排了其他工作,需要在没有被安排的时间段中,找出最适合开会的时间。

为了使开会时间最大程度地避开其他占用的时间,会议安排应选择尽可能长的未安排时间区段,并且从中间划出开会区段。如果最长的未安排区段有多个,则应尽量早安排会议,所以如果两边间隔不对称,则也应取靠前安排。这就是所谓的最适合开会的时间。 请编程将这几个功能串在一起,用一个菜单驱动。

输入描述: 1)统计天数

输入中含有若干组数据,每组数据包括名字、日期和出去(out)的回来(back)的标记。名字长度在[1,10]之间,日期为合法的yyyy-mm-dd格式的日期。对于某个人来说,出去与回来的日期成对出现,先出去后回来,出去与回来的日期区间也不交叉。 示例:days.txt

Zhangsan 2005-10-23 out Lisi 2005-08-09 out

Zhangsan 2005-12-01 back Lisi 2005-08-15 back

2)推排日期

第一行是当前日期(yyyy-mm-dd),以后是每个导游的名字(名字长度在[1,10]之间)以及完成当前工作的所需要的天数n(0≤n≤1000)。 示例:date.txt 2006-10-22 Zhangsan 12 Lisi 3

3)确定天数

第一行是当前日期(yyyy-mm-dd),后面是若干行日期,分别表示各个节日名称(没有空格隔开的字串)和日期(yyyy-mm-dd)。 示例:future.txt 2006-12-22

LabourDay 2008-05-01 NewYear 2008-01-01 NationalDay 2008-10-01 BeijingOlympiad 2008-08-08 4)星期几

输入有若干个日期,日期之间以空格或回车隔开。 示例:week.txt 2008-02-22

2006-11-20 2008-03-08 5)安排会议

第一行是两个日期和一个整数,表示会议只能是这个日期区段中的某个子集,整数表示会议需要的天数。

接着若干行中每行用2个日期表示时间区段,那是已经有了其他安排的日期,如果每行中只有一个日期,说明该时间区段只包含1天。 示例:meeting.txt

2006-10-23 2006-12-24 5 2006-10-27 2006-11-02 2006-11-06 2006-11-07 2006-11-14 2006-11-19 2006-11-21

2006-11-29 2006-12-09 2006-12-14 2006-12-20 输出描述 1)统计天数

按名字的字母顺序输出,输出其名字和合计天数,每个人的数据占一行。名字按10位的宽度并且左对齐,而合计天数按5位宽度并且右对齐。在开始输出前,首先输出一行“统计天数:”。输出至文件days.out或屏幕 2)推排日期

按完成工作的先后顺序排列,如果完成工作日期相同,则按名字字母顺序排列。每人信息占一行,名字将按宽度11个字符左对齐。开始输出前,输出一行“推排日期:”。输出至文件date.out或屏幕 3)确定天数

按节日离当前日期的远近排列,近者靠前。若2个日期一样,则按字母顺序排列。每个节日名称与天数列一行,节日名称与天数之间空一行。开始输出前,首先输出一行“确定天数:”。输出至文件future.out或屏幕 4)星期几

输出每个日期所对应的星期几,星期几以三位英文缩写字母表示,每个日期占一行。开始输出前。输出“星期几:”。输出至文件week.out或屏幕 5)安排会议

要从未被安排的日期区段中寻找最适合开会的时间,输出该日期。在开始输出前,输出“安排会议:”。输出至文件meeting.out或屏幕 要求:

(1) 考虑自定义拷贝构造函数、构造函数默认参数、字符串参数、c-串参数、整数参数;

(2) 使用抽象类做基类,考虑使用虚函数; (3) 数据成员为私有;

(4) 考虑内联函数;体现成员函数重载; (5) 考虑异常处理; (6) 考虑使用委托;

(7) 能检查日期的合法性,不合法给出提示;

(8) 有日期输出功能;日期输出时注意格式的设定,可根据枚举型值决定输出格式;

(9) 可更改日期值;

(10) 可直接进行日期对象赋值操作; (11) 可根据日期判定是否闰年;

(12) 能实现绝对天数与年月日间的相互转换; (13) 借助new可创建类对象;

(14) 体现操作符重载,如+,++, <<,>>,--,==,+=,!=,<,-,-=; (15) 实现菜单操作。 提示:

(1) 需使用using system,用于清屏和获取屏幕输入ReadKey(),ReaLline();

(2) 将每个功能作为一个函数,它们是同类型的,为了调用方便,可将它们做成函数指针数组,调用起来比较方便。

(3) 老师可先讲解主程序结构,即菜单实现,可指导学生一块一块实现; (4) 可考虑采用日期的天数版

四、实验步骤

实验一:C#语法基础实验

实验方法:在VISUAL STUDIO.NET平台编程完成相应任务,并测试通过。 实验步骤:

1、组长确定组员任务分工;

2、分别熟悉实验任务,熟悉实验环境; 3、各组员开发和测试各自的任务;

4、各组员撰写各自任务的实验报告,形成自己的实验报告;

5、组长将组员的报告合并,包括整体工作,形成本组报告,封面写上所有组员名字,内部在相应部分标示组员工作。

设备或工具使用说明

硬件平台:计算机、服务器、集线器、交换机; 系统平台:Windows

开发语言: Visual C#.NET

开发平台:VISUAL STUDIO.NET

实验二:C#语法高级实验

实验方法:在VISUAL STUDIO.NET平台编程完成相应任务,并测试通过。 实验步骤:

1、组长确定组员任务分工;

2、分别熟悉实验任务,熟悉实验环境; 3、各组员开发和测试各自的任务;

4、各组员撰写各自任务的实验报告,形成自己的实验报告;

5、组长将组员的报告合并,包括整体工作,形成本组报告,封面写上所有组员名字,内部在相应部分标示组员工作。

设备或工具使用说明

硬件平台:计算机、服务器、集线器、交换机;

系统平台:Windows

开发语言: Visual C#.NET

开发平台:VISUAL STUDIO.NET

五、实验结果

系统的运行及测试情况。 测试情况: 实验一: 任务一:

任务二:

任务三:

任务四:

实验二: 任务一:

任务二:

六、实验体会及思考题讨论

(1)梳理和总结自己的收获,积累经验;

(2)对有关思考题的讨论。 实验一思考题:

1、如何添加和移除文件的访问控制列表?

要在文件中添加或从文件中移除访问控制列表 (ACL) 项,必须从文件或目录中获得 FileSecurity 或 DirectorySecurity 对象,对其进行修改,然后重新应用回相应的文件或

目录。

在文件中添加或移除 ACL 项

调用 GetAccessControl 方法以获取包含文件的当前 ACL 项的 FileSecurity 对象。 在从步骤 1 返回的 FileSecurity 对象中添加或移除 ACL 项。 将 FileSecurity 对象传递到 SetAccessControl 方法以应用更改。 在目录中添加或移除 ACL 项

调用 GetAccessControl 方法以获取包含目录的当前 ACL 项的 DirectorySecurity 对象。

在从步骤 1 返回的 DirectorySecurity 对象中添加或移除 ACL 项。

将 DirectorySecurity 对象传递到 SetAccessControl 方法以应用更改。 示例

using System;

using System.IO;

usingSystem.Security.AccessControl;

namespaceFileSystemExample {

classFileExample {

public static void Main() { try

{

stringfileName = \"test.xml\";

Console.WriteLine(\"Adding access control entry for \" + fileName); // Add the access control entry to the file.

AddFileSecurity(fileName,@\"DomainName\\AccountName\ghts.ReadData, AccessControlType.Allow);

Console.WriteLine(\"Removing access control entry from \" + fileName);

// Remove the access control entry from the file. RemoveFileSecurity(fileName, @\"DomainName\\AccountName\FileSystemRights.ReadData, AccessControlType.Allow); Console.WriteLine(\"Done.\");

}catch (Exception e)

{ Console.WriteLine(e); } }

// Adds an ACL entry on the specified file for the specified account. public static void AddFileSecurity(string fileName, string account, FileSystemRights rights, AccessControlTypecontrolType) {

// Get a FileSecurity object that represents the // current security settings.

FileSecurityfSecurity = File.GetAccessControl(fileName);

// Add the FileSystemAccessRule to the security settings.

fSecurity.AddAccessRule(new FileSystemAccessRule(account,rights, controlType)); // Set the new access settings.

File.SetAccessControl(fileName, fSecurity); }

// Removes an ACL entry on the specified file for the specified account.

public static void RemoveFileSecurity(string fileName, string account, FileSystemRights rights,AccessControlTypecontrolType) {

// Get a FileSecurity object that represents the

// current security settings.

FileSecurityfSecurity = File.GetAccessControl(fileName);

// Add the FileSystemAccessRule to the security settings. fSecurity.RemoveAccessRule(new

FileSystemAccessRule(account,rights,controlType)); // Set the new access settings.

File.SetAccessControl(fileName, fSecurity); } } } 编译代码

您必须提供有效的用户或组帐户才能运行此示例。此示例使用 File 对象;不过,对于 FileInfo、Directory 和 DirectoryInfo 类使用同一过程。

2、控制台应用程序的主菜单实现?

控制台菜单选项的实现 (1)使用if else入门

程序清单 1 用if else作分支处理(V0.1) void CmdRunning() { int iCmdNum; do {

printf(\"请选择:0. 退出;1. 新建文件;2. 打开文件;3.保存文件

\\n\"); scanf(\"%d\

printf(\"谢谢使用,再见!\\n\"); }

else if (1 == iCmdNum) { CreateFile(); } else if (2 == iCmdNum) { OpenFile(); }

else if (3 == iCmdNum) { SaveFile(); } else {

printf(\"对不起,你选择的数字不存在,请重新选择!\\n\"); } }while(iCmdNum!=0); }

细心的同学可能会发现,这段程序存在一个很严重的Bug,比如,运行程序后输入字符’a’(非数字),回车,死循环出现了。为什么会出现这种情况呢?原因是scanf只能将缓冲区中的数字(使用了%d)读入iCmdNum,并清空缓冲区,而我们输入的是非数字,那么scanf读入失败,失败了它也就不会去清空缓冲区,这样造成的结果就是,我们不需要再输入其它字符,scanf每次都会去读缓冲区。

(2)入口检查

“scanf(\"%d\”语句是V0.1版本出现死循环的关键,那么我们不妨先从这里入手。其实只要将“%d“改为“%c”,即可解决死循环问题。比如: scanf(\"%c\是一个字符变量

iCmdNum = atoi(&chCmd); // 将chCmd转换为整型数值

这样做就能够解决死循环问题

(3)用switch简化逻辑

由于使用if else处理多分支选项显得更加繁琐且效率低下,它必须一个一个分支的判断,而处理多分支比较容易想到的就是switch 语句了。为了避免出现V0.1中的死循环,我们后面的例子将使用另外一个输入函数,代码详见程序清单3。

程序清单 3 用switch语句做分支处理(V0.3) 1voidCmdRunning() 2 { 3 int iCmdNum = 0;1 4

5 do{ 6 printf(\"请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\\n\"); 7 iCmdNum = getchar(); // 获得一个字符

8 fflush(stdin); // 清空缓冲区

9 switch(iCmdNum) { 10 case '0': 11 printf(\"谢谢使用,再见!\\n\"); 12 break; 13 case '1':

14 CreateFile(); 15 break; 16 case '2':

17 OpenFile(); 18 break; 19 case '3':

20 SaveFile(); 21 break; 22

default:

23 printf(\"对不起,你选择的数字不存在,请重新选择!\\n\"); 24 }

25 }while('0' != iCmdNum); 26 }

实验二思考题:

1、如何实现数据的比较和排序? 见实例对DATETABLE的比较排序:

protected void Page_Load(object sender, EventArgs e) {

DataTabledt = new DataTable(); dt.Columns.Add(\"Name\");

dt.Columns.Add(\"Age\");//因为是字符串,所以排序不对 dt.Rows.Add(\"小明\dt.Rows.Add(\"小张\dt.Rows.Add(\"小红\dt.Rows.Add(\"小伟\dt.Rows.Add(\"小美\

dt.DefaultView.Sort = \"Age ASC\"; dt = dt.DefaultView.ToTable();

foreach (DataRow s in dt.Rows) {

Response.Write(s[\"Age\"].ToString() + \"--\" + s[\"Name\"].ToString() + \"
\"); }

Response.Write(\"------------------1----------------
\");

#region 方法1:将年龄补齐为2位,然后再进行排序,但是实际不应该有0(仅作参考)

for (int i = 0; i dt.Rows[i][\"Age\"] = dt.Rows[i][\"Age\"].ToString().PadLeft(2, '0'); }

dt.DefaultView.Sort = \"Age ASC\";

dt = dt.DefaultView.ToTable();

foreach (DataRow s in dt.Rows) {

Response.Write(s[\"Age\"].ToString() + \"--\" + s[\"Name\"].ToString() + \"
\"); }

#endregion

Response.Write(\"------------------2----------------
\");

#region 方法2:创建新的DataTable,将Age类型变更为int类型 DataTabledtNew = dt.Clone();

dtNew.Columns[\"Age\"].DataType = typeof(int);//指定Age为Int类型 foreach (DataRow s in dt.Rows) {

dtNew.ImportRow(s);//导入旧数据 }

dtNew.DefaultView.Sort = \"Age ASC\"; dtNew = dtNew.DefaultView.ToTable();

foreach (DataRow s in dtNew.Rows) {

Response.Write(s[\"Age\"].ToString() + \"--\" + s[\"Name\"].ToString() + \"
\"); }

#endregion

Response.Write(\"-----------------3-----------------
\");

#region 方法3:添加一列,主要用于排序

dt.Columns.Add(\"AgeLength\添加该列时,DataTable列数据即生成

dt.DefaultView.Sort = \"AgeLength,Age ASC\"; dt = dt.DefaultView.ToTable();

foreach (DataRow s in dt.Rows) {

Response.Write(s[\"Age\"].ToString() + \"--\" + s[\"Name\"].ToString() + \"
\"); }

#endregion

Response.Write(\"-----------------4-----------------
\");

#region 方法4:运用LinQ,将DataTable转换为集合,再调用集合自带的排序方法进行排序

foreach (DataRow s in dt.Rows.Cast().OrderBy(r =>int.Parse(r[\"Age\"].ToString()))) {

Response.Write(s[\"Age\"].ToString() + \"--\" + s[\"Name\"].ToString() + \"
\"); }

#endregion }

2、如何事件与委托模式?

事件是对象发送信号的行动发生的消息。该操作可能引起的用户交互,例如鼠标单击,或可能会引起一些其他的程序逻辑。该事件引发(触发器)的对象称为事件发送方。捕获事件,并对其作出响应的对象称为事件接收器。在事件通讯中,发件人的事件类不知道哪个对象或方法将接收(句柄)它引发的事件。我们需要的是中介人(或类似于指针机制)源和接收方之间。

.NET 框架定义了一种特殊类型(委托)所提供的功能的函数指针。委托是一类可以包含对方法的引用。与其他类不同,委托类具有一个签名,按住它可以只对匹配其签名的方法的引用。

七、附件

1、程序流程图

2、关键核心代码 实验一:

任务一: using System;

usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;

usingSystem.Threading.Tasks;

namespace Mission_1 {

class Program {

static void Main(string[] args) { int a;

string x; string y; string z; stringfff;

Boolean w; w = true;

for (int b = 1; w == true; b++)

{

Console.WriteLine(\"\\n请输入第\" + b + \"轮数字(数字之间使用空格)\");

stringsss = Console.ReadLine(); string[] c= sss.Split(' ');

int[] intArray = Array.ConvertAll(c, s =>int.Parse(s));

for (int i = 0; i a = intArray[i];

if (a % 3 == 0)

{

x = \"能被三整除\"; } else

{

x = \"不能被三整除\"; }

if (a % 5 == 0)

{

y = \"能被五整除\"; } else

{

y = \"不能被五整除\"; }

if (a % 7 == 0)

{

z = \"能被七整除\"; } else

{

z = \"不能被七整除\"; }

Console.WriteLine(a + \"的整除情况是:\\n\" + x + \";\" + y + \";\" + z); }

Console.WriteLine(\"\\n输入z结束输入,输入其它继续下一轮数字输入\\n\");

fff = Console.ReadLine(); if (fff == \"z\")

{

w = false; } } } } }

任务二: using System;

usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;

usingSystem.Threading.Tasks;

namespace Mission_2 {

class Program {

static void Main(string[] args) {

//练习使用for、while、do while、foreach in等语句

//输出字符三角形 string a = \" \";

Console.WriteLine(\"输出字符三角形\"); for (int i = 1; i < 6; i++) { int w;

for (w = 6 - i; w > 1; w--) { Console.Write(a); }

for (int q = 1; q < 2*i; q++) { Console.Write(\"A\"); } Console.WriteLine(\"\"); }

for (int i = 1; i < 4; i++) { int w;

for (w = 6 - i; w > 1; w--) { Console.Write(a); }

for (int q = 1; q < 2 * i; q++) { Console.Write(\"B\"); } Console.WriteLine(\"\"); }

//输出背靠背字符三角形

Console.WriteLine(\"输出背靠背字符三角形\"); int z = 1; while (z < 5) { int w = 5 - z; int x = 1; while (x < w)

{ Console.Write(\" \"); x++;

} int y1 = 0; while (y1 < z)

{ Console.Write(\"W\"); y1++;

} Console.Write(\" \"); int y2 = 0; while (y2 < z)

{ Console.Write(\"W\"); y2++;

} Console.WriteLine(\"\"); z++;

}

z = 1; while (z < 4) { int w = 4 - z; int x = 1; while (x < w)

{ Console.Write(\" \"); x++;

} int y1 = 0; while (y1 < z)

{ Console.Write(\"B\"); y1++;

} Console.Write(\" \"); int y2 = 0; while (y2 < z)

{ Console.Write(\"B\"); y2++;

} Console.WriteLine(\"\"); z++;

}

//输出字符菱形

Console.WriteLine(\"输出字符菱形\"); z = 1; do

{ int w = 6 - z; int x = 1;

do { Console.Write(\" \"); x++;

} while (x{ Console.Write(\"A\"); y1++;

} while (y1<=2*z-1); Console.WriteLine(\"\"); z++;

} while (z<=4); int xx = 1; do

{

Console.Write(\"A\"); xx++;

} while (xx<2*z); Console.WriteLine(\"\"); do

{ int w = 7 - z; int x = 1; int y1 = 1; do

{ Console.Write(\" \"); x++;

} while (x { Console.Write(\"A\"); y1++;

} while (y1 < 2*z-2); Console.WriteLine(\"\"); z--;

} while (z >1);

z = 1; do

{ int w = 4 - z; int x = 1; do

{ Console.Write(\" \"); x++;

} while (x < w); int y1 = 1; do

{

Console.Write(\"B\"); y1++;

} while (y1 <= 2 * z - 1); Console.WriteLine(\"\"); z++;

} while (z <= 2); xx = 1; do

{ Console.Write(\"B\"); xx++;

} while (xx < 2 * z); Console.WriteLine(\"\"); do

{ int w = 5 - z; int x = 1; int y1 = 1; do

{ Console.Write(\" \"); x++;

} while (x < w); do

{ Console.Write(\"B\"); y1++;

} while (y1 < 2 * z - 2); Console.WriteLine(\"\"); z--;

} while (z > 1);

//输出交替字符倒三角形

Console.WriteLine(\"输出交替字符倒三角形\"); xxx.aa(3); xxx.aa(10);

Console.WriteLine(\"\\n图形全部绘制完成\");

}

} }

class xxx {

public static void aa(int ii) {

for (int b = 1; b <= ii; b++) {

for (int r = 1; r < b; r++) {

Console.Write(\" \");//输出图像上的空格 }

for (int c = 1; c <= 2 * (ii - b) + 1; c++) { if (c % 2 == 1)

{

Console.Write(\"S\");//输出图像上的s字母 } else

{

Console.Write(\"T\");//输出图像上的t字母 }

}

Console.WriteLine(\"\"); } } }

任务三: using System;

usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;

usingSystem.Threading.Tasks;

namespace Mission_3 {

class Program {

static void Main(string[] args) {

Console.Title = \"绘制 y = a * sin(c * x + b) 正弦曲线图像\"; while (true) { try

{ double a, b, c;

Console.Write(\"请输入 a:\");

a = Convert.ToDouble(Console.ReadLine()); if (a == 0) throw new Exception(\"a 不能为0。\"); Console.Write(\"请输入 b:\");

b = Convert.ToDouble(Console.ReadLine()); Console.Write(\"请输入 c:\");

c = Convert.ToDouble(Console.ReadLine()); Console.WriteLine();

// 纵坐标 y 取值从 -a 到 a

// 0.2 越小画的范围越大,曲线越精细 for (double y = -a; y <= a; y += 0.2) {

// 横坐标 x 取值从 0 到 4π for (double x = 0; x <= Math.PI * 4; x += 0.2) {

if (Math.Abs(y + Math.Sin(c * x + b)) < 0.092) // 一个字符高度大约0.46,0.092 = 0.2 * 0.46

Console.Write(\"#\"); else

Console.Write(\" \");

} Console.WriteLine();

} } catch (Exception ex) {

Console.WriteLine(\"\\r\\n错误!\\r\\n\" + ex.ToString()); }

Console.WriteLine(\"\\r\\n按任意键继续 ...\"); Console.ReadKey(); Console.Clear(); } } } }

任务四: using System;

usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; using System.IO;

namespace Mission_4 {

class Program {

static void Main(string[] args) {

//在D盘创建一个文件夹 Directory.CreateDirectory(\"D:\\\est\");

//在文件夹下创建一个test的txt文件 Stream cc = File.Create(\"D:\\\est\\\est.txt\"); cc.Close();

//定义输出文件路径及对应文件 string path = \"D:\\\est\\\est.txt\"; //调用写入方法

TextWriter writer = File.AppendText(path);

//提示和接收信息

Console.WriteLine(\"请输入想要输出多少行的杨辉三角,建议小于10行\"); //防止输入小数时报错

intss = Convert.ToInt32(Math.Round(Convert.ToDouble(Console.ReadLine()), 0)); //防止输入小于等于0无法创建数组 if (ss<= 0)

{

Console.WriteLine(\"别开玩笑了^*^\"); } else

{

//建立一个存放数据的二维数组 int[,] datas = new int[ss, ss + 2];

//定义第一行的唯一一个数的值为1 datas[0, 1] = 1;

//循环计算出杨辉三角的数值

for (int i = 1; i for (int j = 1; j <= i + 1; j++) {

datas[i, j] = datas[i - 1, j - 1] + datas[i - 1, j]; } }

//循环输出杨辉三角 Console.WriteLine(\"杨辉三角\"); writer.WriteLine(\"杨辉三角\"); for (int i = 0; i //输出数值前面的空格 for (int m = 1; m < (ss - i); m++) { Console.Write(\" \");

//向文件中写入信息 writer.Write(\" \");

}

//输出数值 for (int j = 1; j <= i + 1; j++) {

Console.Write(datas[i, j].ToString() + \" \");

//向文件中写入信息 writer.Write(datas[i, j].ToString() + \" \"); } Console.WriteLine(); writer.WriteLine(); } Console.WriteLine(); }

//将writer方法关闭,防止占用 writer.Close();

//下面的代码读取文件

Console.WriteLine(\"读取文件中的内容为:\"); TextReader reader = File.OpenText(path); stringstr = null;

while ((str = reader.ReadLine()) != null) {

Console.WriteLine(str); } reader.Close();

Console.WriteLine();

//将文件夹中的test文件复制到copy文件中 File.Copy(path, \"D:\\\est\\\\copy.txt\

//显示文件属性

Console.WriteLine(\"文件的属性为:\"); Console.WriteLine(File.GetAttributes(path)); Console.WriteLine();

//获取所在驱动的信息并输出 DriveInfo record = new DriveInfo(path);

Console.WriteLine(\"所在驱动器卷标为:\"); Console.WriteLine(record.VolumeLabel); Console.WriteLine();

Console.WriteLine(\"所在驱动器名为:\"); Console.WriteLine(record.Name); Console.WriteLine();

Console.WriteLine(\"所在驱动器类型为:\"); Console.WriteLine(record.DriveType); Console.WriteLine();

Console.WriteLine(\"所在驱动器分区格式为:\"); Console.WriteLine(record.DriveFormat); Console.WriteLine();

Console.WriteLine(\"所在驱动器大小为:(字节)\"); Console.WriteLine(record.TotalSize); Console.WriteLine();

Console.WriteLine(\"文件路径为:\"); Console.WriteLine(path);

//防止.exe文件秒退 Console.ReadLine(); } } } 实验二: 任务一: 任务二:

3、运行与实验结果

心得体会

在科技高度发展的今天,计算机在人们之中的作用越来越突出。而C#作为一种计算机的语言,学习它将有助于我们更好的了解计算机,与计算机进行交流,因此,我们一定要学

好C#,这对我们以后的发展是十分重要的。

通过实验我也发现了自己不少的问题,这都是只看书上的程序而没有自己亲身上机编写程序而无法得知的,假如我们只因看熟书上的程序就以为自己已经掌握了C#那就大错特错了。

为了能更好地学好C#,在今后学习中我要更多的动脑,综合运用所学,多看相关东西,多上机练习,提高电脑水平,增强自学能力,把已会的东西掌握好。以下是我对如何学好C#的看法和意见:

1、 加深对课堂讲授内容的理解

课堂上要讲授许多关于c#的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c#这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c#的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。

学习c#不能停留在学习它的语法规则,而是利用学到的知识编写c#程序,解决实际问题。即把c#作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握c#、自己编写的程序是否能够正确地解题。 通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去\"掩盖\"程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c#的理解和程序开发能力。 2. 学习上机调试程序

完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。 3.多看多写

看一下别人写的代码,会养成一个好的编程习惯。但更重要的是,要看一下比较成熟的代码。多编多敲看了代码,就要写代码,,可以跟他们相同。这是了解他们的代码,也了解代码的执行过程。特别是在编译的时候,你会发现你的进步和不足。在失败中取得微小的成功,是一件很快乐的事情。在敲代码的时候,你会发现,你的很多英文都会输入错误。尽量多用“.”这个神奇的点,实质就是调用。不要一开始就是很困难、好多行的代码。这样你的自信心会被削弱的。自尊会被打击的。从最基本的学起。从一开始就慢慢体会代码重复利用的快乐。毕竟这样很节省代码的输入量,而且很能体现你的学习的效果。 4.多多交流

也许很简单的问题,都是一些很简单的属性设置的问题,或许一些你很想不到的边边角角的问题,你总是会感到迷茫,但是,不要担心,你要充分利用帮助文件和网络的资源。特别是,在学习C#的时候,很多人,很懒得安装MSDN,确实,那些占用很多空间。但那里面有很多好东西,会教你很多的属性的资料和很多方法。通过网络的搜索,很会找到很多有关的话题的解决方法,很多你遇到的问题,很有可能,早就被人发现和被人解决。你会在寻找问题的答案中,获得进步。发现问题和解决问题本身,就是一大进步。 5.发现新思路

编程最麻烦的就是套用老方式和老办法。你可以充分利用现有的对象,进行细化和增加新的属性。创新是编程最大的灵感。编程归根结底就是对控件属性的修改的过程,使之符合我们的需要。控件也叫做对象,你跟用户最直接的接触方式。修改的过程也就是函数的应用。通过对现有的控件的学习,你会发现,这些很基本,但是覆盖的面十分的宽广。也许,这些控件可能无法满足你的需要,你就会新建新的控件,来满足新的需要。但是,基本的控件你是必须要掌握的。 6.善于总结

在总结中,你会发现,你有很大的进步,也存在很多的不足。所以,你就会千方百计的改进你的工作方式和学习方法,使之不断进步。编程本身是一项创造性的工作。灵感来自客户的需要,来自市场的需要,来自用户的便捷操作,来自您对自己的信心

通过本学期C#上机实验,我对这个介于人类与非人类之间的计算机编程语言有了一定的体验。编程的时候有因为顺利编出程序而开心过、有因为做得比人家慢而郁闷过、有因为不知从何入手而无奈过、有因为不知错出在哪而彷徨过„„但随着练习的增多,我对C#比以前熟了很多,不再只是纸上谈兵,我都有能力独立做出一些程序,可能对于一些“高手来说这不算什么,或者他们早就会了,但我依然觉得很开心,因为我跟我自己比是进步了。

当然,我还得感谢老师的指导与帮助,如果没有老师和其他同学的指点,我可能对C#还是一筹莫展,在实验中遇到的大大少少的问题与所犯过的错误将是我以后的要加以注意的地方与认真审查的部分,为我奠定坚固的基石。伴随着学习的深入,我发现高深的东西还有很多很多,不懂不熟的知识还有很多,所以我不能停步,对C#,我以后会更加努力学习的

因篇幅问题不能全部显示,请点此查看更多更全内容