zl程序教程

您现在的位置是:首页 >  后端

当前栏目

c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)

c#输出入门 使用 详解 字符串 结构 控制台
2023-06-13 09:15:25 时间

枚举、结构
枚举的类型有限(short、byte...)且是相同的,在MSDN上找到枚举的一些示例,觉得这个还不错:

复制代码代码如下:


enummyWeekDay{Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};
inti=3;
myWeekDaytoday=(myWeekDay)i;

枚举是需要先声明的,然后再通过新建一个变量(today)为枚举类型来使用。枚举默认的基本类型值从0开始,递增1,这叫等差数列。

枚举声明时,建议放在命名空间,当然,也可以放在类或结构中。将其它变量赋值给枚举类型时,需要强制转换,例如:today=(myWeekDay)myByte。当然,还有Enum.Parse(typeof(),)命令,就不具体研究了,用时再来看。

而结构(struct)就比较好用了,一个结构内支持不同基础数据类型。同样需要先声明结构,然后再声明变量为该结构类型,从而使用:

复制代码代码如下:


enumorientation:byte{north=1,south=2,east=3,west=4};
structroute
{
   publicorientationdirection;
   publicdoubledistance;
}

使用public:让调用该结构的代码可以访问该结构的成员。具体应用:

复制代码代码如下:
routemyRoute;
intmyDirection=-1;
doublemyDistance;
Console.WriteLine("1)North\n2)South\n3)East\n4)West");
do
{
   Console.WriteLine("请选择一个行驶方向:");
   myDirection=Convert.ToInt32(Console.ReadLine());
}while(myDirection<1||myDirection>4);
Console.WriteLine("请输入一个距离:");
myDistance=Convert.ToDouble(Console.ReadLine());
myRoute.direction=(orientation)myDirection;
myRoute.distance=myDistance;
Console.WriteLine("指定方向{0}的距离是{1}",myRoute.direction,myRoute.distance);

注意myRoute.direction=(orientation)myDirection这一行代码,应该是枚举的应用场景:只需要指明枚举值中的基本类型值i,再通过(enumName)i的方式,即可取得对应的字符串。

声明一个结构:route(创建的结构名)myRoute,再通过myRoute.属性的方式访问结构中的成员。

数组

印象中的数组总是比较复杂的东东。一个不错的例子:需要存储10个同学的姓名,使用数组即可简单解决,首先声明数组:

复制代码代码如下:
string[]friendNames=newstring[arrayCount];
string[]friendNames={"张三","李四","王五","谢六","陈七"};

第一行只初始化数组大小,可选常数或常量,初始化后,才可使用friendNames[0]的方式为数组元素赋值。第二行直接声明数组,并且初始化了数组的内容。

可使用for循环,配合friendNames.Length的大小,来访问数组值,注意第1个元素的位置是0。也可使用foreach,并且不担心超出数组范围。foreach与for的区别在于,foreach是只读访问。

复制代码代码如下:
foreach(stringmyStrinfriendNames)
{
   Console.WriteLine(myStr);
}

多维数组分为矩形数组(多行的每行元素个数相同)、锯齿数组(多行的每行元素个数不同,并可能存在{列1{行1{层1,层2},行2},列2...}),当然,同样可以使用foreach的方式,取出所有元素的内容,多嵌套一个foreach即可:

复制代码代码如下:
int[][]jaggedIntArray={newint[]{1,2,3},newint[]{4,5},newint[]{6,7,8,9},newint[]{10,11}};
foreach(int[]topArrayinjaggedIntArray)
{
   foreach(intbottomArrayintopArray)
   {
       Console.Write("{0}",bottomArray);
   }
   Console.Write("\n");
}

注意:这儿用的都是[]或{},没有用()的方式哈,不要总写错括号,很低级。

字符串处理
这个就有意思多了。可以通过myString[1]的方式访问字符串中的每个字符,第1个字符位是0:

复制代码代码如下:
StringmyString=" HeLlOWoRlD";
charmyChar=myString[1];

使用ToCharArray(),获取一个分解myString每个字符后的char数组:

复制代码代码如下:
char[]myChars=myString.ToCharArray();

还可以使用myString.Length获取字符串的数量,使用myString.ToLower()转为大写,myString.ToUpper()转为小写。注意:ToLower()、ToUpper()并不会改变变量本身的值的大小写,还需要用myString=myString.ToLower()才能修改变量本身的值。

myString.Trim()可以去掉字符串前、后的空格,还有TrimStart()和TrimEnd(),分别去掉前面和后面的空格。还可以使用Trim(myChar[])的方式,指定去除前后的内容不限于空格(char[]myChar={"","s"}):

复制代码代码如下:
myString=" sfrost/110110200010101100-13090909880";
charmykg="";
char[]myxhx={"-","/"};
String[]myStrings=myString.Trim(mykg).Split(myxhx);
Console.WriteLine("myStrings[0]={0}",myStrings[0]);
Console.WriteLine("myStrings[1]={0}",myStrings[1]);
Console.WriteLine("myStrings[2]={0}",myStrings[2]);

最近刚好在搞微信开发,在C#中,上面这个例子,就可以实现以一个(些)关键字分解用户输入的个人信息。例子中使用的Split()方法,同样的可以使用char数组来指明分解的标识。强调一下,Split分解字符串的位置可以是多个不同标记的位置。

结语
从这章开始,很多内容都可以马上做一些小的课题了,呵呵。不管是枚举(同类型)、结构(成员不同类型)、数组(一维、矩形[二维]、锯齿[不规则多维])、以及字符串处理,还有枚举与普通变量之间的值如何转换,数组如何声明、初始化和访问等等。而字符串的处理就太有意思了,特别是split,还有replace,再应用char数组,可以说是锦上添花啊。

附:习题案例

编写一个控制台应用程序,接收用户输入的字符串,将字符串的顺序以输入时相反的方向输出:

复制代码代码如下:
Console.WriteLine("请输入需要交换位置的字符串:");
StringmyString=Console.ReadLine().Trim();
Console.WriteLine("{0}",myString.Length);
StringtmpStr="";
for(inti=myString.Length;i>0;i--)
{
   tmpStr+=myString[i-1];
}
Console.WriteLine(tmpStr);

编写一个控制台应用程序,接收用户输入的字符串,用yes替换字符串中的所有no:

复制代码代码如下:
Console.WriteLine("请输入带有no的字符串:");
myString=Console.ReadLine().ToLower().Trim();
Console.WriteLine("用yes替换掉{0}中的no后:{1}",myString,myString.Replace("no","yes"));

编写一个控制台应用程序,给字符串的每个单词加上引号(我以为,单词间肯定有空格):

复制代码代码如下:
Console.WriteLine("请输入带有空格的单词:");
StringmyWord=Console.ReadLine().Trim();
String[]myWords=myWord.Split("");
myWord="";
foreach(StringtmpWordinmyWords)
{
   myWord+="\""+tmpWord+"\"";
}
Console.WriteLine("添加引号后的句子:{0}",myWord);