当前位置: 首页 > news >正文

C++入门(02)简单了解C++应用程序的开发部署

文章目录

  • 1. 开发C++应用程序
  • 2. 简单示例计算器程序
  • 3. 需求分析
  • 4. 设计
  • 5. 编码
  • 6. 编译
  • 7. 调试
  • 8. 测试
  • 9. 部署
  • 10. 部署示例
    • 10.1 使用Visual Studio Installer Projects创建安装程序
    • 10.2 安装VisualStudio Installer Projects扩展
    • 10.3 在calculator解决方案中创建安装项目
      • 10.3.1 添加安装项目
      • 10.3.2 配置安装项目
      • 10.3.3 添加快捷方式
      • 10.3.4 设置安装属性
    • 10.4 生成安装程序
    • 10.5 在用户计算机安装我们的计算器程序
    • 10.6 部署示例小结

1. 开发C++应用程序

开发应用程序的过程可以细分为:需求分析、设计、编码、编译、调试、测试、部署

2. 简单示例计算器程序

假设开发一个简单的命令行计算器,可以进行加法、减法、乘法和除法操作。

3. 需求分析

程序的需求是什么?对于这个计算器程序,需求可能是这样的:

  • 用户可以输入两个数字
  • 用户可以选择执行的操作(加、减、乘、除)
  • 程序输出计算结果
  • 如果用户输入非法数据或者除以零,程序应当提示错误

4. 设计

考虑如何实现这些功能?

  • 用什么变量来存储用户输入的数字?
  • 如何设计功能模块,比如加法、减法等操作?
  • 如何处理输入错误?

我们可以简单地设计一个基本结构:

  • 主函数 main() 用来控制程序的流程
  • 使用 cin 读取用户的输入,cout 输出结果
  • 使用条件语句 if-else 或 switch 处理用户选择的操作

5. 编码

简单的 C++ 实现,按照这个步骤(C++入门(01)VisualStudio2022社区版HelloWorld),创建项目 - 源码文件:calculator.cpp

#include <iostream>  // 包含标准输入输出库using namespace std;int main() {double num1, num2;  // 声明两个变量用于存储用户输入的数字char operation;     // 声明一个变量用于存储操作符// 提示用户输入两个数字和一个操作符cout << "Enter first number: ";cin >> num1;cout << "Enter an operator (+, -, *, /): ";cin >> operation;cout << "Enter second number: ";cin >> num2;// 根据用户输入的操作符执行相应的计算switch (operation) {case '+':cout << "Result: " << num1 + num2 << endl;break;case '-':cout << "Result: " << num1 - num2 << endl;break;case '*':cout << "Result: " << num1 * num2 << endl;break;case '/':// 检查除数是否为零if (num2 != 0) {cout << "Result: " << num1 / num2 << endl;} else {cout << "Error: Division by zero!" << endl;}break;default:cout << "Error: Invalid operator!" << endl;}return 0;  // 程序成功结束
}

6. 编译

编写完代码以后,要进行编译。
编译是将 C++ 代码转换为计算机可以执行的机器语言。
Ctrl + F5
Visual Studio将自动完成代码的编译,并在控制台窗口中运行程序
如果一切顺利,没有语法错误
将会把源代码文件calculator.cpp 编译成可执行文件 calculator.exe
在这里插入图片描述

7. 调试

调试是找到并修复程序中的错误的过程,比如在运行程序时,如果发现除数为零的情况没有正确提示错误,就需要检查代码进行修改。

8. 测试

测试是为了保证程序在各种输入情况下都能够正确运行。
对于这个计算器程序来讲,测试包括:

  • 正常输入两个数字和操作符,检查是否正确输出结果
  • 测试非法操作符输入,比如输入“%”,检查是否正确提示错误
  • 测试除以零的情况,看看是否输出响应的错误信息

9. 部署

当程序经过测试没有问题后,就可以部署给用户使用了。把程序打包发布给其他人使用,让其他人可以在他们的计算机上使用你的程序。

部署不仅仅是生成可执行文件,还包括处理依赖项、设置安装环境等,保障程序在用户的系统上正常运行。

10. 部署示例

10.1 使用Visual Studio Installer Projects创建安装程序

Visual Studio Installer Projects是一个扩展工具,可以帮助创建Windows安装包,例如MSI文件。

10.2 安装VisualStudio Installer Projects扩展

点击菜单栏的“扩展”,选择“管理扩展”。
在这里插入图片描述
在弹出的窗口中,搜索“Microsoft Visual Studio Installer Projects”
找到后点击“下载”,安装此扩展
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装完成后,重新打开Visual Studio ,重新打开我们的计算器calculator解决方案
在这里插入图片描述

10.3 在calculator解决方案中创建安装项目

10.3.1 添加安装项目

右键点击解决方案calculator,选择“添加” -> “新建项目”。
在这里插入图片描述

在搜索框中输入“Setup Project”,选择“Setup Project”,点击“下一步”。
在这里插入图片描述

给安装项目起个名字,比如CalculatorInstaller,然后点击“创建”。
在这里插入图片描述

10.3.2 配置安装项目

右键点击“Application Folder”,选择“添加” -> “项目输出”
在这里插入图片描述
在弹出的窗口中,选择CalculatorApp的“主输出”,点击“确定”
在这里插入图片描述
现在CalculatorApp.exe文件就被添加到安装包中了

10.3.3 添加快捷方式

右键点击CalculatorApp.exe,选择“创建快捷方式”
在这里插入图片描述
在这里插入图片描述

将快捷方式拖动到“User’s Desktop”文件夹中,这样未来用户安装以后会在桌面上生成快捷方式
在这里插入图片描述

10.3.4 设置安装属性

在解决方案资源管理器,选中CalculatorInstaller项目,打开属性窗口
在这里插入图片描述
打开属性窗口后,你会看到许多选项可以配置
ProductName(产品名称),例如:Calculator Application。
Manufacturer(制造商),例如:Your Name or Company。
Version(版本),例如:1.0.0。这个版本号用于区分不同的程序版本。
Author(作者),通常和制造商信息相同
InstallAllUsers(安装方式),一般选择True,这样所有系统用户都可以使用程序。
UpgradeCode(升级代码),这是用于识别安装包的唯一代码。如果以后要发布更新,升级代码必须保持一致
在这里插入图片描述

10.4 生成安装程序

在这里插入图片描述

Visual Studio会生成安装包
生成完成后,安装程序文件会在\Debug 或 \Release 文件夹下找到(路径可能是CalculatorInstaller\Debug)。CalculatorInstaller.msi 文件是主要的安装程序文件,包含了应用程序的所有文件、安装脚本和其他相关信息。
setup.exe 文件是一个安装引导程序,通常与 .msi 文件一起工作,会首先安装所有先决条件,然后调用 .msi 文件进行主程序的安装

10.5 在用户计算机安装我们的计算器程序

拷贝安装包到另外一台没有C++环境的计算机,双击setup.exe
这台用户计算机并没有C++环境
在这里插入图片描述
进入安装向导界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
做安装文件的时候,要起好名称啊,安装完毕,运行在这里插入图片描述
对于我们这个简单的小程序而言,其实和直接拷贝.exe到用户计算机是一样的
在这里插入图片描述

10.6 部署示例小结

  • 直接拷贝.exe可执行文件:适合简单的小程序,没有复杂的依赖关系
  • 创建安装程序 Installer,利用工具创建用户友好的安装包

相关文章:

C++入门(02)简单了解C++应用程序的开发部署

文章目录 1. 开发C应用程序2. 简单示例计算器程序3. 需求分析4. 设计5. 编码6. 编译7. 调试8. 测试9. 部署10. 部署示例10.1 使用Visual Studio Installer Projects创建安装程序10.2 安装VisualStudio Installer Projects扩展10.3 在calculator解决方案中创建安装项目10.3.1 添…...

有了室内外一体化人行导航,你还怕迷路吗?

在快节奏的现代生活中&#xff0c;无论是穿梭于繁华的都市丛林&#xff0c;还是漫步于错综复杂的购物中心&#xff0c;迷路似乎成了不少人的“小确丧”。然而&#xff0c;随着科技的飞速发展&#xff0c;一项革命性的创新——室内外一体化人行导航系统&#xff0c;正悄然改变着…...

Python虚拟环境包迁移

1. 激活源虚拟环境 首先&#xff0c;激活你想要导出包的源虚拟环境。在命令行中输入&#xff1a; Windows: path\to\your\source_env\Scripts\activatemacOS/Linux: source path/to/your/source_env/bin/activate 2. 导出已安装包的列表 使用以下命令生成一个requirements…...

利用分布式锁在ASP.NET Core中实现防抖

前言 在 Web 应用开发过程中&#xff0c;防抖&#xff08;Debounce&#xff09; 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单&#xff0c;或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中&a…...

Django+Vue3前后端分离学习(二)(重写User类)

一、重写User类&#xff1a; 1、首先导入User类&#xff1a; from django.contrib.auth.models import User 2、然后点在User上&#xff0c;按住ctrl 点进去&#xff0c;发现 User类继承AbstractUser Ctrl点进去AbstractUser&#xff0c;然后将此方法全部复制到自己APP的mo…...

兔英语语法体系——观后笔记

目录 一、视频链接 二、视频前言 三、简单句(Simple Sentences) 1. 可独立完成的动作 2. 有1个动作的承受者 3. 有两个动作承受者 4. 只有一个动作承受者(但需补充) 5. 非 “动作” 6. 总结 四、五大基本句型 五、句子成分 6. 定语 7. 状语 8. 同位语 9. 总结 …...

哈希表如何避免冲突

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…...

内核模块驱动开发

内核模块开始学习前&#xff0c;一定是最先接触到内核模块三要素(面试)&#xff0c;驱动入口、驱动出口和协议的遵循。 1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_…...

Linux 下 alsa 库录音并保存为 WAV 格式

麦克风列表&#xff1a; [jnjn build]$ arecord -l **** List of CAPTURE Hardware Devices **** card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]Subdevices: 1/1Subdevice #0: subdevice #0 card 1: Camera [2K USB Camera], device 0: USB Aud…...

使用stripe进行在线支付、退款、订阅、取消订阅功能(uniapp+h5)

stripe官网:Stripe 登录 | 登录 Stripe 管理平台 然后在首页当中打开测试模式,使用测试的公钥跟私钥进行开发 测试卡号 4242 4242 4242 4242 1234 567 在线支付 stripe的在线支付有两种,第一种就是无代码,第二中就是使用api进行自定义,一般来说推荐第二种进行开发 无…...

深度学习中常见的损失函数

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 深度学习中常见的损失函数 损失函数的作用 损失函数是衡量神经网络输出与真实标签之间差距的指标。在训练过程中&#xff0c;神经网络的目标是最小化损失函数的值。常见的损失函数包括均方误差&#xff08;MS…...

认识Linux及Linux的环境搭建

目录 1、什么是Linux2、Linux环境搭建2.1 下载安装 Xshell2.2 下载安装 VMware Workstation Pro2.3 选择适合自己系统 1、什么是Linux Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff…...

Java之线程篇三

​​​​​​​ 目录 线程状态 观察线程的所有状态 线程状态及其描述 线程状态转换 代码示例1 代码示例2 线程安全 概念 线程不安全的代码示例 线程不安全的原因 线程安全的代码示例-加锁 synchronized关键字 synchronized的特性 小结 形成死锁的四个必要条件 …...

Bootstrap动态设置表格title项

页面searchType <form id"formId"><div class"select-list"><ul><li><select name"searchType" id"searchType"><option value"1">按各节点统计</option><option value"…...

Arrays.sort()方法在Java中的使用:理论与实践

目录 一.概述 二.实现方式 三.具体介绍 1.基本数据类型数组 2.对象数组 1)使对象实现Comparable接口 2)为对象再专门实现一个比较器类 四.进阶技巧 1.基础类型数组实现自定义比较 2.如何进行逆序排序 3.lambda表达式实现比较器类 4.List的排序方法Collection.sort()…...

用AI写论文,千万不要这样用ChatGPT生成参考文献References!!

ChatGPT作为一种先进的语言大模型&#xff0c;被广泛用于生成文本&#xff0c;虽然用ChatGPT辅助论文写作已是大势所趋&#xff0c;但是&#xff0c;用于生成参考文献References的部分还是要谨慎对待。 在学术写作中&#xff0c;参考文献References扮演着至关重要的角色&#…...

Debian 12如何关闭防火墙

在Debian 12中&#xff0c;默认的防火墙管理工具是ufw&#xff08;Uncomplicated Firewall&#xff09;。您可以使用以下命令来关闭防火墙&#xff1a; 关闭防火墙&#xff1a; sudo ufw disable查看防火墙状态&#xff1a; sudo ufw status如果需要重新开启防火墙&#xff1a;…...

windows C++-并行编程-PPL任务并行(二)

延续任务 在异步编程中&#xff0c;一个异步操作在完成时调用另一个操作并将数据传递到其中的情况非常常见。 传统上&#xff0c;这使用回调方法来完成。 在并发运行时中&#xff0c;延续任务提供了同样的功能。 延续任务(也简称为“延续”)是一个异步任务&#xff0c;由另一个…...

快速了解 servlet(SpringMVC 的底层)

Servlet 是 Java EE&#xff08;现 Jakarta EE&#xff09;中用于处理 Web 请求的核心组件。它在 Web 应用程序的服务器端运行&#xff0c;负责接收和处理客户端&#xff08;如浏览器&#xff09;的请求&#xff0c;并生成响应。 尽管现代Web开发更多采用SpringMVC等框架&…...

QT中tr的作用是什么

在Qt框架中&#xff0c;tr() 函数是一个非常重要的宏&#xff0c;它用于国际化和本地化&#xff08;i18n和l10n&#xff09;支持。tr() 函数使得Qt应用程序能够根据不同的语言环境&#xff08;locale&#xff09;显示相应的翻译文本&#xff0c;从而支持多种语言。 具体来说&a…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...