-
2020-12-19 10:36:37
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取。
我们经常使用一些docker管理平台,如DaoCloud、rancher之类的,里面都可以配置环境变量,目的当然也就是供程序获取。使用环境变量的话,可以避免在application.yml里直接明文编写数据库密码、appkey之类的。
用法很简单
譬如我系统环境变量里,配置的有M2_HOME
那么就可以在application.yml使用如下
maven:
path: ${M2_HOME}
然后在代码里就能根据maven.path取到环境变量配置的值了。
当然还有一些高级用法,譬如你忘了配置环境变量了,上面的写法就取不到值了,可以使用
maven:
path: ${M2_HOME:abc}
使用冒号分隔,当环境变量中M2_HOME为空时,就会使用abc来填充了。
通过上面的方式,就可以做到不明文编码一些敏感密码之类的,只配置在环境变量里,就能避免所有开发人员看到了。
Springboot配置文件获取系统环境变量的值
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...
“使用IDEA,配置文件是yml,无法获取[环境变量],值是null”的问题处理
为了便于隐藏用户名和密码,我们有时会用到“环境变量”. Spring Boot提供了很好的机制,可以在配置文件中,如application.yml书写以下格式,然后在代码中@Value就可以获取“环境 ...
.NET Core程序中,如何获取和设置操作系统环境变量的值
有时候我们在.NET Core程序中需要获取和设置操作系统环境变量的值.本文演示如何使用Environment.GetEnvironmentVariable和Environment.SetEnviro ...
C#中如何获取系统环境变量等
C#中获取系统环境变量需要用到Environment 类. 其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承 以下代码得到%systemdrive%的值,即“C:” string ...
C#中如何获取系统环境变量
原文:C#中如何获取系统环境变量 C#中获取系统环境变量需要用到Environment Class.其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承. 以下代码得到%systemd ...
python 获取系统环境变量 os.environ and os.putenv
从一段code说起 “if "BATCH_CONFIG_INI" in os.environ:” 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则就取当前目录下的co ...
SpringBoot系列——利用系统环境变量与配置文件的分支选择实现“智能部署”
前言 通过之前的博客:SpringBoot系列——jar包与war包的部署,我们已经知道了如果实现项目的简单部署,但项目部署的时候最烦的是什么?修改成发布环境对应的配置!数据库连接地址.Eureka注 ...
Java获取系统环境变量(System Environment Variable)和系统属性(System Properties)以及启动参数的方法
系统环境变量(System Environment Variable): 在Linux下使用export $ENV=123指定的值.获取的方式如下: Map ...
JAVA 获取系统环境变量
分享代码: package com.base.entity; import java.io.Serializable; import java.util.Comparator; /** * 系统环境变 ...
随机推荐
2.4嵌套多重if else 的闰年判断以及bool变量的用法
#include #include int main() { int year; bool leap; //把leap定义为bool , ...
简单跳转到微信分享,基于libWeiChatSDK 和简单的自定义UIActivityViewController
一.自定义UIActivity: 如果想要自定义UIActivity必须知道UIActivityViewController.首先这个类主要是用于接受字符串,RUL类型和图片类型的数据用于分享和操作的 ...
RAW模板命名规范
国有国法,家有家规,任何一种开发都要有自己规范,RAW模板也一样,这个文章来介绍一下RAW模板命名的规范. 格式: 开发者或组织_描述词_名称 开发者或组织:如know或自己的组织名 描述词:c-&g ...
C#实现文件的压缩和解压
这里主要解决文件夹包含文件夹的解压缩问题.1)下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download ...
Spring基础学习(一)—初识Spring
一.Spring的使用 1.导入jar包 2.编写实体类 Person.java public class Person{ private String name; public void say() ...
linux_inode 和 block
linux里一切皆文件 什么是文件属性? 文件本身带有的信息, 包括:索引节点编号. 文件类型以及权限.硬链接个数(备份作用).所有者.所属组.文件大小.修改月.修改日.时分 什么是索引节点? ino ...
UVa442 Matrix Chain Multiplication(栈)
#include#include #include #include #inclu ...
我的大学,我的SPR机器人队
时间过的真快,我这个在协会呆了好多年的老油条今年都毕业了,在石油大学大学七年几乎三分之二的时间就是在协会度过的.实话说在北京这是我最亲切的地方,这里有我喜欢的各种设备,有亲爱的老师和一起奋斗的队友,在 ...
(一)问候 HtmlUnit
第一节: HtmlUnit 简介 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实 ...
常用数据类型对应字节数,int长度
常用数据类型对应字节数: 这两台机器,前者32位,后者64位,测试了以下数据类型的长度: 前者: ,, 后者: ,, 不是说int会变吗,为何变得是long? 还有如果要写个通用的程序,订死必须用4个 ...
更多相关内容 -
使用VS2019开始第一个C语言程序,环境安装配置+代码实例
2021-03-07 16:41:48C语言基础-第一个C程序 C语言基础-简单程序分析 VS2019编写简单的C程序示例 简单示例,VS2019调试C语言程序 C语言基础-基本算法 C语言基础-数据类型 C语言中的输入输出函数 C语言流程控制语句 C语言数组——一维数组...C语言文章更新目录
C/C++学习资源(百度云盘链接)
计算机二级资料(过级专用)
C语言学习路线(从入门到实战)
编写C语言程序的7个步骤和编程机制
C语言基础-第一个C程序
C语言基础-简单程序分析
VS2019编写简单的C程序示例
简单示例,VS2019调试C语言程序
C语言基础-基本算法
C语言基础-数据类型
C语言中的输入输出函数
C语言流程控制语句
C语言数组——一维数组
C语言数组——二维数组
C语言数组——字符数组
C语言中常用的6个字符串处理函数
精心收集了60个C语言项目源码,分享给大家
C语言核心技术——函数
C代码是怎样跑起来的?
C语言实现字符串的加密和解密
C语言——文件的基本操作
使用C语言链表创建学生信息并且将信息打印输出
图解C语言冒泡排序算法,含代码分析
实例分析C语言中strlen和sizeof的区别
C语言实例:将人员信息写入磁盘文件并读出显示环境安装配置
首先我们要在Visual Studio官方网站去下载安装包
https://visualstudio.microsoft.com/zh-hans/vs/
进入官网后会发现有三种版本可供下载,分别是社区版、专业版和企业版,冲哥这里选择的是专业版。
下载完成后,我们双击下载的软件开始安装
在弹出的画面点击继续
等待完成然后我们开始配置开发环境
如果没有别的需求这里我们就只选择:使用C++的桌面开发
如果不想用默认的安装路径(默认是安装在C盘的),可以点击更改来指定安装路径
选择好安装路径后,在右下角安装按钮的左边选择下载时安装(默认就是,这样可以节省安装时间),然后点击安装
等待安装完后,点击以后再说,也可以注册一个账号登录。
开发设置选择Visual C++
根据个人喜欢选择主题,冲哥酷爱深色😍,然后点击启动。
启动后的画面如下:
点击创建新项目
选在空项目,然后点击下一步填写项目名称,和项目存放的位置,然后点击右下角的创建
下面就是我们编写代码的画面
在源文件上右击添加–>新建项,也可以直接使用快捷键ctrl+shift+A
选择C++文件
填写程序名称并将后缀名改为.c,然后点击添加
接下来就可以写代码了,冲哥这里写了一个变成界都在用的HelloWorld,如果觉得字体小的话,可以按住CTRL按键将鼠标滚轮向上滚,这样字体就变大了。
接下来运行刚刚写的代码,验证一下环境是否OK,点击调试–>开始执行(不调试)或者直接快捷键CTRL+F5
运行结果如下:
至此,环境已经OK,接下来开始你的码农之路
代码调试
-
代码功能:
求从1加到10的和
-
代码:
#include<stdio.h> #define N 10 int main() { int result = 0; for (size_t i = 1; i <= N; i++) { result += i; } printf("result=%d", result); return 0; }
- 代码调试
添加断点,直接在第7行前面鼠标左击一下
点击调试–>开始调试,或者使用快捷键F5
代码执行到断点处会停下,我们可以将鼠标放在某个变量上查看变量的值,也可以在下方的窗口查看所有变量的值。
调试时可以点击窗口中的按钮,也可以使用快捷键
代码中可以添加多个断点,使用快捷键F5可以直接跳到下一个断点处。
关于环境配置和代码调试就到这了,希望对你有所帮助。
如果您觉得本篇文章对您有帮助,请转发给更多的人
更多干货内容请查看我的个人公众号:C语言中文社区。
【C语言中文社区】是一个C语言/C++视频教程、学习笔记、电子书、计算机二级资料等专注于C语言/C++编程学习者的干货知识分享平台,精选深度文章,分享优秀干货类、技能类的学习资源,帮助学习中的你。
-
-
《嵌入式C语言》C语言介绍及环境搭建
2021-05-18 17:28:53C语言是国际上广泛流行的高级语言,是在B语言的基础上发展起来的, 1970年, 美国贝尔实验室的D.M.Ritchie设计了B 语言, 并用于编写了第一个UNIX操作系统。 1973年, D.M.Ritchie 在B语言的基础上设计出了C语言, 对...--最具价值的嵌入式C语言
1 C语言简介
C语言是国际上广泛流行的高级语言,是在B语言的基础上发展起来的, 1970年, 美国贝尔实验室的D.M.Ritchie设计了B 语言, 并用于编写了第一个UNIX操作系统。 1973年, D.M.Ritchie 在B语言的基础上设计出了C语言, 对B取长补短, 并用之改写了原来的UNIX。
• 1983年-1987年,美国国家标准化协会(ANSI)根据C语言各种版本对C做了发展和扩充,制定了新的标准并发布ANSI C 。##1.1什么是ANSI C、ISO C、C89、C90标准?
随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。1983年,美国国家标准协会(ANSI)组成了一个委员会,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,这个版本的语言经常被称作ANSI C,或有时称为C89(为了区别C99)。在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会(ANSI)采纳为ISO/IEC 9899:1990。这个版本有时候称为C90或者ISO C。综上,ANSI C、ISO C、C89、C90其实是同一种标准。什么是C99标准?
2000年3月,ANSI 采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。 C99新增了一些特性,如:支持不定长的数组,即数组长度可以在运行时决定。变量声明不必放在语句块的开头,for语句提倡写成for(int i=0;i<100;++i) 的形式,即i只在for语句块内部有效。
#include <stdio.h> int main(void) { // C99允许在for循环内定义循环变量,而C89不允许 for (int i = 0; i < 5; i++) { printf("hello world!\n"); } return 0; }
在C89标准下编译,结果为:
F:\A_work\C_Base\C_V3_code\CProject_Test\c99.c|6|note: (this will be reported only once per input file)|
F:\7|error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode|
F:\7|note: use option ‘-std=c99’, ‘-std=gnu99’, ‘-std=c11’ or ‘-std=gnu11’ to compile your code|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|编译报错原因为,在C89标准下,循环变量不能在for循环内定义,必须把标准改为C99标准。
2 两种计算机体系结构
2.1 冯.诺依曼结构
程序指令存储和数据存储合并在一起的存储器结构。
以复杂指令集(CISC)为代表。
命令字长短不一流水线容易出现阻塞停滞。
程序指令和数据的宽度相同机器字长。
通常采用小端字节序(little-endian)即低字节放在低地址。
如英特尔的x86系列、MIPS公司的MIPS处理器。
2.2 哈佛结构
程序存储与数据存储有单独的存储器。
精简指令集(RISC)为代表。
通常有大量内部存储设备避免存储恢复操作。
采用大端字节序(big-endian)即低字节放在高地址。
采用其他RISC技术。
哈佛体系结构
采用短指令机构通畅的流水线。
采用硬解码复杂指令集通常采用以可编程的控制存储器为核心控制逻辑部件速度更快。
如单片机51、Microchip 的PIC、ARM7、ARM9、ARM10、ARM11、摩托罗拉 的MC68的Z8处理器。2.3 端模式介绍
端模式Endian的这个词出自书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big-Endian,从尖头开始将鸡蛋敲开的人被归为Littile-Endian。小人国的内战就源于吃鸡蛋时是究竟从大头Big-Endian敲开还是从小头Little-Endian敲开。
在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界Endian表示数据在存储器中的存放方式。3 怎么理解程序及程序的运行过程
3.1 嵌入式C程序启动流程
a.上电初始化
1从CPU复位时的指定地址开始执行
2跳转至汇编代码startup处执行
3跳转至用户主程序main执行。
在main( )中完成
b.初试化各硬件设备
c.初始化各软件模块
d.进入死循环调用各模块的处理函数
下面是几个“著名”的死循环
1操作系统是死循环
2WIN32程序是死循环
3嵌入式系统软件是死循环
4多线程程序的线程处理函数是死循环。永远的C语言
C语言有人叫它中间语言是介于汇编语言与高级语言之间的编程工具。它的运行速度在高级语言中是最快的据说只比汇编语言慢10%, 在嵌入式世界中除了汇编语言就是C语言。在8位机的控制系统(比如51单片机)中就是用C语言开发的。在嵌入式开发中C语言具有绝对优势。
运行效率高效,大部分嵌入式产品要求具有实时性C的运行速度的优势给实时现场控制提供可能。
数据结构丰富、运算操作丰富、结构化、功能强大。3.2 简单的C程序介绍
为了说明C语言源程序结构的特点,先看以下几个程序。这几个程序由简到难,表现了
C语言源程序在组成结构上的特点。 虽然有关内容还未介绍, 但可从这些例子中了解到组成
一个 C 源程序的基本部分和书写格式。
【例 1.1】void main() { printf("Hello world!\n"); }
main 是主函数的函数名,表示这是一个主函数。
每一个 C 源程序都必须有,且只能有一个主函数(main 函数)。
函数调用语句, printf 函数的功能是把要输出的内容送到显示器去显示。
printf 函数是一个由系统定义的标准函数,可在程序中直接调用。
【例 1.2】#include<math.h> #include<stdio.h> void main() { double x,s; printf("input number:\n"); scanf("%lf",&x); s=sin(x); printf("sine of %lf is %lf\n",x,s); }
•include 称为文件包含命令
•扩展名为.h 的文件称为头文件
•定义两个实数变量,以被后面程序使用
•显示提示信息
•从键盘获得一个实数 x
•求 x 的正弦,并把它赋给变量 s
•显示程序运算结果
•main 函数结束
程序的功能是从键盘输入一个数 x,求 x 的正弦值,然后输出结果。 在 main()之前的两行称为预处理命令(详见后面)。 预处理命令还有其它几种,这里的 include 称为文件包含命令,其意义是把尖括号<>或引号""内指定的文件包含到本程序来,成为本程序的一部分。 被包含的文件通常是由系统提供的,其扩展名为.h。因此也称为头文件或首部文件。C语言的头文件中包括了各个标准库函数的函数原型。因此,凡是在程序中调用一个库函数时,都必须包含该函数原型所在的头文件。在本例中,使用了三个库函数:输入函数 scanf,正弦函数 sin,输出函数 printf。 sin 函数是数学函数,其头文件为 math.h 文件,因此在程序的主函数前用 include 命令包含了 math.h。 scanf 和 printf 是标准输入输出函数,其头文件为 stdio.h,
在主函数前也用 include 命令包含了 stdio.h 文件。
需要说明的是, C 语言规定对 scanf 和 printf 这两个函数可以省去对其头文件的包含命令。所以在本例中也可以删去第二行的包含命令#include<stdio.h>。在例题中的主函数体中又分为两部分,一部分为说明部分,另一部为分执行部分。说明是指变量的类型说明。例题 1.1 中未使用任何变量,因此无说明部分。C语言规定,源程序中所有用到的变量都必须先说明,后使用,否则将会出错。本例中使用了两个变量 x, s,用来表示输入的自变量和 sin 函数值。由于 sin 函数要求这两个量必须是双精度浮点型,故用类型说明符 double 来说明这两个变量。说明部分后的四行为执行部分或称为执行语句部分, 用以完成程序的功能。 执行部分的第一行是输出语句,调用 printf 函数在显示器上输出提示字符串,请操作人员输入自变量 x 的值。第二行为输入语句,调用 scanf 函数,接受键盘上输入的数并存入变量 x 中。第三行是调用 sin 函数并把函数值送到变量 s 中。第四行是用 printf 函数输出变量 s 的值,即 x 的正弦值。程序结束。 运行本程序时,首先在显示器屏幕上给出提示串 input number,这是由执行部分的第一行完成的。用户在提示下从键盘上键入某一数,如 5,按下回车键,接着在屏幕上给出计算结果。
3.3 输入和输出函数
在前两个例子中用到了输入和输出函数 scanf 和 printf,在以后要详细介绍。这里我们
先简单介绍一下它们的格式,以便下面使用。
scanf 和 printf 这两个函数分别称为格式输入函数和格式输出函数。其意义是按指定的格式输入输出值。因此,这两个函数在括号中的参数表都由以下两部分组成:
“格式控制串” ,参数表
格式控制串是一个字符串,必须用双引号括起来,它表示了输入输出量的数据类型。 各
种类型的格式表示法可参阅第三章。 在 printf 函数中还可以在格式控制串内出现非格式控制字符,这时在显示屏幕上将原文照印。参数表中给出了输入或输出的量。当有多个量时, 用
逗号间隔。例如:
printf(“sine of %lf is %lf\n”,x,s);
其中%lf 为格式字符,表示按双精度浮点数处理。它在格式串中两次现,对应了 x 和 s 两个变量。 其余字符为非格式字符则照原样输出在屏幕上。
【例 1.3】int max(int a,int b); /*函数说明*/ main() /*主函数*/ { int x,y,z; /*变量说明*/ int max(int a,int b); printf("input two numbers:\n"); scanf("%d%d",&x,&y); /*输入 x,y 值*/ z=max(x,y); /*调用 max 函数*/ printf("maxmum=%d",z); /*输出*/ } int max(int a,int b) /*定义 max 函数*/ { if(a>b) { return a; } else { return b; /*把结果返回主调函数*/ } }
上面例中程序的功能是由用户输入两个整数, 程序执行后输出其中较大的数。 本程序由两个函数组成,主函数和 max 函数。函数之间是并列关系。可从主函数中调用其它函数。max 函数的功能是比较两个数,然后把较大的数返回给主函数。 max 函数是一个用户自定义函数。因此在主函数中要给出说明(程序第三行)。可见,在程序的说明部分中,不仅可以有变量说明,还可以有函数说明。关于函数的详细内容将在以后第五章介绍。在程序的每行后用/和/括起来的内容为注释部分,程序不执行注释部分。
上例中程序的执行过程是,首先在屏幕上显示提示串,请用户输入两个数,回车后由
scanf 函数语句接收这两个数送入变量 x,y 中, 然后调用 max 函数, 并把 x,y 的值传送给 max函数的参数 a,b。在 max 函数中比较 a,b 的大小,把大者返回给主函数的变量 z,最后在屏幕上输出 z 的值。3.4 C源程序的结构特点
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个 main 函数,即主函数。
4.源程序中可以有预处理命令(include 命令仅为其中的一种), 预处理命令通常应放在源
文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”
之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再
加空格来间隔。3.5 书写程序时应遵循的规则
从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时应遵循以下规则:
1.一个说明或一个语句占一行。
2.用{} 括起来的部分,通常表示了程序的某一层次结构。 {}一般与该结构语句的第一个字母对齐,并单独占一行。
3.低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。 以便看起来更加清晰,增加程序的可读性。
4. 不同逻辑语句空一行。
在编程时应力求遵循这些规则,以养成良好的编程风格4编程开发环境
4.1 MDK Keil
MDK Keil软件为基于8051、Cortex-M、Cortex-R4、ARM7、ARM9等多种处理器设备提供了一个完整的开发环境。专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。
MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。4.2 CodeBlock+MingGW
CodeBlock编辑器,为开发者们提供了对多种编程语言的内置支持,同时也会为这些语言提供丰富的代码补全和导航功能。
需要下载的工具:
CodeBlock
MingGW
免费下载地址 【CodeBlock +MingGW + Proteus 8.8(菜鸟直接安装版,且仿真不闪退)】
(访问密码:9781) -
表达式求值(数据结构栈,c语言版)
2021-07-24 20:23:38严蔚敏数据结构(C语言版)第2版,数据结构栈,课本第79页表达式求值实验。一、实验题目
1.案例分析
任何一个表达式都是由操作数(operand)运算符(operator)和界限符(delimiter)组成的,统称它们为单词。一般地,操作数既可以是常数,也可以是被说明为变量或常量的标识符;运算符可以分为算术运算符、关系运算符和逻辑运算符 3 类;基本界限符 有左右括号和表达式结束符等。为了叙述的简洁,在此仅讨论简单算术表达式的求值问题,这种表达式只含加、减、乘、除4种运算符。读者不难将它推广到更一般的表达式上。
下面把运算符和界限符统称为算符。
我们知道,算术四则运算遵循以下 3条规则:
(1)先乘除,后加减;
(2)从左算到右;
(3)先括号内,后括号外。
根据上述 3条运算规则,在运算的每一步中,任意两个相继出现的算符θ1和θ2之间的优先关系,至多是下面 3 种关系之一 :
θ1 < θ2 θ1的优先权低于θ2
θ1 = θ2 θ1的优先权等于θ2
θ1 > θ2 θ1的优先权高于θ2
表 3.1 定义了算符之间的这种优先关系。
由规则(1), 先进行乘除运算,后进行加减运算,所以有 “+” < “*”; “+” < “/”; “*” >"+"; “/” > “+” 等。
由规则(2), 运算遵循左结合性,当两个运算符相同时,先出现的运算符优先级高,所以有"+" > “+”; “-” > “-”; “*” > “*”; “/” > “/”。
由规则(3), 括号内的优先级高,+、-、*和/为θ1时的优先性均低千 (" “但高于 " )”。
表中的 “(” = “)” 表示当左右括号相遇时,括号内的运算已经完成。为了便千实现,假设每个表达式均以"#“开始,以”#" 结束。所以"#" = “#” 表示整个表达式求值完毕。")“与 “(”、"#”与”)" 以及"(“与”#" 之间无优先关系,这是因为表达式中不允许它们相继出现,一旦遇到这种情况,则可以认为出现了语法错误。在 下面的讨论中,我们暂假定所输人的表达式不会出现语法错误。2.案例实现
为实现算符优先算法,可以使用两个工作栈,一个称做OPTR,用以寄存运算符;另一个称作OPND, 用以寄存操作数或运算结果。
3.算法步骤
1.初始化OPTR栈和OPND栈,将表达式起始符“#”压入OPTR栈。
2.扫描表达式,读人第一个字符ch,如果表达式没有扫描完毕至“#”或OPTR的栈顶元素不为“#”时,则循环执行以下操作:
若ch不是运算符,则压入OPND栈,读入下一字符ch;
若ch是运算符,则根据OPTR 的栈顶元素和ch的优先级比较结果,做不同的处理:
若是小于,则ch 压入OPTR栈,读入下一字符ch;
若是大于,则弹出OPTR栈顶的运算符,从 OPND栈弹出两个数,进行相应运算,结果压入OPND栈;
若是等于,则OPTR 的栈顶元素是“(”且ch是“)”,这时弹出OPTR栈顶的“(”,相当于括号匹配成功,然后读人下一字符ch。
3.OPND栈顶元素即为表达式求值结果,返回此元素。4.算法描述
char EvaluateExpression () {//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈 InitStack(OPND); //初始化OPND栈 InitStack(OPTR); //初始化OPTR栈 Push (OPTR,'#') ; // 将表达式起始符"#" 压人OPTR栈 cin>>ch; while(ch!='#' | | GetTop(OPTR) !='#' ) //表达式没有扫描完毕或OPTR的栈顶元素不为"# " { if (!In (ch)) {Push (OPND, ch); cin»ch;} //ch不是运算符则进OPND栈 else switch (Precede (GetTop (OPTR) , ch)) //比较OPTR的栈顶元素和ch的 优先级 { case'<': Push(OPTR,ch);cin>>ch; //当前字符ch压入OPTR栈,读入下一字符ch break; case'>': Pop(OPTR,theta); //弹出OPTR栈顶的运算符 Pop(OPND,b);Pop(OPND,a); //弹出OPND栈顶的两个运算数 Push (OPND, Operate (a, theta, b·)); / /将运算结果压入OPND栈 break; case'=': //OPTR的栈顶元素是"("且ch是")" Pop(OPTR,x) ;cin>>ch; //弹出OPTR栈顶的"(", 读入下一字符ch break; }//switch }//while return GetTop (OPND) ; //OPND栈顶元素即为表达式求值结果 }
算法调用的三个函数需要读者自行补充完成。其中函数In是判定读入的字符ch是否为运算符,Precede 是判定运算符栈的栈顶元素与读入的运算符之间优先关系的函数,Operate为进行二元运算的函数。
二、工具环境
Window10操作系统,Microsoft Visual C++2010学习版 集成开发环境,C语言
三、实验问题
另外需要特别说明的是,上述算法中的操作数只能是一位数,因为这里使用的OPND栈是字符栈,如果要进行多位数的运算,则需要将OPND栈改为数栈,读入的数字字符拼成数之后再入栈。 读者可以改进此算法,使之能完成多位数的运算。
四、实验代码
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 //顺序栈存储空间的初始分配址 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char SElemType; typedef struct { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈可用的最大容量 }SqStack; Status InitStack(SqStack *S);//构造一个空栈s Status Push(SqStack *S,char e);//插入元素e为新的栈顶元素 Status Pop(SqStack *S,char *e);//删除s的栈顶元素,用e返回其值 SElemType GetTop(SqStack S);//返回s的栈顶元素,不修改栈顶指针 Status In(char e);//判断读入字符是否为运算符 SElemType Precede(char a,char b);//比较运算符的优先级,a为纵轴值,b为横轴值 int Operate(int i,char theta,int j);//计算a(theta)b结果 char EvaluateExpression();//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈 int main() { printf("请输入算术表达式,并以#结束(操作数只能是一位数):"); printf("表达式结果是:%d",EvaluateExpression()); return 0; } Status InitStack(SqStack *S) {//构造一个空栈s S->base=(char *)malloc(MAXSIZE*sizeof(char));//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间 if(!S->base) exit(OVERFLOW); //存储分配失败 S->top=S->base; //top初始为base,空栈 S->stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZE return OK; } Status Push(SqStack *S,char e) {//插入元素e为新的栈顶元素 if(S->top-S->base==S->stacksize) return ERROR; //栈满 *S->top++=e; //元素e压入栈顶,栈顶指针加1 return OK; } Status Pop(SqStack *S,char *e) {//删除s的栈顶元素,用e返回其值 if(S->top==S->base) return ERROR; //栈空 *e=*--S->top; //栈顶指针减1,将栈顶元素赋给e return OK; } SElemType GetTop(SqStack S) {//返回s的栈顶元素,不修改栈顶指针 if(S.top!=S.base) //栈非空 return *(S.top-1); //返回栈顶元素的值,栈顶指针不变 } Status In(char e) {//判断读入字符是否为运算符 if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#') return OK;//是 else return ERROR;//不是 } SElemType Precede(char a,char b) {//比较运算符的优先级,a为纵轴值,b为横轴值 char f; if(a=='+'||a=='-') { if(b=='+'||b=='-'||b==')'||b=='#') f='>'; else if(b=='*'||b=='/'||b=='(') f='<'; } else if(a=='*'||a=='/') { if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#') f='>'; else if(b=='(') f='<'; } else if(a=='(') { if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(') f='<'; else if(b==')') f='='; } else if(a==')') { if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#') f='>'; } else if(a=='#') { if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(') f='<'; else if(b=='#') f='='; } return f; } int Operate(int i,char theta,int j) {//计算a(theta)b结果 int result; switch(theta) { case '+': result = i + j; break; case '-': result = i - j; break; case '*': result = i * j; break; case '/': result = i / j; break; } return result; } char EvaluateExpression() {//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈 SqStack OPND,OPTR; int ch; //把读入的字符转换为整数型,即ASCII表值 char a,b,theta,x; //ch为当前读入字符, theta为运算符,x仅仅只是变量寄存弹出值,对计算表达式无影响 InitStack(&OPND); //初始化OPND栈,寄存操作数和运算结果 InitStack(&OPTR); //初始化OPTR栈,寄存运算符 Push(&OPTR,'#'); ch=getchar(); while(ch!='#'||GetTop(OPTR)!='#') { printf(" %c\n",ch); if(!In(ch))//ch不是运算符则进OPND栈 { ch=ch-48;//数字字符转换为对应整数 Push(&OPND,ch); ch=getchar(); } else { switch(Precede(GetTop(OPTR),ch)) {//优先级选择 case '<': Push(&OPTR,ch); ch=getchar(); break; case '>': Pop(&OPTR,&theta); Pop(&OPND,&b); Pop(&OPND,&a); Push(&OPND,Operate(a,theta,b)); break; case '=': Pop(&OPTR,&x); ch=getchar(); break; } } } return GetTop(OPND); }
-
C语言实现类
2017-03-24 19:05:37学习嵌入式,C语言是必须学习的一门语言,C语言在设计之初是为了提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言不光提供了许多低级处理的功能... -
SpringBoot将配置文件的值加载到工具类的静态变量中(多环境运行加载)
2020-06-22 17:30:35一.首先创建一个SpringBoot项目 项目结构: 创建pom文件,映入maven工程依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=... -
C语言实验报告
2021-05-22 10:17:59熟悉C语言运行环境,了解和使用Visual C+ 6.0集成开发环境;2.熟悉Visual C+ 6.0环境的功能键和常用的功能菜单命令;3.熟悉C语言程序的书写格式和C语言程序的结构;4.熟悉C语言的上机步骤,以及编辑、编译和运行一..... -
C语言之程序环境和预处理
2022-03-05 15:42:34在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。 二. 详解编译+链接 1.翻译环境 组成.. -
C语言(一):C语言概述介绍
2020-10-06 00:55:331.1 什么是C语言 1.2计算机介绍 1.2.1计算机结构组成 1.2.2计算机系统组成 1.2.3程序和指令 1.3 语言发展历程 1.3.1 机器语言 1.3.2汇编语言和编译器 1.3.3高级语言 1.3.4语言的层次 1.3.5语言进化史 1.4... -
VC++6.0环境下调试c语言代码的方法和步骤_附图
2018-08-13 11:55:121.C语言程序四步开发步骤 (1)编辑。可以用任何一种编辑软件将在纸上编写好的C语言程序输入计算机,并将C语言源程序文件*.c以纯文本文件形式保存在计算机的磁盘上(不能设置字体、字号等)。 -
环境变量path的值超过1023字符。无法设置该值。
2014-12-03 22:20:21环境变量path的值超过...还有一类软件可能在电脑上重复的安装,这样就会有重复的环境变量在path中,这样就会有无用的环境变量的产生。这些无用的环境变量都占用了path环境变量的字符,但是却毫无用处,删除就可以了。 -
C语言基础知识入门(大全)
2021-05-11 18:34:11一.C语言入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级... -
eclipse配置c/c++开发环境
2018-07-13 15:48:21笔记:1、eclipse已安装成功,并且配置了JDK,可以运行java文件。2、安装MinGW(C/C++编译器),MinGW官网下载地址:... 配置环境变量:正常情况下配path变量即可,为防... -
计算机二级C语言复习第*周
2021-05-20 09:03:56本周概念总结:第*周(一):1. C语言程序分函数编写,函数又由语句组成。2. main函数有且只有一个,是程序的入口和出口。3. 每条语句结尾必须有一个“;... 用C语言编写的程序,称为C语言源程序(*.c)。需... -
华为C语言编程规范(精华总结)
2020-03-24 09:48:555、禁止头文件循环依赖 头文件循环依赖,指a.h包含b.h,b.h包含c.h,c.h包含a.h之类导致任何一个头文件修改,都导致所有包含了a.h/b.h/c.h的代码全部重新编译一遍。而如果是单向依赖,如a.h包含b.h,b.h包含c.h,而... -
你必须知道的495个C语言问题
2015-05-08 11:09:25如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 1.32 下面的代码为什么不能编译?intf(){chara[]="Hello,world!";} *1.33 下面的初始化有什么问题?编译器提示“invalidinitializers”或其他信息。... -
【C/C++】C语言特性总结
2019-08-10 16:21:28之前都是在Windows环境下学习,这次把重心放在Linux环境下,这次的复习源于基础,但是要高于基础。 文章目录工具gcc编译器VS2019C语言编译过程C语言代码主体必要内容C语言数据类型关键字常量变量进制表示s... -
程序员C语言快速上手——环境准备篇(一)
2019-05-24 18:54:49大多数人在Windows上使用Visual Studio IDE作为C语言学习环境,实际上我认为这是非常错误的做法。每个人都有各自的理由,比如学校是这么教的,要保持和课堂同步,又比如要做毕设等等,还有貌似合理的更高级说法,... -
动态改变枚举类的枚举值,配置方式实现枚举
2019-09-02 18:04:57生产环境中需要枚举类来定义一些常量,但是又希望不用修改代码来新增这些常量。 修改代码又涉及到版本发布,特别麻烦,于是想着通过配置文件的方式来实现枚举项的改变 代码结构 接下来逐个类看看 TestEnum... -
c语言tab什么意思_C语言入门 — 一篇最全的C语言基础知识。
2020-11-20 13:14:54c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界...hello world(最简单的一个例子)注:在最新的C标准中,main函数前的类型为int而不是voidc语言的结构简单来说,一个C程... -
Linux环境下——C语言聊天室项目
2018-07-18 15:24:02本程序默认第一个用户即ID为1的用户为超级管理员。 由于线程阻塞,最后的踢人操作有阻塞,需要在被踢出在线链表后手动下线。 看了老师给的颜色控制命令之后,再也不想print白色的字了。。。 聊天室项目编写时... -
C语言 :UI 窗口类程序
2020-03-28 14:20:48Windows C UI 窗口界面 */ #include<Windows.h> //消息回调函数声明 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR ... -
C语言初阶——手把手教零基础/新手入门(一万字心得笔记)
2021-12-25 16:51:37这是一篇为C语言学习新手倾注心血的学习&&心得笔记,零基础看完它也能看得懂代码!欢迎交流 -
C语言字符分类函数
2017-11-27 20:39:06百科:https://baike.baidu.com/item/ctype.h/8497240?fr=aladdin https://www.cnblogs.com/haomiao/p/6128459.html#include<ctype.h>//头文件... int isalnum(int c):检查字符是否为数字或字母;(0~9,a~z,A~Z) -
C语言高级-存储类、作用域、生命周期、链接属性
2022-03-24 09:02:27一个变量的存储类属性就是描述这个变量存储在何种内存段中; 作用域 对以下函数进行解读 如图可知虽然在for循环内部定义了a,但是在函数外部定义的a++还是显示错误,显示没有定义;这就是作用域的问题! 生命... -
c语言学习之基础知识点介绍(一):输出语句和变量简单介绍
2021-05-21 02:48:55c语言的代码块:定义:每个{}就是一个代码块。注意:{}代码块中定义的变量,代码块外不可以访问。原因:除了代码块之后,代码块内部定义的变量就会被回收。代码块中可以定义代码块外中已存在的变量。... -
13 万字 C 语言从入门到精通保姆级教程2021 年版
2021-06-07 12:25:0113 万字C语言保姆级教程,从入门到精通。 -
50道C-C++编程练习题程序.rar
2020-06-22 20:22:34使用C/C++两种语言完成50道题目,体会两种语言之间的不同。编译环境都是在VS2019。题目内容可以参考我的博客。这里都是可以直接运行的cpp文件,每道题目有C语言,c++两种解答。 -
一文搞懂图像二值化算法
2021-03-25 12:56:14图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。 -
从汇编和底层的角度看c和类c语言
2015-12-29 22:55:21版权所有John Black,转载时记得附上标上原文地址,写那么多我也不容易。。...1.众所周知用任意一高级语言(不是脚本语言)写的代码都要经过类似:预处理->编译成汇编代码(compilation)->汇编(as