八、练习
1、用户输入姓名,然后打印此人的年龄,从1岁-18岁,每一岁占一行,打印内容为“我今年xxx岁了!”;
①当6岁时增加打印“我上小学了!”;
②当11岁时增加打印“我上初中了!”;
③当15岁时增加打印“我上高中了!”;
④当18岁时增加打印“我成年了!考上了北大!”。
主要代码:
①法一:
Console.Write("请输入姓名:");
string n = Console.ReadLine();
for (int a = 1; a <= 18; a++)
{
if (a == 6)
Console.WriteLine("我今年{0}岁了,我上小学了。", a);
else if (a == 11)
Console.WriteLine("我今年{0}岁了,我上初中了。", a);
else if (a == 15)
Console.WriteLine("我今年{0}岁了,我上高中了。", a);
else if (a == 18)
Console.WriteLine("我今年{0}岁了。我成年了!我考上北大了!", a);
else
Console.WriteLine("我今年{0}岁了。", a);
}
Console.ReadLine();
②法二:
Console.Write("请输入姓名:");
string n = Console.ReadLine();
for (int a = 1; a <= 18; a++)
{
switch (a)
{
case 1: Console.WriteLine("我今年{0}岁了。", a); break;
case 2: Console.WriteLine("我今年{0}岁了。", a); break;
case 3: Console.WriteLine("我今年{0}岁了。", a); break;
case 4: Console.WriteLine("我今年{0}岁了。", a); break;
case 5: Console.WriteLine("我今年{0}岁了。", a); break;
case 6: Console.WriteLine("我今年{0}岁了,我上小学了。", a); break;
case 7: Console.WriteLine("我今年{0}岁了。", a); break;
case 8: Console.WriteLine("我今年{0}岁了。", a); break;
case 9: Console.WriteLine("我今年{0}岁了。", a); break;
case 10: Console.WriteLine("我今年{0}岁了。", a); break;
case 11: Console.WriteLine("我今年{0}岁了,我上初中了。", a); break;
case 12: Console.WriteLine("我今年{0}岁了。", a); break;
case 13: Console.WriteLine("我今年{0}岁了。", a); break;
case 14: Console.WriteLine("我今年{0}岁了。", a); break;
case 15: Console.WriteLine("我今年{0}岁了,我上高中了。", a); break;
case 16: Console.WriteLine("我今年{0}岁了。", a); break;
case 17: Console.WriteLine("我今年{0}岁了。", a); break;
case 18: Console.WriteLine("我今年{0}岁了。我成年了!我考上北大了!", a); break;
}
}
Console.ReadLine();
结果:
总结:
通脱此题可以看出switch~case语句在与if~else语句实现相同功能时,一般情况下要比较复杂。
2、输入3个数,将这三个数从大到小排列打印出来。
主要代码:
①法一:
while (true)
{
Console.Write("请输入x=:");
int x = int.Parse(Console.ReadLine());
Console.Write("请输入y=:");
int y = int.Parse(Console.ReadLine());
Console.Write("请输入z=:");
int z = int.Parse(Console.ReadLine());
if (x <= y)
{
int a = x;
x = y;
y = a;
}
if (y <= z)
{
int b = y;
y = z;
z = b;
if (x <= y)
{
int c = x;
x = y;
y = c;
}
}
Console.WriteLine("{0} {1} {2}", x, y, z);
}
Console.ReadLine();
②法二:
Console.Write("请输入x=:");
double x = double.Parse(Console.ReadLine());
Console.Write("请输入y=:");
double y = double.Parse(Console.ReadLine());
Console.Write("请输入z=:");
double z = double.Parse(Console.ReadLine());
if (x > y)
{
if (y > z)
{
Console.WriteLine("x>y>z");
Console.WriteLine("{0}>{1}>{2}", x, y, z);
}
else if (y == z)
{
Console.WriteLine("x>y=z");
Console.WriteLine("{0}>{1}={2}", x, y, z);
}
else if (x > z && z > y)
{
Console.WriteLine("x>z>y");
Console.WriteLine("{0}>{1}>{2}", x, z, y);
}
else if (z > x)
{
Console.WriteLine("z>x>y");
Console.WriteLine("{0}>{1}>{2}", z, x, y);
}
else if (x == z)
{
Console.WriteLine("x=z>y");
Console.WriteLine("{0}={1}>{2}", x, z, y);
}
}
else if(x==y)
{
if (y > z)
{
Console.WriteLine("x=y>z");
Console.WriteLine("{0}={1}>{2}", x, y, z);
}
else if (z > x)
{
Console.WriteLine("z>x=y");
Console.WriteLine("{0}>{1}={2}", z, x, y);
}
else if (x == z)
{
Console.WriteLine("x=y=z");
Console.WriteLine("{0}={1}={2}", x, y, z);
}
}
else if (x < y)
{
if (x > z)
{
Console.WriteLine("y>x>z");
Console.WriteLine("{0}>{1}>{2}", y, x, z);
}
else if (y > z && z > x)
{
Console.WriteLine("y>z>x");
Console.WriteLine("{0}>{1}>{2}", y, z, x);
}
else if (x == z)
{
Console.WriteLine("y>x=z");
Console.WriteLine("{0}>{1}={2}", y, x, z);
}
else if (y == z)
{
Console.WriteLine("y=z>x");
Console.WriteLine("{0}={1}>{2}", y, z, x);
}
else if(z>y)
{
Console.WriteLine("z>y>x");
Console.WriteLine("{0}>{1}>{2}", z, y, x);
}
}
Console.ReadLine();
结果:
法一:
法二:
总结:
通过对比,我们可以知道不同的判断条件,在同一问题下会使得程序复杂度不同。
3、打印100以内的全部质数,并求和。
主要代码:
int b = 0;
int s = 0;
for (int i = 2; i <= 100; i++)
{
int c = 0;
for (int j = 1; j <= i; j++)
{
if (i % j == 0)
c++;
}
if (c == 2)
{
Console.Write(i + " ");
b++;
s += i;
}
}
Console.Write(" ");
Console.WriteLine("b={0}", b);
Console.Write("s={0}", s);
Console.ReadLine();
结果:
总结:
此题关键点在于质数的判断条件,用计算机理解方式来理解就是质数只能执行两次for循环中的if语句两次,为了达到这一目的,我们需要一个变量去记录执行次数,因此切忌不能忘了设置标记变量!
对比题:计算100以内的奇数的和。
主要代码:
int s = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 2 != 0)
{
s += i;
}
}
Console.WriteLine("s={0}", s);
Console.ReadLine();
结果:
总结:
此题与前面的最大不同就是不需要标记变量,究其根本是质数与奇数定义的不同。做此类题要仔细分析定义,要充分把握细节。
4、让用户循环操作,用户输入一个正整数(0-20),如果小于0或大于20都提示输入错误,如果输入的是0-20之间的数,那么就打印从0到这个数的累加求和,一共需要用户输入3遍,输入错误不计入这3遍操作当中。
主要代码:
int s = 0;
int c = 0;
for (int i = 0; i < 10; i++)
{
if (c >= 3)
break;
Console.Write("请输入:");
int a = int.Parse(Console.ReadLine());
if (a >= 0 && a <= 20)
{
s = 0;
for (int j = 0; j <= a; j++)
s += j;
Console.WriteLine(s);
c++;
}
else
Console.WriteLine("输入错误!");
}
Console.ReadLine();
结果:
总结:
此题同上一题一样需要标记变量,其次就是标记变量的位置,需要放到循环之前,因为输入3遍后我们不需要执行for循环。
5、打印方形,每行打印10个“A”,打印10行,使用循环嵌套,不允许定义内容为“AAAAAAAAAA”的变量;
主要代码:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
Console.Write("A");
Console.Write(" ");
}
Console.ReadLine();
结果:
6、打印三角形
*
**
***
****
*****
*****
****
***
**
*
*
**
***
****
*****
*****
****
***
**
*
*
***
*****
*******
*
***
*****
*******
*****
***
*
主要代码:
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
Console.Write("*");
Console.Write(" ");
}
Console.ReadLine();
for (int i = 1; i <= 5; i++)
{
for (int j = 5; j >= i; j--)
Console.Write("*");
Console.Write(" ");
}
Console.ReadLine();
for (int i = 1; i <= 5; i++)
{
for (int j = 4; j >= i; j--)
Console.Write(" ");
for (int k = 1; k <= i; k++)
Console.Write("*");
Console.Write(" ");
}
Console.ReadLine();
for (int i = 0; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
Console.Write(" ");
for (int k = 4; k >= i; k--)
Console.Write("*");
Console.Write(" ");
}
Console.ReadLine();
for (int i = 0; i <= 5; i++)
{
for (int j = 4; j >= i; j--)
Console.Write(" ");
for (int k = 1; k <= i; k++)
Console.Write("*");
for (int m = 1; m <= i - 1; m++)
Console.Write("*");
Console.Write(" ");
}
Console.ReadLine();
for (int i = 0; i <= 5; i++)
{
for (int j = 4; j >= i; j--)
Console.Write(" ");
for (int k = 1; k <= i; k++)
Console.Write("*");
for (int m = 1; m <= i - 1; m++)
Console.Write("*");
Console.Write(" ");
}
for (int i = 0; i <= 4; i++)
{
for (int j = 1; j <= i; j++)
Console.Write(" ");
for (int k = 3; k >= i; k--)
Console.Write("*");
for (int m = 3; m >= i - 1; m--)
Console.Write("*");
Console.Write(" ");
}
Console.ReadLine();
结果:
衍生题:让用户输入一个奇数,打印上面最后的菱形,最长的个数是用户输入的个数。
主要代码:
while (true)
{
Console.Write("请输入:");
int a = int.Parse(Console.ReadLine());
if (a % 2 != 0)
{
for (int i = 0; i < (a + 1) / 2; i++)
{
for (int j = (a + 1) / 2 - 1; j >= i; j--)
Console.Write(" ");
for (int k = 1; k <= i; k++)
Console.Write("*");
for (int m = 1; m <= i - 1; m++)
Console.Write("*");
Console.Write(" ");
}
for (int i = 0; i <= (a + 1) / 2 - 1; i++)
{
for (int j = 1; j <= i; j++)
Console.Write(" ");
for (int k = (a + 1) / 2 - 2; k >= i; k--)
Console.Write("*");
for (int m = (a + 1) / 2 - 2; m >= i - 1; m--)
Console.Write("*");
Console.Write(" ");
}
}
else
Console.WriteLine("你输入的不是奇数!");
}
Console.ReadLine();
结果:
总结:
衍生题注意的是输入的奇数与循环的关系,循环与行数的关系。
7、99乘法表
主要代码:
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
Console.Write("{0}*{1}={2} ", j, i, j * i);
Console.Write(" ");
}
Console.ReadLine();
结果:
总结:
注意此题结果中的每行第一个因数是内循环的循环条件变量,即j;第二个因数是外循环的循环条件变量,即i。
8、有一张纸厚度为0.07mm,对折多少次能达到珠峰的高度,珠峰高度为8848m;
主要代码:
①法一:
double h = 0.07;
for (int i = 1; ; i++)
{
h *= 2;
if (h >= 8848000)
{
Console.WriteLine("对折{0}次。", i);
break;
}
}
Console.ReadLine();
②法二:
int i=0;
for (double h = 0.07; h <= 8848000; h *= 2)
i++;
Console.WriteLine("对折{0}次。", i);
Console.ReadLine();
③法三:
double h = 0.07;
int c = 0;
for (; ; )
{
h *= 2;
c++;
if (h >= 8848000)
break;
}
Console.WriteLine("对折{0}次。", c);
Console.ReadLine();
结果:
总结
通过三种方法可以看出循环的初始条件,循环条件,循环调整的不同,对于同一个题的做法也就不同,但是如果for循环写的比较简单,一般比较难理解,需要加注释。