C#基础
- 排序
遇数据:int[] A = {16, 67, 12, 50, 8, 46, 4};
整体升序:Array.Sort(A);
整体降序:先升序,再反转Array.Reverse(A);
- Math类
属性:
Abs | 取绝对值 |
Ceiling | 返回大于或等于指定的双精度浮点数的最小整数值 |
Floor | 返回小于或等于指定的双精度浮点数的最大整数值 |
Equals | 返回指定的对象实例是否相等 |
Max | 返回两个数中较大数的值 |
Min | 返回两个数中较小数的值 |
Sqrt | 返回指定数字的平方根 |
Round | 返回四舍五入后的值 |
- 保留小数
1.占位符方式
(改方法只能在输出时显示保留两位小数的效果)
double number = 3.3333333333;
Console.WriteLine("{0:0.00}",number);
2.转字符串方式
double number = 3.3333333333;
String str = number.ToString("0.00"); // 保留两位小数,三位是0.000
number = Convert.ToDouble(str); // 保留指定小数位之后的double数值
- 四舍五入
Math.Round( 3.3333333333 , 2 );
- decimal.Round( decimal.Parse( "3.333333333" ), 2 );
- 冒泡排序
什么是冒泡排序,其实就是降序Sort方法,但是我们可以想想怎么不通过系统自带的方法去实现,比如for循环
Console.WriteLine("冒泡循环实列");
int[] num = new int[5]{1,2,7,5,6 };//声明一个数组打乱大小顺序
Console.WriteLine("排序前:");
foreach (var item in num)//通过foreach打印数组里的值
{
Console.Write(" "+item);
}
Console.WriteLine("");
Console.WriteLine("通过自定义的foreach循环后:");
for (int i = 0; i < num.Length; i++)
{
for (int j = 0; j < num.Length-i-1; j++)//第一个为什么要减一,因为数组是从下标0开始的如果不减一将会报超过数组长度的错误,第二个为什么要减i是因为在下面if判断的时候假设num.Length为5的时候,可以通过把数字打印出来就知道最后一次只要一次循环就好了,有时候都用不到,出于性能考虑,当然你不减这个i问题也不大。
{
if (num[j]>num[j+1])//这里就不解释了
{
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
foreach (var item in num)
{
Console.Write(" " + item);
}
- 二维数组
语法:
Int[,] name =new int[,]
用途:可以用来打矩阵,当然要是有同学能深入了解就能写个小游戏贪吃蛇,用0,1,2来说明,还可以计算矩阵,比如相加,相减,转置等。
用法:
int[,] soue = new int[2, 3];
Console.WriteLine("输入:");//输入
for (int i = 0; i < soue.GetLength(0); i++)//这里是循环多少行也就是2,打印2次
{
for (int j = 0; j < soue.GetLength(1); j++)//这里是循环多少列也就是3,打印3次
{
soue[i, j] = Convert.ToInt32(Console.ReadLine());
}
}
Console.WriteLine("输出:");//输出
for (int i = 0; i < soue.GetLength(0); i++)
{
for (int j = 0; j < soue.GetLength(1); j++)
{
Console.Write(soue[i, j] + "\t");
}
Console.WriteLine("");
}
实列:转置
//就是用两个相反的二维数组就行了如果感觉理解不了你可以看他们位置,如下的话就是
00 01 02
10 11 12
20 21 22
如10 30 和01 02 交换数据的时候其实我可以看到一个改变的是行一个是列,所以聪明的你应该知道了吧。
double[,] array = new double[,] { { 1, 1, 1 }, { 5, 5, 5 }, { 25, 25, 25 } };
int x = array.GetLength(0);
int y = array.GetLength(1);
Console.WriteLine("转置前:");
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.Write(array[i, j] + "\t");
}
Console.WriteLine("");
}
double[,] zhuan = new double[x,y];
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
zhuan[j, i] = array[i, j];
}
}
Console.WriteLine("转置后:");
for (int i = 0; i < zhuan.GetLength(0); i++)
{
for (int j = 0; j < zhuan.GetLength(1); j++)
{
Console.Write(zhuan[i, j] + "\t");
}
Console.WriteLine("");
}
更多的二维数组知识可以看(16条消息) C#实现递归;二维数组的转置;矩阵的相乘(介绍利用Parallel.For 循环并行计算解决传统for循环慢的问题);值和矩阵相乘;求矩阵的逆_前路漫漫其修远兮的博客-CSDN博客_c#二维数组转置
以及二维数组的math.net运算:不过要先下载MathNet.Numerics.dll,(16条消息) C#中利用Math.NET进行矩阵运算,极大提高数组运算的性能_前路漫漫其修远兮的博客-CSDN博客
- 交错数组
语法:
Int[][] name =new int[10][];
用途:表示一个表格数据,行确定,但是每一行的列数不同,那么这个时候就可以使用交错数组。交错数组的本质是1个一维数组,只不过这个一维数组的元素的类型是一个数组。
杨辉三角:在杨辉三角中,每个数是它左上方和右上方的数的和。
//杨辉三角
int[][] pascal = new int[10][];
for (int i = 0; i < pascal.Length; i++)
{
pascal[i] = new int[i + 1];
}
//赋值
pascal[0][0] = 1;
for (int i = 1; i < pascal.Length; i++)
{
pascal[i][0] = 1;//第一个元素
pascal[i][i] = 1;//最后一个元素
for (int j = 1; j < i; j++)
{
pascal[i][j] = pascal[i - 1][j - 1] + pascal[i - 1][j];//最主要
}
}
//输出
for (int i = 0; i < pascal.Length; i++)
{
for (int j = 0; j <= i; j++)
{
Console.Write("{0,4}", pascal[i][j]);
}
Console.WriteLine();
}
- 方法
有以下:
String类型返回bool方法:
StartsWith:用于确定字符串开头是否与制定的字符匹配。
EndsWith:用于确定字符串结尾是否与制定的字符匹配。
Equals:用于确定两个字符是否相等。
注意StartsWith和EndsWith放里面的字符串写了什么那么对应的位置一定要一样,特别是英文字母是大写那么就一定要大写。
实列:
//string方法
Console.WriteLine("请输入G开头的用户名:");
string name = Console.ReadLine();
if (!name.StartsWith("G"))
{
Console.WriteLine("请输入G开头的用户名!");
}
Console.WriteLine("请输入以K结尾的账号:");
string userid = Console.ReadLine();
if (!userid.EndsWith("K"))
{
Console.WriteLine("请输入以K结尾的账号!");
}
Console.WriteLine("请输入密码:");
string pwd = Console.ReadLine();
Console.WriteLine("请再次输入密码:");
string pwd1 = Console.ReadLine();
if (!pwd.Equals(pwd1))
{
Console.WriteLine("两次密码不一致!");
}
String类型返回int方法:
IndexOf:从左往右返回当前在字符中找到的下标没有找到返回-1。
LastIndexOf:从右往左返回当前在字符中找到的下标没有找到返回-1。
实列:
//string方法
Console.WriteLine("请输入电子邮件:");
string youjian = Console.ReadLine();
//是否存在@或.
if (youjian.IndexOf("@")==-1||youjian.IndexOf(".")==-1)
{
Console.WriteLine("邮件格式错误,不存在@或.");
}
//是否存在唯一的@
if (youjian.IndexOf("@")!=youjian.LastIndexOf("@"))
{
Console.WriteLine("邮件格式错误,存在多个@");
}
//@是否在.之前
if (youjian.IndexOf("@")>=youjian.IndexOf("."))
{
Console.WriteLine("邮件格式错误,.在@之前");
}
String类型方法:
Substring:截取字符串。
Concat,Format:连接字符。
实列:
Console.WriteLine("请输入用户身份证号码:");
string usercard = Console.ReadLine();
string year, month, day,brithday;
year = usercard.Substring(6,4);
month = usercard.Substring(10,2);
day = usercard.Substring(12,2);
brithday = string.Concat(year,"年",month,"月",day,"日");
brithday = string.Format("{0}年{1}月{2}日",year,month,day);
// Console.WriteLine("{0}年{1}月{2}日", year, month, day);
Console.WriteLine(brithday);
params关键字:
相当于asp.net mvc 里面的?也就是说在方法接受参数的时候用了params在数据类型前面就可以传个空参数都没问题。
实列:
static void Main(string[] args)
{
shuzu(1,2,3,4);
shuzu(1,2,3);
shuzu();
}
public static void shuzu(params int[] num)
{
Console.WriteLine("参数:");
for (int i = 0; i < num.Length; i++)
{
Console.Write("{0}\t",num[i]);
}
Console.WriteLine("");
}
在方法中用out的含义:
out参数:返回值多个,不限类型。
注意事项:
调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉
使用out参数传递变量时,必须在方法内为其赋值,否则return的返回值没有意义
方法的参数使用out修饰时,调用该方法时也要加上out关键字
使用out修饰的变量不需要return
- 递归(学废了)
首先他是什么呢?
简单就是通过自己调用自己把复杂的逻辑简单化,可以求得最终结果。
比如简单一个列子说明
在我们求1-n个数和的时候,大家第一反应是什么用集合对不对,
首先集合怎么写:
public static int Sum(int num)
{
int sum = 0;
for (int i = 0; i <= num; i++)
{
sum += i;
}
return sum;
}
递归:
public static int Sum2(int num)
{
if (num==1)
{
return 1;
}
else
{
return Sum2(num - 1 )+num;
}
}
这两个代码运行效果一致,但是递归更难理解一点,因为在平常的生活中我们一般都是一步一步想着代码运行的,已经用惯了for,两者之间的关系为,能用递归的一定可以用for,而可以用for的不一定可以用递归。
必要条件:
新问题与原问题有着相同的形式
存在一种简单情景,可以使递归在简单情景下退出
- 枚举
首先他是什么呢?
简单就是通过自己调用自己把复杂的逻辑简单化,可以求得最终结果。
比如简单一个列子说明
1、单个字符分隔用split截取
string str = "GT123_1";string[] strArray = str.Split('_');//输出:sArray[0]="GT123"// sArray[1]="1"
2、利用多个字符来分隔字符串
string str = "GTAZB_JiangjBen_123";string[] strArray = str.Split(new char[2] { 'j', '_' });//输出:sArray[0]="GTAZB"// sArray[1]="Jiang"// sArray[2]="Ben"// sArray[3]="123"
3、根据字符串或字符串组来截取字符串
string str = "GTAZB_JiangjBen_123";string[] strArray = str.Split(new string[] { "Ji", "jB" }, StringSplitOptions.RemoveEmptyEntries);//输出:sArray[0]="GTAZB_"// sArray[1]="ang"// sArray[2]="en_123"。
4、提取字符串中的第i个字符开始的长度为j的字符串;
string str = "GTAZB_JiangjBen_123";int start = 3, length = 8;
Console.WriteLine(str.Substring(start - 1, length));
//输出:AZB_Jian。
5、提取字符串中右数长度为i的字符串
string str = "GTAZB_JiangjBen_123";int i = 5;
str = str.Substring(str.Length - i);
Console.WriteLine(str);//输出:n_123。
6、替换字符串中的特定字符串
string str = "GTAZB_JiangjBen_123";
str = str.Replace("123", "321");
Console.WriteLine(str);//输出:GTAZB_JiangjBen_321。
7、删除字符串中的特定字符串Jiangj
string str = "GTAZB_JiangjBen_123";
str = str.Replace("Jiangj", "");
Console.WriteLine(str);//输出:GTAZB_Ben_123。
8、删除指定位置(第i个)的指定长度(length)的字符串
string str = "GTAZB_JiangjBen_123";int i = 5, length = 8;
str = str.Remove(i, length);
Console.WriteLine(str);