
高等程序设计
文章平均质量分 69
使君杭千秋
这个作者很懒,什么都没留下…
展开
-
C++中static关键字用法详解
概述static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。最后一节加入了c++面向对象中static的使用特性,当作拓展阅读。在程序中使用static变量1. 局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局...转载 2021-04-19 21:58:09 · 616 阅读 · 0 评论 -
内联函数详解
一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。下面我们来看一个例子:#include<iostream> using names原创 2021-04-19 16:56:24 · 4291 阅读 · 1 评论 -
C++值传递、指针传递、引用传递的区别
值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参转载 2021-04-19 15:59:14 · 411 阅读 · 0 评论 -
C++中指针和引用区别
一、概念指针 对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。 见下图,所示指针的含义:引用 引用是一个对象的别名,主要用于函数参数和返回值类型,符号T&表示T类型的引用。 见下图,所示引用的含义:二、指针和引用的区别是否需初始化 首先,引用不可以为空,但指针可以为空。 ...原创 2021-04-18 21:13:34 · 273 阅读 · 0 评论 -
全局变量与局部变量的作用域问题
作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量。 在函数参数的定义中声明的变量,称为形式参数。 在所有函数外部声明的变量,称为全局变量。 C++程序的每一个名字,不论是变量名,函数名,类的名字等,都是有作用域的。大名鼎鼎的std就是标准命名空间,OpenCV有cv空间;是为了防止变量名称混淆而设置的作用域的一种。一个作用域是是用{ } 包起来的代码片段,变量在这个 { } 中声明的,也就只在这个作用域中发挥功效。原创 2021-04-18 12:37:03 · 710 阅读 · 0 评论 -
new和malloc的区别(详细)
1. 申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。 那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operato转载 2021-04-18 11:50:56 · 7514 阅读 · 0 评论 -
深拷贝与浅拷贝、深复制与浅复制
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。假设B复制了A,修改A的时候,看B是否发生变化:如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释原创 2021-04-18 10:52:44 · 660 阅读 · 0 评论 -
STL之vector去重三步曲(利用unique函数)
unique()函数作用是“去掉”容器中相邻元素的重复元素,然后返回指向第一个重复元素的迭代器。unique()实质上是一个伪去除,它并不是真正把重复的元素删除,而是用不重复的元素把重复的元素覆盖了,所以总长度其实是不变的。 因此在利用unique()函数前需要对容器内的数据排序,可以通过sort()函数实现。sort()函数的作用是对容器指定范围内的元素按指定格式进行排序,默认从小到大。 在利用unique()函数后需要擦除从返回的迭代器对于的元素到最后元素的...原创 2020-10-09 18:32:43 · 2093 阅读 · 0 评论 -
多线程编程中锁的种类与应用举例
多线程中锁的种类与应用举例 线程之间的锁种类大致有以下几种:互斥锁、条件锁、自旋锁(不推荐使用)、递归锁、读写锁(C++17封装入标准库,开始支持,其余均为C++11标准)。一般而言,锁的功能越强大,性能就会越低。一、互斥锁 互斥锁用于控制多个线程对共享资源互斥访问的一个信号量。可以避免多个线程再某一时刻同时操作一个共享资源。 在某一时刻,只能有一个线程可以获取互斥锁,在释放互斥锁之前其他线程都不能获取该互斥锁。如果其他线程想要获取这个互斥锁,则线程只能以...原创 2020-10-07 21:58:05 · 977 阅读 · 0 评论 -
数据结构:内排序(C++)
数据结构:内排序一、插入排序基本思想:逐个处理待排序的记录。每个新记录与前面已排序的子序列进行比较,将它插入到子序列中正确的位置。排序过程:(1)输入一个记录数组A,存放着n条记录。(2)先将数组中第1个记录看成是一个有序的子序列,然后从第2个记录开始,依次逐个进行处理(插入)将第i个记录X,依次与前面的第i-1个、第i-2个,…,第1个记录进行比较,每次比较时,如果X的值小,则交换,直至遇到一个小于或等于X的关键码,或者记录X已经被交换到数组的第一个位置,本次插入才完成。(3)继续处理,直至原创 2020-08-06 10:55:43 · 604 阅读 · 1 评论 -
数据结构/图论:最小生成树问题
数据结构/图论:最小生成树问题一、问题描述图的生成树是一个包含所有顶点的子图并且是一棵树。一个图可能有很多生成树。生成树问题是网络理论解决的典型问题之一,应用领域非常多。应用:使连接电路板上一系列接头所需焊接的线路最短;使在几个城市间建立电话网所需的线路最短。二、算法实现1、Prim算法算法思想:Prim算法是一个贪心算法。取图中任意一个顶点v作为生成树的根,之后往生成树上添加新的顶点w。在添加的顶点w和已经在生成树上的顶点v之间必定存在一条边,并且该边的权值在所有连通顶点v和w之间的边中取值原创 2020-08-04 12:36:44 · 536 阅读 · 0 评论 -
数据结构/图论:最小路径问题
数据结构/图论:最小路径问题一、分类最短路问题( short- path problem)是指若网络中的每条边都有一个数(权)值(长度、成本、时间等),则找出两节点之间总权值和最小的路径就是最短路问题。●最短路径问题的分类:已知全局信息的最短路径问题已知局部信息的最短路径问题●最短路径问题的分类:无权图中最短路径有权图中的最短路径含有负边的有权图中的最短路径●最短路径问题的分类:单源最短路径全局最短路径两点最短路径二、算法实现1、Dijkstra算法解决问题类型:单源最短路径原创 2020-08-04 11:14:00 · 1443 阅读 · 0 评论 -
几种常见语言中if条件语句的格式
几种常见语言中if条件语句的格式C/C++if(表达式 1) 语句 1;else if(表达式 2) 语句 2;else if(表达式 3) 语句 3;...else 语句 n;Javaif(条件 1){ 语句 1;}else if(条件 2){ 语句 2;}else if(条件 3){ 语句 3;}...else{ 语句 n;}Pythonif 条件 1: 语句 1elif 条件 3: 语句 2elif 条件 2: 语句 3...e原创 2020-08-02 11:42:39 · 2476 阅读 · 0 评论 -
类的多态性:成员变量与成员方法访问特点(C++、Java)
类的多态性:成员变量与成员方法访问特点(C++、Java)1.C++与Java语言中类的多态格式为:C++:父类名称 &引用对象名 = 子类名称 对象名Java:父类名称 对象名 = new 子类名称2.对成员变量与成员方法(函数)访问特点一致,规律如下:对于成员变量,代码编译和执行时都看父类,以父类为依据(有无及值以父类为标准);对于成员方法,编译时以父类为依据(父类无则编译报错),执行时以子类为依据(执行子类方法),但前提是子类必须对方法进行重载,在C++中父类函数还必须为虚函数。原创 2020-07-31 11:15:23 · 946 阅读 · 0 评论 -
递归求解汉诺塔问题(C++)
汉诺塔问题【问题描述】Hanoi(汉诺)塔问题。这是一个经典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64 个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在E移动过程中可以利用B座,要求编写程序打印出若只有n个盘子时移动的步骤。【问题分析】1.假设最开始A座上有n个盘子,如果我们能够将最下面的盘子通过B座移到C座上,则我们只需要再把A座上的n-1个盘子全部挪到C原创 2020-07-21 18:07:43 · 823 阅读 · 0 评论 -
简易RAM的C++实现
简易CPU的C++实现本文通过C++程序设计语言实现了一个简易的RAM,具有数据读写功能。#include <stdio.h>#define memsize (4096)typedef int word;union dataunion { char c[sizeof(double)]; double d; float f; long l; int i; short s;} datarray;char mem[memsize];char readbyte(unsigne原创 2020-07-21 17:29:50 · 560 阅读 · 0 评论 -
简易CPU的C++实现
简易CPU的C++实现本文通过C++程序设计语言实现了一个简易的CPU,具有数据存取及简单的ALU功能。#include <stdio.h>#include <stdint.h>#include<iostream>using namespace std;#define OPALU 0#define OPLW 35#define OPSW 43#define OPBEQ 4#define OPJ 2#define FNADD 32#def原创 2020-07-21 17:26:04 · 922 阅读 · 0 评论 -
研究生信息管理系统(C++实现)
研究生信息管理系统(C++实现)设计一个研究生基本信息管理系统,实现对不同学制的研究生包括:学术硕士和工程硕士的信息管理。定义一个基本的研究生类,基本信息包括:学号、姓名、性别、年龄、课程成绩。派生出学术硕士类,增加的属性包括:专业,发表论文(名称与级别(1、2、3)),可以多篇,最多3篇),论文成绩,总成绩。工程硕士增加的属性包括:领域,参与项目(名称与级别(A,B,C)),项目成绩,总成绩。计算方式如下学术硕士论文成绩计算:各个级别的论文得分为:级别10,每个学生论文最高90分。总成绩=课程成绩0原创 2020-07-21 17:22:13 · 2232 阅读 · 2 评论 -
输入流控制:几种清除输入流中空格或回车的常用函数
cin.clear()、cin.sync()和 cin.ignor()的用法一、cin.clear()、cin.sync()cin.clear()是用来更改cin 的状态标示符的。cin.sync()是用来清除缓存区的数据流的。如果标示符没有改变那么即使清除了数据流也无法输入。所以两个要联合起来使用。例如:#include<iostream>using namespace std;int main(){ int a; cout<<"输入一个字母:"<<原创 2020-07-21 14:46:43 · 1503 阅读 · 0 评论 -
字符串输入控制:与空格、回车的输入相关的几种函数
cin、cin.getline()、getline()的用法主要内容:1、cin 用法2、cin.getline()用法3、getline()用法4、注意的问题一、cin>>用法 1:输入一个数字或字符#include <iostream>using namespace std;int main (){ int a,b; cin>>a>>b; cout<<a+b<<endl;}用法 2:接收一个字符串原创 2020-07-21 14:32:36 · 1247 阅读 · 1 评论