程序设计基石与实践
文章平均质量分 70
通过对程序设计基础理论、抽象思维,和结合实践开发中遇到问题进行学习与实践。
松子茶
关注数字图像处理,数据隐藏与信息隐藏,计算机视觉和机器学习...
展开
-
C++函数对象的应用
这个类的del函数应该如何实现呢?如果节点是new出来的,我们得delete;如果是malloc出来的,我们得使用配套的free。否则,行为就是undefined。而且,用户还可能实现了自己的定制的内存分配回收例程。我们并不知道该内存是如何分配得到的。这就是问题所在。解决方法是让用户将正确的、对应的、适配的资源释放例程传递进来,关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2016-08-13 11:41:36 · 1265 阅读 · 0 评论 -
C++中的static const
所用的环境是gcc 4.8.2 (Ubuntu 14.04 , X86平台)。注意,本文的讨论只针对类的static const成员,也就是所谓的class scope。namespace scope的情况不属于我们的讨论范围内。关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea原创 2016-08-12 15:20:22 · 1370 阅读 · 0 评论 -
空指针(NULL)那些事?
我们常常被告知,使用指针前需要判断是否为NULL;如果是NULL而你去使用它就会出问题。真相果真是这样吗?关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea原创 2016-08-12 15:13:36 · 1687 阅读 · 0 评论 -
C++名称空间
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情况中。原创 2016-05-14 11:23:02 · 3427 阅读 · 0 评论 -
传统的错误处理方法
#include #include using namespace std;class Rainbow{ public: Rainbow(){ cout<<"Rainbow()"<<endl; } ~Rainbow(){ cout<<"~Rainbow()"<<endl; }};jmp_buf kansas;void oz(){ Rainbow原创 2016-04-29 15:41:06 · 1683 阅读 · 0 评论 -
关于变量的讨论程序
程序如下:#include #include using namespace std;//No initializationvoid Task1(){ int num; cout << num << endl;}//Different data typevoid Task2_1(){ int a = 2; float b = 2; co原创 2016-04-29 15:33:40 · 1580 阅读 · 0 评论 -
修改外部对象
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的.关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2016-04-22 13:16:57 · 2192 阅读 · 0 评论 -
指针简介
我们从一个简单的程度开始://// main.cpp// Pointers//// Created by LiuGavin on 4/12/16.// Copyright © 2016 GavinPSU. All rights reserved.//#include using namespace std;int dog,cat,bird,fish;void f(原创 2016-04-12 14:41:32 · 2619 阅读 · 0 评论 -
变量声明
变量声明告知编译器变量的外表特征,包含函数类型、函数名、参数列表和一个分号。例如:int a;可以声明变量 a就一个整数,这符合上面的逻辑。但这就产生了一个矛盾:这段带码有足够的信息让编译器为整数a分配空间,而且编译器也确实给整数a分配空间,要解决这个矛盾,对于C/C++要一个关键字来说明“这只是一个声明,它的定义在别的地方”。这个关键字是extern,它表示变量是在文件以外定义的,或文件后面部分原创 2016-03-20 18:46:06 · 1663 阅读 · 0 评论 -
程序设计基石与实践系列之编写高效的C程序与C代码优化
原文出处: codeproject:Writing Efficient C and C Code Optimization虽然对于优化C代码有很多有效的指导方针,但是对于彻底地了解编译器和你工作的机器依然无法取代,通常,加快程序的速度也会加大代码量。这些增加的代码也会影响一个程序的复杂度和可读性,这是不可接受的,比如你在一些小型的设备上编程,例如:移动设备、PDA……,这些有着严格的内存限制,于翻译 2016-02-18 22:01:47 · 4771 阅读 · 0 评论 -
程序设计基石与实践系列之按值传递还是按引用
从简单的例子开始.假设我们要交换两个整形变量的值,在C/C++中怎么做呢?我们来看多种方式,哪种能够做到.void call_by_ref(int &p,int &q) { // 可以交换的例子 int t = p; p = q; q = t;} void call_by_val_ptr(int * p,int * q) { // 不能交换的例子 int *原创 2016-02-11 11:33:16 · 2293 阅读 · 0 评论 -
程序设计基石与实践系列之类型提升、内存分配,数组转指针、打桩和矢量变换
英文出处:Peter Fačka: Guide to Advanced Programming in CC语言可用于系统编程、嵌入式系统中,同时也是其他应用程序可能的实现工具之一。 当你对计算机编程怀有强烈兴趣的时候,却对C语言不感冒,这种可能性不大。想全方位地理解C语言是一件极具挑战性的事。Peter Fačka 在2014年1月份写下了这篇长文,内容包括:类型提升、内存分配,数组转指针、显式内翻译 2016-01-18 21:57:21 · 2637 阅读 · 0 评论 -
程序设计基石与实践系列之C语言函数指针基础
英文出处:Dennis Kubes:Basics of Function Pointers in C本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础。如果你不讨厌事无巨细,请尽情阅读吧。函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具。本文将从C语言函数指针的基础开始介绍,再结合一些简单的用法和关于函数名称和地址的趣闻。翻译 2015-12-18 23:01:01 · 2510 阅读 · 0 评论 -
程序设计基石与实践系列之从开源项目学习C语言基本的编码规则
英文出处:CoderGears Team :Learn basic “C” coding rules from open source projects每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定。一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项目中的每个开发者使用他自己的风格。所有代码都保持一致风格的大型库,更容易让人理解。有许多翻译 2015-11-30 17:08:37 · 1563 阅读 · 3 评论 -
程序设计基石与实践系列之C中的继承和多态
原文出处: CODE PROJECT 1、引言继承和多态是面向对象语言最强大的功能。有了继承和多态,我们可以完成代码重用。在C中有许多技巧可以实现多态。本文的目的就是演示一种简单和容易的技术,在C中应用继承和多态。通过创建一个VTable(virtual table)和在基类和派生类对象之间提供正确的访问,我们能在C中实现继承和多态。VTable能通过维护一张函数表指针表来实现。为了提供基类和派生翻译 2015-11-06 21:59:19 · 2156 阅读 · 2 评论 -
程序设计基石与实践系列之运算符与选择语句编程
运算符与选择语句编程。关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-11-03 20:03:20 · 1725 阅读 · 0 评论 -
程序设计基石与实践系列之失落的C语言结构体封装艺术
英文来源于 Eric S. Raymond-- The Lost Art of C Structure Packing谁该阅读这篇文章本文是关于削减C语言程序内存占用空间的一项技术——为了减小内存大小而手工重新封装C结构体声明。你需要C语言的基本知识来读懂本文。如果你要为内存有限制的嵌入式系统、或者操作系统内核写代码,那么你需要懂这项技术。如果你在处理极大的应用程序数据集,以至于你的程序常常达到内翻译 2015-11-03 13:28:42 · 2341 阅读 · 0 评论 -
程序设计基石与实践系列之写一个C语言编译器
英文出处:Wilfred Hughes:Baby Steps to a C Compiler动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧可用的编译器却不是这么困难。秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去。这个方法也是Abd翻译 2015-10-20 15:19:08 · 2429 阅读 · 0 评论 -
程序设计基石与实践系列之能让你成为Top程序员的十个C语言资源
大多数程序员都是从C开始学习编程的,因为C是用来写操作系统、应用程序最常用的语言。C编程笔记 : 这些是华盛顿实验学院C编程入门课的部分笔记。它们是以《c程序设计语言》的补充笔记(从1995年春开始)为基础修改的,关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.翻译 2015-10-05 09:35:54 · 2031 阅读 · 0 评论 -
程序设计基石与实践系列之C语言程序员必读的5本书
你正计划着通过看书来学习C语言吗?“书籍是人类最忠诚的朋友“。海明威一定知道书籍对一个人一生的重要性。书籍是知识的丰富来源。你可以从书中学到各种知识。书籍可以毫无歧视地向读者传达作者的本意。C语言是由 Dennis Ritchie在1969年到1973年在贝尔实验室研发的。关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.翻译 2015-10-04 11:34:47 · 3866 阅读 · 1 评论 -
程序设计基石与实践系列之成为一名Top的C语言程序员
问题的提出每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇博文里列出一些有关C语言的最佳读物应该能帮到不少人。关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.翻译 2015-10-04 11:32:06 · 2189 阅读 · 0 评论 -
程序设计基石与实践系列之最短的崩溃C语言程序
想写个崩溃的C语言小程序,看起来是个奇怪的主意,不过在我曾经教过的一门实验课上,这是作业之一!实际上,这是一件非常有教学意义的事情。通常学生们要么尝试反向引用一个非法地址,要么就是除0.除0会引发SIGFPE信号(浮点异常)。关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.翻译 2015-10-03 17:15:19 · 2175 阅读 · 0 评论 -
程序设计基石与实践之C语言指针和数组基础
英文出处:Dennis Kubes: 《Basics of Pointers and Arrays in C》。关于C语言中指针和数组的争论就像是一场恶战。一方面,有些人觉得,所有人都必须承认指针与数组是不同的。而另一些人则认为数组被当成指针来处理,因此它们不应该有什么区别。这种现象让人迷惑。然而,这两种说法其实都是正确的。数组不是指针,指针也不能说是数组。关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.翻译 2015-10-02 20:38:31 · 1629 阅读 · 0 评论 -
程序设计基石与实践之C语言内存地址基础
从计算机内存的角度思考C语言中的一切"东西"是挺有帮助的。我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节。比方说我们的电脑有4K内存,那这个内存数组将会有4096(1024X4)个元素。当我们谈论一个存储地址的指针时,就等同于我们在谈论一个存储着该内存数组某个元素索引的指针。逆向引用某个指针,将会得到数组中该索引所指向的值。这一切当然都是谎言。操作系统对内存的管理要远比这复杂。内存不一定连续,也不一定按顺序处理。但前面的类比是一种讨论C语言内存的简单方式。关于程序设计基石与实践更多讨翻译 2015-10-02 09:25:50 · 1934 阅读 · 0 评论 -
程序设计基石与实践专栏引导
本博文主要对通过程序设计基石与实践专栏归类,主要分为C语言与C++语言.下面对程序设计基石与实践专栏博文的索引:(待定未完待续)C语言C语言概述与基本概念C语言概述与特点C语言基本概念运算符和表达式程序的控制结构结构,联合和权枚举数组函数,指针及指针的高级应用指针point 声明C语言声明输入/输出预处理器与错误处理底层程序设计内存里C语言代码布局编写大型程序.关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-10-01 15:52:09 · 2674 阅读 · 0 评论 -
程序设计基石与实践之内存里C语言代码布局
一个程序本质上都是由 BSS 段、data段、text段三个组成的。这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。原创 2015-09-22 08:16:04 · 2029 阅读 · 1 评论 -
【软件设计】模拟经典游戏超级玛丽实现
这个程序模拟的红白机上的经典游戏超级玛丽。MyTimer头文件// 程序名称:精确到微秒的延时类(基于多媒体定时器)#pragma once#include class MyTimer{private: LARGE_INTEGER m_clk;// 保存时钟信息 LONGLONG m_oldclk;// 保存开始时钟和结束时钟原创 2013-05-26 21:31:29 · 6308 阅读 · 0 评论 -
程序设计基石与实践之旋转方阵
问题描述如下所示为一个6x6数字旋转方阵,现给定N值,输出NXN旋转方阵.MxN螺旋矩阵(由内向外). MxN螺旋矩阵(由外向内) 关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-09-03 09:44:27 · 2032 阅读 · 0 评论 -
程序设计基石与实践之实现数字七段显示与发扑克牌问题
数字七段显示问题描述:我们经常看到的计算器上显示的数字,或电梯中显示的表示楼层的数字,实际上都是由7个发光器件组成的.如下所示.当不同器件被点亮时,可组合出不同的数字.你的任务是,对给定的一个整数,按这种形式把给定整数显示出来,并且数字是可以按比例放大的.在字符终端上显示这样的数字时,一个最小数字需占5行3列,所谓"数字是可以按比例放大"包含横向放大和纵向放大.其中,横向放大w倍是指显示数字所占3原创 2015-08-31 17:43:34 · 1559 阅读 · 0 评论 -
程序设计基石与实践之标记控制和计数器控制的循环
一个有10名学生的班级进行了一次测验,测验成绩(1~100中的一个整数)现在都已经出来了.请计算并打印本班学生的总成绩及班级的平均成绩.我们知道,班级的平均成绩等于总成绩除以学生的人数.使用计数器控制的循环以一次一个的方式输入每个学生的成绩.这种方法用一个称为计数器的变量控制一组语句运行次数.在此,给出了一个已完全开发好的伪代码算法以及GradeBook类的一个版本,其中,GradeBook类在一个C++成员函数中实现了算法.关于Program Language更多讨论与交流,敬请关注本博客和新浪微博son原创 2015-01-10 20:35:15 · 2528 阅读 · 0 评论 -
程序设计基石与实践之C++语言接口与实现分离
接口定义并标准化了人和系统等诸如此类事物彼此交互的方式.每个类定义包含了类的公有成员函数的完整定义及其私有数据成员声明.可是更好的软件工程是在类定义的外部定义成员函数,这样这些成员函数的实现细节对客户代码而言隐藏的,这种方式保证程序员不会写出依赖于类的实现细节的客户代码.否则,若类的实现更改,则客户代码将更可能"遭到损坏".关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-01-08 19:44:41 · 2005 阅读 · 0 评论 -
程序设计基石与实践之使用构造函数初始化对象
每一个类都可以提供一个构造函数,用于类对象创建时的初始化.构造函数是一种特殊的成员函数,定义时必须和类同名,这样编译器才能够将它和类的其他成员函数区分开来.构造函数各其他函数之间的一个重大差别是构造函数不能返回值,因此对它们不可以指定返回类型.通常情况下,构造函数声明为public.关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-01-06 23:03:02 · 1757 阅读 · 0 评论 -
程序设计基石与实践之数据成员与set和get函数
在博文<<程序实践:定义具有成员函数的类 >>介绍了GradeBook类表示可供教师管理学生考试成绩的成绩簿,在本博介结具有一个数据成员,一个Set函数和一个 Get函数的GradeBook类 .关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-01-06 22:23:30 · 1799 阅读 · 0 评论 -
程序设计基石与实践之定义具有成员函数的类
现在从一个由GradeBook类和main函数组成的例子说起,此例是一系例循序渐进例子中的第一个,这些例子通过后续博文讲解,最终是一个功能众多的GradeBook类.这里,GradeBook类表示可供教师管理学生考试成绩的成绩簿,而在main函数创建了一个GradeBook对象.main函数使用这个对象和它的成员函数,在屏幕上显示一条欢迎教师进入成绩簿程序的信息.PS:关键字class后跟类名GradeBook.按照惯例,用户定义的类名字以大写字母开头,而且为了增强可读性,类名中每个随后的单词其首字母也为大原创 2015-01-03 16:51:54 · 1707 阅读 · 0 评论 -
程序设计基石与实践之应用多态性的工资发放系统
本博文通过包含了一个公司支付系统中各种雇员情况的一个继承层次来讨论基类和派生类之间的关系.佣金雇员(表示为一个基类对象)的薪水完全是销售提成,带底薪佣雇员(表示为一个派生类的对象)的薪水由底薪和销售提成组成.以及创建一个增强的雇员类层次结构我们使用抽象类Employee表示通常概念的雇员.直接从Employee类派生的是类SalariedEmployee,CommissionEmployee 和HourlyEmployee.而BasePlusCommissionEmployee类又是从CommissionE原创 2014-12-31 23:11:24 · 3925 阅读 · 0 评论 -
程序实践系列之利用2D数组的GradeBook类
介绍类GradeBook,使用一个二维数组存储学生在多次考试所得的成绩.在一个学期中,学生很可能参加多次考试,老师也可能希望分析一个学生或整个班级在整个学期所获得成绩.关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-12-07 13:11:21 · 2843 阅读 · 0 评论 -
程序实践系列(十):C++流和文件流
编写一个程序,输入一系列的数据(学号、姓名、成绩)存放在文件stud.dat中。输出这些学生数据和相应的成绩等级(≥90为优,80~89为良,70~79为中,60~69为及格,≤59为不及格).关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-11-21 20:43:14 · 1847 阅读 · 0 评论 -
程序实践系列(九)多态性和虚函数
设计一个评选优秀教师和学生的程序,其类结构如下图所示。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出来,并采用相关数据进行测试.解析:设计一个基类base,含纯虚函数isgood(),由base类派生出类student和类teacher,分别包含纯虚函数针对学生和教师为优秀的定义。关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-11-07 20:29:13 · 2040 阅读 · 0 评论 -
程序基石系列(十四) 虚析构函数
用一个例子来说明虚析函数的必要性.在程序中,基类A的构造函数动态分配5个字节,其析构函数负责释放这块内存.派生类Z的构造函数动态分配5000个字节,其析构函数负责释放这块内存.由于类A和Z的构造函数与析构函数输出了跟踪信息.通过定义基类的析构函数~A()为虚成员函数,可以确保其派生类的析构函数也为虚成员函数.为了使代码更清晰,我们可以明确地使用关键字virtual来声明~Z(),不过即使我们不这样做,~Z()仍然为虚成员函数,由于析构函数已经声明为虚成员函数,当通过ptr来删除其所指针的对象时,编译器进行的原创 2014-11-06 12:19:22 · 1278 阅读 · 0 评论 -
程序基石系列之C++多态的前提条件
C++中多态(polymorphism)有以下三个前提条件: 必须存在一个继承体系结构. 继承体系结构中的一些类必须具有同名的virtual成员函数(virtual关键字)至少有一个基类类型的指针或基类类型的引用.这个指针或引用可用来对virtual成员函数进行调用.关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-10-31 19:45:13 · 2311 阅读 · 0 评论