C#基础部分(三)
一、数组
数组格式可以是整形,也可以是字符型……并且数组的长度是确定的,无法动态的增长长度。
string[] names=new string[5]声明一个长度为5的string数组
如何创建一个动态增长的数组呢?(动态数组)
int[] values={3,45,6,4,23} string[] strs=new string[values.Length]
作业问题:
练习 3、将一个字符串数输出为|分割的形式
这个问题用for语句很好做出来,自己的问题在于居然用i=1,然后再前面加上一句console,而且做的时候还费了一点脑子,都没有想起来i=0更加简洁……鄙视一下自己
还可以用字符串相加,这个办法更好!
另外一种思路:第一个不打印竖线,从第二个开始前面打印竖线。
程序有什么bug? 当数组里面没有元素的话,程序就会出现异常加入一个容错处理: 加入if语句来判断
写程序一定要严谨!
练习4、将一个整数数组的每一个元素进行如下的处理:如果元素是正数则将指定位置的元素值加1,如果元素是负数则将指定位置的元素值减1
这个问题也比较简单。变量的作用域 {}起到“圈定”变量的作用 注意for中i的作用域,出了这个作用域i就不能用了。
多个for循环里的变量互相不冲突。
练习5、有一个整数数组,请声明一个字符串数组,将整数数组中的每一个元素转换为字符串保存到字符串数组中。
自己忽略了数字元素转换为数组元素显示上没有区别,实质上通过strs[i] = Convert.ToString(nums[i]);已经转换为字符。琢磨了好久以为没有实现…… 思考问题过于片面。
练习6、将一个字符串数组的元素的顺序进行反转。(第i个和第length-i-1个进行交换)
这个问题着实令我想了一段时间,最后还是看老师的讲解才懂的。所以有必要记下:
static void Main(string[] args)
{
string[] strs = { "hello1", "hello2", "hello3","hello4" };
for (int i = 0; i < strs.Length/2; i++) //计算机中进行除法运算时一般都为整除。
{
string temp=strs[i];
strs[i]=strs[strs.Length-1-i]; //将数组中两个字符串元素交换
strs[strs.Length-1-i]=temp;
//Console.WriteLine("{0,-5}", strs[i]);
}
for (int i = 0; i < strs.Length; i++)
{
Console.Write("{0,-10}",strs[i]);
}
Console.ReadKey();
}
也可以用foreach语句来遍历整个数组,例如:
int[] num = { 2, -5, -9, 23, 9, -4, 7 };
foreach (int n in num) //foreach和in是关键词
{
Console.WriteLine(n);
}
和for的区别在于:for语句可以不逐一遍历,比如每隔一个遍历一个或者从后向前遍历。
二、函数
1、函数就是讲一堆代码进行重用的一种机制。函数就是一段代码,这段代码可能有输入的值(参数),可能会返回值(执行结果)。一个函就像一个专门做这件事的人,我们调用函数来做一些事情,它可能需要我们提供一些数据,函数执行完后可能会有一些执行结果返回给我们,要求的数据就叫做参数,返回的执行结果就是返回值。
例如:在控制台应用程序中,
Console.ReadLine就是一个有返回结果的函数;
Console.WriteLine("Hello")就是一个有执行参数的函数,只有告诉WriteLine被打印的数据它才知道如何打印;
int j = Convert.ToInt32("22")则是一个既有参数又有返回值的函数。
有了函数写代码就像拼积木,C#中各种各样的技术其实就是通过for,if等这些基础的语法将不同的函数按照一定的逻辑组织起来。
2、
如果函数没有返回值,则标记函数为void。
在所有可能造成函数返回的地方都要返回一个合法值。
确定函数参数的原则:能够确定的数据自己内部解决;自己确定不了的数据通过参数来传递。
C#中函数、类的名字都用大写开头,变量、参数名字小写开头,并且要有意义。
练习:定义一个字符串数组string[] strs = {"aa","ss","dd"};返回一个字符串,然后字符串使用指定的分隔符进行分隔,比如指定为“|”,那么返回值就是“aa|ss|dd”
首先确定函数返回值类型为string,然后能够确定的是一个字符串数组和一个分隔符
static string Join(string[] strs, string seperator)
{
string result="";
for (int i = 0; i < strs.Length-1; i++)
{
result = result + strs[i] + seperator;
}
if (strs.Length > 0)
{
result = result + strs[strs.Length - 1];
}
return result;
}
函数写好之后就可以调用了
static void Main(string[] args)
{
string[] names = { "aa", "ss", "dd" };
string s = Join(names, "|");
Console.WriteLine(s);
Console.ReadKey();
}
3、函数可变参数
关键字:params(params参数必须是形参表中的最后一个参数)
例如一个参数数组:
int sum(params int[] values)
int sum(string name,params int[] values) //可变参数数组必须是最后一个
4、函数的重载
所谓函数重载是指一个函数名可以对应多个函数的实现,函数重载在类和对象的应用尤其重要。
函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,参数类型不同,或者参数顺序上不同否则,将无法实现重载。(与返回值无关)
三、字符串
1、字符串的处理:
C#中单个字符用单引号包含就是char类型,单引号中只能放一个字符,且不能为空。('a')
string可以看做是char的只读数组,如char c = s[1];
例子:正序或倒序对字符串中的字符进行访问
string s = "hello";
for(int i = 0;i<s.Length;i++)
{
char c = s[i];
Console.WriteLine(c);
}
for(int i = s.Length-1;i>=0;i--)
{
Console.WriteLine(s[i]);
} //只能读不能写
字符串的一个重要特性:不可变性,字符串一旦声明就不可以再改变。所以只能通过索引来读取指定位置的char,不能对指定位置的字符进行修改。
如果要对char进行修改,就必须创建一个新的字符串,用s.ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。
static void Main(string[] args)
{
string s1 = "hello";
char[] chars = s1.ToCharArray();
chars[1] = 'a';
string s2 = new string(chars);
Console.WriteLine(s2);
Console.ReadKey();
}
string s="abc"; s="123"; ??
要区分变量名和变量指向值的区别。程序中可以有很多字符串,然后由字符串变量指向它们,变量可以指向其他的字符串,但是变量本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不可变。
2、
string类常用函数(重要)
ToLower():得到字符串的小写形式。
注意字符串内容是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回。
ToUpper():得到字符串的大写形式;
Trim()函数用来去掉两遍的空白,只保留有意义的部分;
s1.Equals(s2,StringComparison.OrdinalIgnoreCase):两个字符串进行忽略大小写比较;
string[] Split(params char[] separator,StringSplitOptions options):将字符串按照指定的分隔符分隔为字符串数组;options取RemoveEmptyEntries的时候移除结果中的空白字符串
string[] Split(params string[] separator,StringSplitOptions options):将字符串按照指定的string分隔符分隔为字符串数组。
代码:
static void Main(string[] args)
{
//ToLower方法
string s = "Hello";
s = s.ToLower(); //并不是改变了字符串的内容,而是生成一个新的全部变为小写的字符串,然后s指向这个新的字符串
Console.WriteLine(s);
//Trim()方法
string s1 = " a b ";
s1 = s1.Trim(); //用来去掉两遍的空白,只保留有意义的部分,而字符中间的空白不会被去掉
Console.WriteLine("|{0}|",s1);
//s1.Equals(s2,StringComparison.OrdinalIgnoreCase):两个字符串进行忽略大小写的比较
bool b = ("abc" == "ABC");
Console.WriteLine(b);
bool c = "abc".Equals("ABC", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(c);
//Split重载函数1 Split(params char[] separator)
string s2 = "aaa,bbb,ccc,fsfgs.345rs|dgt66,yes";
string[] s3 = s2.Split(',','.','|'); //只能写char
foreach (string str in s3)
{
Console.WriteLine(str);
}
//Split重载函数2 Split(char[] separator,StringSplitOptions options)
string s4 = "aaa,ccc,bb,,12,3"; //如果只用string[] strs = s4.Split(','),那么,,被识别为长度为0的字符串,用下面的重载方法
string[] strs = s4.Split(new char[] {','},StringSplitOptions.RemoveEmptyEntries);
foreach (string item in strs)
{
Console.WriteLine(item);
}
//Split重载函数3 Split(string[] separator,StringSplitOptions options)
string s5 = "我是迈克尔我是韩庚我是王力宏";
string[] strs1 = s5.Split(new string[] { "我是" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item1 in strs1)
{
Console.WriteLine(item1);
}
Console.ReadKey();
}
未完待续……