news 2026/10/20 4:07:52

C#基础练习题入门:从Hello World到编程直觉

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#基础练习题入门:从Hello World到编程直觉

简介:本资源是一套系统性的C#编程入门实战练习题集,面向零基础或初学阶段的开发者,旨在通过大量编码实践夯实语法、面向对象、集合操作、异常处理等核心能力,快速提升解决实际问题的编程水平。压缩包共1670个文件,涵盖224个C#源码文件(.cs)、94个项目配置文件(.csproj)、82个解决方案文件(.sln)、164个可执行程序(.exe)及配套资源(如.jpg图标、.ico、.resx本地化文件、.config配置项等),整体体积17.87MB,结构完整,支持直接编译运行与分模块学习。已有730人下载学习,资源内容覆盖从基本数据类型、控制结构、函数方法,到类与对象、接口抽象、LINQ查询、异步编程及文件I/O等12大知识板块,每个练习均配有可运行代码与典型场景实现,便于对照理解、调试验证与举一反三。

1. C#基础练习题:不是刷题,是给编程大脑装上第一块“肌肉记忆”芯片

你有没有试过学骑自行车?光看别人蹬、听教练讲“重心前倾”“微调把手”,但一上车就晃得像喝醉——直到某次摔了两跤后,身体突然自己知道怎么平衡了。C#基础练习题,就是编程世界里的那辆自行车。它不是让你背语法口诀的考试卷,而是一套专为新手设计的“手指-眼睛-大脑”协同训练包:每道题都像一个微型靶子,你敲几行代码、点一下运行、看到结果对错,肌肉和神经就悄悄记下“这样写,电脑就听懂了”。它不考你多深奥的算法,只问你:“变量怎么存数字?”“循环怎么让电脑重复干活?”“按钮被点一下,背后到底发生了什么?”——这些问题的答案,藏在你亲手敲出的第一百个Console.WriteLine("Hello, World!");里。适合谁?零基础、刚装好Visual Studio、连项目文件夹里哪个是“.cs”都分不清的新手;也适合学过其他语言但想转C#、需要把概念落地成手感的转岗者。别怕写错,这里的每一道题,都是给你准备的“后悔药”:改一行,再运行,答案立刻告诉你对错——没有黑匣子,只有清晰的反馈回路。


2. 先搞懂一个核心逻辑:C#程序不是“写完就跑”,而是“编译+执行”两步走的流水线

很多新手第一次卡住,不是因为代码写错了,而是根本没意识到:你写的.cs文件,和电脑真正执行的东西,中间隔着一道“编译”的门。这就像你手写一份菜谱(源代码),但厨房(CPU)不能直接照着字读,得先让大厨(编译器)把它翻译成精确到克和秒的操作指令(可执行文件),才能开火。C#用的是.NET平台的编译器,它会把你的C#代码变成一种叫“中间语言(IL)”的通用指令,再由运行时环境(CLR)实时翻译成CPU能懂的机器码。这个过程,决定了为什么你改了一个字母,必须重新“生成解决方案”才能看到效果——它不是刷新网页,而是重造一把钥匙。

2.1 第一个练习:输出“你好,世界!”并理解每一行在干什么

打开Visual Studio,新建一个“控制台应用(.NET Core)”项目(注意选.NET 6或更高版本,避免旧版兼容问题)。你会看到自动生成的Program.cs文件,里面默认有这几行:

using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine("Hello, World!"); } } }

我们逐行拆解,像拆一台玩具机器人:

  • using System;:这是“工具箱说明书”。System是.NET里最基础的工具包,里面装着Console(控制台)、String(字符串)这些常用零件。加这行,等于告诉编译器:“待会儿我要用Console,麻烦把它的说明书翻出来。”
  • namespace ConsoleApp1:这是“项目身份证”。所有代码必须放在某个“命名空间”里,就像快递必须写清省市区。ConsoleApp1是VS自动起的名字,你可以改成MyFirstCSharp,但名字里不能有空格或中文。
  • class Program:这是“机器人本体”。class(类)是C#组织代码的最小单位,Program是它的名字。你可以把它想象成一个空盒子,等着往里塞功能。
  • static void Main(string[] args):这是“启动开关”。Main方法是每个C#程序的唯一入口,电脑开机后只认这个函数名。static表示它属于整个“Program”盒子本身,不用先造个盒子实例就能用;void表示它不返回任何值;string[] args是留给命令行传参数的接口(新手暂时忽略,留着就行)。
  • Console.WriteLine("Hello, World!");:这才是真·干活的命令。“Console”是系统提供的“屏幕打印机”,WriteLine是它的“吐字”按钮,括号里的"Hello, World!"是它要吐出来的内容。双引号告诉编译器:这是文字,不是变量名。

提示:Console.WriteLine和Console.Write的区别在于前者自动换行,后者不换。试试把代码改成Console.Write("Hello, "); Console.Write("World!");,看看输出是不是连在一起的。

2.2 动手改一改:让“你好,世界!”变成你的名字

现在,把"Hello, World!"换成你自己的名字,比如"张三"。保存文件(Ctrl+S),然后点击顶部菜单栏的“调试”→“开始执行(不调试)”(快捷键Ctrl+F5)。你会看到一个黑色窗口一闪而过——别慌,这是正常现象!因为程序执行完就自动关闭了。解决办法很简单:在Console.WriteLine(...)后面加一行新代码:

Console.WriteLine("张三"); Console.ReadKey(); // 新增这一行:按任意键才继续

Console.ReadKey()的意思是:“停在这儿,等用户按下一个键,再往下走。”由于后面没代码了,程序就卡在这里,给你足够时间看清结果。现在再运行,窗口会稳稳停住,等你按回车。

2.3 为什么必须加Console.ReadKey()?——新手最容易误解的“程序生命周期”

很多教程不提这行,导致新手以为程序“没反应”。其实真相是:控制台程序从Main方法第一行开始执行,最后一行结束,就立刻退出。Console.WriteLine只是把字打到屏幕上,不负责“留住窗口”。这就像你喊完一句话就转身走了,没人拦你。Console.ReadKey()相当于在门口放了个保安,说“请留步,等我确认你看见了再走”。如果不加,程序执行速度远超人眼反应,窗口闪退是必然结果。这不是bug,是设计使然——桌面应用、网站后台等长期运行的程序,根本不需要这行;但学习阶段,它就是你的“暂停键”。


3. 从“会打字”到“会思考”:用三道基础题练出编程直觉

刷题不是为了记住答案,而是训练大脑建立“问题→代码→结果”的映射。下面三道题,覆盖变量、输入、条件判断三个最核心概念,每道都附带“为什么这么写”的白话解释,拒绝死记硬背。

3.1 练习1:存一个数字,并让它自己加10

目标:让用户输入一个整数,程序把它加10后输出。

using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数字:"); string input = Console.ReadLine(); // 读取用户输入的文字 int number = int.Parse(input); // 把文字"123"变成数字123 int result = number + 10; // 计算 Console.WriteLine("结果是:" + result); Console.ReadKey(); } } }

关键点解释:

  • Console.ReadLine()永远返回string(字符串),哪怕你输的是“123”。电脑不自动猜类型,必须明确告诉它:“这串字符,我要当数字用!”
  • int.Parse()就是那个“翻译官”,把字符串“123”转成整数123。但如果用户输“abc”,程序会崩溃——这是故意设计的“教学时刻”:它逼你思考“如果输入不对,怎么办?”(后续会学int.TryParse来优雅处理)。
  • +号在字符串和数字混合时很狡猾:"结果是:" + result中,result是数字,但+左边是字符串,所以C#自动把数字转成字符串再拼接。这就是“隐式类型转换”,新手先接受它存在,不必深究原理。

3.2 练习2:判断一个数是奇数还是偶数

目标:输入一个整数,输出“是奇数”或“是偶数”。

using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine("请输入一个整数:"); int number = int.Parse(Console.ReadLine()); if (number % 2 == 0) // %是取余运算符:10%3=1,8%2=0 { Console.WriteLine(number + " 是偶数"); } else { Console.WriteLine(number + " 是奇数"); } Console.ReadKey(); } } }

为什么用%(取余)?
想象你有一堆苹果要分给2个人,number % 2就是“分完后剩下几个苹果”。如果剩0个(==0),说明刚好分完,是偶数;如果剩1个,就是奇数。if-else结构是编程的“岔路口”,程序会根据括号里真假(true/false)决定走哪条路。这里number % 2 == 0的结果只能是true或false,没有第三种可能。

3.3 练习3:模拟登录——用户名密码校验

目标:预设用户名“admin”,密码“123456”,用户输入后,判断是否正确。

using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { const string correctUser = "admin"; // const表示常量,不可修改 const string correctPass = "123456"; Console.WriteLine("请输入用户名:"); string inputUser = Console.ReadLine(); Console.WriteLine("请输入密码:"); string inputPass = Console.ReadLine(); if (inputUser == correctUser && inputPass == correctPass) { Console.WriteLine("登录成功!"); } else { Console.WriteLine("用户名或密码错误!"); } Console.ReadKey(); } } }

重点解析:

  • const string定义常量,比string更安全——它告诉编译器:“这个值从头到尾都不能变”,避免手误写成correctUser = "user"导致逻辑错乱。
  • &&是“且”运算符,左右两边都为true,整个条件才为true。这比写两个if嵌套更简洁。
  • 字符串比较用==,不是=(=是赋值,会把右边值塞给左边变量,导致逻辑全乱)。这是新手高频翻车点。

4. 避坑指南:新手写C#基础题时,90%的报错都来自这5个地方

刚入门时,编译器报错信息像天书,但其实大部分错误都有固定模式。以下是我在带某高校编程实训班时,统计出的新手最高频5类问题,按“现象→原因→解决”给出可立即操作的方案。

4.1 现象:红色波浪线下划线,提示“找不到类型或命名空间名‘Console’”

原因:漏写了using System;,或者写成了using system;(C#区分大小写,System首字母必须大写)。
解决:检查文件顶部,确保第一行是using System;,且S大写。如果已存在,右键项目→“重新生成解决方案”,有时VS缓存未刷新。

4.2 现象:运行时报错“输入字符串的格式不正确”,程序直接崩溃

原因:int.Parse()遇到非数字输入(如空格、字母、小数点)时会抛出异常。这是Parse的硬性要求:必须100%是整数字符串。
解决:临时方案——改用int.TryParse(),它更温柔:

string input = Console.ReadLine(); if (int.TryParse(input, out int number)) // 如果能转成数字,number就存住值 { Console.WriteLine("你输入的是数字:" + number); } else { Console.WriteLine("请输入有效数字!"); }

注意:out int number中的out是关键字,表示“这个变量由方法内部创建并赋值”,不用提前声明。

4.3 现象:代码写完,按Ctrl+F5没反应,或窗口一闪而过

原因:两种可能:① 忘记加Console.ReadKey();② 项目配置错误,启动对象不是Program.cs。
解决:① 在Main方法最后一行加上Console.ReadKey();② 右键项目→“属性”→左侧选“应用程序”,右侧检查“启动对象”是否为ConsoleApp1.Program(你的项目名+Program)。

4.4 现象:中文显示为乱码(如“你好”变成“浣уソ”)

原因:控制台默认编码不是UTF-8,而你的源文件保存为UTF-8(VS默认如此)。
解决:在Main方法第一行加入:

Console.OutputEncoding = System.Text.Encoding.UTF8;

这行代码强制让控制台用UTF-8解码,中文立刻正常。把它当成模板,以后所有含中文的练习都加这行。

4.5 现象:修改了代码,运行结果却没变

原因:VS没自动重新编译,还在运行旧版本。常见于快速修改后直接按Ctrl+F5。
解决:养成习惯——每次改完代码,先按Ctrl+Shift+B(生成解决方案),听到“叮”一声或状态栏显示“生成成功”,再按Ctrl+F5运行。或者直接点顶部菜单“生成”→“生成解决方案”。


5. 下一步学什么?从“会做题”到“会搭积木”的三步跃迁路径

当你能独立完成20道基础练习题(比如变量运算、字符串处理、简单循环),恭喜,你的C#肌肉记忆已经成型。但别停在这——真正的编程能力,是把单个积木块(知识点)组合成能解决问题的结构。接下来,我建议按这个顺序推进,每一步都配一个具体可做的小任务,拒绝空泛理论。

5.1 第一步:把“单个练习题”升级成“可交互的小工具”

基础题是封闭的:输入→计算→输出。真实需求是开放的:用户可能反复输入,直到满意为止。这就需要引入循环结构。不要一上来啃for的全部语法,先用最简单的while实现一个“计算器雏形”:

using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.UTF8; Console.WriteLine("===简易计算器(输入'quit'退出)==="); while (true) // 无限循环,除非遇到break { Console.Write("请输入第一个数字:"); string input1 = Console.ReadLine(); if (input1 == "quit") break; // 输入quit就跳出循环 Console.Write("请输入第二个数字:"); string input2 = Console.ReadLine(); if (input2 == "quit") break; if (int.TryParse(input1, out int a) && int.TryParse(input2, out int b)) { Console.WriteLine($"{a} + {b} = {a + b}"); Console.WriteLine($"{a} - {b} = {a - b}"); Console.WriteLine($"{a} * {b} = {a * b}"); if (b != 0) Console.WriteLine($"{a} / {b} = {a / b}"); else Console.WriteLine("除数不能为零!"); } else { Console.WriteLine("请输入有效数字!"); } Console.WriteLine(); // 空行分隔 } Console.WriteLine("再见!"); Console.ReadKey(); } } }

这个小工具的价值在于:它强迫你把之前学的int.TryParse、if-else、Console.WriteLine全部串起来,还新增了while(true)和break。运行它,你会立刻感受到“程序活了”——它不再是一锤子买卖,而是能陪你反复折腾的伙伴。

5.2 第二步:用“数组”管理多个同类数据,告别变量海啸

做题时,你可能写过int score1=85; int score2=92; int score3=78;……如果要算100个学生的平均分呢?写100个变量?显然不行。这时,数组就是你的救星。它是一块连续的内存,像一排编号的储物柜,用一个名字(如scores)管住所有柜子。

动手任务:录入5个学生的分数,求平均分。

int[] scores = new int[5]; // 创建长度为5的整数数组 Console.WriteLine("请输入5个学生的分数:"); for (int i = 0; i < 5; i++) // i从0开始,到4结束(<5) { Console.Write($"第{i+1}个分数:"); scores[i] = int.Parse(Console.ReadLine()); // 把输入存进第i个柜子 } int sum = 0; for (int i = 0; i < 5; i++) { sum += scores[i]; // 累加每个柜子里的数 } double average = (double)sum / 5; // 强制转double,避免整数除法丢精度 Console.WriteLine($"平均分是:{average:F2}"); // :F2表示保留2位小数 Console.ReadKey();

关键细节:

  • scores[i]中的i叫“索引”,从0开始计数,这是所有编程语言的惯例(别问为什么,接受它,就像接受一年有12个月)。
  • (double)sum是“强制类型转换”,因为sum是int,5是int,int/int结果还是int(如7/2=3),必须先把sum变成double,才能得到3.5。
  • {average:F2}是字符串格式化,F2代表“Fixed-point, 2 decimal places”,比手动写Math.Round(average, 2)更简洁。

5.3 第三步:用“方法”封装重复逻辑,让代码像乐高一样可复用

你发现没?上面计算器里,反复出现int.TryParse(...)和错误提示。如果哪天规则变了(比如要支持小数),你得改5处代码。方法(Method)就是解决这个问题的:把重复动作打包成一个“小盒子”,起个名字(如ReadInt),需要时喊一声名字就行。

动手任务:把“安全读取整数”封装成方法。

using System; namespace ConsoleApp1 { class Program { // 这是一个自定义方法:名字叫ReadInt,返回int类型 static int ReadInt(string prompt) // prompt是提示文字,如"请输入数字" { while (true) // 循环直到输入有效 { Console.Write(prompt); string input = Console.ReadLine(); if (int.TryParse(input, out int result)) { return result; // 成功就返回数字,结束方法 } else { Console.WriteLine("输入无效,请输入整数!"); } } } static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.UTF8; Console.WriteLine("===使用自定义方法的计算器==="); int a = ReadInt("请输入第一个数字:"); int b = ReadInt("请输入第二个数字:"); Console.WriteLine($"{a} + {b} = {a + b}"); Console.WriteLine($"{a} - {b} = {a - b}"); Console.ReadKey(); } } }

为什么这步最关键?
因为真实项目里,90%的代码不是写新功能,而是调用已有方法。Console.WriteLine是微软写好的方法,int.TryParse也是。你现在写的ReadInt,就是迈出“从使用者变成创造者”的第一步。它让代码有了“呼吸感”:主流程(Main)变得清爽,只描述“做什么”;细节(怎么安全读数)被藏进ReadInt里,只描述“怎么做”。这种分离,是专业程序员的底层思维。

从那以后我每次写新功能,都强制走一遍“三问”:① 这段逻辑会不会重复用?② 能不能抽成一个带名字的方法?③ 方法名能不能让人一眼看懂它干啥?(比如ReadInt比GetData好,CalculateAverage比DoMath好)。这个习惯,让我少修70%的bug,因为逻辑集中了,改一处,处处生效。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 4:07:11

医疗AI落地核心:从工作流重构到应用架构的路径拆解

前阵子和几位深耕医疗信息化的架构师线上交流&#xff0c;大家有个高度一致的判断&#xff1a;医疗AI真正难啃的骨头&#xff0c;已经从"模型效果"转移到了"工作流重构"。算法竞赛的阶段正在收尾&#xff0c;各家模型的诊断精度差距在肉眼可见地缩小&#…

作者头像 李华
网站建设 2026/10/20 4:06:46

本地AI知识库问答配置实战:模型接入、分块策略与检索阈值优化

做到本地AI知识库问答的人&#xff0c;八成都会卡在同一个环节&#xff1a;模型文件下了、管理界面打开了&#xff0c;结果一跑问答要么答非所问&#xff0c;要么库里明明有的内容它一句“不知道”就把你打发了。很多人第一反应是模型不行&#xff0c;其实真正的分水岭在“配置…

作者头像 李华
网站建设 2026/10/20 4:06:21

开源集市参展全攻略:从筹备到复盘,让消息流项目被看见

周末的某开源年会现场&#xff0c;开源集市区域比预期还热闹。临近我们展位时&#xff0c;一个背着帆布包的年轻人停下来&#xff0c;目光在桌上的贴纸和易拉宝之间扫了几个来回&#xff0c;开口第一句就是&#xff1a;“你们这项目&#xff0c;是干嘛用的&#xff1f;”——这…

作者头像 李华
网站建设 2026/10/20 4:06:02

context-mode技术概念解析:从术语歧义到工程落地

项目标题是“context-mode”&#xff0c;但提供的输入中&#xff0c;项目正文为空、关键词未给出、摘要描述缺失、网络搜索内容也为纯空行。这意味着&#xff1a;当前输入不满足基本创作前提——你只给了我一个孤立的短语“context-mode”&#xff0c;没有任何上下文、领域指向…

作者头像 李华
网站建设 2026/10/20 4:05:50

OpenClaw龙虾版端侧智能体框架本地部署实战

前几天把家里那台吃灰的小主机翻出来&#xff0c;装上系统、配好环境&#xff0c;然后把我常用的智能体框架跑到了本地。这事听起来简单&#xff0c;真正做完才发现&#xff0c;端侧这趟水比我想象的深不少。今天不聊云端API怎么调&#xff0c;我想把“OpenClaw龙虾版”在端侧落…

作者头像 李华
网站建设 2026/10/20 4:05:49

context-mode:把上下文变成可切换的模式卡片,任务切换不再丢思路

说到“上下文”&#xff0c;大多数人的第一反应是聊天窗口里那段话&#xff0c;或者程序员说的 context 变量。但我今天想聊的这个 “context-mode”&#xff0c;说的是另一件事&#xff1a;一套把“上下文”本身变成可管理、可切换、可复用资产的工作方式。我自己按这套思路干…

作者头像 李华