肖港网站开发,重庆微信网站制作公司,艺术品商城网站开发,福建省工程建设信息官方网站如果是c语言学的比较好的同学 可以直接跟着代码敲一遍#xff0c;代码附有详细语法介绍#xff0c;不可错过
一#xff0c;猜数字游戏
#include iostream
#include cstdlib
#include ctimeint main()
{srand(static_castunsigned int(tim…如果是c语言学的比较好的同学 可以直接跟着代码敲一遍代码附有详细语法介绍不可错过
一猜数字游戏
#include iostream
#include cstdlib
#include ctimeint main()
{srand(static_castunsigned int(time(0)));int secretNumber rand() % 100 1;int guess 0;int tries 0;const int MAX_TRIES 7;std::cout Welcome to guess number game!\n;std::cout I have a number from 1 to 100, you have MAX_TRIES times to try it. ;while ( guess ! secretNumber tries MAX_TRIES){std::cout guess what number is it: ;std::cin guess;tries ;if (guess secretNumber) {std::cout too hign\n;} else if (guess secretNumber) {std::cout too low\n;} else {std::cout Congratulations!;}}if (guess ! secretNumber) {std::cout Sorry, you die. the number is secretNumber . \n;}return 0;
}
写了一个猜数字的小游戏首先要配置任务运行编译器
按下Ctrl Shift P打开命令面板输入Configure Task然后选择Tasks: Configure Task。选择C/C: g.exe build active file可能会有轻微的名称差异以自动生成一个tasks.json文件。这个文件定义了编译任务。你可能需要根据需要修改tasks.json中的命令例如指定不同的编译器标志。我使用的是g tasks.json应该是类似于下面的代码 {version: 2.0.0,tasks: [{type: cppbuild,label: C/C: g 生成活动文件,command: /usr/bin/g,args: [-fdiagnostics-coloralways,-g,${file},-o,${fileDirname}/${fileBasenameNoExtension}],options: {cwd: ${fileDirname}},problemMatcher: [$gcc],group: {kind: build,isDefault: true},detail: 编译器: /usr/bin/g}]
} 按下Ctrl Shift D打开调试视图然后点击“创建 launch.json 文件”链接。选择“C (GDB/LLDB)”。选择“g - 生成并调试活动文件”配置。这将自动生成一个launch.json文件你可以根据需要调整这个文件。
在Vscode的终端中运行文件就可以正常运行你的代码了 由于本人长时间使用c语言所以对C的语法不大熟悉下面来解释以下令我疑惑的代码片段
srand(static_castunsigned int(time(0)));srand() 用于设置随机数生成器的种子。time(0) 获取当前时间作为种子。static_castunsigned int 将 time(0) 的返回值转换为 unsigned int 类型。 它在代码中的具体作用是 time(0) time 函数来自 ctime 或 time.h 库它返回当前时间从1970年1月1日到现在的秒数。传递 0 作为参数意味着请求当前的日历时间。 static_castunsigned int(...) static_cast 是C中的类型转换操作符用于显式地将一种类型转换为另一种类型。在这里它将 time(0) 返回的时间值转换为 unsigned int 类型。这是因为 srand 函数需要一个无符号整数unsigned int作为种子值。 srand(...) srand 是 “set random” 的缩写来自 cstdlib 或 stdlib.h 库。它用于设置随机数生成器的初始种子值。种子决定了随机数生成器产生的伪随机数序列。不同的种子会产生不同的序列。如果你每次运行程序时使用相同的种子将会得到相同的随机数序列。这在某些情况下是有用的比如在需要可重复测试的场景中。
因此srand(static_castunsigned int(time(0))); 这行代码的作用是使用当前时间作为种子来初始化随机数生成器确保每次运行程序时都能产生不同的随机数序列。这对于任何需要随机性的程序如游戏、模拟或安全相关的应用都是非常重要的。 二银行账户管理系统
项目概述
类名BankAccount属性 accountNumber (账户号码)accountHolder (账户持有人名称)balance (账户余额)方法 构造函数 (用于创建账户)deposit (存款)withdraw (取款)getBalance (查看余额)displayAccountDetails (显示账户详情)
代码实现
#include iostream
#include stringclass BankAccout {
private:std::string accountNumber;std::string accountHolder;double balance;public:BankAccout(std::string accountNumber, std::string accountHolder): accountNumber(accountNumber), accountHolder(accountHolder), balance(0) {}void deposit(double amount) {if (amount 0) {balance amount;}}void withdraw(double amount) {if (amount balance) {balance - amount;}}double getBalance() const {return balance;}void displayAccountDetails() const {std::cout Account Number: accountNumber \n Account Holder: accountHolder \n balance: balance \n;}};int main() {BankAccout account(12345678, John Doe);account.displayAccountDetails();account.deposit(1000);account.withdraw(500);account.displayAccountDetails();return 0;
}项目解析
类定义定义了一个名为 BankAccount 的类其中包含账户的基本信息和操作。私有成员变量accountNumber, accountHolder, 和 balance 是类的属性它们被设置为私有以避免直接从类的外部访问和修改。公有成员函数包括构造函数、deposit、withdraw、getBalance 和 displayAccountDetails用于执行银行账户的各种操作。主函数 (main)在这里创建并操作 BankAccount 类的实例。
这个项目展示了C的面向对象编程基础包括类的定义、对象的创建、方法的调用等。您可以通过添加更多功能如交易历史记录、多个账户管理、密码保护等来扩展此项目从而更深入地理解和实践C编程。
部分代码片段详细介绍
BankAccount(std::string accountNumber, std::string accountHolder)BankAccount 是类名这里用作构造函数的名称。构造函数用于初始化对象的新实例。括号内的 std::string accountNumber 和 std::string accountHolder 是构造函数的参数。当创建 BankAccount 类的对象时你需要提供这些参数。 : accountNumber(accountNumber), accountHolder(accountHolder), balance(0)成员初始化列表以冒号 : 开始后面紧跟类成员的初始化。accountNumber(accountNumber) 表示用构造函数接收的 accountNumber 参数来初始化类的 accountNumber 成员变量。accountHolder(accountHolder) 同理表示用参数 accountHolder 初始化类成员 accountHolder。balance(0) 表示类成员 balance 被初始化为 0。
为什么使用成员初始化列表
成员初始化列表在构造函数体执行前初始化类的成员变量。这比在构造函数体内赋值更有效率特别是对于复杂类型的成员变量如对象。在这个特定例子中使用成员初始化列表初始化字符串成员变量和一个浮点数是一种标准做法。
完整的构造函数
将这些部分组合在一起构造函数的意思是当创建 BankAccount 类的对象时需要提供账户号码和持有人姓名。这些值将被用来初始化对象的相应成员变量同时账户余额被初始化为0。 三学生信息管理系统
当然可以。让我们构建一个稍微复杂一些的C项目这次我们将实现一个简单的学生信息管理系统。在这个系统中我们将创建两个类一个是Student类用来表示单个学生的信息另一个是StudentManager类用来管理多个学生的信息。
这个项目将展示如何使用C来处理更复杂的数据结构以及如何在类之间进行交互。
项目概述 类 Student 属性 name (学生姓名)id (学生ID)grade (学生成绩)方法 构造函数显示学生信息 (displayInfo) 类 StudentManager 属性 students (一个存储多个 Student 对象的容器)方法 添加学生 (addStudent)显示所有学生信息 (displayAllStudents)
代码实现
#include iostream
#include vector
#include stringclass Student {
private:std::string name;std::string id;double grade;public:Student(std::string name, std::string id, double grade): name(name), id(id), grade(grade) {}void displayInfo() const {std::cout Student Name: name , ID: id , Grade: grade \n;}
};class StudentManager {
private:std::vectorStudent students;public:void addStudent(const Student student) {students.push_back(student);}void displayAllStudent() const {for (const auto student : students) {student.displayInfo();}}
};int main() {StudentManager manager;manager.addStudent(Student(Alice, A001, 91.5));manager.addStudent(Student(Bob, B002, 88.5));manager.addStudent(Student(Charlie, C003, 79.5));manager.displayAllStudent();return 0;}
部分代码片段分析
class StudentManager {
private:std::vectorStudent students;public:void addStudent(const Student student) {students.push_back(student);}void displayAllStudent() const {for (const auto student : students) {student.displayInfo();}}
};
private:std::vectorStudent students;private 关键字指明紧随其后的成员是私有的只能被 StudentManager 类的成员函数访问。std::vectorStudent students; 声明了一个 std::vector这是C标准库中的一个动态数组用来存储 Student 对象。students 是此向量的名称。
public:void addStudent(const Student student) {students.push_back(student);}public 关键字指明紧随其后的成员是公有的可以被任何访问 StudentManager 对象的代码访问。addStudent 函数接收一个对 Student 类型的引用const Student student作为参数。使用引用可以避免复制整个 Student 对象而 const 确保传递的 Student 对象不会在这个函数中被修改。引用 ()在 C 中引用相当于是另一个变量的别名。使用引用可以避免在函数调用时复制数据从而提高效率。当你用引用作为函数参数时实际上是传递了对原始数据的直接访问权而不是其副本。students.push_back(student); 将传入的 Student 对象添加到 students 向量的末尾。 void displayAllStudents() const {for (const auto student : students) {student.displayInfo();}}displayAllStudents 函数用于显示所有学生的信息。const 关键字表示这个函数不会修改 StudentManager 对象。for (const auto student : students) 是一个范围基于的 for 循环用于遍历 students 向量中的每个 Student 对象。这里使用 auto 关键字让编译器自动推断 student 的类型。在循环内部student.displayInfo(); 调用了每个 Student 对象的 displayInfo 函数以显示其信息。
这个类的设计展示了C面向对象编程的一些关键概念如封装、数据隐藏和接口公开。通过 StudentManager 类的公有接口外部代码可以向管理器添加学生对象和显示所有学生的信息而无需直接操作内部的 students 向量。这是一种良好的设计实践因为它保持了类的内部状态的完整性和安全性。 四小型天气预报应用
这个项目将涉及自定义数据结构、文件输入输出以及一些基本的字符串操作。在这个项目中我们将创建一个 WeatherReport 类来处理和存储关于特定城市的天气数据并从文件中读取数据然后生成报告。
项目概述 类 WeatherData 属性 cityName (城市名称)temperature (温度)humidity (湿度)方法 构造函数显示天气信息 (display) 类 WeatherReport 属性 weatherData (存储多个 WeatherData 对象的容器)方法 从文件加载天气数据 (loadDataFromFile)显示所有天气报告 (displayReport)
代码实现
#include iostream
#include fstream
#include sstream
#include vector
#include stringclass WeatherData {
private:std::string cityName;double temperature;double humidity;public:WeatherData(std::string cityName, double temperature, double humidity): cityName(cityName), temperature(temperature), humidity(humidity) {}void display() const {std::cout City: cityName Temperature: temperature C, Humidity: humidity %\n;}
};class WeatherReport {
private:std::vectorWeatherData weatherData;public:bool loadDataFromFile(const std::string filename) {std::ifstream file(filename);if (!file.is_open()) return false;std::string line, city;double temp, hum;while (getline(file, line)) {std::istringstream iss(line);if (!(iss city temp hum)) break;weatherData.emplace_back(city, temp, hum);}file.close();return true;}void displayReport() const {for (const auto data : weatherData) {data.display();}}};int main() {WeatherReport report;if (report.loadDataFromFile(weather_data.txt)) {report.displayReport();} else {std::cout Failed to load data. \n;}return 0;
}文件 weather_data.txt
创建一个文本文件 weather_data.txt格式如下
London 15.5 60
NewYork 22.3 55
Paris 18.9 65项目解析
WeatherData 类 存储单个城市的天气信息包括城市名称、温度和湿度并提供一个方法来显示这些信息。WeatherReport 类 用于从文件中读取多个城市的天气数据并存储在一个 WeatherData 对象的向量中。它还提供了一个方法来显示所有加载的天气数据。在 main 函数中我们创建了一个 WeatherReport 对象尝试从文件中加载数据如果成功就显示天气报告。
这个项目展示了文件输入输出的处理字符串流的使用std::istringstream以及如何使用STL容器来存储和管理数据。这些是在C编程中经常会用到的重要概念和技术。通过实现这样的项目你可以更好地理解如何在C中处理更复杂的数据流和数据结构。
部分代码片段分析
public:bool loadDataFromFile(const std::string filename) {std::ifstream file(filename);if (!file.is_open()) return false;std::string line, city;double temp, hum;while (getline(file, line)) {std::istringstream iss(line);if (!(iss city temp hum)) break;weatherData.emplace_back(city, temp, hum);}file.close();return true;}void displayReport() const {for (const auto data : weatherData) {data.display();}}
}; bool loadDataFromFile(const std::string filename) 定义了一个名为 loadDataFromFile 的成员函数它接受一个字符串引用作为参数这个字符串代表要加载数据的文件名。该函数返回一个布尔值表示数据加载是否成功。 std::ifstream file(filename); 使用给定的文件名创建了一个输入文件流 file。这个流用于读取文件内容。‘std::ifstream 类‘这是 C 标准库中的一个类专门用于处理文件输入。它是 istream 类的子类专门用于从文件读取数据。ifstream 代表 input file stream即输入文件流。 if (!file.is_open()) return false; 检查文件是否成功打开。如果没有函数返回 false。 std::string line, city; double temp, hum; 定义了一些变量来存储从文件中读取的数据。line 用于存储文件中的每一行city 用于存储城市名称temp 和 hum 分别用于存储温度和湿度。 while (getline(file, line)) { ... } 是一个循环它一行一行地读取文件。每次循环它读取文件的下一行到 line 变量中。 std::istringstream iss(line); 创建了一个字符串输入流它从 line 变量中读取数据。std::istringstream 类: std::istringstream 属于 C 标准库中的 sstream 头文件。它提供了基于字符串的输入流功能。简单来说std::istringstream 允许你像处理输入文件流如 std::ifstream那样处理一个 std::string 对象。通过 std::istringstream iss 语句你创建了一个名为 iss 的 std::istringstream 类型的对象。这个对象用于读取和解析字符串中的数据。一旦 iss 被初始化它就可以像任何其他输入流一样使用允许你从中读取和解析数据。例如你可以使用 运算符从 iss 中提取基本数据类型的值或者使用 getline 函数从中读取字符串。 if (!(iss city temp hum)) break; 使用字符串流从 line 中提取城市名、温度和湿度。如果提取失败循环将中断。 weatherData.emplace_back(city, temp, hum); 将读取的数据作为新 WeatherData 对象添加到 weatherData 向量中。emplace_back 是 vector 的一个方法用于在容器末尾添加新元素。 file.close(); 在读取完所有数据后关闭文件。 return true; 数据加载成功后返回 true。
好了今天的小项目就到此为止辣欢迎继续关注小白的C成长之旅。之前我有试过学习C在外网的一个学习网站但是每次都是重新开始不是从新开始昨晚和学长聊天他建议我一段时间内注重一个知识的学习所以接下来我可能都会发布关于C的项目希望大家也能给我一点关于学习的经验谢谢了