【武理大】可视化编程 C# 总复习笔记

目录

【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 记事本

控件

基本界面

代码:menuStrip 文件

代码:menuStrip 编辑

代码:menuStrip 窗口设置

代码:toolStrip工具栏相关

修改标识符的添加、关闭判断

【Part4】PPT题目

第一题:统计字符串出现字符的个数

第二题:计算输入任意个数的sum和average

第三题:输出n行杨辉三角

第四题:输入[1,n] 区间内的素数

第五题:求n项斐波那契数列

第六题:输入任意10个数,处理输出

六道题目的完整代码

【Part5】基本概念(15分问答题)

OOP基本概念

修饰符

类变量、方法

覆盖和重写

继承

抽象类

虚方法

接口

类 VS 结构

抽象类 VS 接口


【Part1】基本语法

基本框架

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<int> i = new Nullable<int>(3);

声明可空类型

< data_type> ? <variable_name> = 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;
}

【Part2】可视化基础控件

开发步骤

  • 使用C#开发应用程序时,一般包括创建项目、界面设计、设置属性、编写程序代码、保存项目、程序运行等6个步骤

  • 添加窗体:在项目名称上单击鼠标右键,在弹出的快捷菜单中选择“添加”/“Windows窗体”或者“添加”/“新建项”菜单,打开“添加新项”对话框,选择“Windows窗体”选项,输入窗体名称后,单击“添加”按钮,即可向项目中添加一个新的窗体。

  • 设置启动窗体:向项目中添加了多个窗体以后,如果要调试程序,必须要设置首先运行的窗体,在Program.cs文件中设置的,在Program.cs文件中改变Run方法的参数,即可实现设置启动窗体。

  • 窗体属性如下:

  • 常用方法如下:Show() 显示窗体 ; Hide 隐藏窗体 ; Close关闭窗体

  • 常用事件如下:Load 窗体加载 ; FormClosing 窗体关闭时触发

Label

标签

设置标签文本 label1.Text = "用户名:";

显示隐藏控件 label1.Visible = true;

textBox

文本框

创建只读文本框——ReadOnly属性

创建密码文本框—— PasswordChar属性

创建多行文本框—— Multiline属性

响应文本框的文本更改事件—— TextChanged事件

RichTextBox

有格式文本框控件,它主要用于显示、输入和操作带有格式的文本,比如它可以实现显示字体、颜色、链接、从文件加载文本及嵌入的图像、撤消和重复编辑操作以及查找指定的字符等功能。

显示滚动条——ScrollBars属性

设置字体属性—— SelectionFont属性和SelectionColor属性

显示为超链接样式—— Text属性和LinkClicked事件

设置段落格式—— SelectionBullet、SelectionIndent属性

Botton

按钮

radioButton & Panel

同一个panel下的radiobutton才被视为一组单选按钮。

判断单选按钮是否选中——Checked属性

响应单选按钮选中状态更改事件—— CheckedChanged事件

checkBox

同一个panel下的radiobutton才被视为一组单选按钮。

判断复选框是否选中——CheckState属性

响应复选框的选中状态更改事件—— CheckStateChanged事件

listBox 列表框

列表框每一条消息都是一行

列表控件,它主要用于显示一个列表,用户可以从中选择一项或多项,如果选项总数超出可以显示的项数,则控件会自动添加滚动条。

添加和移除项——Items属性的Add方法和Remove方法

总显示滚动条—— HorizontalScrollbar属性和ScrollAlwaysVisible属性

选择多项—— SelectionMode属性

comboBox 下拉框

如何添加选项?—— 在数据 / Items / Collections 添加选项

设置下拉组合框样式——DropDownStyle属性

响应下拉组合框的选项值更改事件—— SelectedValueChanged事件

GroupBox 分组框控件

  • 主要为其他控件提供分组,并且按照控件的分组来细分窗体的功能

  • 控件集周围总是显示边框,而且可以显示标题,但是没有滚动条

  • 最常用的是Text属性,用来设置分组框的标题

pictureBox 图片框

在Image中设置图片src

在行为-Sizemode中设置填充方式

Timer 计时器

打开新窗口 Form2

Step1:先创建Form2

参考资料:`

C#窗体应用程序之新建窗体和添加窗体事件_Thray.的博客-CSDN博客_c#怎么在一个窗体完成后添加一个窗体

Step2:在Form1窗体中添加鼠标单击窗体事件,并在该事件对应的方法中写入打开 Form2 窗体的代码

private void button4_Click(object sender, EventArgs e)
{
	Form2 form2 = new Form2();
	form2.Show();
}

可以在菜单栏添加各种按钮

ToolStrip 工具栏控件

该控件可以创建具有WindowsXP、Office、Internet Explorer或自定义的外观和行为的工具栏及其他用户界面元素

MessageBox 消息对话框

向用户显示与应用程序相关的信息以及来自用户的请求信息

MessageBox.Show("确定要退出当前系统吗?", "警告", MessageBoxButtons.YesNo, 
MessageBoxIcon.Warning);

saveFileDialog控件   保存文件窗口 & MessageBox弹窗

在控件代码中使用 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);
            }
        }

openFileDialog控件 打开文件窗口

             //传统方法打开文件
            /*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控件 判断文本是否被修改过

增加toolStrip控件,添加toolStripLabel,并隐藏它(visible: false) 在文本框双击,进入 change方法,若该文本改变了,则把toolStripLabel修改为 *

为Form添加FormClosing事件 提示改动保存

  • 根据文件是否被修改的标记符(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子窗体”

  • MDI应用程序启动时,首先会显示父窗体。

  • 在父窗体中可以在任何时候打开多个子窗体。每个应用程序只能有一个父窗体,其他子窗体不能移出父窗体的框架区域。

设置父窗体

如果要将某个窗体设置为父窗体,只要在窗体的属性面板中,将IsMdiContainer属性设置为True即可。

设置子窗体

通过设置某个窗体的MdiParent属性来确定子窗体。例如,将Form2窗体设置成当前窗体的子窗体,代码如下:

Form2 frm2 = new Form2();
frm2.Show();
frm2. MdiParent = this;

设置子窗体排列方式

通过使用带有MdiLayout枚举的LayoutMdi方法来排列多文档界面父窗体中的子窗体。

public void LayoutMdi (MdiLayout value)

【Part3】实验题相关知识点

EXP3 打字软件

控件

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<charQuantitiesInt; i++)
            {
                questionString = questionString + charArrays[random.Next(0,53)];  //生成 [0,53)的整数
            }


            /* Step3.把生成的随机字符串打印在textQuestion的TextBox中  */
            textQuestion.Clear();
            textQuestion.AppendText(questionString);


            /* Step3.在用户点击开始的瞬间,启动计时器并在textBox  showReminderTime 并在时间到的时候,自动点击交卷按钮Submit  */
            seconds = charQuantitiesInt; //1个字符给2s的时间
            showReminderTime.Text = seconds.ToString();
            timer1.Enabled = true;
            //changeColor.Enabled = true; 修改颜色(有BUG,暂时不用)




        }

代码:交卷按钮

        /* 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<len; i++)
            {
                //对一个字符,得1分
                if(answer[i] == input[i])
                {
                    res++;
                }
            }

            //跳转到新窗口,输出成绩
            Form2 form2 = new Form2();
            form2.Show();
            //机智的我把showScore改成public就可以在第一个窗口访问啦
            form2.showScore.Text = res + "";

            //把错误的字符标红
            String str = textQuestion.Text; //获取输入的内容
            input = inputChars.Text; //获取输入的内容


            //使用RichContextBox来对指定索引的字体进行颜色的更改
            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] != str[i])
                {
                    inputChars.Select(i, 1);
                    inputChars.SelectionColor = Color.Red;
                }
            }



        }

代码:设置字体按钮 + 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;
            }
        }


EXP4 记事本

控件

menuStrip、toolStrip、tlsNotePad、

richTextbox、button、saveFileDialog、openFileDialog、

为Form添加FormClosing事件

基本界面

代码:menuStrip 文件

新建

        //文件 — 新建 
        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();
        }

代码:menuStrip 编辑

剪切、复制、粘贴 的 方法其实很简单! 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;
            }
        }

代码:menuStrip 窗口设置

        //窗口
        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); //层叠窗口   
        }
    }

代码:toolStrip工具栏相关

打开、关闭、保存、复制、剪切、粘贴 相关功能的代码和上面一样,不再赘述。

撤销 很简单! 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;
                }

            }
        }


【Part4】PPT题目

第一题:统计字符串出现字符的个数

        //第一题:键盘输入字符串,统计英文出现次数
        public void Q1_CharsAppearCounts()
        {
            Console.WriteLine("请输入字符串:");
            String str = Console.ReadLine();

            //字典
            Dictionary<char, int> dic = new Dictionary<char, int>();
            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]]++;
                }
            }

第二题:计算输入任意个数的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);
        }
    }

第三题:输出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,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<n; i++)
            {
                if(i == 0 || i == 1)
                {
                    dp[i] = 1;
                }
                else
                {
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
            }

            //输出数列
            for (int i = 0; i < n; i++)
            {
                Console.Write(dp[i] + " ");
            }
        }

第六题:输入任意10个数,处理输出

  • 完整题目:一行输入任意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<char, int> dic = new Dictionary<char, int>();
            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<n; i++)
            {
                if(i == 0 || i == 1)
                {
                    dp[i] = 1;
                }
                else
                {
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
            }

            //输出数列
            for (int i = 0; i < n; i++)
            {
                Console.Write(dp[i] + " ");
            }
        }


        //第六题:一行输入任意10个整数,数据间空格间隔,输出平均值(保留两位小数)以及所有小于平均值的数。
        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] + " ");
                }
            }
        }
    }

    class TestMain
    {
        static void Main(String[] args)
        {
            PPTquestions pptquestions = new PPTquestions();
            Console.WriteLine("请选择要测试的函数:1.测试字符个数  2.统计输入数字的ave 3.杨辉三角 4.判断素数 5.斐波那契数列 6.获取ave和小于ave的数");
            int flag = Convert.ToInt32(Console.ReadLine());
            switch (flag)
            {
                case 1: pptquestions.Q1_CharsAppearCounts();break;//第一题
                case 2: pptquestions.Q2_SumAndAverage();break; //第二题
                case 3: pptquestions.Q3_YanghuiTriangle();break;//第三题
                case 4: pptquestions.Q4_outputAllEvens();break;//第四题
                case 5: pptquestions.Q5_FibonacciArrays();break;//第五题
                case 6: pptquestions.Q6_getAverageAndBelow();break;//第六题
            }
        }
    }
}


【Part5】基本概念(15分问答题)

OOP基本概念

  • 什么是类:具有相似特性(属性)和行为(方法)的对象的集合。

  • 类与对象之间的关系:一对多的关系。类是对象的蓝图。

  • 面向对象的三大特性:封装、继承、多态。

    • 封装:隐藏内部实现,稳定外部接口。

    • 继承:子类继承父类的所有成员,实现代码的复用。

    • 多态:同一操作可分别作用于不同的类的实例,此时不同的类将进行不同的解释,最后产生不同的执行结果。


修饰符


类变量、方法

  • 类中分为两种成员:成员变量(字段,属性),成员函数(方法)

    属性的作用: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关键字重写父类的方法,接口中的方法子类就不需要再实现。


类 VS 结构

a) 类中字段可以有初始值,结构中字段不可以有初始值

b) 类中可以包含默认构造函数,结构中不能有显示定义的默认构造函数,结构体中带参数构造函数,但是构造函数中的参数必须为所有字段赋值

c) 类属于引用类型,结构属于值类型

d) 类可以被继承,结构不能被继承

e) 类必须实例化,结构可以实例化也可以不实例化


抽象类 VS 接口

=================================The End==================================

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graskli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值