其他路径:
CSDN: https://blog.csdn.net/wodehao0808
微信公众号:程序喵星人
更多资源和视频教程,QQ:1902686547
5 变量的更多内容
5.1 类型转换
5.1.1 隐式转换
当小盒子可以放入大盒子时,系统可以自动隐式转换;
例如:
byte byt = 6;
int i = byt; // int 类型范围比 byte 大,所以可以隐式转换,系统自动将 byt 的值转换为 int 类型存储在 i 中
2.子类型赋值给基类(父类)
5.1.2 显示转换
显示转换,也叫强制转换。
当将大盒子放入小盒子时,可能会放不下,编译器不允许这样操作,这时需要显示转换(相当于告诉编译器,我知道自己在做这件事,有问题自己承担。)。
例如:
int i = 12;
// byte byt = i; // 编译器会报错,不允许
byte byt = (byte)i; // 使用 (byte) 明确的告诉编译器,我要将 int 类型的 i值 转换为 byte 类型的值存储到 byt 中。
为什么编译器会不允许小盒子放入大盒子呢?举个例子:
int i = 2566;
byte byt = i; // i 超出了byte取值范围,导致 byt 值 可能不是用户想要存储的值,导致未知错误;所以编译器,不允许这样操作!除非用户自己知道并愿意承担强制转换的后果,就使用显示转换。
5.1.3 使用Convert转换
使用之一:如果要把一个数字字符串转换成一个数字类型(整形或者浮点型),就要用到Convert里面的方法。
int类型:Convert.ToInt32。
float类型:Convert.ToSingle。
double类型:Convert.ToDouble。
string类型:Convert.ToString。
......
5.1.4 Example:类型转换
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 类型转换
namespace Lesson_4_1
{
class Program
{
static void Main(string[] args)
{
// 隐式转换
byte byt = 10;
int i = byt; // 隐式转换
Console.WriteLine("隐式转换i = " + i);
// 显示转换
int iNum = 10;
// byte bytNum = iNum; // 大盒子放入小盒子中,不能隐式转换
byte bytNum = (byte)iNum; // 显示转换
Console.WriteLine("显示转换 iNum = " + iNum);
// Convert转换
string str = "123.36";
float f = Convert.ToSingle(str);
double d = Convert.ToDouble(str);
// int intN = Convert.ToInt32(str); // 抛出异常错误,小数不能转换成整数
// Console.WriteLine("Convert转换 intN = " + intN);
Console.WriteLine("Convert转换 f = " + f);
Console.WriteLine("Convert转换 d = " + d);
Console.ReadKey();
}
}
}
5.2 枚举
枚举是一组命名的整型常量。枚举类型使用 enum 关键字声明。
枚举定义:
enum <typeName>
{
<value1>,
<value2>,
<value3>,
...
}
枚举类型中的每一个值,其实都是一个整数,默认为int类型。
默认情况下,枚举中的值从 0 开始,其后面的值是前一个值+1。
例如:
enum EState
{
start, // 默认为 0
end, // 1
win, // 2
fail, // 3
}
enum EState2
{
start = 100, // 自定义值 100
end, // 101
win, // 102
fail, // 103
}
enum EState3
{
start = 100, // 自定义值 100
end, // 101
win = 695, // 自定义值695
fail, // 696
}
枚举也可以设置枚举的类型,例如
enum EState: byte
{
start, // 默认为 0
end, // 1
win, // 2
fail, // 3
}
如果在明确枚举类型范围最大值时,尽可能的使用小的类型存储,这样能节约内存开销。
5.2.1 Example: 枚举
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 枚举
namespace Lesson_4_2
{
enum EGameState // 默认枚举存储类型是 int
{
Start, // 默认值 0
End, // 前一个值自动 +1, 1
Win, // 前一个值自动 +1, 2
Fail // 前一个值自动 +1, 3
}
enum EGameState2
{
Start, // 默认值 0
End = 10, // 自定义值 10
Win, // 前一个值自动 +1, 11
Fail // 前一个值自动 +1, 12
}
enum EGameState3
{
Start = 10, // 自定义值 10
End, // 前一个值自动 +1, 11
Win = 30, // 自定义值 30
Fail // 前一个值自动 +1, 31
}
// 如果在明确枚举值范围情况下,尽可能的使用小的枚举存储类型,这样能节省内存开销
enum EGameState4 : byte // 重新定义枚举存储类型,byte
{
Start, // 默认值 0
End, // 前一个值自动 +1, 1
Win, // 前一个值自动 +1, 2
Fail // 前一个值自动 +1, 3
}
class Program
{
static void Main(string[] args)
{
// EGameState
EGameState t_eState = EGameState.Fail;
if (EGameState.Fail == t_eState)
{
Console.WriteLine("当前状态时失败");
}
Console.WriteLine("EGameState 是 t_eState = " + t_eState);
Console.WriteLine("EGameState 是 int e = " + (int)t_eState);
// EGameState2
EGameState2 t_eState2 = EGameState2.Fail;
if (EGameState2.Fail == t_eState2)
{
Console.WriteLine("当前状态时失败");
}
Console.WriteLine("EGameState2 是 t_eState2 = " + t_eState2);
Console.WriteLine("EGameState2 是 int e = " + (int)t_eState2);
// EGameState3
EGameState3 t_eState3 = EGameState3.Fail;
if (EGameState3.Fail == t_eState3)
{
Console.WriteLine("当前状态时失败");
}
Console.WriteLine("EGameState3 是 t_eState3 = " + t_eState3);
Console.WriteLine("EGameState3 是 int e = " + (int)t_eState3);
// EGameState4
EGameState4 t_eState4 = EGameState4.Fail;
if (EGameState4.Fail == t_eState4)
{
Console.WriteLine("当前状态时失败");
}
Console.WriteLine("EGameState4 是 t_eState4 = " + t_eState4);
Console.WriteLine("EGameState4 是 byte e = " + (int)t_eState4);
Console.ReadKey();
}
}
}
5.3 结构
结构,可以看成是一组数据和操作的集合。
定义:
struct <typeName>
{
// ...
}
例如:
// 定义了位置信息的结构
struct Postion
{
public float x;
public float y;
public float z;
}
Position pos1, pos2;
pos1.x = 1;
pos1.y = 1;
pos1.z = 1;
pos2.x = 20;
pos2.y = 20;
pos2.z = 20;
5.3.1 Example:结构
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 结构
namespace Lesson_4_3
{
// 位置
struct Position
{
public float x;
public float y;
public float z;
}
// 方向
enum EDir
{
West,
North,
South,
East
}
struct Direction
{
public EDir eDir;
public float distance;
}
class Program
{
static void Main(string[] args)
{
// 不使用结构,定义两个位置
float x1 = 1;
float y1 = 1;
float z1 = 1;
float x2 = 1;
float y2 = 1;
float z2 = 1;
// 使用结构,定义两个位置
Position pos1, pos2;
pos1.x = 1;
pos1.y = 1;
pos1.z = 1;
pos2.x = 1;
pos2.y = 1;
pos2.z = 1;
// 方向
Direction dir;
dir.eDir = EDir.North;
dir.distance = 1000;
}
}
}
5.4 数组
数组存储一个大小固定的顺序集合中相同类型的元素。数组用于存储数据的集合,我们通常认为数组是一个存储在连续的内存位置的相同类型的集合。
数组特性:
1.所有元素是同一类型;
2.数组定义后大小固定,不能增删;
3.通常认为数组是一个存储在连续的内存位置。
5.4.1 数组的定义
数组声明:
<Type>[] <varName>;
数组是一个变量的索引列表,这个索引是一个整数,第一个条目的索引是0,第二个是1,以此类推。
比如:
int[] scores = { 1, 2, 3 };
// 取值
int i0 = scores[0]; // 1
int i1 = scores[1]; // 2
int i2 = scores[2]; // 3
// 赋值
scores[0] = 100;
scores[1] = 101;
scores[2] = 102;
会发现,索引从0开始,最大索引值是数组长度减1(Length - 1)。
数组长度获取方法,.Length,例如:scores.Length;
int[] scores;
第一种定义方式:
scores = { 16, 8, 9, 86, 102 };
第二种定义方式:
scores = new int[10]; // 10个元素的数组,每个元素是该类型的默认值
第三种定义方式:
scores = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
第四中定义方式:
scores = new int[] { 1, 2, 3, 4 }; // new int[] 中没有指定元素数目,而是根据后面的{}中的元素个数推导出来数组长度;
5.4.1.1 Example:数组的定义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 数组的定义
namespace Lesson_4_4
{
class Program
{
static void Main(string[] args)
{
// 第一种定义方式
int[] scores = { 12, 65, 89, 89, 98, 65 };
Console.WriteLine("第一种定义方式,scores[0] = :" + scores[0]);
Console.WriteLine("第一种定义方式,长度:" + scores.Length);
// 第二种定义方式
int[] scores2 = new int[10];
scores2[0] = 100;
scores2[1] = 31;
Console.WriteLine("第二种定义方式,scores2[0] = :" + scores2[0]);
Console.WriteLine("第二种定义方式,scores2[1] = :" + scores2[1]);
Console.WriteLine("第二种定义方式,scores2[2] = :" + scores2[2]);
Console.WriteLine("第二种定义方式,长度:" + scores2.Length);
// 第三种定义方式
int[] scores3 = new int[5] { 5, 55, 65, 75, 85 };
Console.WriteLine("第三种定义方式,scores3[0] = :" + scores3[0]);
Console.WriteLine("第三种定义方式,scores3[1] = :" + scores3[1]);
Console.WriteLine("第三种定义方式,scores3[2] = :" + scores3[2]);
Console.WriteLine("第三种定义方式,长度:" + scores3.Length);
// 第四种定义方式
int[] scores4 = new int[] { 4, 41, 43, 23 };
Console.WriteLine("第四种定义方式,scores4[0] = :" + scores4[0]);
Console.WriteLine("第四种定义方式,scores4[1] = :" + scores4[1]);
Console.WriteLine("第四种定义方式,scores4[2] = :" + scores4[2]);
Console.WriteLine("第四种定义方式,scores4[3] = :" + scores4[3]);
Console.WriteLine("第三种定义方式,长度:" + scores4.Length);
Console.ReadKey();
}
}
}
5.4.2 数组的遍历
5.4.2.1 Example:数组的遍历
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 数组的遍历
namespace Lesson_4_5
{
class Program
{
static void Main(string[] args)
{
int[] scores = { 2, 98, 87, 56, 32 };
// 使用for遍历
for (int i = 0; i < scores.Length; ++i)
{
Console.WriteLine("for 循环遍历数组,元素 {0} 的值是 = {1}", i, scores[i]);
}
Console.WriteLine("for循环遍历数组结束--------------------------------");
// 使用while遍历
int i2 = 0;
while (i2 < scores.Length)
{
Console.WriteLine("while 循环遍历数组,元素 {0} 的值是 = {1}", i2, scores[i2]);
++i2;
}
Console.WriteLine("while循环遍历数组结束--------------------------------");
// 使用foreach遍历
foreach (int value in scores) // 无法取得元素的索引值
{
Console.WriteLine("foreach 循环遍历数组,元素的值是 = {0}", value);
}
Console.WriteLine("foreach循环遍历数组结束--------------------------------");
Console.ReadKey();
}
}
}
5.5 字符串的处理
字符串的一些常用处理方法:
* 通过索引,获得指定的字符串的指定位置的字符;索引从 0 开始。例如:
string str = "Hello";
char ch = str[0]; // 'H'
char ch2 = str[2]; // 'l'
* 字符串长度,.Length;例如:
string str = "12345";
int len = str.Length; // 5
* ToLower()方法:将字符串中的字母,全部转换为小写字母;返回一个副本,原字符串不会改变;
* ToUpper()方法:将字符串中的字母,全部转换为大写字母;返回一个副本,原字符串不会改变;
* Trim()方法:将字符串,首尾两端的空格删除;返回一个副本,原字符串不会改变;
* TrimStart()方法:将字符串,首端的空格删除;返回一个副本,原字符串不会改变;
* TrimEnd()方法:将字符串,尾段的空格删除;返回一个副本,原字符串不会改变;
* Split()方法:将字符串,按照指定的 字符(参数传递进入)进行分割,返回的结果是数组(类型是string);原字符串不会改变;
5.5.1 Example:字符串的处理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 字符串的处理
namespace Lesson_4_6
{
class Program
{
static void Main(string[] args)
{
string str = " My N a.m.e is CShape ";
// 索引
char ch = str[5];
Console.WriteLine("索引,ch = " + ch);
Console.WriteLine("索引结束--------------------------------");
// 长度
int t_len = str.Length;
Console.WriteLine("长度,length = " + t_len);
Console.WriteLine("长度结束--------------------------------");
// ToLower
string strLower = str.ToLower();
Console.WriteLine("ToLower 原字符串不会改变,str = " + str);
Console.WriteLine("ToLower 结果是:" + strLower);
Console.WriteLine("ToLower 结束--------------------------------");
// ToUpper
string strUpper = str.ToUpper();
Console.WriteLine("ToUpper 原字符串不会改变,str = " + str);
Console.WriteLine("ToUpper 结果是:" + strUpper);
Console.WriteLine("ToUpper 结束--------------------------------");
// Trim
string strTrim = str.Trim();
Console.WriteLine("Trim 原字符串不会改变,str = " + str + "!"); // 加上一个 ! 是为了方便查看 去除空格的效果
Console.WriteLine("Trim 结果是:" + strTrim + "!");
Console.WriteLine("Trim 结束--------------------------------");
// TrimStart
string strTrimStart = str.TrimStart();
Console.WriteLine("TrimStart 原字符串不会改变,str = " + str + "!"); // 加上一个 ! 是为了方便查看 去除空格的效果
Console.WriteLine("TrimStart 结果是:" + strTrimStart + "!");
Console.WriteLine("TrimStart 结束--------------------------------");
// TrimEnd
string strTrimEnd = str.TrimEnd();
Console.WriteLine("TrimEnd 原字符串不会改变,str = " + str + "!"); // 加上一个 ! 是为了方便查看 去除空格的效果
Console.WriteLine("TrimEnd 结果是:" + strTrimEnd + "!");
Console.WriteLine("TrimEnd 结束--------------------------------");
// split
string[] strArray = str.Split('.');
for (int i = 0; i < strArray.Length; ++i)
{
Console.WriteLine("Split 分割后的字符串数组时,元素 {0} 的值是 = {1}", i, strArray[i]);
}
Console.WriteLine("Split 结束--------------------------------");
Console.ReadKey();
}
}
}
5.6 练习
练习1.
找出100到999之间的水仙花数;"153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3"
练习2.
3个可乐瓶可以换一瓶可乐,现在有364瓶可乐。问一共可以喝多少瓶可乐,剩下几个空瓶!
练习3.
猜数字游戏,我有一个数,请您猜猜是多少?
//请您输入一个0-50之间的数:20(用户输入数字)
//您猜小了,这个数字比20大:30
//您猜大了,这个数字比30小:25
//恭喜您猜对了,这个数字为:25
用户猜错了就继续猜,猜对了就停止游戏。
练习4.
编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下:
‘a’→’d’ ‘b’→’e’ ‘w’→’z’ …… ‘x’→’a’ ‘y’→’b’ ‘z’→’c’‘A’→’D’ ‘B’→’E’ ‘W’→’Z’ …… ‘X’→’A’ ‘Y’→’B’ ‘Z’→’C’?对于其他字符,不进行加密。
练习5.
编写一个控制台程序,要求用户输入一组数字用空格间隔,对用户输入的数字从小到大输出。(Array.Sort方法和冒泡排序)
练习6.
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
用户输入n的值,计算出来他第一天吃的时候桃子是多少个?
练习7.
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
练习8.
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
输出新的序列
练习9.
问题:如果工资额都知道,最少需要准备多少张人民币,才能在给每位发工资的时候都不用找零呢?
这里假设工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
练习10.
输入一个字符串,判断其是否是C#的合法标识符。
练习11.
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
练习12.
网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。
首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。、
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
5.6.1 Example:练习1、2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习1、2
namespace Lesson_4_7
{
class Program
{
static void Main(string[] args)
{
// example_1: 找出100到999之间的水仙花数;"153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3"
for (int i = 100; i < 1000; ++i)
{
int t_bai = i / 100; // 百位
int t_shi = (i / 10) % 10; // 十位
int t_ge = i % 10; // 个位
int result = t_ge * t_ge * t_ge + t_shi * t_shi * t_shi + t_bai * t_bai * t_bai;
if (result == i)
{
Console.WriteLine("水仙花数是:" + i);
}
}
Console.WriteLine("example_1 finish ----------------------------------- ");
// example_2: 3个可乐瓶可以换一瓶可乐,现在有364瓶可乐。问一共可以喝多少瓶可乐,剩下几个空瓶!
int iCount = 364;
int iEmptyCount = 364;
while (iEmptyCount >= 3)
{
int iNewCount = iEmptyCount / 3;
iEmptyCount %= 3;
iCount += iNewCount;
iEmptyCount += iNewCount;
}
Console.WriteLine("一共可以喝 {0} 瓶可乐,剩下 {1} 个空瓶", iCount, iEmptyCount);
Console.WriteLine("example_2 finish ----------------------------------- ");
}
}
}
5.6.2 Example:练习3、4
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习3、4
namespace Lesson_4_8
{
class Program
{
static void Main(string[] args)
{
// example_3:
/*
猜数字游戏,我有一个数,请您猜猜是多少?
//请您输入一个0-50之间的数:20(用户输入数字)
//您猜小了,这个数字比20大:30
//您猜大了,这个数字比30小:25
//恭喜您猜对了,这个数字为:25
用户猜错了就继续猜,猜对了就停止游戏。
*/
int iCount = new Random().Next(0, 51);
Console.WriteLine("请输入一个数字:");
while (true)
{
int i = Convert.ToInt32(Console.ReadLine());
if (i > iCount)
{
Console.WriteLine("您猜大了,这个数字比 {0} 小。请继续输入数字猜:", i);
}
else if (i < iCount)
{
Console.WriteLine("您猜小了,这个数字比 {0} 大。请继续输入数字猜:", i);
}
else
{
Console.WriteLine("恭喜您猜对了,游戏结束。");
break;
}
}
Console.WriteLine("example_3 finish -------------------------------- ");
// example_4:
/*
编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下:
‘a’→’d’ ‘b’→’e’ ‘w’→’z’ …… ‘x’→’a’ ‘y’→’b’ ‘z’→’c’
‘A’→’D’ ‘B’→’E’ ‘W’→’Z’ …… ‘X’→’A’ ‘Y’→’B’ ‘Z’→’C’
对于其他字符,不进行加密。
*/
Console.WriteLine("请输入一个字符串:");
string str = Console.ReadLine();
string strTmp = "";
for (int i = 0; i < str.Length; ++i)
{
char tmp = str[i];
if (tmp >= 'a' && tmp <= 'z')
{
int iNum = (int)tmp;
iNum += 3;
tmp = (char)iNum;
if (tmp > 'z')
{
tmp = (char)(tmp - 'z' + 'a' - 1);
}
strTmp += tmp;
}
else if (tmp >= 'A' && tmp <= 'Z')
{
int iNum = (int)tmp;
iNum += 3;
tmp = (char)iNum;
if (tmp > 'Z')
{
tmp = (char)(tmp - 'Z' + 'A' - 1);
}
strTmp += tmp;
}
}
Console.WriteLine("加密后的字符串是:" + strTmp);
Console.WriteLine("example_4 finish ---------------------------------------- ");
Console.ReadKey();
}
}
}
5.6.3 Example:练习5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习5
namespace Lesson_4_9
{
class Program
{
static void Main(string[] args)
{
// example_5: 编写一个控制台程序,要求用户输入一组数字用空格间隔,对用户输入的数字从小到大输出。(Array.Sort方法和冒泡排序)
Console.WriteLine("请输入一组数字(数字直接用一个空格间隔):");
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
int[] intArray = new int[strArray.Length];
for (int i = 0; i < strArray.Length; ++i)
{
intArray[i] = Convert.ToInt32(strArray[i]);
}
//// 直接使用CLR(公共语言运行库)提供的排序功能,采用的是快速排序法
//Array.Sort(intArray);
//for (int i = 0; i < intArray.Length; ++i)
//{
// Console.WriteLine("sort方法排序后的输出是:" + intArray[i]);
//}
// 使用冒泡排序
for (int i = 1; i < intArray.Length; ++i)
{
for (int j = 0; j < intArray.Length - i; ++j)
{
if (intArray[j] > intArray[j + 1])
{
int tmp = intArray[j];
intArray[j] = intArray[j + 1];
intArray[j + 1] = tmp;
}
}
}
for (int i = 1; i < intArray.Length; ++i)
{
Console.WriteLine("冒泡排序后的输出是:" + intArray[i]);
}
Console.WriteLine("example_5 finish ------------------------------------ ");
Console.ReadKey();
}
}
}
5.6.4 Example:练习6、7
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习6、7
namespace Lesson_4_10
{
class Program
{
static void Main(string[] args)
{
// example_6:
/*
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
用户输入n的值(n为最后一天的天数),计算出来他第一天吃的时候桃子是多少个
*/
Console.WriteLine("请输入一共吃了多少天:");
int n = Convert.ToInt32(Console.ReadLine());
int iCount = 1; // 最后一天拥有的桃子数
for (int i = n - 1; i > 0; --i)
{
// 规律是:
// 第 n 天剩余数目 = ( 第 n - 1 天的数目 )/ 2 - 1;
// 所以得到:第 n-1 天的数目 = (第 n 天剩余数目 + 1 ) * 2;
iCount = (iCount + 1) * 2; // 第 i 天拥有的桃子数
}
Console.WriteLine("第一天吃的桃子数是:" + iCount);
Console.WriteLine("example_6 finish --------------------------------");
// example_7: 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Console.WriteLine("请输入一组整数(整数之前使用一个空格间隔):");
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
int[] intArray = new int[strArray.Length];
for (int i = 0; i < intArray.Length; ++i)
{
intArray[i] = Convert.ToInt32(strArray[i]);
}
int iIndex = 0, iMin = intArray[0];
for (int i = 1; i < intArray.Length; ++i)
{
if (iMin > intArray[i])
{
iMin = intArray[i];
iIndex = i;
}
}
int tmp = intArray[0];
intArray[0] = iMin;
intArray[iIndex] = tmp;
for (int i = 0; i < intArray.Length; ++i)
{
Console.WriteLine("交换后的数组顺序是:" + intArray[i]);
}
Console.WriteLine("example_7 finish --------------------------------");
Console.ReadKey();
}
}
}
5.6.5 Example:练习8
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习8
namespace Lesson_4_11
{
class Program
{
static void Main(string[] args)
{
// example_8:
// 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
// 输出新的序列
int[] intArray = { 1, 2, 3, 4, 5, 6 }; // 已经排序好的
Console.WriteLine("请输入一个插入的整数:");
int iNum = Convert.ToInt32(Console.ReadLine());
int[] intNewArray = new int[intArray.Length + 1];
int iIndex = -1;
bool isInsert = false;
for (int i = 0; i < intArray.Length; ++i)
{
++iIndex;
intNewArray[iIndex] = intArray[i];
if (intArray[i] > iNum && !isInsert)
{
isInsert = true;
intNewArray[iIndex] = iNum;
++iIndex;
intNewArray[iIndex] = intArray[i];
}
}
if (!isInsert)
{
isInsert = true;
++iIndex;
intNewArray[iIndex] = iNum;
}
for (int i = 0; i < intNewArray.Length; ++i)
{
Console.WriteLine("新的数组顺序是:" + intNewArray[i]);
}
Console.WriteLine("example_8 finish --------------------------------");
Console.ReadKey();
}
}
}
5.6.6 Example:练习9、10
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习9、10
namespace Lesson_4_12
{
class Program
{
static void Main(string[] args)
{
// example_9:
// 问题:如果工资额都知道,最少需要准备多少张人民币,才能在给每位发工资的时候都不用找零呢?
// 这里假设工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
Console.WriteLine("请输入薪资:");
int iMoney = Convert.ToInt32(Console.ReadLine());
int iCount100 = iMoney / 100; // 100元张数
int iRemain = iMoney % 100;
int iCount50 = iRemain / 50; // 50元张数
iRemain %= 50;
int iCount10 = iRemain / 10; // 10元张数
iRemain %= 10;
int iCount5 = iRemain / 5; // 5元张数
iRemain %= 5;
int iCount2 = iRemain / 2; // 2元张数
iRemain %= 2; // 1元张数
Console.WriteLine("需要准备 100元{0}张 50元{1}张 10元{2}张 5元{3}张 2元{4}张 1元{5}张", iCount100, iCount50, iCount10, iCount5, iCount2, iRemain);
Console.WriteLine("example_9 finish ------------------------------");
// example_10: 输入一个字符串,判断其是否是C#的合法标识符。
Console.WriteLine("请输入一个字符串:");
string str = Console.ReadLine();
bool isOk = true;
char ch = str[0];
// 首位判断
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_' || ch == '@')
{
// 首位合法
}
else
{
isOk = false;
}
if (isOk)
{
for (int i = 1; i < str.Length; ++i)
{
ch = str[i];
// 其他位
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_')
{
// 合法
}
else
{
isOk = false;
break;
}
}
}
if (isOk)
{
Console.WriteLine("标识符合法");
}
else
{
Console.WriteLine("标识符不合法");
}
Console.WriteLine("example_10 finish ----------------------------------");
Console.ReadKey();
}
}
}
5.6.7 Example:练习11、12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 练习11、12
namespace Lesson_4_13
{
class Program
{
static void Main(string[] args)
{
// example_11: “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
Console.WriteLine("请输入一个字符串:");
string str = Console.ReadLine();
bool bIsHui = true;
for (int i = 0; i < str.Length / 2; ++i)
{
if (str[i] != str[str.Length - 1 - i])
{
bIsHui = false;
break;
}
}
if (bIsHui)
{
Console.WriteLine("是回文串");
}
else
{
Console.WriteLine("不是回文串");
}
Console.WriteLine("example_11 finish------------------------------------");
// example_12:
/*
安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
*/
Console.WriteLine("请设置一个密码(8~16位):");
string strMM = Console.ReadLine();
if (strMM.Length >= 8 && strMM.Length <= 16)
{
bool bHaveUpper = false;
bool bHaveLower = false;
bool bHaveNumber = false;
bool bHaveSpecial = false;
for (int i = 0; i < strMM.Length; ++i)
{
char ch = strMM[i];
if (ch >= 'A' && ch <= 'Z')
{
bHaveUpper = true;
continue;
}
if (ch >= 'a' && ch <= 'z')
{
bHaveLower = true;
continue;
}
if (ch >= '0' && ch <= '9')
{
bHaveNumber = true;
continue;
}
if (ch == '~' || ch == '!' || ch == '@' || ch == '#' || ch == '$' || ch == '%' || ch == '^')
{
bHaveSpecial = true;
}
}
int iCount = 0;
if (bHaveUpper) ++iCount;
if (bHaveLower) ++iCount;
if (bHaveNumber) ++iCount;
if (bHaveSpecial) ++iCount;
if (iCount >= 3)
{
Console.WriteLine("是一个安全的密码");
}
else
{
Console.WriteLine("不是一个安全的密码");
}
}
else
{
Console.WriteLine("密码长度不满足条件,需要大于等于8位,小于等于16位");
}
Console.ReadKey();
}
}
}