C#语言中用于结构化程序设计的三种基本结构是:顺序结构、选择结构、循环结构。本文详细整理了以上三种结构的用法,案例。
4.1 顺序结构
4.1.1 赋值语句
1.赋值语句
由一个赋值运算符构成的赋值语句。赋值语句的格式为:
变量 = 表达式;
格式中的“=”称为“赋值号”。
赋值语句的功能是把计算赋值号右边的“表达式”的值,并 赋给赋值号左边的“变量”。
例如: int age = 30;
注意:对于任何一个变量必须首先赋值,然后才能引用,否则,未赋初值的变量将不能参与运算。另外,赋值号两边的类型必须相同,或者符合隐式类型转换规则。
2. 复合赋值语句与连续赋值语句
(1) 复合赋值语句
复合赋值语句是使用+=、-=、*=、/=等运算符构成的赋值语句,这种语句首先需要完成特定的运算,然后再进行赋值运算操作。例如:
int x=5;
x+=6;
string s="abcd";
s+="efjh";
(2) 连续赋值语句
连续赋值语句是在一条语句中使用多个赋值运算符进行赋值的语句,这种语句可以一次为多个变量赋予相同的值。例如:
int x,y,z;
x=y=z=6;
string s1,s2,s3;
s1=s2=s3="efjh";
4.1.2 输入语句
通过计算机的外设把数据送到计算机内存的过程称为输入。C#语言的输入语句常用的有两种形式:
Console.Read();
Console.ReadLine();
输入可以是整型或字符串等,但布尔型不可以直接读入。
例如:
string strInput = Console.ReadLine();
Read语句和ReadLine语句不同之处在于输入数据到各变量之后,ReadLine自动换行,从下一行开始再输入数据。
4.1.3 输出语句
输出是将内存中的数据送到外设的过程。C#语言的输出语句有两种形式:
Console.Write(输出项);
Console.WriteLine(输出项);
其中<输出项>可以是常量、变量、表达式或字符串。
例如:
Console.Write("abcd"); //输出”abcd”
Console.WriteLine("abcd"); //输出”abcd”并换行
Console.WriteLine("{0}; {1}; {2}",10,20,30); //输出“10;20;30”并换行
Write和WriteLine的区别:Write语句是输出项输出后不换行,光标停留在最后一项后;WriteLine语句按项输出后,自动换行,光标则停留在下一行的开始位置。
4.1.4 复合语句
复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以 { } 括起来,作为一条语句。复合语句的一般形式:
{
语句1;
语句2;
……
语句n;
}
4.1.5 应用实例
【例4-1】 编写一个控制台应用程序,输入圆的半径值,求圆的周长和面积,结果如图4-1所示。
(1)Parse方法
Parse方法可以将特定格式的字符串转换为数值,格式为: 数值类型名称.Parse(字符串型表达式)
例如:int x=int.Parse("123");
(2) ToString方法
ToString方法可将其他数据类型的变量值转换为字符串类型,格式为:
变量名称.ToString( )
例如:int x=123; string s=x.ToString( );
**【例4-2】**使用标签与文本框实现输入与输出。输入两个数,并实现两数的算术运算:和、差、积、商,结果如图所示。
4.2 选择结构
4.2.1 if条件语句
1.单分支if语句
单分支if语句的格式为:
if (布尔条件表达式)
{ 内嵌语句序列1; }
说明:若布尔表达式的为真时,程序执行内嵌语句序列。如果内嵌语句序列中为多个执行语句,则要使用花括号({…})组合为一个语句块。
2. 双分支if语句
双分支if语句的格式为:
if (布尔条件表达式)
{ 内嵌语句序列1; }
else
{ 内嵌语句序列2; }
说明:
① 若布尔表达式的值为真时,程序执行内嵌语句序列1,否则执行内嵌语句序列2。
② if…else语句中,内嵌语句序列1和内嵌语句序列2可以是简单语句,也可以是复合语句。如果内嵌语句序列中为多个执行语句,则要使用花括号({…})组合为一个语句块。
说明:
(1)首先判断表达式1,如果其值为true,则执行if语句块中的语句,然后结束if语句。
(2)如果表达式1的值为false,则判断表达式2,如果其值为true,则执行else if语句块中的语句,然后结束if语句。
(3)如果表达式2的值为false,再继续往下判断其他表达式的值。
(4)如果所有表达式的值都为false,则执行else语句块中的语句,然后结束if语句。
对于多层if嵌套结构,要特别注意if与else的配对关系,一个else必须与一个if配合,按照就近原则进行匹配。
【例4-3】 某商店为了吸引顾客,采取以下优惠活动:所购商品在1000元以下的,打9折优惠;所购商品多于1000元的,打8折优惠。试编程实现该优惠功能。
分析:该问题属于数学分段函数问题,当所购商品总额<1000元时,打折后的商品总额为所购商品总额0.9;当所购商品总额>1000时,打折后的商品总额为所购商品总额0.8。
【例4-4】 将百分制成绩转换为五分制成绩。转换标准如下:90分以上为“优秀”,80分以上为“良”,70分以上为 “中”,60分以上为“及格”,60分以下为“不及格”。
【例4-5】 设计一个判断属相的程序,输入0 ~ 11的整数,判断其对应的十二生肖。
【例4-6】 设计一个学生成绩输入程序。要求两个文本框不能为空且成绩应在0 ~ 100之间,单选按钮必须有一个被选择。用户输入了合法数据并单击”确定”按钮后的程序运行界面如图所示。单击”清除”按钮可清除上次输入的所有数据,并恢复两个单选按钮都处于未选中状态。
【例4-7】 某航空公司规定在旅游的旺季7~9月份,如果订票数超过20张,票价优惠15%,20张以下优惠5%;在旅游的淡季1~5月份、10月份、11月份,如果订票数超过20张,票价优惠30%,20张以下优惠20%;其他情况一律优惠10%。试设计程序,根据月份和订票张数决定票价的优惠率,程序运行界面如图
4.2.2 switch结构
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
C# 中 switch 语句的语法:
switch(expression){
case constant-expression :
statement(s);
break;
case constant-expression :
statement(s);
break;
/* 您可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
break;
}
switch 语句必须遵循下面的规则:
- switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。
- 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
- case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量。
- 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
- 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
- 不是每一个 case 都需要包含 break。如果 case 语句为空,则可以不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
- C# 不允许从一个开关部分继续执行到下一个开关部分。如果 case 语句中有处理语句,则必须包含 break 或其他跳转语句。
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
- C# 不支持从一个 case 标签显式贯穿到另一个 case 标签。如果要使 C# 支持从一个 case 标签显式贯穿到另一个 case 标签,可以使用 goto 一个 switch-case 或 goto default。
switch结构:
Console.WriteLine("输入一个数:");
double var1 = Convert.ToDouble(Console.ReadLine()); ///读取键盘输入的数
switch( (int)(var/10) )
{
case 9: Console.WriteLine("优秀");break;
case 8:
case 7:Console.WriteLine("良好");break;
case 6:Console.WriteLine("及格");break;
case var/10<6:Console.WriteLine("不及格");break;
default:Console.WriteLine("输入错误");break;
}
4.3 循环结构
C#中的循环结构有几种:
• for循环
• while循环
• do…while循环
• foreach循环
支持用 break 来退出循环,用 continue 来跳过本次循环进入下一次循环。foreach循环用于处理数组,下一章介绍。
4.3.1 for循环语句
1. for语句的语法格式
for (表达式1; 表达式2; 表达式3)
{ 循环语句序列; }
功能:表达式1用于参与循环条件变量的初始化,该表达式仅执行一次;表达式2为条件判断表达式,即每次循环开始之前,判断该表达式是否成立,如果成立,进入下一次循环,否则,循环结束;表达式3用于参与循环条件变量的运算,一般为递增或递减的循环计数器。
说明:
- 表达式1、表达式2、表达式3是可选的,但应该注意避免死循环的发生。
- 如表达式2省略,并且不采用转移语句,会导致死循环的发生。
- 可以在循环体中的任何位置放置break语句来强制终止for循环(随时跳出for循环)。
2. for循环语句的使用
【例4-8】 使用for语句计算1+2+3+…100。
class Program
{
static void Main(string[] args)
{
int sum;
sum=0;
for(int k=1;k<=100;k=k+1)
{
sum=sum+k;
}
Console.WriteLine("从1加到100值为"+sum.ToString());
}
}
4.3.2 whlie、do…while语句
1. while语句
(1)while循环语句的语法格式:
while (条件表达式)
{ 语句序列; }
while循环的执行过程:
首先计算条件表达式的值,如果为真(True),则执行后面的循环体,执行完后,再开始一个新的循环;如果为假(False),则终止循环,执行循环体后面的语句。
对while循环的有关说明如下:
① 条件表达式是一个具有boolean值的条件表达式,为循环的条件。
② 作为循环体的语句序列可以是简单语句、复合语句和其他结构语句。
③ 可以在循环体中的任何位置放置break语句来强制终止while循环(随时跳出while循环)。
④可以在循环体中的任何位置放置continue语句,在整个循环体没有执行完就重新判断条件,以决定是否开始新的循环。
(2)while循环语句的使用
在while循环语句中, while是关键字,控制while语句的条件表达式包含在括号内,括号后面的是当条件表达式值为真时应执行的循环体。循环体中应包含对条件表达式的修改,例如:
int i = 0; //定义一个int类型的变量
while (i < 5) //判断while条件
{
Console.WriteLine(i); //输出结果
i++; //i 加1
}
程序段中就包含了对循环控制变量i的修改(i++).
2. do… while语句
(1) do… while的语法格式
do
{ 语句序列; }
while (布尔条件表达式);
功能:当程序执行到do区域的时候,就进入了循环体,第一次进入这个循环体没有进行任何判断,就可以执行这个循环体的所有语句,然后进入while条件判断,如果条件符合,再次进入do区域,否则退出循环。
(2) do… while的使用
do语句后面是一个循环体,后面紧跟着一个while关键字。控制循环执行次数的条件表达式位于while关键字的后面。条件表达式在循环体执行后再判断,循环体执行一次(至少一次)或若干次。例如:
int i = 3; //定义一个整型变量
do
{
Console.WriteLine(i); //输出结果
i++; //i加1
} while (i < 3); //判断while条件
程序段中定义了整型变量i,它的值为3。当程序执行到do区域的时候,就进入了循环体,第一次进入这个循环体没有进行任何判断,就可以执行这个循环体的所有语句,然后进入while条件判断,如果条件符合,再次进入do区域,否则退出循环。
【例4-9】 使用do…while语句实现1+2+3+…100。
static void Main(string[] args)
{
int sum;
sum = 0;
int k = 1;
do
{
sum = sum + k;
k = k + 1;
}
while (k <= 100);
Console.WriteLine("从1加到100值为" + sum.ToString());
}
4.3.3 循环嵌套
一个循环(称为”外循环”)的循环体内包含另一个循环(称为”内循环”),则称为循环的嵌套。
内循环中还以包含循环,形成多层循环(循环嵌套的层数理论上无限制)。
三种循环(while循环、do…while循环、for循环)可以互相嵌套。
使用跳转语句,可以使程序执行跳转到程序中其它部分。C#中提供四种转移语句:goto语句、break语句、continue语句、return语句。
C#中提供四种转移语句:
- goto语句。可以将程序控制直接转移给标签制定的语句。
- break语句。只能在循环体内和switch语句体内使用break语句,使运行的程序立刻退出它所在的最内层循环或者退出一个switch语句。
- continue语句。仅从当前的循环迭代中退出,然后执行下一次迭代循环。只能用在while语句、do-while语句、for语句、或者foreach语句的循环体内。
- return语句。用于指定函数返回的值。return语句只能出现在函数体内。
【例4-10】 使用计数器循环语句(for)了解continue语句的使用,要求输出大于5的数 。
4.3. 4 应用实例
【例4-11】 计算n!,假设n=10。
分析:该例实现阶乘的运算。可以使用循环语句,通过改变乘数的值来实现连乘。
static void Main(string[] args)
{
int sum, k;
sum = 1;
for (k = 1; k <= 10; k++)
{
sum = sum * k;
}
Console.WriteLine(sum.ToString());
}
【例4-12】 编写一个控制台应用程序,求300以内的素数,程序的运行结果如图所示。
static private Boolean IsSuShu(int x)
{
Boolean Yes = true;
for (int i = 2; i <= Math.Sqrt(x); i++)
{
if((x % i)==0)
{
Yes = false;
}
}
return Yes;
}
static void Main(string[] args)
{
for (int i = 2; i < 300; i++)
{
if (IsSuShu(i) == true)
{
Console.Write(i.ToString());
Console.Write(" ");
}
}
Console.ReadKey();
}
【例4-13】 设有一张厚为X mm,面积足够大的纸,将它不断地对折。试问对折多少次后,其厚度可达珠穆朗玛峰的高度(8844.43 m)。
设对折后纸的厚度为h mm,计数器为n。在没有对折时,纸厚为X mm,每对折一次,其厚度是上一次的2倍,在未到达8844.43 m时,重复对折。在程序中,纸的厚度就是对折后纸的厚度,所以用一个变量h。
static void Main(string[] args)
{
int n = 0;
float h;
Console.Write("请输入纸的厚度:\n");
h = float.Parse(Console.ReadLine());
while (h < 8844430)
{
n = n + 1;
h = 2 * h;
}
Console.WriteLine( n.ToString());
}
【例4-14】 编程实现九九乘法表。
分析:使用两重循环,利用循环变量作为被乘数和乘数,就可方便的解决问题。外层循环变量i的取值从1~9,内层 循环变量k的取值也是1~9。
static void Main(string[] args)
{
string s = "";
int sum;
for (int i = 1; i < 10; i = i + 1)
{
s = "";
for (int k = 1; k <= i; k = k + 1)
{
sum = k * i;
s = s + k.ToString() + "×" + i.ToString() + "=" + sum.ToString() + ";";
}
Console.WriteLine(s);
}
转载:https://blog.csdn.net/lucky51222/article/details/115862224