标签:
我们在之前的文章中,对于变量的赋值(初始化)都是直接写在程序中的,那如果想从键盘输入,怎么做呢?我来介绍一个用于从键盘获取输入值的方法。
看到这个标题,是不是想起了什么?对,我们之前用的输出函数Console.WriteLine()方法。今天我们再介绍一下输入函数。
猜猜怎么用?好吧,我介绍一下用法:
string s; s=Console.ReadLine(); Console.WriteLine(s);
从上面的例子中我们可以看出,Console.ReadLine()会从键盘读取一个数,并且把结果赋值给s。是不是用法很简单呢?让我们思考一个问题。
编写一个程序,从键盘输入两个整数,并且输出他们的和。
哇,你写出来了么?是不是写了类似的语句 int a=Console.ReadLine();执行时报错了,错误列表告诉我们:无法将类型string隐式转换为int。这是神马意思呢?
通过查资料(MSDN帮助文件的使用后文会讲解)我们发现,Console.ReadLine()的结果是字符串类型,即string。而我们需要的是一个int整数,那我们怎么将string转换成我们需要的类型呢?下面我们介绍转换方法。
在这里,我们介绍两种常用的转换方式,一种是利用Convert转换,一种是强制转换(不是任何地方都可以强制转换)。当然我会告你刚才的错误中所说的隐式转换是什么东西。
我先给出上面思考题的解决方法。
string s1=Console.ReadLine(); int a1=Converrt.ToInt32(s); string s2=Console.ReadLine(); int a2=Converrt.ToInt32(s); int sum=a1+a2; Console.WriteLine(sum);
从上面的例子中可以看出,我用的Convert.ToInt32()这样的语句进行转换为int整数的,括号里的是待转换的变量,这个变量其实可以不只是string类型,可以是任意类型(可能会出错,后面讲)。这样的转换是不是也是很简单,那你猜猜转换为double类型怎么做呢?不知道你猜到没有,那就是Convert.ToDouble()方法。还有一个常用的方法就是Convert.ToBoolean();这个会将“true”或者“false”的字符串转换为bool类型的变量。我们需要知道的就这三个。
你可能会有疑问,为什么不介绍转换为string类型的方法呢。第一个是我们输入的直接就是string类型,而且任意类型都会自动(隐式)转换为string类型。而且你可以明确的用方法转换为string类型,那就是Convert.ToString();
刚才我说了,转换过程中可能会出错,你能想到是什么样的错误么?
例如我从键盘输入了一个这样的字符串“asdfbh23sdf562dfs”,你能将他转换为整数int类型吗?貌似说不通,也做不到,除非你自己写一个转换方法(后面咱们可以尝试一下)。还有一种情况,我输入的是数字,例如“123654132154561324564132”,这个要是转换成int会出什么样的错误呢?前文我提到,每种变量类型是有范围的,不是任意的值都可以,当然,这个字符串的范围显然超出了int类型的范围,那当然会出错喽。至于这两种问题(用户导致的错误,而不是我们写程序的)怎么解决,我们以后在异常那里会详细说。
其实我不喜欢这种方式,会经常出错,而且试用范围小。方法就是在待转换变量前加一个括号,括号里写目标类型,如下:
double a=6.568; int b=(int)a; Console.WriteLine(b); //结果是6,显然精度丢失了,我们有时候用这个方法取整数。前文提到过。
这个方法就简单提一下。下面介绍一下显式转换和隐式转换。
用我的理解来定义这两种转换的话,我们明确指出的并且采用以上两种方法的转换就是显式转换。而程序自己默认转换的就是隐式转换。其实,我们前面已经用了很多的隐式转换,例如,两个整数相除时我们总是乘以0.1来让结果变成double型。还有我们常用的输出方法,Console.WriteLine(),其实括号中只接受string类型,而我们操作时经常把任意类型放进去,其实程序在这里自己做了隐式转换。那么,什么时候可以进行隐式转换呢?
也就是说,小类型转换为大类型。如int可以隐式转换为double,反过来却不能,为什么呢?很好理解,小容器内的水总能全部倒入到大容器而不出错,反过来,可能会把水溢出来。(我在之前也说过,把类型理解为装指定范围值的容器)这样也解释了,任何变量类型总能转换为string字符串。因为string可以存放任意长度的任意东西。
隐式转换顺序如下:
char >> int >> double >> string;
bool >> string
你看完是不是想说我在玩儿你,char字符类型的怎么可以转换为整数int,例如a的整数是多少。我想请你打消顾虑,他的确可以进行转换,其实转换的结果就是char对应的Ascii码表(点击查看什么是ascii码)的值。例如下面的程序:
char a = ‘a‘; int b = a;//这里有隐式转换char>>int char c = (char)(a + 1); //这是什么玩意儿?其实就是把a先隐式转换为int,然后加1,再强制转换会char类型 Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); /* * 运行结果 * a * 97 * b */
你尝试一下,输出“abcde……xyz”(用循环)
参考
char a = ‘a‘; char b; for (int i = 0; i < 26; i++) { b = (char)(a+i); Console.WriteLine(b); }
在之前我们使用这个输出方法,总是输出单一的变量或者一句简单的字符串。那么,怎么进行多彩缤纷的输出呢?例如用户输入了一个值,我们再输出一句话,“您输入的是XXX”来让用户确认输入的正确性。我们来改造一开始那个用户输入两个整数,输出和的程序。我这样写:
Console.WriteLine("请输入变量A:"); int a=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入变量B:"); int b = Convert.ToInt32(Console.ReadLine()); int c = a + b; Console.WriteLine("您输入的A变量是" + a + ",您输入的A变量是" + b + ",他们的和是" + c);
先执行一下,效果是不是比刚才好多了呢?需要解释的是第二行的代码,我把声明和转换写成了一句,你是否理解了呢?还有最后一行的输出,乱七八糟的是什么啊?我重点介绍一下输出:
还记得刚才那句话么,输出方法的括号里需要的类型是字符串,而我这里面写了一堆加号是干啥的?难道int类型还能加字符串?
其实,当加号出现在字符串旁边时,他已经失去了加法运算的性质,而变成了连接两个字符串(如“hello,”+“北京你好”的结果就是“hello,北京你好”),而此时参与连接的abc这些整数变量,已经隐式转换为了string。所以上面程序输出的结果就是你运行的那样喽。
上面那种方法是不是看着眼晕呢?其实还有更好地方法,占位符!
我把上面的最后一句话改成这样的:
Console.WriteLine("您输入的A变量是{0},您输入的A变量是{1},他们的和是{2}",a,b,c);
上面的{0},{1}这样的符号就是占位符了,顾名思义,占着位子的符号,也就是说,这些东西占了位置,需要用东西填补起来,也就是逗号后面的对应的变量喽。需要说明的占位符的序号必须从0开始。你会了么?自己试一下。将A和B的和差积商都输出。
思考一个问题,我们输入时候,不知道你留心没,智能提示有个类似的方法,Console.Write(),那么和WriteLine什么区别,哈哈,你猜到了么?
写如下的程序,来看一下区别:
Console.WriteLine("你好世界!"); Console.WriteLine("我爱你!!!"); Console.WriteLine("------华丽的分隔符-------"); Console.Write("你好世界!"); Console.Write("我爱你!!!"); /*运行结果 * 你好世界! * 我爱你!!! * ------华丽的分隔符------- * 你好世界!我爱你!!! */
发现点什么吗?原来他俩就差着输出完是否换行,WriteLine输出完后,会自动换行,而Write却不会,你记住了吗?
思考:我们怎么输入换行呢?而且还有一个严重的问题,你是否能将字符串“高尔基说:“书是人类进步的阶梯”。这句话告诉我们要多读书!”赋值给一个string变量呢?是不是发现问题了?双引号没办法赋值给字符串,因为它本身表示字符串的开始或者结尾,我们下面介绍处理这两个问题的方法!
从字面讲,就是转换含义的字符,我介绍几个常用的。见下表:
转义字符 | 含义 | 示例 |
\n | 换行符 | Console.Write(“我爱你北京!!!\n”) |
\r | 回车符 | 注意,键盘的回车键相当于\t\n的组合,回车键是回车加换行 |
\t | 制表符 | 键盘的Tab键 |
\” | 双引号 | 表示是一个双引号,此处双引号不再是字符串的开头或者结尾(这里是英文半角双引号,中文的双引号可以直接输入的) |
\\ | \(单斜线) | 表示一个斜线,由于单斜线意味着转义,所以想输出单斜线,必须\\ |
举个例子,比如文件的路径C:\windows\system32\我的”电影”怎么表示呢?(不要想多了啊,电影加了引号,还是电影,嘿嘿)
string s="C:\\windows\\system32\\我的\"电影\"";
你看,我是不是用双斜线代替了单斜线,用\”代替了双引号。
如果我这个字符串中有\n,我不想让他表示转义的换行符,就是简单的\n字符串,那么我们怎么办?我们可以在字符串前加原意字符@,如下
string s=@"C:\windows\system32\我的电影";
这样输出的单斜线还是单斜线。你是不是好奇,我为什么取消\”了,因为在加原意字符@的字符串中,\”会出问题,你可以自己尝试一下(多试验才会知道)!
考虑一个有趣的问题,你能声明一个名字是if的变量么?貌似不可以吧,我告诉你可以这样做,int @if;你试试,这样会报错么?所以@可以屏蔽关键字,这个你知道就好,不会用到的。
关于练习答案的声明,以后可以直接给我发邮件索求练习题答案,并且进行交流,索求答案时注明文章的序号,例如今天的是7。以后不再占篇幅解答练习答案。
【C#学习笔记】【7】我想从键盘输入变量的值,这样程序就更灵活了(输入输出函数以及类型转换)
标签:
原文地址:http://www.cnblogs.com/zp646858695/p/4659974.html