-
流程控制综合应用——用c#学生成绩分级系统
第一部分:C#基础入门
实例3:流程控制综合应用——学生成绩分级系统
实例介绍
本实例通过学生成绩分级系统,综合运用循环、条件判断、输入验证等核心流程控制语法,实现从输入到统计的完整流程。系统vb.net教程C#教程python教程SQL教程access 2010教程
支持批量输入学生成绩、自动分级、统计各等级人数及计算平均分,帮助读者掌握流程控制的组合使用逻辑,理解变量作用域与数据验证的重要性。
需求分析
批量输入:支持输入任意数量的学生姓名与成绩;
成绩验证:确保成绩在0-100之间,无效输入时提示并重新输入;
自动分级:按成绩划分等级(优秀/良好/中等/及格/不及格);
统计分析:计算总分、平均分,统计各等级人数;
结果输出:清晰展示单个学生信息、整体统计结果。
代码实现
csharp
using System;
namespace FlowControlDemo
{
class StudentGradeSystem
{
static void Main(string[] args)
{
// 1. 输入学生人数(验证:正整数)
int studentCount;
Console.Write("请输入学生人数:");
while (!int.TryParse(Console.ReadLine(), out studentCount) || studentCount <= 0)
{
Console.WriteLine("输入无效!请输入正整数。");
Console.Write("请输入学生人数:");
}
// 2. 初始化统计变量
int totalScore = 0;
int excellentCount = 0, goodCount = 0, mediumCount = 0, passCount = 0, failCount = 0;
// 3. 循环输入每个学生信息
for (int i = 0; i < studentCount; i++)
{
Console.WriteLine($"
===== 第{i + 1}个学生 =====");
// 输入姓名
Console.Write("姓名:");
string name = Console.ReadLine().Trim();
if (string.IsNullOrWhiteSpace(name)) name = $"匿名学生{i + 1}"; // 处理空姓名
// 输入成绩(验证:0-100的整数)
int score;
do
{
Console.Write("成绩(0-100):");
} while (!int.TryParse(Console.ReadLine(), out score) || score < 0 || score > 100);
// 4. 成绩分级
string level;
if (score >= 90) level = "优秀";
else if (score >= 80) level = "良好";
else if (score >= 70) level = "中等";
else if (score >= 60) level = "及格";
else level = "不及格";
// 5. 更新统计
totalScore += score;
switch (level)
{
case "优秀": excellentCount++; break;
case "良好": goodCount++; break;
case "中等": mediumCount++; break;
case "及格": passCount++; break;
case "不及格": failCount++; break;
}
// 输出单个学生结果
Console.WriteLine($"→ 学生 {name}:成绩{score}分,等级「{level}」");
}
// 6. 计算平均分(避免整数除法)
double averageScore = (double)totalScore / studentCount;
// 7. 输出整体统计结果
Console.WriteLine("
===== 成绩统计结果 =====");
Console.WriteLine($"总人数:{studentCount}人");
Console.WriteLine($"总分:{totalScore}分,平均分:{averageScore:F2}分"); // F2保留两位小数
Console.WriteLine("
等级分布:");
Console.WriteLine($"优秀:{excellentCount}人 ({(double)excellentCount/studentCount:P2})"); // P2显示百分比
Console.WriteLine($"良好:{goodCount}人 ({(double)goodCount/studentCount:P2})");
Console.WriteLine($"中等:{mediumCount}人 ({(double)mediumCount/studentCount:P2})");
Console.WriteLine($"及格:{passCount}人 ({(double)passCount/studentCount:P2})");
Console.WriteLine($"不及格:{failCount}人 ({(double)failCount/studentCount:P2})");
// 等待退出
Console.WriteLine("
按任意键退出...");
Console.ReadKey();
}
}
}
逐行讲解
-
学生人数输入与验证
csharp
int studentCount;
Console.Write("请输入学生人数:");
while (!int.TryParse(Console.ReadLine(), out studentCount) || studentCount <=0)
{
Console.WriteLine("输入无效!请输入正整数。");
Console.Write("请输入学生人数:");
}
int.TryParse:尝试将输入字符串转为整数,成功则返回true并赋值给studentCount,避免输入非数字导致崩溃。
while循环:持续验证直到输入正整数(studentCount>0)。
-
统计变量初始化
csharp
int totalScore =0;
int excellentCount=0, goodCount=0, mediumCount=0, passCount=0, failCount=0;
声明并初始化统计变量:总分、各等级人数,初始值均为0,用于后续累加。
-
循环输入学生信息
csharp
for(int i=0; i<studentCount; i++)
{
// ...输入姓名、成绩、分级、统计...
}
for循环:已知学生人数,循环studentCount次,每次处理一个学生。
-
姓名输入与处理
csharp
Console.Write("姓名:");
string name = Console.ReadLine().Trim();
if(string.IsNullOrWhiteSpace(name)) name = $"匿名学生{i+1}";
Trim():去除姓名前后空格,避免空字符串。
空姓名处理:若用户未输入姓名,自动生成“匿名学生X”。
-
成绩输入与验证
csharp
int score;
do
{
Console.Write("成绩(0-100):");
} while (!int.TryParse(Console.ReadLine(), out score) || score<0 || score>100);
do-while循环:至少执行一次输入,直到输入0-100的整数。
验证逻辑:非数字(TryParse失败)或超出范围(score<0/score>100)均重新输入。
-
成绩分级
csharp
string level;
if(score>=90) level="优秀";
else if(score>=80) level="良好";
else if(score>=70) level="中等";
else if(score>=60) level="及格";
else level="不及格";
if-else if-else:按成绩范围分级,逻辑清晰,适合连续范围判断。
-
统计更新
csharp
totalScore += score;
switch(level)
{
case "优秀": excellentCount++; break;
case "良好": goodCount++; break;
case "中等": mediumCount++; break;
case "及格": passCount++; break;
case "不及格": failCount++; break;
}
总分累加:totalScore += score等价于totalScore = totalScore + score。
switch语句:根据等级更新对应统计变量,break避免穿透到下一个case。
-
平均分计算与输出
csharp
double averageScore = (double)totalScore / studentCount;
Console.WriteLine($"总分:{totalScore}分,平均分:{averageScore:F2}分");
类型转换:将totalScore(int)转为double,避免整数除法(如100/3=33而非33.33)。
格式说明符:F2保留两位小数,P2显示百分比(如0.25→25.00%)。
基础知识拓展
- 循环类型选择
循环类型
适用场景
示例
for
已知循环次数
输入固定数量的学生
while
未知次数,可能不执行
输入学生人数直到正确
do-while
未知次数,至少执行一次
成绩验证(必须输入一次)
- 条件判断优化
if-else if-else:适合连续范围判断(如成绩分级)。
switch(C#8+范围模式):更简洁的范围判断,替代冗长的if-else:
csharp
level = score switch
{
>=90 => "优秀",
>=80 => "良好",
>=70 => "中等",
>=60 => "及格",
_ => "不及格" // 默认情况
};
- 变量作用域
局部变量:在循环内声明的变量(如name、score),每次循环重新创建,仅在当前迭代有效。
全局变量(相对循环):循环外声明的变量(如totalScore),作用域覆盖整个循环,用于累加统计。
- 输入验证最佳实践
TryParse优先:避免Convert.ToInt32(输入非数字会抛出异常)。
范围验证:确保输入值在合理区间(如成绩0-100)。
友好提示:明确告知用户错误原因(如“请输入正整数”而非“输入错误”)。
扩展思考
文件交互:从CSV文件读取学生成绩,处理后保存到新文件(需引用System.IO)。
排序功能:将学生成绩按从高到低排序,输出排名(需用List
中位数计算:统计成绩的中位数(需排序后取中间值)。
多班级支持:输入多个班级的成绩,分别统计每个班级的结果。
类封装:定义Student类(包含Name、Score、Level属性),用List
图形化界面:将控制台程序改为WPF/WinForms应用,提供更直观的交互(如表格展示成绩)。
总结
本实例通过学生成绩分级系统,综合运用了循环、条件判断、输入验证等流程控制核心语法,同时覆盖了变量作用域、类型转换、格式化输出等基础知识。通过扩展思考,可进一步提升程序的实用性与扩展性,为后续学习面向对象编程打下基础。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49394.html










