Week 1 - 阶段检查
第一周只检查 C# 控制台基础:环境、变量、类型、控制流、运算符、字符串、方法、数组、List 和 CLI 小项目。
本周学习地图
| 阶段 | 先掌握什么 | 最终能写什么 |
|---|---|---|
| 环境 | dotnet new、dotnet run、项目目录 | 能创建并运行控制台项目 |
| 数据 | 变量、类型、转换、字符串操作 | 能接收输入并转成可计算数据 |
| 流程 | if、switch、for、while、foreach | 能根据条件处理不同分支和重复任务 |
| 封装 | 方法、参数、返回值 | 能把重复逻辑拆成可复用方法 |
| 多条数据 | 数组、List、统计 | 能保存多条商品并计算结果 |
| 综合 | 输入、校验、处理、输出 | 能写一个完整 CLI 小项目 |
本周自测项目:控制台商品收银台
从空项目开始写一个收银台程序,至少包含:
- 输入商品名称、单价、数量。
- 名称不能为空,单价必须大于 0,数量必须大于 0。
- 可以连续录入多条商品。
- 最后输出商品明细、总数量、总金额。
- 所有计算逻辑至少拆成 2 个方法。
过关标准:不看答案能独立写出来,并能解释每个变量的类型为什么这样选。
上位机阶段验收:控制台设备状态检测器
本周目标: 用变量、判断、循环、方法和 List 完成第一台纯 C# 设备监控程序。
必须亲手完成:
- 输入设备名、温度和报警上限
- 用方法判断在线、正常或报警
- 连续保存 5 次采集值并输出最大值
过关标准: 你能从空项目独立敲完,能解释每个变量、if、循环和方法参数。
不要只看答案。新建一个空项目重做一次,运行成功后再故意改坏一处并自己排错。
本周流程图
终端创建项目
-> Program.cs 写入口代码
-> Console.ReadLine 接收输入
-> TryParse 转换类型
-> if/else 校验数据
-> 方法计算结果
-> List 保存多条数据
-> Console.WriteLine 输出明细和汇总本周主线
第一周不是七个散点,而是一条完整路线:
终端和 dotnet 命令
-> 创建控制台项目
-> Program.cs 写入口代码
-> 变量保存数据
-> 类型限制数据能做什么
-> 运算符处理数据
-> if/else 选择路线
-> for/while/foreach 重复处理
-> 方法封装动作
-> 数组/List 保存多条数据
-> CLI 小项目把输入、校验、处理、输出串起来如果这条线能说清楚,第一周的基础就算建立起来了。
必须掌握的能力
环境和项目
- 能用
dotnet --version判断 .NET SDK 是否可用。 - 能用
dotnet new console -n 项目名创建控制台项目。 - 能分清
.csproj和Program.cs的作用。 - 能用
dotnet run运行项目。 - 知道
dotnet run会先编译,再运行。
变量和类型
- 能说清变量名、类型和值的关系。
- 能选择
int、decimal、string、bool。 - 知道金额优先用
decimal。 - 知道用户输入先是
string?。 - 能用
TryParse安全转换输入。
控制流
- 能写
if / else if / else。 - 能分清
=和==。 - 能使用
&&、||、!。 - 能写
for、while、foreach。 - 能分清
break、continue、return。
方法
- 能写有返回值的方法。
- 能写
void方法。 - 能分清参数和返回值。
- 能把重复代码拆成方法。
- 知道局部变量只能在自己的作用域里使用。
数组和 List
- 知道数组长度固定,
List长度可以变化。 - 知道下标从
0开始。 - 知道最后一个下标是
Count - 1。 - 能用
Add添加数据。 - 能用
for或foreach遍历数据。 - 能统计总和、平均值、最高值、最低值。
第一周常用操作速查
这一节是第一周最终要能熟练使用的操作清单。后面做桌面端和 Web 时,这些写法会一直出现。
终端和项目
| 需求 | 写法 |
|---|---|
| 查看 .NET 是否可用 | dotnet --version |
| 创建控制台项目 | dotnet new console -n 项目名 |
| 进入文件夹 | cd 文件夹名 |
| 查看当前文件夹 | pwd |
| 查看文件 | ls |
| 运行项目 | dotnet run |
| 只检查编译 | dotnet build |
控制台输入输出
| 需求 | 写法 |
|---|---|
| 输出并换行 | Console.WriteLine("文字") |
| 输出不换行 | Console.Write("提示: ") |
| 读取一行输入 | string? input = Console.ReadLine(); |
| 清屏 | Console.Clear(); |
| 等待按键 | Console.ReadKey(); |
类型和转换
| 需求 | 写法 |
|---|---|
| 整数 | int count = 3; |
| 金额 | decimal price = 19.9m; |
| 文本 | string name = "Keyboard"; |
| 真假 | bool canSave = true; |
| 当前时间 | DateTime now = DateTime.Now; |
| 文本转整数 | int.TryParse(text, out int value) |
| 文本转金额 | decimal.TryParse(text, out decimal value) |
| 文本转日期 | DateTime.TryParse(text, out DateTime value) |
字符串
| 需求 | 写法 |
|---|---|
| 判断空白 | string.IsNullOrWhiteSpace(text) |
| 去掉前后空格 | text.Trim() |
| 转大写 | text.ToUpper() |
| 转小写 | text.ToLower() |
| 判断包含 | text.Contains("key") |
| 判断开头 | text.StartsWith("P-") |
| 替换 | text.Replace(" ", "-") |
| 分割 | text.Split('-') |
| 拼接 | string.Join("-", parts) |
| 长度 | text.Length |
判断和循环
| 需求 | 写法 |
|---|---|
| 条件判断 | if / else if / else |
| 固定选项 | switch |
| 多个条件都满足 | && |
| 任意条件满足 | || |
| 取反 | ! |
| 次数明确循环 | for |
| 次数不确定循环 | while |
| 遍历集合 | foreach |
| 跳过本轮 | continue |
| 结束循环 | break |
| 结束方法或程序 | return |
方法
| 需求 | 写法 |
|---|---|
| 只做动作 | void PrintReceipt(...) |
| 返回结果 | decimal CalculateTotal(...) |
| 返回真假 | bool IsValidName(...) |
| 失败返回空 | string? ReadRequiredText(...) |
| 尝试读取 | bool TryReadInt(..., out int value) |
List
| 需求 | 写法 |
|---|---|
| 创建列表 | var items = new List<string>(); |
| 添加 | items.Add("Keyboard"); |
| 插入 | items.Insert(0, "Mouse"); |
| 读取 | items[0] |
| 修改 | items[0] = "Keyboard Pro"; |
| 删除值 | items.Remove("Mouse"); |
| 删除下标 | items.RemoveAt(0); |
| 判断包含 | items.Contains("Keyboard") |
| 查找下标 | items.IndexOf("Keyboard") |
| 排序 | items.Sort(); |
| 清空 | items.Clear(); |
| 数量 | items.Count |
名词复盘
| 名词 | 必须能说清楚 |
|---|---|
| 项目 | 一组能一起编译运行的文件 |
| 入口 | 程序开始执行的位置,控制台项目主要看 Program.cs |
| 变量 | 保存一份数据的名字 |
| 类型 | 规定变量能保存什么、能做什么 |
| 字面量 | 直接写在代码里的值,例如 18、"Tom"、19.9m |
| 表达式 | 能算出一个结果的一段代码 |
| 条件 | 结果为 true 或 false 的表达式 |
| 循环 | 重复执行一段代码 |
| 方法 | 有名字的一段逻辑 |
| 参数 | 调用方法时传进去的数据 |
| 返回值 | 方法执行后交回来的结果 |
| 集合 | 保存一组数据的结构 |
| 下标 | 集合里元素的位置,从 0 开始 |
| CLI | 通过文字输入输出操作的程序 |
最低代码能力
下面这些代码必须能看懂,也要能自己写出来。
读取并转换输入
Console.Write("请输入年龄: ");
string? input = Console.ReadLine();
if (!int.TryParse(input, out int age))
{
Console.WriteLine("年龄必须是整数");
return;
}
Console.WriteLine($"年龄: {age}");条件判断
int score = 78;
if (score >= 90)
{
Console.WriteLine("优秀");
}
else if (score >= 60)
{
Console.WriteLine("通过");
}
else
{
Console.WriteLine("未通过");
}循环处理 List
var numbers = new List<int> { 3, 5, 7 };
int sum = 0;
foreach (int number in numbers)
{
sum += number;
}
Console.WriteLine(sum);拆成方法
decimal total = CalculateTotal(19.9m, 3);
Console.WriteLine($"总价: {total:F2}");
decimal CalculateTotal(decimal price, int count)
{
return price * count;
}用 List 保存多条输入
var names = new List<string>();
while (true)
{
Console.Write("姓名,直接回车结束: ");
string? input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
break;
}
names.Add(input.Trim());
}
foreach (string name in names)
{
Console.WriteLine(name);
}阶段检查题
先读题目,再看完整答案。每道题都对应第一周的一个核心能力。
题目 1:环境和项目
创建一个名为 Week1Check 的控制台项目,运行后输出:
Week 1 Check
Program.cs is running题目 2:变量、类型和输入转换
写一个程序:
- 输入商品名称。
- 输入单价。
- 输入数量。
- 名称不能为空。
- 单价必须是数字。
- 数量必须是整数。
- 输出总价,金额保留两位小数。
题目 3:控制流和循环
写一个程序:
- 反复输入成绩。
- 直接回车结束。
- 成绩必须是整数。
- 成绩必须在
0到100之间。 - 每输入一个有效成绩,输出等级。
等级规则:
| 分数 | 等级 |
|---|---|
90-100 | 优秀 |
80-89 | 良好 |
60-79 | 通过 |
0-59 | 未通过 |
题目 4:方法
把商品小票拆成三个方法:
CalculateTotal负责计算总价。IsValidName负责判断名称是否有效。PrintReceipt负责打印小票。
题目 5:List 统计
写一个成绩统计程序:
- 用
List<int>保存成绩。 - 统计数量、总分、平均分、最高分、最低分。
- 空集合时输出“没有成绩”。
题目 6:CLI 小项目
写一个记账 CLI:
- 菜单包含添加记录、查看记录、查看合计、退出。
- 添加记录时输入金额、分类、备注。
- 金额必须是数字。
- 分类不能为空。
- 查看记录时显示序号。
- 查看合计时显示笔数和总金额。
完整答案
题目 1 答案
终端命令:
dotnet new console -n Week1Check
cd Week1Check
dotnet runProgram.cs:
Console.WriteLine("Week 1 Check");
Console.WriteLine("Program.cs is running");题目 2 答案
Console.Write("商品名称: ");
string? nameText = Console.ReadLine();
Console.Write("单价: ");
string? priceText = Console.ReadLine();
Console.Write("数量: ");
string? countText = Console.ReadLine();
if (string.IsNullOrWhiteSpace(nameText))
{
Console.WriteLine("商品名称不能为空");
return;
}
if (!decimal.TryParse(priceText, out decimal price))
{
Console.WriteLine("单价必须是数字");
return;
}
if (!int.TryParse(countText, out int count))
{
Console.WriteLine("数量必须是整数");
return;
}
if (price < 0 || count <= 0)
{
Console.WriteLine("单价或数量范围不正确");
return;
}
string name = nameText.Trim();
decimal total = price * count;
Console.WriteLine($"商品: {name}");
Console.WriteLine($"单价: {price:F2}");
Console.WriteLine($"数量: {count}");
Console.WriteLine($"总价: {total:F2}");题目 3 答案
while (true)
{
Console.Write("请输入成绩,直接回车结束: ");
string? input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
break;
}
if (!int.TryParse(input, out int score))
{
Console.WriteLine("成绩必须是整数");
continue;
}
if (score < 0 || score > 100)
{
Console.WriteLine("成绩必须在 0 到 100 之间");
continue;
}
string level;
if (score >= 90)
{
level = "优秀";
}
else if (score >= 80)
{
level = "良好";
}
else if (score >= 60)
{
level = "通过";
}
else
{
level = "未通过";
}
Console.WriteLine($"等级: {level}");
}题目 4 答案
string name = "Keyboard";
decimal price = 199m;
int count = 2;
if (!IsValidName(name))
{
Console.WriteLine("商品名称不能为空");
return;
}
decimal total = CalculateTotal(price, count);
PrintReceipt(name, price, count, total);
bool IsValidName(string? name)
{
return !string.IsNullOrWhiteSpace(name);
}
decimal CalculateTotal(decimal price, int count)
{
return price * count;
}
void PrintReceipt(string name, decimal price, int count, decimal total)
{
Console.WriteLine("----- 小票 -----");
Console.WriteLine($"商品: {name}");
Console.WriteLine($"单价: {price:F2}");
Console.WriteLine($"数量: {count}");
Console.WriteLine($"总价: {total:F2}");
}题目 5 答案
var scores = new List<int> { 80, 95, 62, 40 };
if (scores.Count == 0)
{
Console.WriteLine("没有成绩");
return;
}
int sum = 0;
int max = scores[0];
int min = scores[0];
foreach (int score in scores)
{
sum += score;
if (score > max)
{
max = score;
}
if (score < min)
{
min = score;
}
}
double average = (double)sum / scores.Count;
Console.WriteLine($"数量: {scores.Count}");
Console.WriteLine($"总分: {sum}");
Console.WriteLine($"平均分: {average:F1}");
Console.WriteLine($"最高分: {max}");
Console.WriteLine($"最低分: {min}");题目 6 答案
var amounts = new List<decimal>();
var categories = new List<string>();
var notes = new List<string>();
while (true)
{
PrintMenu();
string? choice = Console.ReadLine();
if (choice == "1")
{
AddRecord(amounts, categories, notes);
}
else if (choice == "2")
{
ListRecords(amounts, categories, notes);
}
else if (choice == "3")
{
PrintTotal(amounts);
}
else if (choice == "0")
{
Console.WriteLine("程序结束");
break;
}
else
{
Console.WriteLine("未知选项");
}
}
void PrintMenu()
{
Console.WriteLine();
Console.WriteLine("==== 记账 CLI ====");
Console.WriteLine("1. 添加记录");
Console.WriteLine("2. 查看记录");
Console.WriteLine("3. 查看合计");
Console.WriteLine("0. 退出");
Console.Write("请选择: ");
}
void AddRecord(List<decimal> amounts, List<string> categories, List<string> notes)
{
Console.Write("金额: ");
string? amountText = Console.ReadLine();
if (!decimal.TryParse(amountText, out decimal amount))
{
Console.WriteLine("金额必须是数字");
return;
}
Console.Write("分类: ");
string? category = Console.ReadLine();
if (string.IsNullOrWhiteSpace(category))
{
Console.WriteLine("分类不能为空");
return;
}
Console.Write("备注: ");
string? note = Console.ReadLine();
amounts.Add(amount);
categories.Add(category.Trim());
notes.Add(string.IsNullOrWhiteSpace(note) ? "" : note.Trim());
Console.WriteLine("记录已添加");
}
void ListRecords(List<decimal> amounts, List<string> categories, List<string> notes)
{
if (amounts.Count == 0)
{
Console.WriteLine("暂无记录");
return;
}
for (int i = 0; i < amounts.Count; i++)
{
Console.WriteLine($"{i + 1}. {amounts[i]:F2} | {categories[i]} | {notes[i]}");
}
}
void PrintTotal(List<decimal> amounts)
{
decimal total = 0m;
foreach (decimal amount in amounts)
{
total += amount;
}
Console.WriteLine($"共 {amounts.Count} 笔,合计 {total:F2}");
}通过标准
完成第一周后,至少要达到下面这些标准:
- 能独立创建并运行一个控制台项目。
- 能解释
Program.cs、.csproj、dotnet run的作用。 - 能写出输入、校验、转换、计算、输出的完整流程。
- 能用
if处理错误输入。 - 能用循环重复处理数据。
- 能把重复逻辑拆成方法。
- 能用
List保存多条数据并统计。 - 能完成一个只在内存里运行的 CLI 小项目。
如果没有通过
不要急着进入第二周。按这个顺序补:
- 重做 Day 1 的项目创建和运行。
- 重做 Day 2 的商品总价程序。
- 重做 Day 3 的成绩等级程序。
- 重做 Day 5 的方法拆分。
- 重做 Day 6 的成绩统计。
- 最后再做 Day 7 的记账 CLI。
第一周通过后,第二周会继续加强 C# 基础,重点是更完整的集合体系、LINQ、泛型、异常处理和 CSV 小项目。