现在的位置: 首页 > 综合 > 正文

C++ 案例指导(1)C++程序设计概述

2013年04月07日 ⁄ 综合 ⁄ 共 5192字 ⁄ 字号 评论关闭

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来说,其值可以通过下面的公式算出来:,前面是整数部分,后面是小数部分,mn为正整数,表示第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

 

抱歉!评论已关闭.