C++ 案例指导(1)C++程序设计概述
来源:互联网 发布:歼20 f35 知乎 编辑:程序博客网 时间:2024/06/06 02:49
0. 语言概念
计算机语言
语言是一套具有语法、词法规则的系统。计算机语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行。
指令系统
指令是计算机可以识别的命令。一台计算机硬件系统能够识别的所有指令的集合,称为它的指令系统。
机器语言
由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。
汇编语言
将机器指令映射为一些可以被人读懂的助记符,如ADD和SUB等。
高级语言
高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定含义的数据命名和容易理解的执行语句。
1. C++与C的联系与区别
C++ 继承了C,并支持面向对象的程序设计。除增加了类以外,C++还对C的其它方面做了扩充和更新:
1.C++使用IO流类库实现输入输出功能,C语言的IO函数也仍然可以使用。
2.C++程序中调用某个函数之前需要声明函数的原型。
3.C++中函数的参数可以采用默认值。
4.C++增加了引用类型、布尔类型。
5.C++中常用内联函数来代替#define宏。
6.C++中变量和对象可以在需要的地方声明,不必全部写在程序开始的位置。
7.C++充许函数重载,C不充许。
8.C++用new 操作代替C中的malloc()函数,用delete操作来代替free()函数。
9.C中说明结构体变量需要带有关键字struct,关键字是不可少的。但是在C++中,结构体名就是类型名,是一种自定义类型,可以省略关键字struct而只用结构体名来声明变量。对于枚举类型也是一样。
在C++中充许使用作用域运算符::
在C++中充许声明一个无参数的函数
C++程序的主函数返回类型要求是int,如果不写return语句,则自动返回0.
2. C++、Java 和 C #的区别
C++、Java和C#的主要区别在于三者运用的计算环境的类型不同。创建C++是为特定类型的CPU和操作系统编写高性能的程序。Java和C#的开发则是为了满足因特网的联网环境下特殊的编程需求。Internet连接许多不同类型的CPU和操作系统。因此,创建跨平台、可移植程序的能力就称为最重要的特征。第一种满足这种特性的语言是Java,Java编写的程序可以在Internet上自由地传递。然而,Java程序的执行速度要比C++慢得多,这也是可移植性好的代价。C#也是如此。因此,如果要创建一个高性能的程序,建议使用C++。如果需要创建一个可移植性高的程序,那么就应该使用Java和C#.归根结底,C++、Java和C#是为解决不同类型问题而设计的。
3. Java和C#为何能够实现跨平台使用,而C++不能?
Java和C#可以创建跨平台、可移植的程序,而C++不能,这是由于编译器生成的对象代码类型不同造成的。在C++编译环境中,编译器输出的是机器代码,可以由CPU直接执行。因此,它受限制于特定的CPU和操作系统。如果要在不同的系统上运行C++程序,则需要在当前系统下将程序重新编译成针对该环境的机器代码。
Java和C#的跨平台、可移植程序是通过伪代码实现的,即以一种中间语言翻译来实现。在Java环境中,这种中间语言称为字节码。在C#中称为微软中间语言。伪代码都是由运行时系统执行的。对于Java,这种运行时系统称为Java虚拟机(Java Virtual Machine,JVM)C#中称为公共语言运行时(Common Language Runtime CLR)因此,Java程序可以运行在任何使用JVM的环境中,而C#程序可以运行在任何实现了CLR的环境中。因为Java和C#虚拟机的运行会产生一定的系统开销,而C++程序无需这些开销,故C++程序通常要比使用Java和C#编写的程序执行得快一些。
4. 面向对象程序设计方法中基础概念
对象
面向对象方法中的对象是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。属性是用来描述对象静态特征的数据项,行为是用来描述对象动态特征的操作序列。
类
面向对象方法中的“类”是具有相同属性和行为的一组对象的集合。它为属于该类的全部对象提供了抽象的描述,其内部包括属性和行为两个主要部分。类与对象的关系犹如模具和铸件之间的关系,一个属于某类的对象称为该类的一个实例。
封装
封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。
继承
继承是面向对象技术能够提高软件开发效率的重要原因之一,其定义是:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
多态性
多态性是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。
5. 计算机信息存储与表示
计算机内部的信息可以分成两大类:计算机加工的对象是数据信息,而指挥计算机操作的是控制信息。
信息的单位通常采用位,字节和字。
位(b):表示一位二进制信息
字节(B):一个字节由8位二进制数字组成(1B = 8b)
字(word):字是位的组合,并作为一个独立的信息单位处理。字又称为计算机字,它的含义取决于机器的类型、字长以及使用者的要求。常用的固定字长有8位、16位、32位等。
西文字符的最流行的编码方案是ASCII码。ASCII码用一个字节中的7位二进制数来表示一个字符,最多可以表示27= 128个字符。
用于表示字符的还有另一种EBCDIC码(Extended Binary Coded DecimalInterchange Code),采用8位二进制表示,因此有28 = 256个编码状态。
目前的汉字编码方案最流行的是GB2312-80标准。是二字节码,用两个7位二进制数编码表示一个汉字。
(1) 负数在计算机内如何表示?
计算机能够表示的只有“0”和“1”构成的编码,因此有符号数的符号也要通过二进制编码表示。正整数无需编码,始终以二进制绝对值的形式存储。对负数的常用编码需要引入原码、反码和补码的概念。
原码:是一种计算机中对数字的二进制定点表示方法。但是“0“的表示不唯一,在进行四则运算时,对符号位要单独处理,使得减法运算不方便。
反码:由原码求反得到,是由原码求补码的中间结果,通常并不直接使用。
补码:由反码加1得到。“0“的表示惟一,减法可以方便地转换为加法运算。
正数的原码、反码和补码是一模一样的!
负数的补码是反码的最末位加1得到的,即负数的补码就是原码取反(取反时符号位不变!)加1.
必须要指出的是补码运算的结果也是补码,还要把它算到原码才得到最后的结果。那么知道补码后,怎么计算出原码?很简单,就是对补码再求补码就是原码了。
例如:10 – 67 = ? 10 的原码是0000 1010 正数原补反相同,所以补码和原码一样。 -67的原码是 1100 0011,补码是 1011 1101. 两个补码相加是 1100 0111 这个运算结果是最终结果的补码形式(即补码运算的结果还是补码),求原码要对这个补码再求补码,取反加1后就是 1011 1001 即-57.
负数原码变反码,反码变补码过程中的取反操作中,符号位始终保存不变,不进行取反操作!
(2) 小数在计算机内如何表示?
在计算机中通常都采用浮点方式表示小数,由尾数、阶码两部分组成。尾数和阶码都是带符号的数,可以采用不同的码制表示法。存储格式如下:
阶码符号阶码尾数符号尾数6. 程序开发术语和过程
其中,翻译程序包括:汇编程序、编译程序和解释程序三种类型!
7. 案例指导:多种数制转换程序
案例解析
本案例编写一个函数Transform(intn , int base)将一个十进制数转换成二~九进制、十六进制和三十二进制数。其中n为十进制数,base为进制的基数。转换的方法为以n不断除以base取余数,将余数序列反序输出即可。
代码注解
#include <iostream>using namespace std;void Transform(int n ,int base){ //buffer[20]是用来保存余数的缓冲数组 i和j都是循环用的指示标记,变量m用来接收传入的十进制值n int buffer[20],i=0,j,m=n; do { i++; buffer[i]=m % base; //保存余数 m = m /base; }while(0 != m); cout<<"* *"<<n<<"转换为"<<base<<"进制的结果:"; for(j = i; j >= 1; j--)// 将余数反序输出 { if(10 > buffer[j])//如果是0~9则直接输出 { cout<<buffer[j]; } else { cout<<char(buffer[j]+'A'-10);//如果是大于9的数字,则转化为字符输出 } } cout<<endl;}int main(){ int n, choice; cout<<"输入一个整数:"; cin>>n; do { cout<<"输入需要转换的进制:2-9,16,32(输入0退出)"; cin>>choice; switch(choice) { case 2:Transform(n,2);break; case 3:Transform(n,3);break; case 4:Transform(n,4);break; case 5:Transform(n,5);break; case 6:Transform(n,6);break; case 7:Transform(n,7);break; case 8:Transform(n,8);break; case 9:Transform(n,9);break; case 16:Transform(n,16);break; case 32:Transform(n,32);break; case 0:break; default: cout<<"输入错误"<<endl;break; } }while(0 != choice); return (0);}
调试运行
注:本例程中关键点主要有两个
1.是两个进制之间转换如何实现:进制转换实际就是求余!(对整数而言)
2.就是如何将求得的余数反序输出:实际上是利用数组的小标i,向前递增来存储,而后递减就是反序输出。
备注:进制的转换分析
大家应该知道比较常用的数制是十进制、二进制、八进制和十六进制。二进制就是逢二进一,每位都是小于二的数,其他进制类推。计算机存储数据使用的是二进制编码。
对于一个R进制的数X来说,其值可以通过下面的公式算出来:,前面是整数部分,后面是小数部分,m,n为正整数,表示第i位上的数字乘以进制数的i次方。比如二进制数(11.01)2=1×21+1×20+0×2-1+1×2-2=3.25。当R进制转换到十进制时,就这样转换。
那十进制怎么转换为R进制呢,可以将十进制数连续除以R,其每个余数就是R进制数各个数位上的数字,最后的余数是最高位。比如将68转换成二进制数,用除2取余法:
2∟68 余数
2∟34…………………0 低位
2∟17…………………0
2∟8 …………………1
2∟4 …………………0
2∟2 …………………0
2∟1 …………………0
0 …………………1 高位
结果就是6810 =10001002,将68转换为八进制数就用除8取余法。
十进制小数转换成R进制小数,整数部分仍按上述方法转换,小数部分则乘以R,然后将结果的整数位取出作为转换最终结果的一位,再用去掉整数位的小数再乘以R,之后循环这样执行,直到小数部分为0或者达到所要求的精度为止,取出的这些整数位第一位为最高位。例如,将十进制小数0.3125转换成二进制小数:
0.3125×2 = 0.625 取出0,为最高位
0.625×2 = 1.25 取出1,剩下的小数为0.25
0.25×2 =0.5 取出0
0.5×2 =1.0 取出1,小数位为0,不再继续
结果就是0.312510 =0.01012。所以将十进制数68.3125转换成二进制数就是1000100.0101。
二进制和八进制十六进制之间怎样转换呢?每位八进制数相当于三位二进制数,每位十六进制数相当于四位二进制数,举个例子说明下就清楚了:
(1000100)2=(1 000 100)2=(104)8
(1000100)2=(100 0100)2=(44)16
上面这个等式反过来当然也成立,就是八进制十六进制转换为二进制反过来计算就可以了。
参考来源
http://www.jizhuomi.com/software/21.html
- C++ 案例指导(1)C++程序设计概述
- C程序设计-C语言概述
- C程序设计题解与上机指导
- C程序设计(1)
- C语言程序设计案例精编----ping程序设计
- C语言程序设计案例精编----UDP程序设计
- 【初级C语言】简单的程序设计案例
- c程序设计题解与上计指导(第三版 ) 谁有下载链接?
- C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码
- C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码 第四章
- C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码第五章
- C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码第六章
- C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码第七章
- C语言及程序设计初步例程-46 小小型应用系统开发指导(一)
- C语言及程序设计初步例程-47 小小型应用系统开发指导(二)
- C语言及程序设计提高例程-15 小小型应用系统开发指导(三)
- C语言及程序设计提高例程-40 小小型应用系统开发指导(四)
- windows程序设计中的HEXCALC.c 程序的一些难点指导
- python得subprocess模块
- vs2012 error LNK2038 RuntimeLibrary 不匹配的解决
- Linux 补丁(patch)的制作和使用
- IT学子成长指导类文章链接(四)
- Java的内存泄漏
- C++ 案例指导(1)C++程序设计概述
- 浅谈矩阵分解以及应用(3)
- linux进程调度浅析
- 让WINDOWS命令行像LINUX一样
- HOWTO: Be more productive
- ECMS反馈发送邮箱文档
- Linux下的管道编程技术
- SERVICE后台服务进程的自启动和保持
- c语言使用free函数之后