目录
【Part1】基本语法
基本框架
强转
输入
封装
方法
可空类型
数组
结构体
继承
运算符重载
【Part2】可视化基础控件
开发步骤
Label
textBox
RichTextBox
Botton
radioButton & Panel
checkBox
listBox 列表框
comboBox 下拉框
GroupBox 分组框控件
pictureBox 图片框
Timer 计时器
打开新窗口 Form2
ToolStrip 工具栏控件
MessageBox 消息对话框
openFileDialog控件 打开文件窗口
toolStrip控件 & toolStripLabel控件 判断文本是否被修改过
为Form添加FormClosing事件 提示改动保存
控件的基本语法
MDI
【Part3】实验题相关知识点
EXP3 打字软件
控件
代码:开始按钮
代码:交卷按钮
EXP4 记事本
控件
基本界面
代码:toolStrip工具栏相关
修改标识符的添加、关闭判断
【Part4】PPT题目
第一题:统计字符串出现字符的个数
第二题:计算输入任意个数的sum和average
第三题:输出n行杨辉三角
第四题:输入[1,n] 区间内的素数
第五题:求n项斐波那契数列
第六题:输入任意10个数,处理输出
六道题目的完整代码
【Part5】基本概念(15分问答题)
OOP基本概念
修饰符
类变量、方法
覆盖和重写
继承
抽象类
虚方法
接口
类 VS 结构
抽象类 VS 接口
using System;
namespace RectangleApplication
{
class Rectangle
{
//类
}
class ExecuteRectangle
{
static void Main(string[] args)
{
//主函数体
}
}
}
Console.ReadLine()
得到的是字符串,需要转为数字
函数 Convert.ToInt32() 把用户输入的数据转换为 int 数据类型,因为 Console.ReadLine() 只接受字符串格式的数据。
int num = Convert.ToInt32(Console.ReadLine());
Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。
Private 访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员。
Protected 访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。我们将在继承的章节详细讨论这个。
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
//方法体
}
static void Main(string[] args)
{
//主函数
//调用方法
int num = FindMax(1,2);
}
}
}
? 单问号用于对 int、double、bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable 类型的。
int? i = 3; 等价于 Nullable i = new Nullable(3);
声明可空类型
< data_type> ? = null;
可空类型和非可空类型相加,得到的是不空的数字
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
Console.WriteLine("num3 的值: {0}", num3); //5.34
num3 = num2 ?? 5.34;
Console.WriteLine("num3 的值: {0}", num3); //3.14157
Console.ReadLine();
}
}
}
定义
datatype[] arrayName;
初始化
double[] balance = new double[10];
for / foreach遍历
using System;
namespace ArrayApplication
{
class MyArray
{
static void Main(string[] args)
{
int [] n = new int[10]; /* n 是一个带有 10 个整数的数组 */
/* 初始化数组 n 中的元素 */
for ( int i = 0; i < 10; i++ )
{
n[i] = i + 100;
}
/* 输出每个数组元素的值 */
foreach (int j in n )
{
int i = j-100;
Console.WriteLine("Element[{0}] = {1}", i, j);
}
Console.ReadKey();
}
}
}
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
<访问修饰符> class <基类>
{
...
}
class <派生类> : <基类>
{
...
}
C#子类继承,只会继承父类的变量,不会继承变量的值
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
使用C#开发应用程序时,一般包括创建项目、界面设计、设置属性、编写程序代码、保存项目、程序运行等6个步骤
添加窗体:在项目名称上单击鼠标右键,在弹出的快捷菜单中选择“添加”/“Windows窗体”或者“添加”/“新建项”菜单,打开“添加新项”对话框,选择“Windows窗体”选项,输入窗体名称后,单击“添加”按钮,即可向项目中添加一个新的窗体。
设置启动窗体:向项目中添加了多个窗体以后,如果要调试程序,必须要设置首先运行的窗体,在Program.cs文件中设置的,在Program.cs文件中改变Run方法的参数,即可实现设置启动窗体。
窗体属性如下:
常用方法如下:Show() 显示窗体 ; Hide 隐藏窗体 ; Close关闭窗体
常用事件如下:Load 窗体加载 ; FormClosing 窗体关闭时触发
标签
设置标签文本 label1.Text = "用户名:";
显示隐藏控件 label1.Visible = true;
文本框
创建只读文本框——ReadOnly属性
创建密码文本框—— PasswordChar属性
创建多行文本框—— Multiline属性
响应文本框的文本更改事件—— TextChanged事件
有格式文本框控件,它主要用于显示、输入和操作带有格式的文本,比如它可以实现显示字体、颜色、链接、从文件加载文本及嵌入的图像、撤消和重复编辑操作以及查找指定的字符等功能。
显示滚动条——ScrollBars属性
设置字体属性—— SelectionFont属性和SelectionColor属性
显示为超链接样式—— Text属性和LinkClicked事件
设置段落格式—— SelectionBullet、SelectionIndent属性
按钮
同一个panel下的radiobutton才被视为一组单选按钮。
判断单选按钮是否选中——Checked属性
响应单选按钮选中状态更改事件—— CheckedChanged事件
同一个panel下的radiobutton才被视为一组单选按钮。
判断复选框是否选中——CheckState属性
响应复选框的选中状态更改事件—— CheckStateChanged事件
列表框每一条消息都是一行
列表控件,它主要用于显示一个列表,用户可以从中选择一项或多项,如果选项总数超出可以显示的项数,则控件会自动添加滚动条。
添加和移除项——Items属性的Add方法和Remove方法
总显示滚动条—— HorizontalScrollbar属性和ScrollAlwaysVisible属性
选择多项—— SelectionMode属性
如何添加选项?—— 在数据 / Items / Collections 添加选项
设置下拉组合框样式——DropDownStyle属性
响应下拉组合框的选项值更改事件—— SelectedValueChanged事件
主要为其他控件提供分组,并且按照控件的分组来细分窗体的功能
控件集周围总是显示边框,而且可以显示标题,但是没有滚动条
最常用的是Text属性,用来设置分组框的标题
在Image中设置图片src
在行为-Sizemode中设置填充方式
Step1:先创建Form2
参考资料:`
C#窗体应用程序之新建窗体和添加窗体事件_Thray.的博客-CSDN博客_c#怎么在一个窗体完成后添加一个窗体
Step2:在Form1窗体中添加鼠标单击窗体事件,并在该事件对应的方法中写入打开 Form2 窗体的代码
private void button4_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
}
可以在菜单栏添加各种按钮
该控件可以创建具有WindowsXP、Office、Internet Explorer或自定义的外观和行为的工具栏及其他用户界面元素
向用户显示与应用程序相关的信息以及来自用户的请求信息
MessageBox.Show("确定要退出当前系统吗?", "警告", MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
在控件代码中使用 saveFileDialog.Filter进行文件的自定义路径弹窗设置
添加 saveFileDialog控件,当点击保存按钮的时候,添加事件
设置过滤器 saveFileDialog.Filter = ("XXXX")
打开文件对话框 if (saveFileDialog.ShowDialog() == DialogResult.OK){ //... }
else { MessageBox.Show(提示信息,标题,MessageBoxButton.OK,MessageBoxIcon.XXX) }
具体代码如下:
private void 保存ToolStripMenuItem1_Click(object sender, EventArgs e)
{
//传统方式保存文件
/* String content = richTextbox.Text;
var path = @"D:\DeskData\WHUT files\大2 下\【Note】C# 可视化编程\FormPractice\testText.txt";
File.WriteAllText(path, content); */
//高级方法保存文件
//设置过滤器
saveFileDialog1.Filter = ("富文本文件(*.rtf)|*.rtf");
//打开文件对话框
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取路径
String path = saveFileDialog1.FileName;
//获取文本内容、通过IO 把文件保存到指定的位置
String content = richTextbox.Text;
StreamWriter sw = new StreamWriter(path,false);
sw.WriteLine(content);
sw.Flush();
}
else
{
//知识点:弹窗、按钮、icon图标
MessageBox.Show("保存失败", "Titlt",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
//传统方法打开文件
/*var path = @"D:\DeskData\WHUT files\大2 下\【Note】C# 可视化编程\FormPractice\testText.txt";
string content = File.ReadAllText(path, Encoding.UTF8);
richTextbox.Text = content;*/
//高级方法打开文件
//设置过滤器
openFileDialog1.Filter = ("文本文件(*.txt)|*.txt");
//打开文件对话框
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取路径
String path = openFileDialog1.FileName;
//获取文本内容、通过IO 把文件保存到指定的位置
StreamReader sr = new StreamReader(path, false);
String content = sr.ReadToEnd();
richTextbox.Text = content;
sr.Close();
}
else
{
//知识点:弹窗、按钮、icon图标
MessageBox.Show("打开失败", "Titlt", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
增加toolStrip控件,添加toolStripLabel,并隐藏它(visible: false) 在文本框双击,进入 change方法,若该文本改变了,则把toolStripLabel修改为 *
根据文件是否被修改的标记符(toolStrip),添加FormClosing事件,提示用户选择是否保存
当窗体关闭的时候,会触发FormClosing事件。在该事件内编写如下代码,让用户确认是否退出
触发FormClosing事件的代码编写如下:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
//判断是否保存 通过toolStripLabel的标识符来判断
if (toolStripLabel1.Text == "*")
{
DialogResult dr = MessageBox.Show
("文档未保存,是否继续?", "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr == System.Windows.Forms.DialogResult.Yes)
{
this.Dispose(); //关闭窗口
}
else
{
e.Cancel = true;
}
}
}
对于其他的关闭、退出等操作,直接写this.close();即可。通过close,都会跳转到上述那个关闭窗口的事件方法中。本质:FormClosing事件,会响应一切关闭窗口的这个事件
获取文本值
String str = textBox / richTextBox.Text;
文件读取和保存
File.ReadAllText(path , Encoding.UTF8) 和 File.WriteAllText(path , Encoding.UFT8)
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
var path = @"D:\DeskData\WHUT files\大2 下\【Note】C# 可视化编程\FormPractice\testText.txt";
string content = File.ReadAllText(path, Encoding.UTF8);
richTextbox.Text = content;
}
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
String content = richTextbox.Text;
var path = @"D:\DeskData\WHUT files\大2 下\【Note】C# 可视化编程\FormPractice\testText.txt";
File.WriteAllText(path, content);
}
文本的复制、剪切、粘贴 & 获取选中的文本框
复制:Text.Copy()
剪切:Text.Cut()
粘贴:Text.Paste()
获取选中的文本框:richTextbox.Selected()
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Windows.Forms.Clipboard.SetText(richTextbox.SelectedText);
}
private void 剪切ToolStripMenuItem1_Click(object sender, EventArgs e)
{
System.Windows.Forms.Clipboard.SetText(richTextbox.SelectedText);
richTextbox.SelectedText = "";
}
private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e)
{
String content = System.Windows.Forms.Clipboard.GetText();
SendKeys.Send("^v");
}
起到容器作用的窗体被称为“父窗体”,可放在父窗体中的其他窗体被称为“子窗体”,也称为“MDI子窗体”
MDI应用程序启动时,首先会显示父窗体。
在父窗体中可以在任何时候打开多个子窗体。每个应用程序只能有一个父窗体,其他子窗体不能移出父窗体的框架区域。
设置父窗体
如果要将某个窗体设置为父窗体,只要在窗体的属性面板中,将IsMdiContainer属性设置为True即可。
设置子窗体
通过设置某个窗体的MdiParent属性来确定子窗体。例如,将Form2窗体设置成当前窗体的子窗体,代码如下:
Form2 frm2 = new Form2();
frm2.Show();
frm2. MdiParent = this;
设置子窗体排列方式
通过使用带有MdiLayout枚举的LayoutMdi方法来排列多文档界面父窗体中的子窗体。
public void LayoutMdi (MdiLayout value)
textbox、label、timer1、fontDialog、button
/* Button 【功能】用户点击按钮,开始打字 【名字】Start */
private void Start_Click(object sender, EventArgs e)
{
inputChars.ReadOnly = false;
inputChars.Text = "";
/* Step1.获取用户输入的字符个数 */
String charQuantitiesString = charQuantities.Text.Trim();
int charQuantitiesInt = Convert.ToInt32(charQuantitiesString);
/* Step2.根据用户输入的字符个数,随机生成字符串 */
//生成一个 大小写字母 + 空格 的字符串
char[] charArrays = getCharArrays();
//随机数
Random random = new Random();
String questionString = "";
for(int i=0; i
/* Button 【功能】用户点击按钮,提交 【名字】Submit */
private void Submit_Click(object sender, EventArgs e)
{
/* 交卷后,从textQuestion获取题目,从inputChars获取用户输入的文本 进行对比 给出成绩 */
String answer = textQuestion.Text;
String input = inputChars.Text;
//比对结果 以用户输入的答案为len
int len = input.Length;
//分数,初始为0
int res = 0;
//打分
for(int i=0; i
代码:设置字体按钮 + fontDialog使用
/* Button 【功能】点击进入字体设置的界面 【名字】setCharFormat */
private void setCharFormat_Click(object sender, EventArgs e)
{
//使用前提:【在窗体添加fontDialog1控件】
//显示字体对话框
//需要通过事件调用该控件的 ShowDialog 方法显示对话框
DialogResult dr = fontDialog1.ShowDialog();
//如果在对话框中单击“确认”按钮,则更改文本框中的字体
if (dr == DialogResult.OK)
{
inputChars.Font = fontDialog1.Font;
inputChars.ForeColor = fontDialog1.Color;
}
}
menuStrip、toolStrip、tlsNotePad、
richTextbox、button、saveFileDialog、openFileDialog、
为Form添加FormClosing事件
新建
//文件 — 新建
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
//清空toolStrip的标识符flag,表示当前没有修改
flag.Text = "";
//清空richtextbox的内容
richTextBox1.Text = "";
}
打开、保存
添加 openFileDialog 和 saveFileDialog 控件
//文件 — 打开
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
//清空标识符flag,表示没有修改
flag.Text = "";
//过滤器,设置打开文件类型
openFileDialog1.Filter = ("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*");
//打开打开文件对话框
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取路径
string path = openFileDialog1.FileName;
//读取到指定的位置文件
StreamReader sr = new StreamReader(path, false);
string txt = sr.ReadToEnd();
richTextBox1.Text = txt;
sr.Close();
}
}
//文件 — 保存
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (richTextBox1.Text != "")
{
//过滤器,设置保存文件类型
saveFileDialog1.Filter = ("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*");
//打开保存文件对话框
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取路径
string path = saveFileDialog1.FileName;
//文件保存到指定的位置
StreamWriter sw = new StreamWriter(path, false);
sw.WriteLine(richTextBox1.Text);
sw.Flush(); //缓冲
sw.Close();
}
}
else
{
MessageBox.Show("空文档不用保存", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
退出
退出的时候判断是否保存:这个功能是在Form的Closing事件中添加的哦
//文件 — 退出
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
剪切、复制、粘贴 的 方法其实很简单! text.Cut() Copy() Paste()
//编辑 — 剪切
private void 剪切ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Cut();
}
//编辑 — 复制
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Copy();
}
//编辑 — 粘贴
private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Paste();
}
//编辑 — 粘贴
private void 颜色ToolStripMenuItem_Click(object sender, EventArgs e)
{
FontDialog fd = new FontDialog();
fd.ShowColor = true; //对话框中显示颜色设置
if (fd.ShowDialog() == DialogResult.OK)
{
richTextBox1.SelectionColor = fd.Color;
richTextBox1.SelectionFont = fd.Font;
}
}
//窗口
private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.TileHorizontal); //水平平铺
}
private void 垂直平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical); //垂直平铺
}
private void 层叠ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(System.Windows.Forms.MdiLayout.Cascade); //层叠窗口
}
}
打开、关闭、保存、复制、剪切、粘贴 相关功能的代码和上面一样,不再赘述。
撤销 很简单! Text.Undo()
//工具栏 — 撤销
private void toolStripButton7_Click(object sender, EventArgs e)
{
richTextBox1.Undo();
}
toolStrip中的修改标识符
即 toolStrip中的Label标签,name = flag
当 新建、打开 的时候,在代码中添加一个 flag = ""; 初始化标识符
richTextBox添加change事件
//richTextchange的时候事件
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
//修改flag表示,代表已经文本有变动
flag.Text = "changed";
}
为Form添加一个退出事件 FormClosing
//窗口关闭的提示事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (flag.Text == "changed")
{
DialogResult dr = MessageBox.Show("文档未保存,确定要不保存就关闭吗?", "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr == System.Windows.Forms.DialogResult.Yes)
{
this.Dispose(); //关闭窗口
}
else
{
e.Cancel = true;
}
}
}
//第一题:键盘输入字符串,统计英文出现次数
public void Q1_CharsAppearCounts()
{
Console.WriteLine("请输入字符串:");
String str = Console.ReadLine();
//字典
Dictionary dic = new Dictionary();
for (int i = 0; i < str.Length; i++)
{
if (!dic.ContainsKey(str[i]))
{
//字典.Add(K,V)添加字典
dic.Add(str[i], 1);
}
else
{
//字典[K] = V 修改K对应的V
dic[str[i]]++;
}
}
public void Q2_SumAndAverage()
{
int sum = 0;
int n = 0;
String num = "";
do
{
Console.WriteLine("请输入数(以0结束输入):");
num = Console.ReadLine();
if (num != "0")
{
sum += Convert.ToInt32(num);
n++;
}
} while (num != "0");
Console.WriteLine("sum = " + sum + ", average = " + sum/n);
}
}
public void Q3_YanghuiTriangle()
{
Console.WriteLine("要获得的三角行数:");
int n = Convert.ToInt32(Console.ReadLine());
int[] num = new int[n+2];
for(int i=0; i <= n; i++)
{
//先把第一行弄好
for (int j = i + 1; j >= 1; j--)
{
if (j == 1 || j == i + 1)
{
num[j] = 1;
}
else
{
num[j] = num[j] + num[j - 1];
}
}
//输出
for(int j = 1; j<=i+1; j++)
{
Console.Write(num[j] + " ");
}
//换行
Console.WriteLine();
}
}
public void Q4_outputAllEvens()
{
Console.Write("输出[1,n]所有的素数,请输入n:");
int n = Convert.ToInt32(Console.ReadLine());
for(int i=1; i<=n; i++)
{
if (isEven(i))
{
Console.Write(i + " ");
}
}
//是素数则返回true
Boolean isEven(int n)
{
//4要单独处理一下
if (n == 4)
{
return false;
}
for (int i = 2; i < Math.Sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
}
public void Q5_FibonacciArrays()
{
Console.Write("请输入要求的斐波那契数列的个数:");
int n = Convert.ToInt32(Console.ReadLine());
int[] dp = new int[n];
//生成数列
for(int i=0; i
完整题目:一行输入任意10个整数,数据间空格间隔,输出平均值(保留两位小数)以及所有小于平均值的数。
知识点:Double在C#中的精度显示
double temp=3.1415926;
string str1=temp.toString("f1");//保留一位小数 四舍五入 结果:3.1
string str2=temp.toString("f2");//保留两位小数,四舍五入 下面一次类推 结果:3.14
str2=temp.toString("N");//保留 结果:3.14
string str2=temp.toString("G");//保留 结果:3.1415926
string str2=temp.toString("P");//保留 结果:314.16%
string str2=temp.toString("E");//保留 结果E:3.141593E+000
string str2=temp.toString("C");//保留 结果:¥3.14
第六题代码:
public void Q6_getAverageAndBelow()
{
//题目要求用空格分割数字,则可以考虑【先读入一个字符串,然后对字符串进行处理】
//获取数字字符串
Console.Write("请输入一行10个整数,用空格分割(最后一个数字后面不要空格):");
String numStr = Console.ReadLine();
//分割字符串,再转为数字
String[] numsStr = numStr.Split(" ");
double[] nums = new double[10];
for(int i=0; i<10; i++)
{
nums[i] = Convert.ToDouble(numsStr[i]);
}
//计算平均值
double sum = 0.0;
double ave = 0.0;
for(int i=0; i<10; i++)
{
sum += nums[i];
}
ave = sum / 10;
//把平均值格式换为两位小数
String aveStr = ave.ToString("f2");
Console.Write("平均值:" + aveStr);
//输出所有小于ave的数
Console.WriteLine();
Console.Write("小于ave的数: ");
for(int i=0; i<10; i++)
{
if(nums[i] < ave)
{
Console.Write(nums[i] + " ");
}
}
}
using System;
namespace PPT1
{
class PPTquestions
{
//第一题:键盘输入字符串,统计英文出现次数
public void Q1_CharsAppearCounts()
{
Console.WriteLine("请输入字符串:");
String str = Console.ReadLine();
//字典
Dictionary dic = new Dictionary();
for (int i = 0; i < str.Length; i++)
{
if (!dic.ContainsKey(str[i]))
{
//字典.Add(K,V)添加字典
dic.Add(str[i], 1);
}
else
{
//字典[K] = V 修改K对应的V
dic[str[i]]++;
}
}
//遍历字典 dic.Count 字典个数
foreach (var item in dic)
{
Console.WriteLine($"{item.Key}出现的次数:{item.Value}");
}
}
//第二题:计算输入任意个数的sum和average
public void Q2_SumAndAverage()
{
int sum = 0;
int n = 0;
String num = "";
do
{
Console.WriteLine("请输入数(以0结束输入):");
num = Console.ReadLine();
if (num != "0")
{
sum += Convert.ToInt32(num);
n++;
}
} while (num != "0");
Console.WriteLine("sum = " + sum + ", average = " + sum/n);
}
//第三题:杨辉三角
public void Q3_YanghuiTriangle()
{
Console.WriteLine("要获得的三角行数:");
int n = Convert.ToInt32(Console.ReadLine());
int[] num = new int[n+2];
for(int i=0; i <= n; i++)
{
//先把第一行弄好
for (int j = i + 1; j >= 1; j--)
{
if (j == 1 || j == i + 1)
{
num[j] = 1;
}
else
{
num[j] = num[j] + num[j - 1];
}
}
//输出
for(int j = 1; j<=i+1; j++)
{
Console.Write(num[j] + " ");
}
//换行
Console.WriteLine();
}
}
//第四题:判断素数(只能被1、自身整数;一般判断2~根号n 内即可)
public void Q4_outputAllEvens()
{
Console.Write("输出[1,n]所有的素数,请输入n:");
int n = Convert.ToInt32(Console.ReadLine());
for(int i=1; i<=n; i++)
{
if (isEven(i))
{
Console.Write(i + " ");
}
}
//是素数则返回true
Boolean isEven(int n)
{
//4要单独处理一下
if (n == 4)
{
return false;
}
for (int i = 2; i < Math.Sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
}
//第五题:求n项斐波那契数列
public void Q5_FibonacciArrays()
{
Console.Write("请输入要求的斐波那契数列的个数:");
int n = Convert.ToInt32(Console.ReadLine());
int[] dp = new int[n];
//生成数列
for(int i=0; i
什么是类:具有相似特性(属性)和行为(方法)的对象的集合。
类与对象之间的关系:一对多的关系。类是对象的蓝图。
面向对象的三大特性:封装、继承、多态。
封装:隐藏内部实现,稳定外部接口。
继承:子类继承父类的所有成员,实现代码的复用。
多态:同一操作可分别作用于不同的类的实例,此时不同的类将进行不同的解释,最后产生不同的执行结果。
类中分为两种成员:成员变量(字段,属性),成员函数(方法)
属性的作用:1、封装字段,为字段提供有效的数据验证。
2、为其他类提供一个外部的访问接口。
属性的分类:只读属性、只写属性、可读可写属性。
方法的分类:实例方法、静态方法、构造方法(构造函数)
实例方法:当一个类被实例化后,通过类的实例(对象)调用的方法。
静态方法:当直接通过类名调用的方法。静态方法中只能包含静态成员变量。
构造方法:当类的实例(对象)被创建的过程中,所调用的方法称为构造方法。特点:构造方法与类名相同,且没有返回类型。
如果子类继承父类,那么子类就必须继承父类的构造函数。如果父类没有默认构造函数,那么子类就必须 显示 调用父类带参的构造函数。
在实例化子类的时候,首先执行父类的构造函数,再执行子类的构造函数。
父类可以派生多个子类,子类只能直接继承一个父类,继承具有传递性以及单根性的特点。
创建子类对象时,程序先调用父类无参的构造方法,再调用子类自己的构造方法,无论子类的构造方法是否有参数,始终调用父类无参的构造方法。
通过关键字abstract定义的类称为抽象类。抽象类主要用于类的蓝图或模版。
特点
(1)抽象类中既包含抽象方法又包含实例方法(只能定义没有实现的方法称为抽象方法。)
(2)有抽象方法的类一定是抽象类;
(3)抽象类可以被继承,但是不能被实例化;
(4)抽象类一般作为基类,子类继承抽象类,必须实现抽象类中的抽象方法;
(5)抽象类不能是密封类或静态类。
(6)当父类是一个抽象类时,子类要么实现父类中所有的抽象方法,要么将自己也声明为抽象类,子类重写父类的抽象方法时,必须使用关键字override。
(9)抽象类的作用:强制约束子类的行为。
在C#中默认的方法形式都是非虚方法。如果父类的方法被定义为虚方法,那么子类就可以通过override重写父类的虚方法,否则子类将隐藏(new)父类的方法。
接口是单纯对事物行为的描述。
接口的作用:实现多重继承。 为了C#中继承单根性的扩展。
子类继承父类,可以实现多个接口。
接口中包含的内容:属性、方法、索引器、事件。
类实现接口的语法:类名:接口名{类成员、方法}。 注意:当类实现接口时要实现接口中的所有方法。而且不需要 Override
//定义接口
interface IMyInterface
{
void MethodToImplement();
}
//实现接口
using System;
class InterfaceImplementer : IMyInterface
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
}
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
接口的默认修饰符是public,而且public不需要显示的定义,也不能修改成其它修饰符
接口可以继承接口,当类实现的接口继承于其它接口时,类需要实现子接口和父接口中的所有定义内容。
父类实现接口中的方法时将方法定义为虚方法,子类继承父类时用override关键字重写父类的方法,接口中的方法子类就不需要再实现。
a) 类中字段可以有初始值,结构中字段不可以有初始值。
b) 类中可以包含默认构造函数,结构中不能有显示定义的默认构造函数,结构体中带参数构造函数,但是构造函数中的参数必须为所有字段赋值。
c) 类属于引用类型,结构属于值类型。
d) 类可以被继承,结构不能被继承。
e) 类必须实例化,结构可以实例化也可以不实例化
=================================The End==================================