c#程序设计

一.c#程序结构

程序的三种结构:1、顺序2、选择(判断)

3、循环-----------------------------------------

什么是循环?

1、不断的重复进行--》循环

2、直到某条件不成立终止循环---》循环结束

3、如果条件永远成立则为“死循环”

----------------

两种情况:1、先判断再执行(循环)

2、先执行一次再判断,条件为真则继续执行直到条件为假退出循环

---------------

C#中的四种循环语句

1、while(循环)2、do...while(循环)

3、for(循环)

4、foreach(循环)

-------------------------

while循环是一种当型循环,就是当条件满足为真时执行循环,当条件不满足为假时退出循环。while(布尔表达式){ //循环体语句}<----不用写分号结束

----------------------------

循环的核心是控制循环的次数,所以一般使用整数进行控制,例如:int i;循环的三要素:

1、初始部分:从哪里开始

2、终止条件:到哪儿结束

3、迭代部分:循环语句体的执行

-----------------------------

while循环语句其实最适合做次数不确定的循环,但是却知道什么条件才终止循环的场景。

-----------------------------------

while中表达式可以逆向判断,也就是说可以进行取反的判断,使用关系运算符中的(!=)不等于运算可以进行取反的操作。

---------------------

除非我们有意引入死循环,否则一定要在程序中避免死循环。

-----------------------

do...while循环是先执行一次循环体语句然后在判断循环条件是否为真。

使用场景:当需要无论什么情况都要先执行语句然后在确定是否循环的情况下,使用do...while循环会更适合。

------------------------

语法:do{   //循环体语句 }while(布尔表达式); <---这里一定不要忘记了分号结束语句---------------------do...while循环至少会执行一次。while循环可能一次都不执行while是先判断再执行,do...while是先执行一次或多次再判断是否循环--------------------死循环产生的必要条件:就是循环终止条件永不为假。

二.c#标识符常用方法

Console.

1、Clear<---清屏

2、WindowHeight<---设置黑屏幕的高度

3、WindowWidth<---设置黑屏幕的宽度

4、BufferHeight<---设置屏幕缓冲区的高度

5、BufferWidth<---设置屏幕缓冲区的宽度

6、ForegroundColor<---设置前景色

7、BackgroundColor<---设置背景色

8、Beep<---播放指定频率和时长的声音

9、SetCursorPosition<---设置屏幕光标的位置的方法(函数)

10、CursorLeft<---光标距离黑屏左边的多少字符

11、CursorTop<---光标距离黑屏顶部的多少字符

三.c#四种循环语句区别

while和do...while区别?

1,while是先判断后执行,有可能一次都不循环

2,do...while是先执行一次循环,然后在判断是否执行循环,所以无论如何都会执行至少一次。

3,while和do...while都适合于不知道循环次数的循环

----------------------------------------

for语句?

for循环语句也叫“迭代语句”名词解释:

迭代迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。

每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。

此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。

例如利用迭代法*求某一数学问题的解。对计算机特定程序中需要反复执行的子程序*(一组指令),

进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。

--------------------------------

for语句也称为:计数器循环语句

for语法:

for(表达式1;表达式2;表达式3)

{   

 循环语句

}

-----------------------

在同一个作用范围内不能声明相同变量名的变量,因为这样会产生二义性。编译器将不能识别。

------------------------------

for语句中三个表达式的作用:表达式1作用是赋初值,仅在开始执行一次表达式2每次都会执行,

用于判断是否终止循环表达式3作用是对表达式1的变量进行累加或递减,第一次不会执行,以后每次都会执行直到循环终止

----------------------------------

for可以有四种表现形式

1,for (i = 1; i <= max; i++)  <---基本用法

2,int i=0;for (; i <= max; i++) <---第二种

3, for (i = 1; i <= max; ){i++;} <---第三种

4,for (i = 1; ; i++) <---第四种   { if (i <= max)  {  //语句} else{break;}   }

-------------------------------

while、do...while、for相同点

1、都是循环语句,有固定的语法

2、都是有循环条件和循环体构成

3、循环的核心都是控制好循环的次数,次数又由三点决定:

 a、初始部分

 b、终止条件 

c、迭代部分------------------------------

while、do...while、for不同点

1、while、do...while适合用于循环次数未知的情况,for循环适合循环次数确定的情况

2、while、do...while初始部分通常在开始之前就完成了,for循环则是在语法表达式的表达式1部分完成

3、while、do...while循环的迭代是在循环体中完成,for循环是在语法结构的表达式3部分完成,for循环是将三要素同时写在for后面的小括号中

4、while和for是先判断在执行,如果条件一开始就不成立,则循环一次都不执行。do...while先执行在判断,无论条件是否成立最少执行一次。

-----------------------

c#四种跳转语句

C#中提供了四种跳转语句

1、continue:立即终止当前这一次循环,进入下一次循环。(仅用于各种循环语句,只能作用于包裹它的循环)

2、break:立即终止当前循环或退出switch语句(仅用于各种循环语句和switch语句,只能作用于包裹它的循环或switch)

3、goto:无条件跳转,可以跳转到任意指定标签位置。(可以构成循环效果)现代编程中是严禁使用使用goto语句的地方一般是在受限设备中,例如:各种芯片中使用,因为芯片中的空间有限通常只有几k或几十k的空间

4、return:立即跳出当前(包裹return)函数,不会执行return后面的语句,函数也会立即终止执行。

return语句也是用于终止函数执行的语句

-----------------------------------------

continue、break、return这三个跳转语句后面的代码是不会执行的,因为这三条语句已经跳转到别处,所以后面的代码等同于失效代码,因此也会称为:检测到无法访问到的代码-----------------------------跳转语句用于无条件的转移控制。

 

c#数组定义和使用

C#中数组可以分为:

一维数组、多维数组、数组的数组

-----------------------------

数组的使用步骤:

1、声明数组(数组的类型和数组的名称)

2、创建数组(请求内存空间的分配)

3、初始化数组(给数组中每个空间放一个值)

一维数组的语法:数据类型[] 数组名称;<-----声明一个数组对象例如:int[] ages;

//声明一组年龄的数组用于存储年龄的值声明数组时要注意的事情

1、数据类型是C#语言中的任意数据类型

2、数组名称必须满足标识符的命名规范和变量的命名规范是相同的数组名称 = new 数据类型[数组的长度];

<----申请空间,包含多少个同类型的空间(数组长度)ages = new int[10];

<---创建整型数组对象,申请空间用于存放10个整型数据值创建数组时要注意的事情

1、创建数组时,数组的长度不能省略,长度可以是常量、变量或表达式

2、数组的声明和创建可以合并到一起的。例如:int[] ages = new int[5];

//这种写法比较常见初始化数组数组名称[索引] = 值;

<---为数组的某个空间赋初值int[] ages = new int[5];

//声明并创建一个整型数组ages[0] = 18;

//将18 赋值给ages数组的第0个空间中ages[1] = 20;

//将20 赋值给ages数组的第1个空间中ages[2] = 13;ages[3] = 22;ages[4] = 19;

------------------------------------------------

ages[5] = 10;//这句赋值的代码是错误的。

因为ages数组只有5个空间,空间的索引值从0开始

------------------------------------------------

数组的索引从0开始因此数组的索引值一定是小于数组的长度,小一个

==============================================

一维数组的动态初始化语法:数据类型[] 数组名称 = new 数据类型[]{值1,值2,值3,值4,....值N};

动态初始化时数组会根据初始化值的个数来确定数组的长度。

例如:int[] ages = new int[]{12,13,23,22,18,16};

一维数组静态初始化语法:数据类型[] 数组名称 = {值1,值2,值3,值4,....值N};例如:int[] ages = {13,15,16,8,19};

===========================

元素的默认值:数组是一种对象类型(属于引用类型),一旦创建对象则系统默认会给出原始初始化值。

int 类型 默认值 0float 类型 默认值 0.0fbool 类型 默认值 falsechar 类型 默认值 '\u000'(表示一个空字符)string 类型 默认值  null(对象的默认值就是null)

================================

一维数组的访问:数组名[索引] = 值;

//为数组的指定索引的元素赋值数组名[索引];

//获取数组中指定索引的元素值例如:int[] ages = new int[5];赋值:ages[0] = 20;取值:int age = ages[0];

//将指定索引位置的元素值取出赋给同类型的变量

=====================

数组和变量不同数组的初始化其实是第二次赋值,变量的初始化才是真的第一次赋值

=======================

注意:数组的长度是固定的,在C#语言中数组的长度一旦确定是不能更改的。数组的索引一定小于数组的长度,否则会出现“索引超出了数组界限。”错误

c#冒泡排序

1、什么是排序?就是将杂乱无章的数据按照某种格式进行排列的一种方式。排序的目的是为了更好的、更快的搜索和查找数据。

2、排序的算法就是怎样高效排列数据一种计算方法。

3、排序算法种类

3.1 冒泡排序

3.2 插入排序

3.3 选择排序

3.4 快速排序

4、冒泡排序的算法反复对两个元素进行比较,如果这两个元素的顺序错误则进行交换。

原理:1、比较相邻的元素,如果第一个比第二个大则交换它们两个

2、对每一对相邻的元素做同样的工作,从开始的一对到结尾的最后一对

3、针对所有的元素做同样的步骤,除了最后一个

4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较了。

原理分析:设待排序的数组a中有n个元素,冒泡排序要进行n-1趟,每趟循环均是从比较相邻的两个元素开始,一直到最后两个元素。算符实现的描述两个循环进行嵌套外循环和内循环均是循环这个数组a。int[] a = {6,2,4,1,5,9}外循环for 从0-5六个元素,索引为i内循环fro 从0-5六个元素,索引为j外循环第一次i=0,进入内循环j=0,内循环第一次a[i]>a[j+1]truea[i]=a[j+1];<---交换两个元素的位置内循环第二次a[i+1]>a[j+1]truea[i+1]=a[j+1];<---交换两个元素的位置==========================

选择排序算法算法原理:

1、从待排序的数组元素中选择值最小的或值最大的元素并将它与第一个元素进行交换

2、然后从不包括第一个位置的数组元素中选择最小的或最大的元素并将它与数组中第二个元素交换位置

3、重复前面的操作直到剩下一个元素为止。

c#函数初探

什么是函数?

C#中的函数不是数学中的函数,它是将一个或几个功能封装到一个代码段中,

并为这个代码段命上一个名称这种方式将这个代码段称为“函数/方法/子过程”。

函数的好处在哪里:

1、实现模块化设计

2、使得程序设计比较简单

3、提高程序的可读性和可维护性

--------------------------

函数分类:

1、系统函数

2、自定义函数(重点)

---------------------------

函数的定义在使用函数前必须先定义,才能使用。

定义函数的语法:

[访问修饰符] [static] 返回值类型 函数名称([形参列表]){ 函数的代码块;//封装的功能代码}

其中的[]括号表示可有可无并不是必须的。

访问修饰符:指定此函数可以被访问的范围(谁可以访问(调用)此函数)

static:static关键字表示这个函数是一个静态函数返回值类型:函数调用后会向主控程序(主调程序)返回一个值。

返回值类型就是指这个返回的数据类型。

函数名:也就是函数的名称,调用函数是通过函数名来调用的,函数名与不良的命名规则是一致的。

形参列表:如果有数据要传递到函数里面去参与运算,这个数据就是参数函数体:这个部分就是函数具体的代码。

c#函数参数和返回值详解

函数可以帮助进行模块化设计。

前提条件就是对问题域,分析找出组成问题域的关键点(子问题)。

分而治之。以大化小。

函数的参数:

函数运算时需要参与运算的值(外部的),被称为参数。

函数的参数是主调函数与被调函数进行数据传递的主要渠道,函数头上的块级注释其实就是对函数的简单说明,在调用时会出现提示,提示中的消息就是注释的内容。

形参和实参形参是函数定义时出现,主要是用于约束传入数据的类型实参是函数被调用时出现,主要是按照形参的约束传递数据。

实参是受到形参的约束的。这个约束主要是体现在数据类型上。

为啥叫形参列表或实参列表,是因为,函数定义时对参数的个数并没有限制,因此把这种就称为:形参列表或实参列表。

参数传递时是受到形参的约束,除了数据类型的约束外还有参数数量的约束。

形参还有顺序的约束,实参一定要和形参的顺序是一致的。

在形参数据类型相同的情况下,顺序并不会被检测。

只有形参的数据类型不一样的情况下才会对实参的顺序检测。

当实参的数据类型和形参的数据类型不一致时必须要保证实参是可以隐式转换或显示转换的才行,

否则就会出错。

===============================================

参数传递的方式:

1、值传递:就是将传入的值复制一份,然后传入到函数中,这种是默认传递方式。

2、引用传递:需要ref关键字,作用是将值的内存地址专递到函数中。这种传递方式也称为:引用传递

=====================================

函数的返回值就是函数在执行完毕后将执行结果返回给主控函数,主控函数可以随意使用。

函数的返回值不是必须的,而是根据实际需要得来。

语法:[访问修饰符] [static] 返回值类型 函数名称([形参列表]){函数体;}

其中返回值类型:如果没有返回值是void的如果有返回值则是具体的数据类型:包括已知的任意类型(已知的任意类型是指当前项目中可以使用的任意类型)

返回值使用的语法:{ //函数体; return 和函数定义同类型数据值;}函数在执行中一旦遇到return语句就表示函数执行完毕,将控制权交还给主控函数。

------------------------------

例子说明:

主函数中首先调用设置窗口的函数,然后调用菜单函数,菜单函数调用计算函数Main---》SetWindowSize  |  |__>>Menu--->>Calculation

=================================

带有返回值的函数调用形式:数据类型 变量=被调用函数(实参);

//这里的变量的数据类型必须和被调函数的数据类型一致被调函数(实参);

//返回值无用处带返回值的函数只能有一个返回结果(每次)方法签名(函数签名):[访问修饰符] [static] 返回子类型 函数名称(形参列表)

----------------------------

注意:函数如果定义了形参,那么在调用时必须按照形参列表中的参数个数、顺序、数据类型来传入具体的实参

 

c#函数的重载

什么是函数重载?

一般情况下,函数的名称是反映函数实际功能和任务。

C#语言中不允许存在一个类中定义多个同名函数。

为了解决这个矛盾微软提供了函数重载这个技术。

允许我们定义多个同名(函数名称)函数重载允许我们在一个类中指定同一个函数的不同版本,

这些函数都具有相同的名称(我们看来),仅仅由函数的签名来区分这些不同的版本。

函数签名是编译器去识别的。

================================

函数重载运用的条件是:

1、函数的参数类型不同

2、函数的参数顺序不同(形参的类型不同)

3、函数的参数个数不同满足以上的三个条件就可以运用函数重载。

函数重载时,形参的名称要符合命名规则,但是最重要的是形参的类型,因为形参类型才是约束实参的规则。

函数重载的识别规则是:整个函数定义的头部不包含函数体。

函数签名示例:[访问修饰符] [static] 返回值类型 函数名称(形参列表)  

<<<<-----就是函数签名编译器是通过函数的签名来区别函数重载的,这样编译器才可以准确的找到对应的函数,达到重载的目的。

=============================

函数重载的几种可能:

1、形参的个数不同,但类型相同,顺序相同,可以发生重载

2、形参类型不同,个数相同,顺序相同,可以发生重载

3、形参顺序不同,类型一定要不同,个数相同,可以发生重载

======================================

函数的几种形式:

1、有参数无返回值:[public] [static] void 函数名称(int num)

2、有参数有返回值: [public] [static] int 函数名称(int num)

3、无参数无返回值: [public] [static] void 函数名称()

4、无参数有返回值: [public] [static] int 函数名称()以上就是函数的四种形式(写法)

=====================================

函数的动态数组参数:

1、参数的类型是一个数组类型

2、参数前面加上params关键字满足以上的两个条件,就能够创建动态数组参数的函数动态数组参数能够将函数的参数由

有限个数变为无限个数也就是说如果使用动态数组参数则函数的参数你可以随意的传任意个同类型参数

===================================

动态数组很方便,但是不是无限使用的,它是有一些限制的:

1、定义函数时参数列表中,最后一个

2、定义函数时,动态数组参数只能有一个。

c#字符串详解

1、字符类型在C#中表示为一个Unicode字符,是一个结构体(struct)

因为计算机是说英语的人发明的,

所以英文在计算机中只占一个字节,但是中文或亚洲的语系不能直接在计算机上使用,因此推出了各种编码,

其目的就是为了让亚洲的语言可以在计算机上使用,所以发明了双字节编码格式,这样就可以容纳全球的语系。

英文还是占一个字节,中文或其他亚洲的语言就是双字节表示,比如大家见过的乱码,其实就是因为双字节中某一个字节坏了的原因。

在C#中字符是属于

值类型的,存储在栈中,字符类型是可以直接转为整数类型。

-----------------------------------------

C#中的转义字符"\" <<---这是转义字符可以把特殊符号(语言中已经指定使用的符号或字符转为普通字符)

也可以出现一些特殊的效果。

=========================

2、字符串字符串是Unicode的字符的有序集合,主要用于表示文本,并且该值是不可以改变的。

字符串一旦赋值是不能更改的,但是字符串不是常量,因此编译器会在赋值时生成一个相同的字

符串来接收新值并且将旧的字符串变量给删除掉。因此在外部看起来就像是赋值成功了。

常用属性:

Length属性用于获取字符串中包含字符的个数也就是字符串的长度。通过这个属性我们可以使用循环遍历字符串中所有的字符

。常用的方法:

Trim()用于去除字符串两端的空白。不能去除字符串中间的空白

EndWith()用于从字符串尾端开始查找匹配的字符串。

IndexOf()用于搜索指定的字符串在目标字符串中首个匹配的索引值

LastIndexOf()用于从尾部开始搜索第一个匹配的字符串的索引值

Substring()用于从一段字符串中截取指定的一部分出来。

重载版本:

Substring(startIndex)

Substring(startIndex,count)

Split()用于分割字符串,通过指定的分割点字符来做为分割的依据。

分割后产生一个字符串数组string user = "张三,男,2010-10-01,189138338438,zs@sohu.com"

;string[] UserInfo = user.Split(',');

Replace()用于替换指定的字符串

string str="世界你好";

string newstr = str.Replace("你好","今天你吃了吗?");

c#异常处理

1、什么是异常?

指程序运行过程中发生的异常事件(不正常事件)这些事件的组成是由:

a、硬件问题

b、软件问题异常是可以处理(不是全部)在C#中将常见的异常封装为一系列的类。使用时直接调用即可。

常见的异常:

1、Exception  <----异常的总类(祖先类)

2、SystemException <----系统异常类

3、ArgumentException <----参数异常类

4、ArithmeticException <----算术导致的异常类

5、IOException <----输入输出异常(流的异常)类

6、IndexOutOfRangeException <----索引超出异常(数组索引越界)

7、DivideByZeroException  <----除零异常

8、OverflowException <----运算结果过大,超过目标类型的范围。

9、FormatException <----输入字符串格式不正确异常

--------------------------------

为什么要处理异常?

1、对用户来说体验不友好

2、程序会因此死掉,所以未保存的数据就有可能丢失。

3、程序因为未知问题导致数据的丢失。

---------------------

异常的处理不是异常出现后的处理而是预先估算可能出现异常的地方事先做出处理的方式。

C#中处理异常使用的抛接机制?

程序遇到异常会将异常抛出,如果没有处理则继续抛出,直到操作系统收到异常信息做出处理。

如果操作系统没有做出异常的处理那么就会导致系统的死机。

因此现在的操作系统对于程序抛出的异常一般都是直接杀掉异常程序的进程从而保证操作系统的正常运行。

那么在C#语言中提供了抛接机制来处理异常

语法:

try

{

//异常代码预估

}catch(异常类型 异常变量)

{

//异常处理代码

}

将可能发生异常的代码放到try的模块中进行测试,一旦代码出现了异常则下面得catch模块会主动拦截并程序的流程转向到此处进行处理,

这样一来异常的代码就被处理了。所以就不会把程序的异常抛给操作系统处理,由于已经处理了异常所以程序就可继续运行或是正常退出。

这样就保证了程序的健壮性。

catch后面的小括号中的内容并不是必须的,

可以没有小括号,但是如果没有小括号也就不能得到异常的信息。

如果你需要异常的信息用来判断究竟是什么异常时,异常信息就会告诉你。

这样我们就可以有针对性的处理。

=========================

ps:.net 4.7.2版本认为除零是正无穷大(此种情况是数据类型为double时出现)当整数进行除零时出现除零的异常。

================

在使用catch捕捉异常信息时可以根据由进到远的关系来做出多种异常类型的捕捉,

祖先类型:Exception放在最后一个,其他同级别异常没有先后顺序。

================================

从代码中可以看出,异常的捕捉也是一级一级的进行,最后是异常祖先类型。

======================================

以后如果涉及到程序中使用其他的资源这种情况下,一旦发生异常就会导致资源被占用

,如果没有很好的处理就会导致资源被锁定了,其他程序将不能访问。

为了解决这个问题C#中提供了finally语句模块用于释放资源。

finally语句的特点:无论有没有异常发生都将执行finally模块中的释放语句。

finally使用场景:

1、程序中使用了数据库资源

2、程序中使用了文件独占访问资源

3、程序中独占了某个网络的端口。。。。。

以上这些只要是有使用资源的情况,都需要使用finally进行资源的释放。

=========================================

某些特殊的情况下我们需要人为抛出异常此时我们使用throw语句来做人为抛出异常语法:

throw new Exception("异常消息");finally语句块中不能使用return语句,语法不允许

。哪怕在try块或catch块中使用return语句,如果有finally语句也会跳到此处执行。

这是语法规则。也是编译器的规则。

 

 

 

posted @ 2020-06-12 18:06  吾与落樱万般相似  阅读(445)  评论(0)    收藏  举报