C#学习笔记 05.01
(学习视频来自bilibili的传智播客赵老师基础教学视频)
整完了while循环,就来for循环
个人感觉对于确定循环次数的这个用的更多一点,至少不用担心因为失误把循环写死,而while循环则被用于故意写死的循环。
for (int i = 0; i < length(这是需要判断的条件); i++(这里完成条件变动))
{
这里面是循环体
}
这个和while的差别,就是不需要总是记得把条件的变化写进循环体里面,就不容易忘。。。
因为本身都是循环,所以说功能上来讲用哪个都能实现,只是用哪个更方便。
还是来个例子
输出水仙花数(个位,十位,百位的立方和等于这个数本身的数)
Console.WriteLine("水仙花数:");
int baiWei, shiWei, geWei, sum;
for (int i = 100; i < 1000; i++)
{
baiWei = (int)i / 100; //这个强转其实不是很有必要
shiWei = ((int)i / 10) - baiWei * 10;
geWei = i % 10;
sum = (int)( Math.Pow(baiWei, 3) + Math.Pow(shiWei, 3) + Math.Pow(geWei, 3));
if (sum==i)
{
Console.Write(i + "\t");
}
}
Console.ReadKey();
乘法口诀表
for (int i = 1; i < 10; i++)
{
for (int j = i; j < 10; j++)
{
Console.Write("{0}x{1}={2}\t", i, j, i * j);
}
Console.WriteLine();
}
for (int i = 1; i < 10; i++)
{
for (int j = 1; j < i + 1; j++)
{
Console.Write("{0}x{1}={2}\t", j, i, i * j);
}
Console.WriteLine();
}
Console.ReadKey();
break 只能跳出当前循环,不能跳出所有循环
Continue 立即停止本次循环回到循环条件进行判断,如果条件成立那么继续,不成立则跳出
上例子
while 配合continue 输出100以内所有能被7整除的数之和。
int i = 0;
int sum = 0;
while (i < 100)
{
i = i + 1;
if (i % 7 == 0)
{
continue;
}
sum = sum + i;
}
Console.WriteLine(sum);
Console.ReadKey();
另一种变量类型转换的方法
int.Parse()
Convert.ToInt32()
这两个东西其实是一样的,其实内部而言,Convert.ToInt32() 调用的就是 int.Parse()
故事终于走向了我没碰过东东
三元表达式
表达式1 ?表达式2:表达式3;
如果表达式1 的结果是 true ,那么返回表达式2 ,否则 返回表达式3
其实就是 if else 针对一些赋值情况的一种简便写法。
创建随机数
Random r = new Random();
r.Next(1,10);
产生一个1~10的随机数,推测这是个开区间,但是如果我们把他赋值给int,他会进行小数抹除,所以表现出来的就是 1 到 10 的左闭右开区间(说人话就是包括 1 不包括 10)。
随机数这个东西有个神奇的特性是时间种子,所以不要在循环里面创建(当然,本来也不应该在循环里面创建对象),因为这个特性的存在,如果我们在循环中创建(实例化)这个对象,会造成随机数不再随机。
关键字 const
加了这个关键字之后会变成常量,只能被赋值一次,后面不能重新赋值。
枚举类型
枚举和我们的各种变量其实是一样的,只不过是对内容进行了一些限定
目的是用来规范开发中对于某些通用性东西的表达。
枚举类型不能写在函数(方法里面)最好直接写在命名空间,这样在同一个命名空间(项目)可以很方便的访问。
类型转换
枚举类型和 int 类型兼容,可以直接强制转换,默认是从 0 开始;
如果我们强行让其中某个与数字进行对应,那么会保持后面的以 1 递增。
举个例子
enum 汉字与数字
{一,二,三,五,六}
这样对应的数字时 0 1 2 3 4
enum 汉字与数字
{一 = 1,二,三,五 = 5,六}
这样一来就对应了 1 2 3 5 6
转成字符串也比较简单
所有的类型基本都有一个角 tostring 的方法,可以直接转成字符串
汉字与数字.一.ToString(); 这样就会得到一个字符串 “一”
比较麻烦的是把字符串转换成枚举类型
插一句,.Parse()这个方法好多类型都能 . 出来,就是把其他类型转化成当前的类型,比如前面的 int.Parse()就是把括号里的(一般是字符串)转成 int 类型。
Enum.Parse()就是用来将其他类型转换成枚举类型的,但是当原本的枚举中并不存在,这种转换就会抛出异常。
枚举类型赋值有个简便方法,就是写完赋值符号(=)之后敲一个空格,会自动的出来,选一下然后把想赋的值 . 出来就行了
说了半天也不太好整明白,还是写个代码吧。
写五个QQ的状态,在线,离线,忙碌,隐身,请勿打扰
先演示第一个出现的错误
public enum QQ状态
{
在线=1,
离线=3,
忙碌=0,
隐身,//这样按顺序下来,隐身也是1
请勿打扰
}
按照自动给我们的枚举对应数字的方式,在线,隐身这两个东西有了相同的索引,所以试着运行这个:
Console.WriteLine(QQ状态.在线.ToString() + QQ状态.隐身.ToString());
就会得到这个:
这显然是不可取的,所以一旦我们手动给各个部分定义了数值,那就需要保证其唯一性,不然后面的会盖掉前面的。
然后我们接着这个来,第二个会出现问题的地方
class Program
{
static void Main(string[] args)
{
QQ状态 zt0 = (QQ状态)9;//数字强转成枚举,如果数字在枚举中没有对应值,也会转换成功
Console.Write(zt0.ToString());//比如这样,就会输出9,也就是在枚举里面补了一个,补进去这个值和索引都是9
int zt1 = (int)QQ状态.在线; //枚举和 int 互转
QQ状态 zt2 = (QQ状态)Enum.Parse(typeof(QQ状态), "2");//如果我们这个字符串是数字的话,那么就和上面的一样
QQ状态 zt3 = (QQ状态)Enum.Parse(typeof(QQ状态), "忙碌");//如果字符串真的是字符串,如果枚举中存在,那就转换成功
QQ状态 zt4 = (QQ状态)Enum.Parse(typeof(QQ状态), "我也不知道是啥状态");
//如果枚举中不存在,就会抛出异常(猜测是程序不能像int那样很直接的直接分配索引,索性就不给处理了)
Console.ReadKey();
}
}
public enum QQ状态
{
在线 = 1,
离线,
忙碌,
隐身,
请勿打扰
}
让我们完整的实现一个功能
让用户输入1~5五个数字,显示出不同的状态,如果输入别的就报错重输
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace _08_MeiJu
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请确定在线状态:1-在线,2-离线,3-忙碌,4-隐身,5-请勿打扰");
lable_shuru:
string input_str = Console.ReadLine();
if (!(input_str=="1"|| input_str == "2"|| input_str == "3"|| input_str == "4"|| input_str == "5"))
{
Console.WriteLine("请输入1~5数字");
goto lable_shuru;
}
QQ状态 zt = (QQ状态)Enum.Parse(typeof(QQ状态), input_str);
Console.WriteLine(zt.ToString());
Console.ReadKey();
}
}
public enum QQ状态
{
在线 = 1,
离线,
忙碌,
隐身,
请勿打扰
}
}
这波学的有点多啊。。结构类型
结构类型,作用是一次性声明多个不同类型的变量
语法:
public struct 结构名 { public 字段类型 字段名}
这里比较需要注意的是这个叫法,因为我们在这个结构类型里面将变量加了 public 修饰符,就不再被称为变量了,而称为字段,字段命名规则是在前面加一个下划线
其实我们常用的 int 就是一个结构
举个例子:
public struct XinXi //一个结构型变量
{
public string _name;
public int _age;
public Gender _gender;
}
public enum Gender //一个枚举类型
{
男,
女
}
class Program
{
static void Main(string[] args)
{
XinXi zhangSan,xiaoLan;
zhangSan._name = "张三";
zhangSan._age = 18;
zhangSan._gender = Gender.男;
xiaoLan._name = "小兰";
xiaoLan._age = 20;
xiaoLan._gender = Gender.女;
}
}
最后一个 数组
结构是一个变量里面存好多其他类型的变量,就像前面的,我们在一个类型为 xinxi 的变量里面又存了 string int gender(是个枚举)这三个类型的变量。
数组呢,则是在一个变量中存好多个相同类型的变量。
语法 int [] nums =new int[10]
在数组中我们可以用索引去访问其中的每一个内容,值得注意的是,数组的这个索引和枚举的默认索引是一样的,都是从0开始的。
数组声明的方式
前面的 int [] nums =new int[10] 是一种,只确定长度,不赋值;
另外 int [] = { 1,2,3,4,5 } 声明时候就直接赋值;
这两种是最常用的;
还有两种麻烦的。。就不管了。。