1、 装箱、拆箱练习。
using System; // 主命名空间,包含所有.net基础类型和通用类型。如Object,比如string等
using System.Collections.Generic; /* using System.Collections是集合命名空间,包含定义各种对象集合的接口和类。加了Generic说明是泛型集合。*/
using System.Linq; // 引入的linq语法需要提供的支持类
using System.Security.Cryptography; // 安全方面的类,主要是加密方面的类。
using System.Text; // 包含常用字符串操作的类(我猜想和字符串型变量的定义或者输出操作有关)
namespace homework1 // 导入命名空间,类似于C语言中的#include <stdio.h>
{
class Program // 类:Program类
{
static void Main(string[] args){ /* static:声明main是静态的;void:不会返回内容;String[] args:命令行参数,声明args是可以存储字符串数组。*/
double d1 = 3.14; // 定义双精度浮点数d1(值类型),赋值3.14
double d2 = d1; // 定义双精度浮点数d2(值类型),将d1的值赋给d2
Console.WriteLine("d1与d2内存地址是否相同:"+((object) d1==(object) d2)); /* 输出,对于值类型来说,值相同,地址也不相同*/
object o1 = d1; // 装箱操作
object o2 = o1;
Console.WriteLine("o1和o2是否指向同一个内存地址:"+((object)o1==(object) o2)); /* 输出o1和o2是否指向同一个内存地址的判断。值相同,引用变量的地址也相同。*/
double y1 = (double)o1; // 拆箱操作
double y2 = (double)o2;
Console.WriteLine("y1和y2是否指向同一个内存地址:" + ((object)y1 == (object)y2));/*对于值类型来说,值相同,地址也不相同*/
d1 =3.1416;
Console.WriteLine((double)o1); /* 装箱之后,改变值类型的数值,引用类型的值不改变,o1不指向d1的地址*/
string s1 = "Visual C#"; // 将Visual C#赋给字符串变量s1(字符串是引用类型)。
string s2 = s1; // 将s1的值赋给s2
Console.WriteLine("s1和s2是否指向同一个内存地址:"+((object)s1==(object) s2)); // 输出.
s1 ="C#"; // 创建了一个新的s1实例,在内存中存放的地址不同
Console.WriteLine("改变s1后,s1和s2是否指向同一个内存地址:"+((object) s1==(object) s2));
s2="C#"; // 对于引用类型来说,内容相同地址就相同
Console.WriteLine("改变s2使s1和s2的值相同后,它们的地址是否一样呢"+((object) s1==(object) s2)); /* 输出. */
Console.WriteLine("s1与s2是否相等呢:"+(s1==s2)); // 输出
}
}
}
运行结果:
2、 百鸡百钱问题(two methods)
(1)第一种做法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace ahundredchickenandmoney
{
class Program{
static void Main(string[] args){
int hen, cock, chick;
for (cock = 0; cock <= 13; cock++){
for(hen = 0; hen <= 22 ; hen++){
chick = (100 - 5 * cock - 3 * hen) * 3;
if ((cock > 0) &&(cock + chick + hen == 100))
Console.WriteLine("公鸡:{0},母鸡:{1},小鸡:{2}\n", cock, hen, chick);
}
}
}
}
}
运行结果:
(2)第二种做法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace ahundredchickenandmoney{
class Program { //Program类
static void Main(string[] args){
int hen, cock, chick,b,c;
/* cock<15的原因:设极端情况下,只有cock和chick,
* 则可列出二元一次方程:5cock+(1/3)chick=100;chick+cock=100.可解出cock∈(14,15).*/
for (cock=1;cock<15;cock++){
/* 原因:根据三种鸡数量与铜钱的关系,可列出二元一次方程: 5cock+3hen+(1/3)chick=100;cock+hen+chick=100;
* 则可以利用cock的数量表示另外两种鸡的数量: hen = (100 - 7 * cock) / 4;chick = (300 + 3 * cock) / 4;
* 又hen、chick的数量应为整数,是故分母对分子求余需得0,这是一个重要条件(见下文if判断语句)*/
b = (100 - 7 * cock) % 4;
c = (300 + 3 * cock) % 4;
if(b==0&&c==0){
hen = (100 - 7 * cock) / 4;
chick = (300 + 3 * cock) / 4;
Console.WriteLine("公鸡:{0},母鸡:{1},小鸡:{2}\n", cock, hen, chick);
}
}
// 两个功能:1,等待键盘输入 2,终止一个程序的执行 。此处应该是第二个功能
Console.Read();
}
}
}
运行结果:
3、 扑克牌游戏(two methods)
第一种方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace pokerquestion{
class TestCard //值类型TestCard
{
static void Main(string[] args) {
int i, j, temp;
Random Rnd = new Random();
int k;
int[] Card = new int[52]; // 一维数组。52张牌
int[,] Player = new int[4, 13]; // 二维数组,四个玩家每人13张牌
for (i = 0; i < 4; i++) // 52张牌初始化
for (j = 0; j < 13; j++)
Card[i * 13 + j] = (i + 1) * 100 + j + 1;
Console.Write("How many times for card: "); // 写进
string s = Console.ReadLine();
int times = Convert.ToInt32(s);
for (j = 1; j <= times; j++)
for (i = 0; i < 52; i++){
k = Rnd.Next(51 - i + 1) + i; // 产生i到52之间的随机数
temp = Card[i];
Card[i] = Card[k];
Card[k] = temp;
}
k = 0;
for (j = 0; j < 13; j++) // 52张牌分发给4个玩家
for (i = 0; i < 4; i++)
Player[i, j] = Card[k++];
for (i = 0; i < 4; i++)
{
Console.WriteLine("玩家{0}的牌:", i + 1);
for (j = 0; j < 13; j++){
k = (int)Player[i, j] / 100; // 分离出牌的花色,k由于是整型,所以只有四种可能:1/2/3/4.
switch (k) {
case 1: // 返回红桃
s = Convert.ToString('\x0003');
break;
case 2: // 返回方块
s = Convert.ToString('\x0004');
break;
case 3: // 返回梅花
s = Convert.ToString('\x0005');
break;
case 4: // 返回黑桃
s = Convert.ToString('\x0006');
break;
}
k = Player[i, j] % 100; // 分离出牌号。牌号有13种可能,正好对应每人的13张牌。
switch (k) {
case 1: // 扑克牌中没有1、11、12、13,用字母代替。
s = s + "A";
break;
case 11:
s = s + "J";
break;
case 12:
s = s + "Q";
break;
case 13:
s = s + "K";
break;
default:
s = s + Convert.ToString(k); // 如果不是以上几种字母,就输出数字,并返回到 Convert.ToString(k)
break;
}
Console.Write(s); // 写出数字
if (j < 12) // 每写13个牌,换一次行。重新从“玩家某的牌”开始写
Console.Write(", ");
else
Console.WriteLine(" ");
}
}
Console.Read(); //结束程序
}
}
}
运行结果:
第二种方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace pokerquestion
{
class TestCard
{
static void Main(string[] args)
{
int i, j, temp;
Random Rnd = new Random();
int k;
int[] Card = new int[52]; // 一维数组。52张牌
int[,] Player = new int[4, 13]; // 二维数组,四个玩家每人13张牌
for (i = 0; i < 4; i++) // 52张牌初始化
for (j = 0; j < 13; j++)
Card[i * 13 + j] = (i + 1) * 100 + j + 1;
Console.Write("How many times for card: "); // 写进
string s = Console.ReadLine();
int times = Convert.ToInt32(s);
for (j = 1; j <= times; j++)
for (i = 0; i < 52; i++){
k = Rnd.Next(51 - i + 1) + i; // 产生i到52之间的随机数
temp = Card[i];
Card[i] = Card[k];
Card[k] = temp;
}
k = 0;
for (j = 0; j < 13; j++) // 52张牌分发给4个玩家
for (i = 0; i < 4; i++){
Player[i, j] = Card[k++];
/*此处,将位于101~113之间的数字变为1~13,201~213之间的数字变为14~26,以此类推,直到52*/
if (Player[i, j] <= 113) Player[i, j] -= 100;
else if (Player[i, j] <= 213) Player[i, j] -= 187;
else if (Player[i, j] <= 313) Player[i, j] -= 274;
else if (Player[i, j] <= 413) Player[i, j] -= 361;
}
for (i = 0; i < 4; i++){
Console.WriteLine("玩家{0}的牌:", i + 1);
for (j = 0; j < 13; j++){
k = (int)Player[i, j] / 13; // 分离出牌的花色,k由于是整型,所以只有四种可能:1/2/3/4.
switch (k){
case 1: // 返回红桃
s = Convert.ToString('\x0003');
break;
case 2: // 返回方块
s = Convert.ToString('\x0004');
break;
case 3: // 返回梅花
s = Convert.ToString('\x0005');
break;
case 4: // 返回黑桃
s = Convert.ToString('\x0006');
break;
}
k = Player[i, j] % 13; // 分离出牌号。牌号有13种可能,正好对应每人的13张牌。
switch (k) {
case 1: // 扑克牌中没有1、11、12、13,用字母代替。
s = s + "A";
break;
case 11:
s = s + "J";
break;
case 12:
s = s + "Q";
break;
case 13:
s = s + "K";
break;
default:
s = s + Convert.ToString(k); ; // 如果不是以上几种字母,就输出数字,并返回到 Convert.ToString(k)
break;
}
Console.Write(s); // 写出数字
if (j < 12) // 每写13个牌,换一次行。重新从“玩家某的牌”开始写
Console.Write(", ");
else
Console.WriteLine(" ");
}
}
Console.Read(); //结束程序
}
}
}
运行结果: