目录
二、 选择结构: if else-if /switch-case
一、分支结构: if else
1、顺序结构:程序从main函数进入,从上到下一行一行执行,不会落下任何一行
循环结构: while do-while for foreach
if语句:
语法:
if(判断条件)
{
要执行的代码;
}
判断条件:一般为关系表达式或者bool类型的值
执行过程:程序运行到if处,首先判断if所带的小括号中的判断条件
条件成立:返回true,执行if中大括号中的所有内容
条件不成立:返回false,跳过if语句,继续向下执行
特点:先判断 后执行 有可能一行代码都不执行,用于一种情况的判断
using System;
class Program
{
static void Main()
{
// 输入一个整数
Console.Write("请输入一个整数:");
int number = int.Parse(Console.ReadLine());
// 使用 if 语句进行条件判断
if (number > 10)
{
Console.WriteLine("这个整数大于 10。");
}
if (number <= 10)
{
Console.WriteLine("这个整数小于或等于 10。");
}
}
}
if else 语句 :
语法:
if(判断条件)
{
执行的代码
}else{}
执行过程:程序执行到if处,首先判断if所带的小括号中的判断条件是否成立
成立:返回true,则执行if所带的大括号中的代码,执行完成跳出if - else结构
不成立:返回false,跳出if语句,执行else所带的大括号中的语句,执行完成后,跳出if - else语句
特点:先判断 后执行 最少执行一行代码,用于两种情况的判断
using System;
class Program
{
static void Main()
{
// 输入一个整数
Console.Write("请输入一个整数:");
int number = int.Parse(Console.ReadLine());
// 使用 if 和 else 语句进行条件判断
if (number % 2 == 0)
{
Console.WriteLine("这个整数是偶数。");
}
else
{
Console.WriteLine("这个整数是奇数。");
}
}
}
二、 选择结构: if else-if /switch-case
if else-if语句:
语法:
if(判断条件)
{
要执行的代码;
}else if(判断条件){
要执行的代码
}else if(判断条件)
{
要执行的代码
}else if(判断条件)
{
要执行的代码
}else if(判断条件)
{
要执行的代码
}......else
{
要执行的代码
}
执行过程:
- 如果第一个
if
条件为真(true
),则执行if
块中的代码,之后跳过所有后续的else if
和else
块。- 如果第一个
if
条件为假(false
),则继续检查下一个else if
条件。- 如果某个
else if
条件为真,则执行该else if
块中的代码,之后跳过所有后续的else if
和else
块。- 如果该
else if
条件为假,则继续检查下一个else if
条件。- 如果所有
if
和else if
条件都为假,则执行else
块中的代码(如果存在else
)。特点:特点:先判断 后执行 最少执行一行代码,用于多种情况的判断
using System;
class Program
{
static void Main()
{
// 输入一个分数
Console.Write("请输入分数:");
int score = int.Parse(Console.ReadLine());
// 使用 if-else if 语句判断成绩等级
if (score >= 90)
{
Console.WriteLine("成绩等级是 A");
}
else if (score >= 80)
{
Console.WriteLine("成绩等级是 B");
}
else if (score >= 70)
{
Console.WriteLine("成绩等级是 C");
}
else if (score >= 60)
{
Console.WriteLine("成绩等级是 D");
}
else
{
Console.WriteLine("成绩等级是 F");
}
}
}
异常捕获(try-catch)
1、语法上没有错误,在程序运行的过程当中,由于某些原因程序出现了问题,不能再正常运行了,引入try-catch来进行异常捕获
语法:
try
{
可能出现异常的代码
}catch{
出现异常后要执行的代码
}
执行过程:如果try中的代码没有出现异常,那么catch中的代码不会执行,如果出现异常,直接跳到catch中执行处理异常的代码
using System;
class Program
{
static void Main()
{
try
{
// 输入两个整数
Console.Write("请输入第一个整数:");
int num1 = int.Parse(Console.ReadLine());
Console.Write("请输入第二个整数:");
int num2 = int.Parse(Console.ReadLine());
// 尝试进行除法运算
int result = num1 / num2;
Console.WriteLine("结果是: " + result);
}
catch (DivideByZeroException ex)
{
// 捕获并处理除零异常
Console.WriteLine("错误:不能除以零。");
Console.WriteLine("异常消息: " + ex.Message);
}
catch (FormatException ex)
{
// 捕获并处理格式异常(例如,用户输入非整数)
Console.WriteLine("错误:输入格式不正确。");
Console.WriteLine("异常消息: " + ex.Message);
}
catch (Exception ex)
{
// 捕获所有其他未指定的异常
Console.WriteLine("发生了一个错误。");
Console.WriteLine("异常消息: " + ex.Message);
}
finally
{
// 可选的 finally 块,总是会执行
Console.WriteLine("程序执行完毕。");
}
}
}
switch case 语句:
语法:
switch(变量或者表达式的值)
{
case 值1 : 要执行的代码;
break;
case 值2:: 要执行的代码;
break;
case 值3 : 要执行的代码;
break;
........
default : 要执行的代码
break;
}
执行过程 : 程序执行到switch处,首先将括号里的变量或者表达式的值计算出来,然后拿着这个值一次跟每个case后面所带的值进行匹配,一旦匹配成功则执行该case所在的代码,执行完成后遇到break,跳出switch-case结构,都不匹配,有defaul执行default,没有default则该结构都不执行
using System;
class Program
{
static void Main()
{
Console.Write("请输入一个数字(1-7),代表星期一到星期日:");
string input = Console.ReadLine();
int dayNumber;
if (int.TryParse(input, out dayNumber) && dayNumber >= 1 && dayNumber <= 7)
{
switch (dayNumber)
{
case 1:
Console.WriteLine("星期一");
break;
case 2:
Console.WriteLine("星期二");
break;
case 3:
Console.WriteLine("星期三");
break;
case 4:
Console.WriteLine("星期四");
break;
case 5:
Console.WriteLine("星期五");
break;
case 6:
Console.WriteLine("星期六");
break;
case 7:
Console.WriteLine("星期日");
break;
default:
Console.WriteLine("输入的数字不在1到7之间。");
break;
}
}
else
{
Console.WriteLine("输入无效,请输入一个介于1到7之间的数字。");
}
}
}
三、循环结构
循环结构:while循环
语法:
while(循环条件)
{
循环体;
}
执行过程:判断条件返回true,执行循环体,执行完成后再次判断条件,成立继续循环,不成立跳出循环,如果循环条件一直成立则称为死循环
using System;
class Program
{
static void Main()
{
// 提示用户输入一个正整数
Console.Write("请输入一个正整数:");
int number = int.Parse(Console.ReadLine());
// 确保输入的数字是正整数
if (number <= 0)
{
Console.WriteLine("请输入一个正整数。");
return;
}
int sum = 0;
int i = 1;
// 使用 while 循环计算从 1 到 number 的所有整数之和
while (i <= number)
{
sum += i;
i++;
}
// 输出结果
Console.WriteLine("从 1 到 " + number + " 的总和是: " + sum);
}
}
do - while 循环
语法:
do{
循环体;
}while(循环条件);
执行过程:先执行do中的循环体,执行完成后,判断循环条件,成立继续执行do中的循环体,不成立,跳出do-while循环
特点:先循环 在判断 至少执行一次循环
using System;
class Program
{
static void Main()
{
// 提示用户输入一个正整数
Console.Write("请输入一个正整数:");
int number = int.Parse(Console.ReadLine());
// 确保输入的数字是正整数
if (number <= 0)
{
Console.WriteLine("请输入一个正整数。");
return;
}
int sum = 0;
int i = 1;
// 使用 do-while 循环计算从 1 到 number 的所有整数之和
do
{
sum += i;
i++;
} while (i <= number);
// 输出结果
Console.WriteLine("从 1 到 " + number + " 的总和是: " + sum);
}
}
- 关键字break
1、可以跳出switch case结构
2、可以跳出当前循环
break一般不单独使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就不再循环
using System;
class Program
{
static void Main()
{
int number;
// 创建一个无限循环
while (true)
{
Console.Write("请输入一个正整数 (输入0退出):");
number = int.Parse(Console.ReadLine());
// 如果用户输入的是0,则使用break语句退出循环
if (number == 0)
{
break;
}
// 输出用户的输入
Console.WriteLine("输入的数字是:" + number);
}
Console.WriteLine("程序已退出。");
}
}
- 关键字Continue
1、当 continue
被执行时,循环将跳过当前的迭代,直接跳到循环的更新步骤(即 for
循环中的第三部分),然后继续下一次迭代。
2、continue
将跳过当前的循环体剩余部分,直接回到条件检查部分(即 while
或 do-while
的条件表达式),然后决定是否继续下一次迭代。
//for 循环中的 continue
using System;
class Program
{
static void Main()
{
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0) // 如果 i 是偶数
{
continue; // 跳过当前迭代
}
Console.WriteLine(i); // 仅打印奇数
}
}
}
//while 循环中的 continue
using System;
class Program
{
static void Main()
{
int i = 0;
while (i < 10)
{
i++;
if (i % 2 == 0) // 如果 i 是偶数
{
continue; // 跳过当前迭代
}
Console.WriteLine(i); // 仅打印奇数
}
}
}
for循环语句:
语法:
for(表达式1;表达式2;表达式3)
{
循环体;
}
表达式1:声明循环体变量,记录循环次数
表达式2:循环条件
表达式3:改变循环条件的代码
using System;
class Program
{
static void Main()
{
// 使用 for 循环打印 1 到 10
for (int i = 1; i <= 10; i++)
{
Console.WriteLine("for循环: " + i);
}
}
}
for循环嵌套语句
语法:
// 外部 for 循环
for (initialization; condition; increment)
{
// 外部循环的代码逻辑
// 嵌套 for 循环
for (initialization; condition; increment)
{
// 内部循环的代码逻辑
}
}执行过程:
- 外部
for
循环:控制循环的外部结构(例如行),每次迭代外部循环时都会启动内部循环。- 内部
for
循环:在外部循环的每次迭代中执行,用于处理内部结构(例如列),完成外部循环的每一行的处理。- 循环体执行:外部循环每次自增时,内部循环从头开始,直到完成一整行的打印后,外部循环再自增,开始下一行的处理。
- 循环结束:当外部循环的条件不再满足时,整个循环结束。
using System;
class Program
{
static void Main()
{
int rows = 5; // 行数
int cols = 4; // 列数
// 外层循环:用于遍历每一行
for (int i = 0; i < rows; i++)
{
// 内层循环:用于遍历每一列
for (int j = 0; j < cols; j++)
{
// 打印当前行和列的位置
Console.Write($"{i},{j} ");
}
// 每打印完一行后换行
Console.WriteLine();
Console.ReadKey();
}
}
}
四、程序调试
使用场景:
- 写完一段程序后,想看一下这段程序的执行过程
- 写完程序后,发现程序并没有按照你想象的样子去执行
调试方法:
逐语句调试(Step Over):
F10
执行当前行的代码,但不会进入函数调用内部。逐过程调试(Step Into):
F11
进入当前行代码中的函数调用,并逐步调试函数内部的代码断点调试:允许你在代码的特定行暂停程序的执行,从而检查程序状态、变量值和代码行为
调试的快捷方式:
逐语句调试(Step Over):
F10
执行当前行的代码,但不会进入函数调用内部。逐过程调试(Step Into):
F11
进入当前行代码中的函数调用,并逐步调试函数内部的代码。逐出调试(Step Out):
Shift + F11
执行当前函数的剩余代码,直到返回到调用该函数的地方。继续执行(Continue):
F5
继续运行程序,直到遇到下一个断点或程序结束。暂停调试(Pause):
Ctrl + Alt + Break
暂停程序的执行,使其进入调试状态。设置/删除断点:
F9
在当前行设置或删除断点。查看调用堆栈:
Ctrl + Alt + C
显示调用堆栈窗口,以查看程序执行的调用路径。
调试工具窗口
调试工具栏:
在 Visual Studio 窗口的顶部工具栏中,通常有调试按钮,如“继续”、“暂停”、“停止”等,帮助你控制调试过程。本地变量窗口:
显示当前作用域内的变量及其值。帮助你检查在当前调试状态下的变量值。监视窗口:
允许你添加并观察特定变量的值,方便跟踪程序状态变化。调用堆栈窗口:
显示当前执行点的调用路径,帮助你了解程序是如何到达当前断点的。
五、类型转换
1、Convert
类
概念:
Convert
类提供了静态方法来转换基本数据类型和其他类型之间的转换。它可以处理大多数基本类型之间的转换,例如从string
到int
或从double
到decimal
。特点:
- 在转换失败时通常会抛出异常(例如
FormatException
)。 - 对于
null
值,Convert
会将其转换为default
值(例如,null
转换为0
或false
)。
- 在转换失败时通常会抛出异常(例如
// 从 string 转换为 int
string str = "123";
int number = Convert.ToInt32(str); // number 为 123
// 从 double 转换为 string
double d = 123.45;
string strDouble = Convert.ToString(d); // strDouble 为 "123.45"
// 从 null 转换为 int
object obj = null;
int defaultValue = Convert.ToInt32(obj); // defaultValue 为 0
2. Parse
方法
概念:
Parse
是所有基础数据类型(如int
、double
、DateTime
等)的实例方法,用于将string
类型的数据转换为对应的基础数据类型。它属于System
命名空间下的每个基本数据类型(例如Int32.Parse
)。特点:
- 在转换失败时抛出异常(例如
FormatException
、OverflowException
)。 - 不能处理
null
值,如果string
为null
会抛出ArgumentNullException
- 在转换失败时抛出异常(例如
// 从 string 转换为 int
string str = "123";
int number = int.Parse(str); // number 为 123
// 从 string 转换为 double
string doubleStr = "123.45";
double d = double.Parse(doubleStr); // d 为 123.45
// 解析失败会抛出异常
try
{
string invalidStr = "abc";
int invalidNumber = int.Parse(invalidStr); // 抛出 FormatException
}
catch (FormatException e)
{
Console.WriteLine("Format exception: " + e.Message);
}
3. TryParse
方法
概念:
TryParse
方法也是用于将string
转换为基本数据类型的方法,但与Parse
不同,它不会抛出异常。相反,它返回一个布尔值,指示转换是否成功,并通过参数返回转换后的值。特点:
- 不抛出异常,转换失败时返回
false
,转换成功时返回true
。 - 适用于需要安全转换的场景。
- 不抛出异常,转换失败时返回
// 从 string 转换为 int
string str = "123";
bool success = int.TryParse(str, out int number);
// success 为 true,number 为 123
// 从 string 转换为 double
string doubleStr = "123.45";
success = double.TryParse(doubleStr, out double d);
// success 为 true,d 为 123.45
// 转换失败的情况
string invalidStr = "abc";
success = int.TryParse(invalidStr, out int result);
// success 为 false,result 为 0
六、三元表达式
语法:
表达式1?表达式2:表达式3;
表达式1
:一个布尔表达式,决定选择哪个结果。- 表达式2:当条件为
true
时的结果。- 表达式3:当条件为
false
时的结果。执行过程:
- 条件检查:首先评估条件表达式。
- 选择结果:如果条件为
true
,返回expression1
;如果条件为false
,返回expression2
。
using System;
class Program
{
static void Main()
{
int a = 5;
int b = 10;
// 使用三元表达式判断哪个数更大
string result = a > b ? "a is greater" : "b is greater";
Console.WriteLine(result); // 输出 "b is greater"
}
}