程序设计步骤:分析问题,设计算法,编写程序,运行程序,分析结果,编写文档
面向过程三个结构:顺序结构、选择结构、循环结构
面向过程的三个原则:自顶向下、逐步求精、模块化
面相对项:对象、类、封装、继承、多态、信息。优点:符合人们认识事物的规律。改善程序可读性,人机交互更加贴切自然语言。
计算机分类:电子模拟计算机,电子数字计算机:专用和通用。
计算机的五代发展
计算的五个组成部分:控制器,运算器,存储器,输入设备,输出设备。
计算机的存储:半导体存储,铁磁环存储
软件分类:系统软件,应用软件。
Windows组成:内核部分,应用程序,ie视窗。
Windos命令快捷:
Dir 显示本文件夹下内容
Md 创建文件夹
Rd删除文件夹
Cd 切换路径cd.. 上一级
切换盘符盘符+:
1. 新建项目,尽量不要用中文。
2. 解决方案大于项目,一个方案下可以有多个项目
3. Properties属性,C#后缀名为cs文件,C的后缀为c,C++为h或cpp
4. Bin-》debug-》里面有程序的可执行文件exe。
5. 选项-》Consolas字体,程序员常用。文本编辑器里,打开行号
6. F5播放,sln文件为解决方案的可执行文件,双击进入解决方案,suo隐藏文件,csproj项目进入文件。
7. 快捷键:
ctrl+s\z保存撤销
k+c注释 k+u取消注释
k+d代码对齐
l 删除一行
ctrl+F5开始执行但不调试
alt+shift+
K+S折叠冗余代码 #region #endregion
红色波浪线指报错、绿色警告。
8、解决方案右键添加新的项目,多个项目需要在解决方案中右键属性修改自动项,不然只会运行上一次运行的程序。
1. net平台
新一代平台,两种交互模式C/S,B/S。
作用:窗体应用程序的开发、应用程序(网页为主)。
2. netframwork框架
为net平台提供稳定的运行环境。
为平台下应用软件提供运行环境。
编译器、CLR公共语言运行池、FCL类库、BCL类库。
C#->编译器(IDE)-》FCL类库-》CLR公共语言运行池jit模块解析成机器语言-》计算机阅读。
3. static void Main()主函数,程序入口。
Console.writeLine();将字符输出在控制台上。
输出多个变量时,可以使用占位符,{0},{1}…占几个位置必须填几个变量,例如:
Console.WirteLine(“语文{0}数学{1}英语{2}”,a,b,c);
Console.Write();用法和上面一样,只是不会换行
Console.ReadKey();暂停,任意键继续,接受用户输入的字符显示在控制台,mono中会自动输入,但vs不会。
Console.ReadLine();返回字符串类型,必须用字符串类型变量接收
4. 注释
三种,1单行注释:// 解释代码的意义,注释掉代码。2多行注释:/* */。
3文档注释:///注释类和方法使用。
1、 整数类型
2、 Sbyte -128 --- 127
Short -2^15-----2^15-1 -32768 --- 32767 2字节
Int -2^31----2^31-1 -2147583648----2147483647 4字节
Long -2^63----2^63-1 8字节
一般用int
无符号整形:没有负数,从零开始
Byte o-255
Ushort 2^16-1 65535
Uint 2^32-1 4294967295
Ulong 2^64-1
2. 小数类型:浮点型
单精度float 7位小数赋值时后面必须加f,用来区别双精度。赋值为整数时,会默认为整数.0,不用加f。 4字节
双精度double 15位,不用加f 8字节
Decimal 货币类型28位 16字节赋值时后加m
Unity中常用的是float
3、 字符类型
Char 赋值使用单引号,只能存一个字符,可以存一个汉字,因为C#的char是占用两个字节,char不能为空
字符串类型:string 必须使用双引号赋值,空字符串也占内存。
4、 布尔值
只有true和false,其他值都不行,0和1也一样,此处和PHP不一样。
字母下划线开头,只能字母大小写,数字0-9 下划线,不能有空格
C#区分大小写
变量名不能使用关键字,例如:true,flase,while,case,break,int,long。。。。等
经典命名方法:
Camel命名法(驼峰法):第一个单词首字母小写,第二个首字母大写。一个单词小写
Parscal命名法:所有单词首字母大写
匈牙利命名法:C++老程序员使用较多,变量格式:作用域_数据类型的变量名。
作用域表现形式:全局静态s_,全局作用g_,常量c_,类的作用m_,方法作用域没有开头(随便写)
数据类型:int n, float f,double d,long l,short s,uint un,ushort us,ulong ul,char b/c,byte ub,sbyte b ,string sz,bool b ,对象 p
如果是数组结构,就把它当做对象。
结构体su 结构体名字全部大写,有空格的地方用下划线。
枚举em,跟结构体一样
<数据类型>变量名/=值/变量名1,变量名2.
Eg: int number; Int number = 8; intnumber,number2
和PHP一样.
隐式转换:低精度转高精度,可以自动转。
显式类型:即强制类型转换(int)(long) (short)
不同类型的数据先转换才能运算,例如:
Int a =4,b=5; float c= a/b; 此例子不会有小数,因为int计算后才会转换类型,小数直接被舍弃了。
String 转int Convert.Toint32( ); 转shortint16 转longint64
Uint16 uint32 uint64
转double Convert.ToDouble();
转float Convert.ToSingle();
和php一样
\b 退格(删掉一个字符),放在字符串开头结尾不起作用。
\n换行,\r回车
\ttab
@取消转义字符的作用,按原格式输出。
十进制转二进制,十进制数除以2,一直除到余1或者除尽,过程所有余数倒过来即二进制。
例如19/2 ,余数11001,二进制为10011
二转十,二进制每位数乘以2的位次方,再相加,即为十进制。公式 m1*2^0+m2*2^1+…mn*2^n-1
1、 负数转换取反加1 即反码+1表示负数,加的1叫做补码
7为0000 0111(原码) -7 为1111 1001
二进制最高位为1即为负数
最高位为0,即为整数。
按位与&:都为1为1,
按位或|:一个为1即为1,
异或^:相异为1相同为0,
取反~:反之
左移右移<<>>:左移n位即乘以2的n次方。高位丢弃,低位补零。
右移n位就是除以2的n次方。低位抛弃高位补零,负数则补1
注意:左移右移都是以符号左边为位移数
++,-- 优先级高于乘除法
++I,先加后用i--
I++,先用后加
减法同理。
Int I = 0;
Int a = (++I + I++/4 – i--) * 6 + i++;
1 0 2 1
结果i=2,a=-5;本题误区,整型/整型永远是整型,所以1/4为0;
不能用于表达式和常量。
三目运算符中,作为输出结果,i++也是先加后用。例如:a=1;b=2;a>b?a:b++;此时输出,b=2;
+=,-=,/=,*=,%=
使用和PHP一样
< >= <= == !=
算数运算符优先级高于关系运算符。
关系运算符返回布尔值
&& || ! 与或非
逻辑运算符比关系运算符低,包括==。
待截图
If(布尔表达式){
要执行的代码;
}
注意:C#中不能使用数值变量或者空字符串代表布尔值,包括1和0;
If(){ }else{ }
If(){ }else if(){ }else{ } //执行完一个成立条件,就不再往下走了
三目运算符
a> b?a:b
switch(表达式){//和PHP一样,default可以不要,每个语句后面不要忘记加break;包括default
case“a” :语句1;break;
……..
Default: 语句;
}
Switch效率更高一些。
If代码段内的定义的变量,只能在if中使用。即变量的作用域仅限于if条件内
用来纠正用户不按常理出牌的输入导致的报错
语法:
Try{
会产生异常的语句;
}catch{
异常处理语句;
}finally{
最后必须执行的语句;
} Finally必定执行,但可以不要
例如:
Try{
Console.wirteLine(“”);
Int number = 输入语句
原执行语句
}catch{
Console.WriteLine(“输入非法”);//直接写结果即可,判断是否非法是由系统判断的,因为C#本身变量的强类型。
}finally{
}
1、 While循环
Whiel(循环条件){
循环体;
}
Break在循环中代表终止循环语句
Continue;跳出本次循环,进入下一次循环
2、 do while循环
do{ }while(循环条件);//先执行一次
点击代码左侧的黑条,设置断点
F10快捷键逐步执行
黄色的符号是将要执行的,绿色箭头是正在执行的,鼠标放在变量上,可以看到变量在当前执行过程的值。
不能被重新赋值
声明【访问修饰符】 const <数据类型> <常量名> = <值>;
例如: const double PI = 3.4159265;
注:常量不一定非要用大写字母,小写也不会报错,此处和php不同,但一般命名时都会采用大写,多个单词用下划线隔开。
作用:提高可读性,方便运算,可以复用。
Public 共有 private 私有
举例: Enum Season{ Spring, summer, autumn, winter } |
【访问修饰符】 enum 枚举名{
枚举项,
枚举项,
….
}
每个枚举项以逗号结束
枚举可以在命名空间下定义,
类下也可以定义,如下:
using System;
namespace xuexi
{
public enum Gender{
nan,nv
}
class MainClass{
public enum Gender1{
男,女
}
public static void Main (string[] args){
枚举的使用:赋值时使用枚举名加点来表示,定义时使用枚举名为类型,如下
Gender g = Gender.男; Gender1 g1 = Gender1.女;
枚举类型和Int类型相互兼容,可强转:(int)
例如:int num = (int)g;
public enum Gender1{
男,//相当于0
女//相当于1
}
注意:枚举项也可以从任意数开始,后边根据第一个数后延,直接对枚举项赋值即可
例如:public enum Gender1{
男=8,//相当于8
女=12,//相当于12
人妖 //13
}
Int转换成枚举,对应的int值转换成枚举项,如果没有该int值,不会报错,但也不会转换。
Int a = 8;
Gender1 gg = (Gender1)a;
枚举转换成字符串:
Gender1 gg = Gender1.男;
String gstr = gg.ToString();
字符串转成枚举:
(枚举类型)Enum.Parse(typeof(枚举名),字符串);
注意:此处的字符串可以使枚举项本身,也可以是枚举项的索引
例如:(Gender1)Enum.Parse(typeof(Gender1),”0”/gstr);
接收转换结果时使用对应枚举类型的变量 例如:Gender1 g3 = (Gender1)Enum.Parse(typeof(Gender1),”1”);
大多数类型都有转换方法(待补充没有的)
Int.Parse(num);
String.Parse();
Enum.Parse();
Public struct Person{ Public string name; Public int age; Public Gender gender;//枚举 } |
存储多个不同的变量,
结构体是值类型
在命名空间,类下做的定义
【public】Struct 结构体名{
[public]结构体成员;
}
注意:结构体不能赋初值,
结尾是分号,和枚举不同
使用结构体:
Person p1;
P1.name = “csdfs”;p1.age=”12”;p1.gender =Gender.男;
Person p2;
P1.name = “42fs”;p1.age=”32”;p1.gender =Gender.男;
思考问题:
结构体变量的遍历:
枚举的遍历:方法是加一个标志作为最后一个枚举项,得出最后一个枚举的索引值,然后for循环(该方法只适用于正常索引的枚举值)
<数据类型>[]数组名 = new eg:int[] nums
赋值方法:int[] nums = {1,2,3,4,5};int与中括号之间可以有空格
Int [] nums = new int[10];//如果不给赋值,此时默认全部为0
Int[] nums = new int[2]{1,44};
单个赋值:nums[0] = 5;//默认从0开始,索引不能为字符串
数组长度可以用 .Length获得,eg: nums.Length
Array.Sort();//数组元素升序排序
Array.Reverse();//反转函数,将每两个数组的元素顺序反转过来,例如{1,2,3}反转后{3,2,1}
C#中没有降序,只有升序,但可以使用先升序排序,然后在使用反转函数,即形成降序。因为有顺序下元素互换正好更换顺序。
在C#中,数组a赋值给数组b,只是将引用给了数组b,修改数组a和b中任意元素,对应的数组元素会跟着变。
For(初始表达式;循环表达式;增量表达式){
循环体;
}
循环中声明变量不会报错,eg:
For(int I =0;i<10;i++){
Inttt = I;//循环中声明变量,不会重复声明。
}
和 PHP一样
Random r = new Random;//创建随机数对象
r.Next(100);//随机0-99之间的数
r.Next(1,50);//随机1-49之间的数
随机出来的数字不包含最后一个(即最大值)
Static struct Length{
Public float area;
Public float length;
}
Length[] nums1 = new Length[3];
Nums1[0].area = 0;
Nums1[0].length = 23;
Nums1[1].area = 20;
Nums1[1].length = 233;
Int[,] nums = new int[,]{{1,2,3,4}{3,4,6,7}};两行四列
Int[,] nums = new int[2,3];两行三列
1【0,0】 |
2【0,1】 |
3【0,2】 |
4【1,0】 |
5【1,1】 |
6【1,2】 |
赋值:nums[0][0] = 7;
给没有的下标赋值不会报错,但运行会出错,例如:nums[3,3]= 56;错误的方式
获取长度:
Nums.length 例如:2,3 获取长度为6
nums.GetLength(0); 获取第0维的长度,即有多少行,开头n小写
nums.GetLength(1); 获取第1维的长度,即有多少列
Int[,,] nums = new int[1,2,3];
自行了解
Var 是一个推断类型,可以根据变量中的类型自动推断变量的类型,该推断在编辑器中推断的,编辑器中完成,效率等同同类变量
例如: int a= 6; 可以改为 var a = 6;自动推断为int类型
Foreach(var item in 数组){
Console.WriteLine(item);
}
1 |
2 |
|
|
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
第一行两列,第二行4列,第三行三列,这就是交错数组
交错数组可以指定每一行有不同列
<数据类型>[][]交错数组名称;
Int[][] a = new int[2][];先指定有多少行
a[0] = new int[3];然后再单独指定有多少列
a[0] = new int[6];
赋值方式:a[0][2] = 9;同样不能超出下标界限
获取多少行一样使用GetLength(),行可以用GetLength(0)获取有多少行,其余应该使用nums[0].Length,nums[1].Length,nums[2].Length,其中0,1,2,正好是行下标,因此可以用i代替
例如:
For(int i=0;i For(intj;j Console.WriteLine(nums[i][j]); } } 使用foreach嵌套也可以遍历 Foreach(var item in nums){ Foreach(varv in item){ Console.WriteLine(v); } } 代码重用的机制 函数的实参和形参都占用空间 优点:模块化和复用 [public] static 返回值 函数名([参数列表]){ 代码块; Return 返回值; } 函数名使用帕斯卡命名法,即全首字母大写 Void代表没有返回值 函数写在主函数之外 例如:static int Add(int a,int b){ 函数调用:如果该函数是静态函数,调用方式是类名.方法名.如果这个函数和主函数在同一类下,可以直接写函数名调用,参数不能为空。 形参和实参内容和php一样。 实参形参都在内存中开辟了空间 可以返回多个不同类型的数据。 举例: Static int Add(out int a,int b){ a= 0;//out参数a,那么a必须在函数内重新赋值,方法外赋值没有用 b+=a; a+=b; return b; } 调用: Add(out a,b);//out的变量,传递时必须加上out 该方法中,out的变量的值会直接改变原变量的值,相当于将变量值带出了函数。 可变参数其实是通过数组的方式来表现出数量可以变化的参数,而不是传递的值可以变化,所以可变参数标记的变量必须是数组。 Params标志的参数必须是数组,可以在参数中直接传值,而不是传递变量。传递的数值和函数的形参必须类型相同,顺序也必须相同,多个参数以逗号分隔。 注意:多个参数时,params必须放在所有需求参数的后面 static void AddCash(out float a,params float[] b){ float a = 5000.0f; 同名函数会发生重载。 C#中函数可以重名(两个或两个以上),但参数个数不能相同(或者个数相同,类型不同),重名后根据传递的参数来判断到底调用哪个函数。 参数个数相同,类型也相同,但顺序不同也构成重载,返回值不同不能构成重载 选中函数,按F12可以查看该函数的函数库,查看重载的信息。 使用变量的地址,直接修改实参的数值,使用ref必须在方法外先赋值 static void Change(ref int a,ref int b){ int a = 5;//必须先赋值,否则会报错 Int,float,double,short,enum,struct等值类型,数值存在栈中,地址也存在栈中。 String,数组,自定义的类,等引用类型,值是存在堆里面的,栈中只存引用的地址。 Ref本质就是复制了地址,然后直接通过地址改变栈中的原数值。 数组即使不加ref函数内操作也是会改变数组的内容的。 类中的变量存在堆中 方法中的变量存在栈中 值类型是值传递,引用类型是引用传递 方法自己调用自己,自己调用自己会死循环,所以一定要有条件的调用自己。 (静态方法必须使用静态变量)。多数无用,看例子。 Static int GetD(){ If(number<1){ Return 0; } Int re = 1; For(int I =1;i Re*=I; } Return re+GetD(number-1); } 6.2 函数
return a+b;
} 6.2.1 输出参数out
6.2.2 可变参数params
6.2.3 可变参数params和out可以混用
a = 5000.0f;
a += b[0];
a += b[1];
}
AddCash (out a, 1000.0f,18.0f);
Console.WriteLine (a);//6018;6.2.4 方法的重载
7 第八天
引用型参数ref
int temp =a;
a = b;
b = temp;
}
int b = 8;
Change (ref a,ref b);//传参数时也需要用ref标记 7.1.1 值类型、引用类型(堆栈)
7.1.2 值类型和引用类型的区别
7.2 方法的递归