【C#学习笔记】【7】我想从键盘输入变量的值,这样程序就更灵活了(输入输出函数以及类型转换)

我们在之前的文章中,对于变量的赋值(初始化)都是直接写在程序中的,那如果想从键盘输入,怎么做呢?我来介绍一个用于从键盘获取输入值的方法。

Console.ReadLine()方法

看到这个标题,是不是想起了什么?对,我们之前用的输出函数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转换,一种是强制转换(不是任何地方都可以强制转换)。当然我会告你刚才的错误中所说的隐式转换是什么东西。

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);
}

多彩缤纷的输出方法Console.WriteLine()

在之前我们使用这个输出方法,总是输出单一的变量或者一句简单的字符串。那么,怎么进行多彩缤纷的输出呢?例如用户输入了一个值,我们再输出一句话,“您输入的是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;你试试,这样会报错么?所以@可以屏蔽关键字,这个你知道就好,不会用到的。

总结

  1. 怎么样从控制台输入一个值
  2. 类型怎么转换
  3. 什么是显式转换和隐式转换
  4. 输出方法的多样性
  5. 字符串旁边的+是什么意思
  6. 转义字符是什么
  7. 怎么不让转义字符转义

练习

  1. 用户输入一个数,判断其是奇数还是偶数,并且输出,然后再让用户输入一个数,判断是否能被刚才的数整除,余数是多少。尽量使用今天的内容解答问题,并且加入适当的提示性信息,例如“请输入一个数”之类的提示语,尽量使程序友善。

关于练习答案的声明,以后可以直接给我发邮件索求练习题答案,并且进行交流,索求答案时注明文章的序号,例如今天的是7。以后不再占篇幅解答练习答案。

posted @ 2015-07-19 22:15  鹏哥,一个业余爱好者  阅读(4561)  评论(0编辑  收藏  举报