C++零基础实战:从VC++6.0环境搭建到图书管理系统开发

发布时间:2026/10/24 11:06:40
C++零基础实战:从VC++6.0环境搭建到图书管理系统开发 简介这是一份面向C初学者与高校实验教学场景的《C实验指导书》聚焦面向对象程序设计核心能力培养特别适合作为自主学习训练或课堂教学配套实践材料。全书以“图书管理系统”为贯穿项目采用任务分解式教学法系统设计五个递进实验从开发环境搭建与基础语法实践到类与对象建模、继承派生、多态与虚函数应用再到输入输出流操作覆盖封装、继承、多态三大核心范式并强调规范实验报告撰写。资源为单文件Word文档.doc共1个文件大小965KB内容完整包含实验目的、设备要求、详细步骤、课后作业及附录格式规范目录结构清晰便于按模块快速定位。目前已有284人学习下载读者可直接获取结构化实验路径、可复用的类设计范例如图书类、读者类、典型错误规避提示及标准化报告模板高效支撑C面向对象编程的实操落地。1. C实验指导书是什么一个零基础学生能亲手敲出“图书管理系统”的实操手册你是不是也经历过这种时刻打开一本C教材第一页就写着“面向对象”“封装继承多态”翻两页就开始讲“虚函数表偏移量”“RTTI类型信息”……脑子嗡的一声合上书默默点开短视频——不是不想学是真不知道从哪下手、敲第一行代码该写啥、报错红字满屏时该看哪一行。别急这本《C实验指导书.doc》就是专为这时候的你写的。它不讲大道理不堆术语而是带着你从双击VC6.0图标开始到亲手打出“图书管理系统主菜单”那串星号和文字再到让程序真的能添加、查询、删除图书——全程手把手一步一截图文档里有图1.1到图1.6连“鼠标该点哪个菜单”“快捷键CtrlF5是干啥的”都写清楚了。它用一个真实可运行的项目——图书管理系统——把C最核心的5个能力开发环境搭建、类与对象、继承派生、多态虚函数、输入输出流拆成5个实验任务每个任务就像打游戏过副本目标明确比如“让Date类能正确显示2003/1/30”、步骤清晰点哪里→输什么→按什么键、结果可见控制台立刻弹出你想要的输出。它不是让你背概念而是让你在改一行代码、多加一个public:、少写一个分号的过程中自然理解“为什么要有类”“为什么构造函数要叫这个名字”“为什么这里必须用虚函数”。如果你是第一次听说#include iostream.h或者连.cpp和.dsw文件区别都分不清——恭喜你找对地方了。这份指导书就是你的C第一台“学习脚手架”稳稳托住你不让你掉进抽象黑匣子里。2. 先跑通第一个程序从双击图标到控制台打印“图书管理系统主菜单”刚接触C最大的障碍往往不是语法而是“整个流程像黑箱”我写了代码它怎么变成屏幕上能看的东西编译、连接、运行……这些词听着就头大。这节我们就彻底拆开这个黑箱用指导书里最基础的“实验一”内容带你从零敲出第一个可运行的C程序。别担心不需要你懂任何编程只要会用鼠标、会打字就行。2.1 第一步启动VC6.0认出那个“熟悉的陌生窗口”提示现在主流系统已不预装VC6.0但它是这本指导书指定环境也是理解C编译流程最直观的“教学版IDE”。它的界面虽老却把“编辑-编译-连接-运行”每一步都暴露得清清楚楚比现代IDE更利于新手建立底层认知。启动方式很简单点击电脑左下角【开始】→【程序】→【Microsoft Visual Studio 6.0】→【Microsoft Visual C 6.0】或者桌面有图标直接双击。启动后你会看到一个叫Developer Studio的窗口就是指导书图1.1。别被名字吓到它其实就是个“集成工作台”主要分三块顶部菜单栏File文件、Edit编辑、Build编译运行……这是你的操作指令集左侧工作区Workspace像一个文件夹树后面放你所有的项目和源文件右侧编辑区白底黑字的大空白框你敲代码的地方底部输出区Output灰色小窗口所有报错、警告、成功提示都从这儿冒出来——新手请永远把它调成可见状态这是你的“错误翻译器”。第一次打开可能觉得乱没关系。记住你只管用鼠标点菜单其他窗口位置可以拖拽调整关了再开也不影响。它不像手机APP没有“必须按顺序点”的玄学。2.2 第二步创建项目——给你的代码建个“专属档案袋”C不是写完.cpp就能直接运行的它需要一个“项目”Project来管理所有相关文件源码、库、配置。就像你要整理一叠发票得先建个“2024报销”文件夹再把发票放进去。操作路径照着做不跳步点顶部菜单【File】→【New】→ 弹出对话框选【Projects】标签页在左边列表中务必选中Win32 Console ApplicationWindows 32位控制台应用——这是最简单的命令行程序没有图形界面干扰在【Project name】框里输入Exe1_1名字随意但建议用英文数字别用中文或空格在【Location】框里选一个你容易找到的文件夹比如D:\CXX_Practice提前在D盘新建好这个文件夹点【OK】→ 弹出向导选【An empty project】空项目→ 点【Finish】→ 再点【OK】。这时左侧工作区Workspace里会出现Exe1_1这个项目名下面有个Files文件夹但里面还是空的。恭喜你的“档案袋”建好了下一步往里放“第一张纸”——源代码文件。2.3 第三步新建源文件输入并保存你的第一段C代码现在我们要往Exe1_1这个项目里添加一个.cpp文件。它就是你写的代码本身。操作路径再次点【File】→【New】→ 对话框选【Files】标签页左边列表中选中C Source FileC源文件在【File】框里输入Exe1_1_1名字和项目名呼应方便管理关键一步勾选右下角Add to project复选框不勾选文件就只是硬盘上一个孤立文本和项目无关编译时找不到它点【OK】。此时右侧编辑区会自动打开一个空白文档光标在闪。现在把你的眼睛对准指导书“实验一”里的“实战演练”部分把这段代码一字不差地敲进去注意标点符号全为英文半角#include iostream.h int main() { cout ******************************************** \n; cout 图书管理系统主菜单 \n; cout ******************************************** endl; cout 请按照需求选择相应功能的编号并按回车键执行 \n; cout 1— 添加新书 \n; cout 2— 查询图书 \n; cout 3— 删除图书 \n; cout 4— 退出 \n; cout ******************************************* endl; return 0; }代码说明白话版#include iostream.h告诉编译器“我要用输入输出功能请把‘输入输出’的说明书头文件拿给我看”。iostream.h是VC6.0时代的旧写法现代C用iostream但指导书要求用这个我们就用它int main()每个C程序必须有且仅有一个main函数它是程序的“起点”就像电影开场镜头。int表示这个函数会返回一个整数通常是0代表“一切顺利”cout ...cout是“控制台输出”的缩写是“把右边的东西塞给左边”的操作符...里是你想打印的文字\n和endl都是“换行”的意思\n是字符endl是函数效果一样混用也没问题return 0;告诉操作系统“我的任务完成了结果是0成功”。敲完后立刻点【File】→【Save】保存。文件会自动存为Exe1_1_1.cpp放在你之前选的D:\CXX_Practice文件夹里。养成习惯写几行就存一次避免崩溃丢代码。2.4 第四步编译、连接、运行——三步变一个.exe文件现在代码有了项目也关联了该让它动起来了。VC6.0把这三步打包在【Build】菜单里我们一步步来编译Compile把.cpp人能看懂的代码翻译成机器能懂的.obj目标文件。点【Build】→【Compile Exe1_1_1.cpp】或按快捷键CtrlF7看底部【Output】窗口如果出现Compiling...→Compiling done.就成功了如果出现error C2065: cout : undeclared identifier这类红字说明#include iostream.h没写对回去检查引号、尖括号、h字母。连接Build把.obj文件和系统自带的“输入输出”功能库拼在一起生成最终的.exe可执行文件。点【Build】→【Build Exe1_1_1.exe】或按F7Output窗口显示Linking...→Linking done.即成功。此时D:\CXX_Practice\Exe1_1\Debug\文件夹下会出现Exe1_1_1.exe。运行Execute双击那个.exe文件或者在VC里直接运行点【Build】→【Execute Exe1_1_1.exe】或按CtrlF5立刻一个黑色的DOS风格窗口控制台弹出来上面清晰印着******************************************** 图书管理系统主菜单 ******************************************** 请按照需求选择相应功能的编号并按回车键执行 1— 添加新书 2— 查询图书 3— 删除图书 4— 退出 *******************************************按任意键比如回车窗口自动关闭。这就是你的第一个C程序它没做任何复杂逻辑但它完整走完了“写代码→编译→连接→运行”的全流程。你亲手参与了每一个环节看到了每一步的反馈。这种“掌控感”是学编程最珍贵的起点。3. 类与对象入门把“一本书”变成代码里能操作的活物跑通第一个“Hello World”式程序后你可能会问C不是说“面向对象”吗光打印文字有啥用别急实验二就是来解决这个问题的。它要把“图书管理系统”里最核心的实体——“一本书”从一个抽象概念变成代码里可以创建、修改、查询的“活物”。这节我们不讲定义直接用指导书里的“实战演练”例子让你亲手定义一个Book类然后创建两本不同的书看看它们怎么“各过各的”。3.1 为什么需要“类”——一个生活化的比喻想象一下你去图书馆借书。管理员不会说“请给我那本作者叫王小明、书名是《C入门》、ISBN是978-7-XXXX-XXXX-X、出版日期是2023年5月、库存数量是3本的书”。她会说“请借《C入门》”。这本书的所有信息作者、书名、ISBN……是绑定在一起的它是一个整体。而“《C入门》”这个名字代表的是这一类书的模板——所有叫这个名字的书都有这些属性但每本的具体值不同比如A书库存3本B书库存1本。在C里类Class就是这个“模板”它定义了一类事物有什么属性数据和能做什么事函数。比如Book类规定每本书都有title书名、author作者、stock库存这些属性还有displayInfo()显示信息、borrow()借出这些动作。对象Object就是根据这个模板“造出来”的具体实例。book1是《C入门》book2是《数据结构》它们共享Book类的结构但各自的数据书名、作者、库存是独立的。没有类你得用一堆零散的变量book1_title,book1_author,book1_stock,book2_title……管理100本书就得写300个变量改一个逻辑要改300处。有了类你只写一次Book的定义然后Book book1, book2;就搞定。这就是“封装”——把数据和操作打包让代码干净、易改、易复用。3.2 动手定义一个Book类从mytype.h开始指导书实验二要求“在自定义的头文件 mytype.h 中完成类的定义”。头文件.h就像一份“公共说明书”告诉所有要用到这个类的代码“嘿这里有Book这个东西它长这样你们可以放心用”。我们来创建它。第一步新建头文件在VC6.0里点【File】→【New】→【Files】标签 → 选C/C Header File【File】框里输入mytype系统自动加.h后缀务必勾选Add to project点【OK】。第二步在mytype.h里敲入Book类的定义// mytype.h #ifndef MYTYPE_H // 防止头文件被重复包含的“守卫” #define MYTYPE_H #include iostream.h #include string.h // 用于字符串操作 class Book { private: // 私有成员只有Book自己能访问外部不能直接改 char title[50]; // 书名最多49个字符1个结束符 char author[30]; // 作者 int stock; // 库存数量 public: // 公有成员外部可以自由调用 // 构造函数创建Book对象时自动调用用来初始化数据 Book(char* t , char* a , int s 0) { strcpy(title, t); // 把t字符串复制给title strcpy(author, a); // 把a字符串复制给author stock s; // 设置库存 } // 成员函数显示这本书的全部信息 void displayInfo() { cout 书名: title , 作者: author , 库存: stock 本 endl; } // 成员函数借出一本书库存减1 void borrow() { if (stock 0) { stock--; cout 成功借出一本《 title 》剩余库存 stock endl; } else { cout 《 title 》已无库存无法借出 endl; } } // 成员函数归还一本书库存加1 void returnBook() { stock; cout 成功归还一本《 title 》当前库存 stock endl; } }; #endif // MYTYPE_H 结束守卫关键点解释避坑前哨#ifndef / #define / #endif这是C头文件的“防重包含”机制。如果同一个头文件被多个源文件包含它能确保里面的class Book只被定义一次否则编译会报错redefinition重复定义。新手常忘写这个导致编译失败务必加上private和public这是访问控制。private里的title,author,stock是“内部秘密”外部代码不能直接写book1.title 新书只能通过public里的函数如borrow()来间接修改。这保证了数据安全——比如borrow()函数里有if(stock0)判断防止库存变负数。构造函数Book(...)名字必须和类名完全一样没有返回类型连void都不能写。它在Book book1(C入门, 王小明, 3);这行代码执行时自动运行把传进来的参数赋给成员变量。char* t 表示参数有默认值如果创建对象时不给参数t就是空字符串。3.3 创建对象并使用在login.cpp里让Book活起来头文件mytype.h定义好了“说明书”现在我们要“按说明书造东西”。指导书要求“建立主函数并存入 login.cpp 中”。第一步新建源文件 login.cpp【File】→【New】→【Files】→C Source File→ 【File】填login→勾选Add to project→ 【OK】。第二步在login.cpp里包含头文件并创建对象// login.cpp #include mytype.h // 注意用自己的头文件用双引号系统头文件用尖括号 #include iostream.h int main() { // 创建两个Book对象分别初始化不同的数据 Book book1(C入门, 王小明, 3); Book book2(数据结构, 李华, 5); // 调用对象的成员函数让它们“干活” cout 初始化后的图书信息 endl; book1.displayInfo(); // 输出书名: C入门, 作者: 王小明, 库存: 3 本 book2.displayInfo(); // 输出书名: 数据结构, 作者: 李华, 库存: 5 本 cout \n 模拟借阅操作 endl; book1.borrow(); // 借出1本《C入门》库存变2 book1.borrow(); // 再借1本库存变1 book2.borrow(); // 借出1本《数据结构》库存变4 cout \n 模拟归还操作 endl; book1.returnBook(); // 归还1本《C入门》库存变2 cout \n 最终库存 endl; book1.displayInfo(); // 库存2 book2.displayInfo(); // 库存4 return 0; }代码说明#include mytype.h把我们刚写的“说明书”拿进来让main函数知道Book类的存在Book book1(C入门, 王小明, 3);这就是“造东西”。Book是类型book1是对象名括号里是传给构造函数的参数book1.displayInfo();用“点号.”调用对象book1的displayInfo函数。注意book1和book2的数据完全独立book1.borrow()只影响book1.stockbook2的库存纹丝不动。编译运行它按CtrlF5控制台会清晰打印出每一步操作的结果。你亲眼看到两本书各自有各自的库存各自响应各自的借还指令。这一刻“类”和“对象”不再是课本上的名词而是你键盘下真实可控的代码生命。4. 常见问题排查新手踩坑血泪经验总结附现象、原因、解法刚上手C尤其是用VC6.0这种经典环境报错是家常便饭。很多错误看似吓人其实原因非常固定。我把指导书实验一、二中最常卡住新手的5个坑按“你遇到的现象→背后真正的原因→三步解决法”列出来。这些都是某导师带几十个零基础学生时反复验证过的“高频翻车点”。4.1 现象fatal error C1083: Cannot open include file: iostream.h: No such file or directory原因VC6.0默认安装路径下iostream.h这个文件确实存在但你的项目设置里编译器找不到它。常见于① 安装时没选全组件② 项目设置里“包含目录”没指向VC的include文件夹③ 手误写成了#include iostream少了.h。解决先确认代码里写的是#include iostream.h不是iostream在VC6.0里点【Tools】→【Options】→【Directories】标签页在【Show directories for】下拉框里选Include files确保列表第一行是类似C:\Program Files\Microsoft Visual Studio\VC98\include的路径这是VC6.0的标准include目录。如果没有点击【Add】按钮手动添加进去重启VC6.0重新编译。4.2 现象error C2065: cout : undeclared identifier或error C2065: endl : undeclared identifier原因cout和endl不是C语言内置的“关键字”它们是iostream.h这个头文件里定义的“东西”。报这个错99%是因为#include iostream.h这行代码要么没写要么写在了main()函数里面应该在最开头所有函数外面要么写错了比如写成#include iostream。解决打开你的.cpp文件滚动到最顶部确认第一行或前几行有且仅有#include iostream.h并且它不在任何{}大括号里检查引号是英文半角尖括号是英文半角h字母没漏掉如果用了using namespace std;现代C常用VC6.0不支持删掉它。4.3 现象编译成功Compiling done.但连接时报错error LNK2001: unresolved external symbol _main或error LNK2001: unresolved external symbol _WinMain16原因你的项目类型选错了你在【New Project】时如果没选Win32 Console Application而是误选了Win32 ApplicationWindows应用程序编译器就会期待一个叫WinMain的入口函数而不是main。而你的代码里只有int main()所以连接器找不到WinMain就报“未解析的外部符号”。解决不要删项目重来点【File】→【Close Workspace】关掉当前项目重新【File】→【New】→【Projects】→务必、一定、死死盯住左边列表选中Win32 Console Application输入新项目名点【OK】→【Finish】新项目建好后再把你的.cpp和.h文件用【File】→【Add To Project】加进去。4.4 现象程序运行后控制台窗口一闪而过根本看不到输出原因程序执行完main()函数里的最后一行return 0;就立刻结束了控制台窗口随之关闭。你没来得及看清结果。解决三选一推荐第一种最简单在return 0;前面加一行system(pause);。这行代码会让程序暂停显示“Press any key to continue . . .”你按任意键才继续退出。记得加#include stdlib.h因为system函数在这里面不依赖系统命令在return 0;前加cin.get();意思是“等待用户按一个回车键”。需要#include iostream.h终极方案不要在VC里按CtrlF5运行而是编译后去D:\CXX_Practice\Exe1_1\Debug\文件夹里双击那个.exe文件。它会单独开一个命令行窗口执行完也不会自动关闭。4.5 现象定义了Book类在login.cpp里创建book1对象时报错error C2065: Book : undeclared identifier原因login.cpp不知道Book是什么因为你没在login.cpp的开头用#include mytype.h把类的定义“拿进来”。mytype.h和login.cpp是两个独立文件C编译器不会自动帮你关联。解决打开login.cpp确保第一行或#include iostream.h下面有#include mytype.h检查mytype.h文件名拼写是否完全一致大小写、下划线确认mytype.h确实已经通过【Add To Project】加入了当前项目在左侧Workspace里能看到它。5. 从类到继承用“儿童-成人-老人”理解派生的真正价值学到这里你已经能创建Book对象让它们各自管理自己的库存了。但现实中的图书系统书不止一种有新书、二手书、电子书人也不止一种有儿童、成人、老人。如果每种都从头写一个全新的类代码会爆炸式增长而且大量重复比如姓名、出生日期儿童、成人、老人全都要。实验三的“类的派生”就是来解决这个痛点的——它让你写一次通用代码再针对特殊需求做增量修改。这节我们就用指导书里“儿童、成人、老人”的例子亲手实践一次继承。5.1 继承的核心思想提取共性描述差异还是用生活比喻假设你要设计一套“人物档案系统”。儿童、成人、老人他们有什么共同点姓名、出生日期、出生地。这些就是“共性”应该抽出来写在一个基类Base Class里比如叫Person。而他们的差异点呢儿童有监护人guardian成人有工作单位unit、工资salary老人已退休可能有退休金pension。这些差异就写在各自的派生类Derived Class里。派生类自动拥有基类的所有东西姓名、出生日期再额外添加自己独有的部分监护人、单位。这样你改“姓名”的逻辑只用在Person类里改一次所有儿童、成人、老人的对象都会同步更新。这就是“高内聚、低耦合”的威力。5.2 动手实践定义Person基类与Child派生类指导书实验三的“实战演练”给出了Base类即我们的Person和AllChil类即Child。我们来精简实现它聚焦核心逻辑。第一步在 mytype.h 里补充 Person 基类定义接在之前Book类后面#endif前面// mytype.h (续) class Person { protected: // 保护成员基类和派生类能访问外部不能直接访问 char name[20]; int birthYear, birthMonth, birthDay; char birthPlace[30]; public: // 构造函数初始化所有基本信息 Person(char* n , int y 0, int m 0, int d 0, char* bp ) { strcpy(name, n); birthYear y; birthMonth m; birthDay d; strcpy(birthPlace, bp); } // 显示基本信息 void displayBasicInfo() { cout 姓名: name , 出生: birthYear / birthMonth / birthDay , 出生地: birthPlace endl; } }; // Child 类从 Person 派生而来 class Child : public Person { // public 继承基类的public成员在Child里还是public private: char guardian[20]; // 儿童特有监护人 public: // Child的构造函数先调用Person的构造函数初始化共性再初始化特有部分 Child(char* n , int y 0, int m 0, int d 0, char* bp , char* g ) : Person(n, y, m, d, bp) { // 冒号后是“成员初始化列表”必须在这里调用基类构造 strcpy(guardian, g); } // Child特有的显示函数先显示共性再显示特性 void displayInfo() { displayBasicInfo(); // 复用基类函数 cout 监护人: guardian endl; } };关键点解释class Child : public Person这就是继承的语法。:后面是基类名public是继承方式目前只需记publicprotected比private宽松一点基类的protected成员派生类可以访问比如Child里可以直接用name但外部代码不行。name放protected是为了让Child能复用displayBasicInfo()又不让外界随便改成员初始化列表: Person(...)这是派生类构造函数的唯一正确写法不能在函数体{}里写Person(n,y,m,d,bp);那会被当成调用一个普通函数毫无意义。必须在冒号后、大括号前用这个列表来调用基类构造函数。新手最大误区忘记写这个列表导致Child对象的姓名、出生日期全是乱码。5.3 创建派生类对象感受“自动继承”的魔力现在回到login.cpp我们来创建一个Child对象并验证它是否真的拥有了Person的所有能力。// login.cpp (续在main函数里添加) #include mytype.h #include iostream.h int main() { // ... 之前的Book代码可以注释掉或保留 ... cout \n 创建儿童对象 endl; Child child1(小明, 2015, 5, 10, 北京, 张伟); // 直接调用从Person继承来的函数 child1.displayBasicInfo(); // 输出姓名: 小明, 出生: 2015/5/10, 出生地: 北京 // 调用Child自己定义的函数 child1.displayInfo(); // 输出姓名: 小明... 监护人: 张伟 // 甚至可以直接访问如果Person的name是public或通过函数修改 // 但这里name是protected外部不能直接child1.name新名字必须通过函数 return 0; }运行它你会看到child1不仅能显示自己的监护人还能完美显示从Person继承来的所有基本信息。你没有为Child重复写姓名、出生日期的存储和显示逻辑它们“自动”就有了。这就是继承的价值它不是复制粘贴而是建立一种“我是你的一种”的真实关系。后面学“多态”时你就能让Person* p new Child();用一个统一的Person指针指向各种各样的派生类对象再调用p-displayInfo()自动执行各自版本的函数——这才是面向对象的精髓。6. 下一步学什么从“能跑”到“会设计”的进阶路径与我的血泪习惯走到这一步你已经远超大多数零基础同学你能独立配置VC6.0环境能写出带类、对象、继承的完整小程序能看懂报错并快速定位问题。但真正的C工程远不止于此。接下来该怎么走不是盲目刷题也不是一头扎进STL源码而是沿着一条被验证过的、平滑的进阶路径把“能跑”的代码升级为“会设计”的系统。结合我第一次带某高校学生做图书管理系统时的真实教训给你三条具体、可执行的建议。6.1 路径一把“图书管理系统”从Demo变成真可用的系统练工程思维你现在写的Book类只是一个骨架。真实的图书系统需要持久化存储关机后书的信息不能丢。指导书实验五讲输入输出流就是教你怎么把Book对象的数据写入.txt文件下次启动时再读出来。别小看这个它逼你思考本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询