Skip to Content
Week 01📋 Week 1 阶段检查

Week 1 - 阶段检查

第一周只检查 C# 控制台基础:环境、变量、类型、控制流、运算符、字符串、方法、数组、List 和 CLI 小项目。

本周学习地图

阶段先掌握什么最终能写什么
环境dotnet newdotnet run、项目目录能创建并运行控制台项目
数据变量、类型、转换、字符串操作能接收输入并转成可计算数据
流程ifswitchforwhileforeach能根据条件处理不同分支和重复任务
封装方法、参数、返回值能把重复逻辑拆成可复用方法
多条数据数组、List、统计能保存多条商品并计算结果
综合输入、校验、处理、输出能写一个完整 CLI 小项目

本周自测项目:控制台商品收银台

从空项目开始写一个收银台程序,至少包含:

  • 输入商品名称、单价、数量。
  • 名称不能为空,单价必须大于 0,数量必须大于 0。
  • 可以连续录入多条商品。
  • 最后输出商品明细、总数量、总金额。
  • 所有计算逻辑至少拆成 2 个方法。

过关标准:不看答案能独立写出来,并能解释每个变量的类型为什么这样选。

上位机阶段验收:控制台设备状态检测器

本周目标: 用变量、判断、循环、方法和 List 完成第一台纯 C# 设备监控程序。

必须亲手完成:

  1. 输入设备名、温度和报警上限
  2. 用方法判断在线、正常或报警
  3. 连续保存 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 项目名 创建控制台项目。
  • 能分清 .csprojProgram.cs 的作用。
  • 能用 dotnet run 运行项目。
  • 知道 dotnet run 会先编译,再运行。

变量和类型

  • 能说清变量名、类型和值的关系。
  • 能选择 intdecimalstringbool
  • 知道金额优先用 decimal
  • 知道用户输入先是 string?
  • 能用 TryParse 安全转换输入。

控制流

  • 能写 if / else if / else
  • 能分清 ===
  • 能使用 &&||!
  • 能写 forwhileforeach
  • 能分清 breakcontinuereturn

方法

  • 能写有返回值的方法。
  • 能写 void 方法。
  • 能分清参数和返回值。
  • 能把重复代码拆成方法。
  • 知道局部变量只能在自己的作用域里使用。

数组和 List

  • 知道数组长度固定,List 长度可以变化。
  • 知道下标从 0 开始。
  • 知道最后一个下标是 Count - 1
  • 能用 Add 添加数据。
  • 能用 forforeach 遍历数据。
  • 能统计总和、平均值、最高值、最低值。

第一周常用操作速查

这一节是第一周最终要能熟练使用的操作清单。后面做桌面端和 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
表达式能算出一个结果的一段代码
条件结果为 truefalse 的表达式
循环重复执行一段代码
方法有名字的一段逻辑
参数调用方法时传进去的数据
返回值方法执行后交回来的结果
集合保存一组数据的结构
下标集合里元素的位置,从 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:变量、类型和输入转换

写一个程序:

  1. 输入商品名称。
  2. 输入单价。
  3. 输入数量。
  4. 名称不能为空。
  5. 单价必须是数字。
  6. 数量必须是整数。
  7. 输出总价,金额保留两位小数。

题目 3:控制流和循环

写一个程序:

  1. 反复输入成绩。
  2. 直接回车结束。
  3. 成绩必须是整数。
  4. 成绩必须在 0100 之间。
  5. 每输入一个有效成绩,输出等级。

等级规则:

分数等级
90-100优秀
80-89良好
60-79通过
0-59未通过

题目 4:方法

把商品小票拆成三个方法:

  1. CalculateTotal 负责计算总价。
  2. IsValidName 负责判断名称是否有效。
  3. PrintReceipt 负责打印小票。

题目 5:List 统计

写一个成绩统计程序:

  1. List<int> 保存成绩。
  2. 统计数量、总分、平均分、最高分、最低分。
  3. 空集合时输出“没有成绩”。

题目 6:CLI 小项目

写一个记账 CLI:

  1. 菜单包含添加记录、查看记录、查看合计、退出。
  2. 添加记录时输入金额、分类、备注。
  3. 金额必须是数字。
  4. 分类不能为空。
  5. 查看记录时显示序号。
  6. 查看合计时显示笔数和总金额。

完整答案

题目 1 答案

终端命令:

dotnet new console -n Week1Check cd Week1Check dotnet run

Program.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.csprojdotnet run 的作用。
  • 能写出输入、校验、转换、计算、输出的完整流程。
  • 能用 if 处理错误输入。
  • 能用循环重复处理数据。
  • 能把重复逻辑拆成方法。
  • 能用 List 保存多条数据并统计。
  • 能完成一个只在内存里运行的 CLI 小项目。

如果没有通过

不要急着进入第二周。按这个顺序补:

  1. 重做 Day 1 的项目创建和运行。
  2. 重做 Day 2 的商品总价程序。
  3. 重做 Day 3 的成绩等级程序。
  4. 重做 Day 5 的方法拆分。
  5. 重做 Day 6 的成绩统计。
  6. 最后再做 Day 7 的记账 CLI。

第一周通过后,第二周会继续加强 C# 基础,重点是更完整的集合体系、LINQ、泛型、异常处理和 CSV 小项目。