目录
学习视频
https://www.sikiedu.com/course/926/task/75998/show
介绍及准备
热门编程语言:C、C++、C#、Python、Java等
编程语言使用排行:https://www.tiobe.com/tiobe-index/
Unity使用C#语言开发项目,Unity是一种游戏开发引擎可以用来开发各种游戏以及虚拟现实应用
C#语言
在C、C++基础上衍生出的语言,面向过程,.NET框架下,与Java相似。
参考资料:www.runoob.coms,https://docs.microsoft.com/zh-cn/dotnet/csharp/作为字典查不会的、遗忘的知识
IDE开发环境
编辑》编译》运行》调试
编程工具:Visual Studio 2019/2020/2021/2022
下载地址:https://visualstudio.microsoft.com/zh-hans/vs/community/
勾选.NET桌面开发组件和Unity开发组件(在Hololens 2开发中还需要用到"通用Windows平台开发"并勾选USB设备连接性组件)
Visual Studio创建项目和基本设置
创建项目
在工具\主题和工具\选项\字体和颜色分别能设置背景和字体,字体推荐consolas
解决方案文件.sln
可以在一个解决方案下创建多个项目,解决方案运行时弹出控制台
内容
计算机知识
计算机结构
-
硬件
输入设备:键盘、鼠标、麦克风、摄像头等
输出设备:显示屏、音响
存储、处理设备:主板、CPU、显卡、声卡、硬盘、内存、光驱
-
软件
下载的应用,系统
编程语言:
编程语言是计算机和人都能识别的语言,借此人们可以控制计算机实现各种功能
进制
-
进制的本质(拓展内容)
-
二进制与十六进制
-
二进制:受计算机硬件的限制,(电子电路的通路与断路两种情况),以及跟符合计算机的运算方式,故其采用二进制。(苏联曾使用过三进制计算机后来因各种原因成为绝唱)即只用0和1表示数,逢二进一,eg:1+1=10,10+10=100,1+10=11
-
十六进制:了解了二进制和十进制大家很容易想到十六进制就是有16个基础数字逢十六进一,但是会想十六个数字怎么表示如何表示?前十位和十进制相同,后六位用字母表示,即:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
-
-
进制的转换
了解进制的本质就明白了进制的转换
进制之间的转化就是看这个数是要转换的进制的各个幂的倍数0次幂为最小位(右边第一位),n次幂为第n+1位,倍数决定在该位上的数值。由于大家对十进制比较熟悉,所以在两个非十进制之间的转换时可以先转为十进制在转其他进制。
eg:十进制17转换为二进制:17=1倍的2的4次方(第五位)+0倍的2的3次方+0倍的2的2次方+0倍的2的1次方+1倍的2的0次方(第一位)=10001
十六进制2A转化为十进制:2A=2倍的16的1次方+11倍的16的0次方=2*16+11=43
欲了解更多进制转换的方法和技巧请跟我来༼ つ ◕_◕ ༽つ
当然在实际运用中数据不好处理可以直接用代码或进制转换器进行转换。
(补充一个在编写文档时发现的小知识:转换一般指同种物理量不同形式之间的变化;转化一般指不同种物理量之间的变化)
-
数据大小
数据在计算机中一般有两种存在通俗的讲:
内存:临时性的存储数据,主要用于运算。对应硬件是RAM
存储:永久性存储数据,对应硬件是硬盘。
了解更多戳我§(* ̄▽ ̄*)§
数据计量单位:
1B(Byte 字节)=8bit,
1KB (Kilobyte 千字节)=1024B,
1MB (Megabyte 兆字节 简称“兆”)=1024KB,
1GB (Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB (Trillionbyte 万亿字节 太字节)=1024GB,其中1024=2^10 ( 2 的10次方),
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB,
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024 EB,
1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024 ZB,
1BB (Brontobyte 一千亿亿亿字节)= 1024 YB.
注:“兆”为百万级数量单位。
附:进制单位全称及译音
yotta, [尧]它, Y. 10^21,
zetta, [泽]它, Z. 10^18,
exa, [艾]可萨, E. 10^15,
peta, [拍]它, P. 10^12,
tera, [太]拉, T. 10^9,
giga, [级]咖, G. 10^6,
mega, [兆],M. 10^3
信息的表述和处理
字符编码:所用编码b
快捷键及其作用
快捷键 | 作用 |
Home | 光标定位至行前 |
End | 光标定位至行后 |
Ctrl | 单个选中 |
Shift | 选中两次点击中间的部分 |
Delete | 删除 |
Ctrl+A | 全选 |
Ctrl+S | 保存 |
Ctrl+Z | 撤销这一步操作,返回上一步 |
Ctrl+Y | 再按从Ctrl+Z后按该键,进行下一步 |
选中内容后Ctrl+C | 复制所选内容至剪切板 |
选中内容后Ctrl+V | 粘贴剪切板上的内容 |
选中内容后Ctrl+X | 剪切;删除选中内容,但会保存在剪切板上,按粘贴键后会出来 |
选中内容后Ctrl+D | 直接在本行下复制选中内容 |
Ctrl+K+L | 注释所选内容 |
Ctrl+K+U | 取消所选内容的注释注释 |
Ctrl+F5 | 开始执行程序 |
Ctrl+5 | 开始调试程序 注:调试是对源程序进行编译或把错误找出来,主要是纠错,使之无语法错误。而执行是在无语法错误的情况下才能进行的。 |
编程知识
C#编译(代码)=>机器语言(程序集)=>机器执行指令 在.NET框架下
编写程序必须用半角英文
-
代码结构
-
基本结构
using System;//引用命名空间,引用之后可以调用该命名空间下的类和函数
namespace MyApp // 本项目的命名空间
{//{}括住本条目下的内容(代码块),这个是命名空间下括住的代码块的起始
internal class Program//类名
{
static void Main(string[] args)//函数名
{
Console.WriteLine("Hello World!");//执行的语句,语句以;结尾
}
}
}/*这个是命名空间下代码块的结束的括号,每个{}必须是首尾呼应的缺一不可,
为了方便阅读代码同一代码块的{}对齐*/
上面的//是注释标记,//后面为注释内容代码运行时不会//后的内容被识别,不影响程序正常运行。多行注释/*xxxxxxx*/,注释快捷键:Ctrl+k+l;取消注释快捷键:Ctrl+k+u
-
变量
变量含义:相当于一个容器可以储存数据,你也可以把它理解为代数里的x,y
变量声明:从内存开辟空间创造一个变量容器。
int num1;//int 表示变量类型 比如水杯,水桶,脸盆都是容器,但他们是不同类型的容器
//num1 是你自己填写的变量名,这个名字符合规范是对的\( ̄︶ ̄*\))
float num2,num3;//可以同时声明多个同 类型的变量(✪ ω ✪)
int 1num;//以数字开头这种命名是错的(>﹏<)
char int;//与类名重复,也是错的(>︿<)
变量的声明规则:
-
变量类型+空格+变量名,观察上面“代码结构”中的代码你会发现,不仅是在变量命名时,命名空间,类名,函数名等也是这样的“修饰词/类型+空格+名字”的结构。
-
名字只能用英文,数字和_(下划线)。且不能用数字作为开头
-
名字不能和关键字重复,关键字是指内部已经规定好特殊含义的词汇,如变量类型,修饰词等关键字和其他的代码颜色不一样一般可以自己区分
-
为方便代码阅读还有一些其他的命名规则,感兴趣的同学请点我了解(づ ̄ 3 ̄)づ
变量赋值:
int num1;
num1 = 1;//在编程里=是赋值的意思,在这里就是把1赋值给我们声明的变量num1,右边赋值给左边
int num2 = 2;//也可以在声明的同时就对变量进行赋值
num1 = 3;//再次赋值会覆盖原来的值
-
变量的作用域
一般变量的作用域在其所在的代码块内
void Main ()
{
int i =Convert.Totint32(Console.ReadLine());//在Main函数中定义的变量作用域整个Main函数能
if(i%2==1)
{
int a=3*i+1;//if内定义的函数只作用在if语句内,而i定义在main函数内,if也在main函数内所以
//i可以被if调用
}
Console.Write(a);//在变量a的作用域外调用a不会被识别
}
-
声明、定义、初始化和赋值的区别
-
声明:(向编译器)说明变量的类型和名称的过程,(只作用于编译器)不分配存储空间。例:int a;/类 对象名;
定义:声明变量并进行初始化的过程,分配存储空间。例:int a = 0;/类 对象名 = new 类();
赋值:更改这块区域里的值。
初始化:在定义变量时的赋值或引用的过程。
-
数据类型
-
内置数据类型
-
主要介绍值类型(数据存储在栈当中),带红点的是常用的比较重要的
-
其他类型在这里( o=^•ェ•)o ┏━┓重点看一下string类型
-
类型转换
-
隐式转换:
-
小类型的数据可以直接转化为大类型的数
-
同类型或小类型的无符号可以直接转化为有符号的数据
-
(小容器里的水可以倒到大容器里面)
-
-
显示转换(强制转换)
-
默认是不能转换的,需要通过代码强制转换
-
但需要在可转换的情况下,比如字符串一般不转换为值类型,需要的话用Convert
-
-
转换方法
-
点我!点我!ヾ(≧▽≦*)o
-
-
根号
-
定义数据类型
作用:用于补充内置数据类型
Way:Class 类 通过class关键字,可以实现自己定义一种数据类型
抽象和封装: 把不是数据的东西转化成可以用数据表达的东西,这个过程是抽象;把数据表达定义成class叫做封装如何把一个问题抽象成函数,抽象成那些函数,把函数进行封装。
存储:在堆上开辟存储空间,在栈上存放指针。
初始化:用与类名相同的构造器或函数初始化
int a;
string x;
//Cat是类型,c是对象
Cat c=new Cat();//可以定义新的类型的变量
Rectangle rect=new Rectanglr();//通过new初始化,new是开辟存储空间的过程
Dog xx;
//定义 猫 这种数据类型
/*定义猫
名字:string类型
体重:flaot
年龄:int
*/
//成员访问,成员变量没有加public不可直接访问
Console.WriteLine("猫的年龄是"+c.age);
class Cat:Animal,Runner//,连接多重继承和接口,一个类只能继承一个父类实现N个接口
{
//不用静态的话每个对象都又不同的subject,static是类的属性
static string subject="猫科动物";
string name;//成员变量name
float weight;//成员变量weight
int age;//成员变量age
//行为
void run(){//成员函数:eat
Console.WriteLine("run run run");
}
void eat(){//成员函数:run
Console.WriteLine("eat eat eat");
}
public Cat(string name,float weight,int age/*这样可以是实现自定义初始化*/){
//可以在构造器里面做一些成员的初始化。
/*name='cc';
weight=5;
age=2;*/
this.name=name;//this表示当前这个实体对象
this.weight=weight;
this.age=age;
Console.Write("猫的构造器");//这个函数是隐形的
}
public Cat(){//重载一个构造函数
name='cc';
weight=5;
age=2;
}
public static void SetSubject(string newSubject)
{
subject=newSubject;//在statie中不能访问成员,只能访问static的成员
}
public void Run(float speed)
{
Console.WriteLine("pao");
}
}
Cat c=null;//null指的是空,没有指向堆当中的任何地址
Cat.SetSubject("犬科动物");//通过类去访问和调用
//定义 狗 这种数据类型
class Dog{
}
//定义矩形类型
//1.类名:Rectangle
//2.数据:长float,宽float
//3.行为:求周长float,求面积float
class Rectangle{
float length;
float width;
float Area(/*float length,float width因为已经定义了成员变量所以参数不用写*/){
return length*width;
}
float Length(){
return (length+width)*2;
}
}
Runner r1=new Cat();//Cat继承于Runner所以可以赋值给Runner
Runner r2=new Dog();//Dog未继承Runner,不能赋值,会报错
public abstract class Animal//定义一个父类
{//abstract抽象类无法被实例化 ,抽象类是为给子类提供属性的
public float age;
protected float x;//可被继承变量
private int y;//私有数据不能被继承
public void Rest()
{
//子类中有相同定义时会被掩盖
Console.WriteLine("休息");
}
//虚函数
public virual Rest()
{
Console.WriteLine("xiuxi");//虚函数可以在子类中用override重写,同一名称的东西有不同的属性称为多态
}
}
//实现多态
//通过虚函数和重写
//通过抽象函数和抽象类
//通过接口实现多态
栈内存
堆内存
静态存储区
接口interface 接口不实现函数
-
转译及常量
见本链接界面的字符常量模块
-
运算符
查看具体知识请跟我走(@^0^)
-
算术运算符
-
关系运算符
-
逻辑运算符
||,&&,!
-
位运算符
非运算:~0=1;~1=0
与运算:&
或运算:|
亦或运算:^有且只有一个为真
移位运算:>>,<<
-
与逻辑运算区别:结果为数字不只是0和1且运算符不一样
-
运算符:
-
-
赋值运算符
-
其他运算符
-
运算符的优先级
b=a++和b=++a的区别:前者先自增再赋值,后者反之
-
访问修饰符
-
数组
数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。
char [] letter = { 'a', 'b', 'c' };//datatype[] arrayName;数据类型+[数组长度]+数组名这种创建方式必须在同一行
char[] hanzi = new char[3] { '甲', '乙', '丙' };//定义一个字符数组,可以分成两行写
char[] num;//声明一个数组
num=new char[]{ '1', '2', '3' };//数组的初始化,C#中[3]这个长度可以不加
Console.WriteLine(letter[0]);//访问数组中固定位置的元素,元素的对应序号从0开始排的
Console.WriteLine(letter[1]);
Console.WriteLine(letter[2]);
letter[0] = 'y';//给数组中对应序号元素赋值
Console.WriteLine(letter[0]);
letter = num;//同等级同类型数组之间可以相互赋值,同等级小数组赋值给大数组
Console.WriteLine(letter);
//num[3] = '4';//超出数组的长度会报错,之后会学如何增加数组
foreach(char L in letter)//遍历数组,foreach(元素类型 承载数组元素的变量 in 要遍历的数组)
{
Console.WriteLine(L);
}
letter = hanzi;
for(int i= letter.Length-1; i>=0;i--)//反向遍历数组,数组名.Length可以获取数组长度
{
Console.Write(letter[i] + " ");
}
此外,一个sting字符串也可以被视为一个字符数组,可以用数组的方式调用某个位的字符,也有一些专用的操作方法
string name = " Micheal Liang ";
Console.WriteLine(name[2]);
string str1 = name.ToLower();
string str2 = name.ToUpper();
string str3 = name.Trim();
string str4 = name.TrimStart();
string str5 = name.TrimEnd();
Console.WriteLine("转小写"+name + '-' + str1);
Console.WriteLine("转大写" + name + '-' + str2);
Console.WriteLine("去空格"+name + '-' + str3);
Console.WriteLine("去字符串前空格"+name + '-' + str4);
Console.WriteLine("去字符串前空格" + name + '-' + str5);
name.Split(" ");//以空格为分隔标志,分成字符串数组
Console.WriteLine(name)
//运行结果如下:
// i
//转小写 Micheal Liang -micheal liang
//转大写 Micheal Liang -MICHEAL LIANG
//去空格 Micheal Liang -Micheal Liang
//去字符串前空格 Micheal Liang -Micheal Liang
//去字符串前空格 Micheal Liang -Micheal Liang
// Micheal Liang
-
函数
a.函数的参数
b.函数的返回值
c.函数的调用
语句学习
-
输入输出语句
-
Console.Write("xxx")输出" "内的内容不换行,下一次输出会紧接着这次输出
-
Console.WriteLine(" xxxx")在这一行输出,并换行
-
格式化输出
using System;
static void Main(string[] args)//函数名
{
int a=500,b=20;
Console.WriteLine("a={0},b={1},a+b的和为",a,b,a+b);
}
-
Console.ReadLine( );读取用户输入内容
-
Convert.Toint32();将括号内的变量转化为int类型
-
分支语句
-
if-判断语句
if ()//判断条件,一个bool值
{
//满足条件的情况下执行的内容
}
else
{
//不满足条件时执行的内容,不必要的话这部分可以不写
}
if()
{
}
else if()//在if的判断为false时,再对这个里的值进行判断,为true则执行;此结构可以连续使用多个
{
}
-
switch分支语句
Console.WriteLine("输入数字获取对应饮料:");
Console.WriteLine("输入1-矿泉水");
Console.WriteLine("输入2-红茶");
Console.WriteLine("输入3-绿茶");
Console.WriteLine("输入4-阿萨姆奶茶");
Console.WriteLine("输入5-雪碧");
Console.WriteLine("输入6-可口可乐");
Console.WriteLine("输入7-脉动");
Console.WriteLine("输入8-芒顿小镇");
int number = Convert.ToInt32(Console.ReadLine());
switch (number)
{
case 1://当数字等于1时执行下面的代码
Console.WriteLine("矿泉水");
break;//每个case后一般要加break
case 2:
Console.WriteLine("红茶");
break;
case 3:
Console.WriteLine("绿茶");
break;
case 4:
Console.WriteLine("阿萨姆奶茶");
break;
case 5:
Console.WriteLine("雪碧");
break;
case 6:
Console.WriteLine("可乐");
break;
case 7:
Console.WriteLine("脉动");
break;
case 8:
Console.WriteLine("芒顿小镇");
break;
default://可以没有
Console.WriteLine("不再选择范围内");
break;
}
-
循环语句
-
while循环
while()//判断条件,满足条件是一直执行循环体,需要条件限制或break终止循环
{
//循环体
}
//eg:验证3n+1问题
Console.WriteLine("3n+1问题");
Console.WriteLine("请输入一个正整数:");
long N = Convert.ToInt32(Console.ReadLine());
while(true)
{
N++;//这句可以不加
long X = N;
int indx = 0;
while (X != 1)
{
if (X % 2 == 1)
{
X = 3 * X + 1;
}
else
{
X /= 2;
}
indx++;
Console.WriteLine("变换后的数字为" + X);
}
Console.WriteLine("{0}总共经过{1}次运算", N,indx);
}
-
for循环
for(; ;)//第一个空定义增量;第二个空是循环的判断条件;第三个空格是自增规则
{
//循环体
}
//eg:
Console.WriteLine("请输入两个数字n,m(n<m),输出两者间的奇偶数");
Console.WriteLine("输入n的值:");
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("输入m的值:");
int m = Convert.ToInt32(Console.ReadLine());
string ji = " ";
string ou = " ";
for(int i=n;i<=m;i++)
{
if(i%2==1)
{
ji += i + " ";
}
else
{
ou+=i+" ";
}
}
Console.WriteLine(ji);
Console.WriteLine(ou);
-
do-while循环
for(int i=1;i<=100;i++) { if(i%2==0) { continue;//终止本次循环进入下次循环 } Console.WriteLine(i); }
-
Continue
for(int i=1;i<=100;i++)
{
if(i%2==0)
{
continue;//终止本次循环进入下次循环
}
Console.WriteLine(i);
}
-
其他
random随机数生成器
Console.WriteLine("猜数字,电脑会随机生成一个1-100的整数,猜猜看");
Random rd = new Random();//声明并初始化一个随机数生成器Random
//随机数的生成random
int num = rd.Next(1, 101);//包括下限不包括上限即[1,101)内的整数
while(true)
{
int x=Convert.ToInt32(Console.ReadLine());
if (x > num)
{
Console.WriteLine("猜大了");
}
else if (x<num)
{
Console.WriteLine("猜小了");
}
else
{
Console.WriteLine("恭喜你猜对了");
break;
}
思维导图
思维导图推荐是用Xmind,飞书上也可以直接做思维导图(🚀马上注册飞书加入虚拟培训基地吧)
代码练习
你懂的( ̄︶ ̄)↗
Console.WriteLine("求真素数:先后输入1-10000内的两个数用空格隔开回车确认");
string [] A= Console.ReadLine().Split(" ");
int n = Convert.ToInt32(A[0]);
int m = Convert.ToInt32(A[1]);
if(n>=m)
{
int temp = m;
m = n;
n = temp;
}
int index = 0;
string zhishu=" ";
for(int i=n;i<=m;i++)
{
for(int k =2;k<=i/2&&i%k!=0;k++)
{
if(k==i/2)
{
zhishu = (char)i+ " ";
index++;
}
}
}
int[] zhish = new int[index];
zhishu = zhishu.TrimStart();
zhishu = zhishu.TrimEnd();
string []B=zhishu.Split(" ");
for(int i=0;i<index;i++)
{
zhish[i] = Convert.ToInt32(B[i]);
}
string ZZS=" ";
foreach (int Y in zhish)
{
int y = Y;
int x=0;
do
{
x += y% 10;
y /= 10;
} while (y==0);
foreach (int X in zhish)
{
if(X==Y)
{
ZZS = (char)X + " ";
}
}
}
Console.WriteLine("{0},{1}之间的真素数有" + ZZS, n, m);