有时候,当我孤独地坐着等待生命大门关闭时,一种与世隔绝的感觉就会像冷雾一样笼罩着我。远处有光明、音乐和友谊,但我进不去,命运之神无情地挡住了大门。我真想义正词严地提出抗议,因为我的心仍然充满了热情。但是那些酸楚而无益的话语流溢在唇边,欲言又止,犹如泪水往肚里流,沉默浸透了我的灵魂。然后,希望之神微笑着走来对我轻轻耳语说:“忘我就是快乐。”因而我要把别人眼睛所看见的光明当作我的太阳,别人耳朵所听见的音乐当作我的乐曲,别人嘴角的微笑当作我的快乐。

发布新日志

  • 状态检测防火墙

    2009-07-23 09:36:25

    从网络协议分层的角度,防火墙分为:

    包过滤防火墙

    状态检测防火墙

    应用层防火墙

     

    基于包过滤防火墙,由于不能预先知道报文确切的IP地址和端口信息,往往会开启很多端口,造成无法拦截,或者拦截太多的问题

    基于状态检测的防火墙,规则中允许从内部访问外部,从内部访问外部时,响应的在状态表中添加这条回话信息,包含源IP地址和端口号,目的IP地址和端口号。根据这条状态信息,防火墙允许外部的响应报文进入。回话信息有一个超时值,之后这条回话信息删除。实际中使用的聊天工具,如QQ,MSN等都是这么实现的。 另外,用户很久不在线,还是能收到腾讯给用户发送的信息,这个原因是客户端不到1分钟会主动与服务器联系,刷新回话信息。

    状态监测防火墙不能过滤掉应用层中的特定内容。这个需要应用层防火墙来完成。针对每一种协议,都需要开发一种协议过滤器,比较复杂。

     

  • tcl语言特点

    2009-07-23 07:29:52

    tcl语言属于脚本语言的一种。

    1.1         TCL语言简介

    Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。

    TCL简单易学,功能强大。TCL经常被用于快速原型开发、脚本编程、GUI和测试等方面。

    tool command language的缩写,发音为 "tickle”, 实际上包含了两个部分:一个语言和一个库。

    首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些交互程序如文本编辑器、调试器和shell。它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。

    其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。

    Tcl和其他编程语言例如C不同,它是一种解释语言而非编译语言。Tcl程序由一系列Tcl命令组成,在运行时由Tcl解释器解释运行。

    解释执行的语言因为解释器不需要直接同机器码打交道所以实现起来较为简单、而且便于在不同的平台上面移植,这一点从现在的编程语言解释执行的居多就能看出来

    编译执行的语言因为要直接同CPU 的指令集打交道,具有很强的指令依赖性和系统依赖性,但编译后的程序执行效率要比解释语言要高的多,象现在的 Visual C/C++、Delphi 等都是很好的编译语言。

     

    Tcl的一个重要特性是它的扩展性。如果一个程序需要使用某些标准Tcl没有提供的功能,可以使用c语言创造一些新的Tcl命令,并很容易的融合进去。

    Tk是一系列令Tcl易于编写图形用户接口GUI的命令和过程。另一个流行的扩展包是Expect.Expect提供了通过终端自动执行命令的能力,例如(passwdftptelnet等命令驱动的外壳)

    tcl 是一种类C的脚本语言,相比较之下有其自身特点:

    1 可移植性好。不依赖底层协议

    2 支持多种平台。Tcl 是用 C 语言开发的。它现在可运行在 Unix,Windows 和 Macintosh 等各种平台上。

    3 较高的执行效率

    4 简单易学

    5 与操作系统集成

    总之,“小巧,易学,高效,跨平台执行”是 Tcl 语言特点的集中体现。

    tcl 语言是一种类C的解释执行的语言,本身不依赖与机器码,所以执行效率高,同时支持多种平台,移植性也好。

    tcl本身比较 容易掌握,应用范围很广。我们知道的,界面测试和测试都使用很多。

    对于tcl本身不能实现的功能,通过c语言创建行命令,然后融合就可以实现,这个也就是说扩展性上也很好。常用的有TK和expect ,后者用于终端自动执行命令行。

     

    TCL脚本框架:

    连接设备部分

    spawn telnet 10.255.255.240  登陆设备

    expect "Username:"           期望输入用户名

    send "admin\n"             

    expect "Password:"

    send "XXXXXX\n"

    expect "3750>"

    send "en\n"

    expect "Password:"

    send "XXXXXX\n"

    expect "3750#"

    send "ping 192.168.100.100\n"

    expect "3750#"

    send "config t\n"

    expect "#"

    send "ip route 123.2.1.1 255.255.255.255 null0\n"

    expect "#"

    使用自定义函数

    使用的全局变量

    #global veriables

    set g_dbgflag 1

    set g_devip "192.168.1.222"

    set g_user "root"

    主程序执行

    批命令执行

    # $Id$
    # Construct different source MAC address packets, and send them to switch.

    proc src_mac_attack {mac} {
        set rc [exec echo "src MAC attack packet $mac" \
            | nemesis ethernet -M 00:01:02:03:04:05 -H $mac -T 0x0800 -P -]
        return $rc
    }


    for {set i 1} {$i < 256} {incr i} {
        set mac [constructMac $i]
        src_mac_attack $mac
    }

    # $Id$
    # Construct different source MAC address packets, and send them to switch.

    proc src_mac_attack {mac} {
        set rc [exec echo "src MAC attack packet $mac" \
            | nemesis ethernet -M 00:01:02:03:04:05 -H $mac -T 0x0800 -P -]
        return $rc
    }


    for {set i 1} {$i < 256} {incr i} {
        set mac [constructMac $i]
        src_mac_attack $mac
    }

  • DNS

    2009-07-22 19:50:17

    DNS是Domain name system 域名系统,实现了域名和地址的相互转换。

    明确的概念:

    1 DNS是使用层的方式来运作的。

    2 计算机用户是间接不是直接使用域名系统的。

    3 网络中的每个主机采用层次结构的命名树来命名。

    4 名字到服务器的解析是由网络中若干个域名服务器完成的。

    inter 网采用域名树结构命名网络中的主机。

    因特网 的域名结构:

    1 域名结构是采用层次树的形式完成的。

    2 在网络上的每个主机有唯一的层次结构的名字,即域名。

    3 域名是由若干分量组成的,中间用点隔开

    4 各分量代表不同级别的域名。

     

    以域名www.cs.tsinghua.edu.cn为例,顶级域名是cn ,二级域名是edu ,三级域名是tsinghua,四级域名是cs 。而cn后面的“。”也就是树根。而“.”这层是由InterNIC(Internet Network Information Center,互联网信息中心)所管理。
     
    域名解析-递归查询实例
     1、位于用户计算机的解析器(resolver)作为客户向DNS服
    务器(dns.pku.edu.cn)发出一个请求。
     
    2、DNS服务器在本机内查询,如果有相应纪录,则向解析器
    发回一个应答。如果没有,则向根服务器(dns.edu.cn)查询。
     
    3、根服务器将查询结果返回给DNS服务器,DNS服务器给解析器发回一个应答(166.111.68.13)。
     
    DNS的性能优化:

    1 采用根服务器复制,分布在不同的地方。

    2 主机和服务器都保存一个域名缓存,在一定时间内有效,这个时间由管辖者给出。

     

  • dhcp option60

    2009-07-22 15:55:13

    用户定义厂商类型。 可以是n个字符串类型,

    Option 60 协议说明

    供应商的识别ID。 这个选项的资讯会给予 DHCP Server 在做 DHCP 回应时必要附加讯息上面的提示

  • dhcp Option 82

    2009-07-22 14:57:25

    dhcp 协议的option 82字段  用于标识用户的位置信息。现在只添加sub-option 1和sub-option 2,不添加sub-option5。 华为提出的Option 82用于用户物理位置定位。sub-option 1修正为“节点+框号/槽位号/子槽/端口号 + vlan ,节点表示mac地址或者是系统名称。sub-option2没有改变,表示的是的relay系统mac地址。

    在标准模式,sub-option 1是接收报文的二层端口号和vlan号,sub-option 2是接收报文设备的mac地址。

    在连接的DHCP 中继支持Option82 :

    1 客户端在初始化时发送广播报文。

    2 若本网段中有DHCP服务器,服务器返回地址信息。

    3 若本网段没有DHCP服务器,由DHCP中继对广播报文进行处理

    4 若中继收到的报文中包含Option 82信息,将安照策略进行(丢弃,用自身信息进行替代或者保持不变),然后把报文转发给DHCP服务器。

    5 若中继收到的报文中没有包含Option 82信息,中继将添加Option 82字段,也就是说,把自身的mac地址,和vlan ,端口的信息添加在Option 82 字段中。

    6 DHCP 服务器收到报文后,把相关的DHCP配置信息和Option 82 字段填充后,转发给DHCP 中继。

    7 DHCP中继把Option 82字段剥离,然后把DHCP报文转发给客户端。

  • TCL语言

    2009-07-22 10:51:34

    tcl 一直存在的问题是:很少用,没有编过程序。这样产生的问题呢就是:看不懂,而且不会自己写。

    所以:

    1 在网站上看tcl脚本,结合理论进行理解。

    2 自己试着编编,就熟悉了。

    从网站上看了这位的脚本,确实是自己编写的,就细细分析下好了!

    http://blog.chinaunix.net/u2/82392/article_97213.html

    1.SSH到linux主机上查看linux内核版本号

     

    #!/usr/expect/bin/expect

     

    set HOSTIP [lindex $argv 0]

    set LOGIN [lindex $argv 1]

    set PASS [lindex $argv 2]

     

    set timeout 1

    set cmd {uname -a}

     

    if {$argc<3} {

            puts stderr "Usage:$argv0 hostip login password.\n"

            exit 1

    }

     

    send_user "argv0:  $argv0\n"

    send_user "argv:  $argv\n "

     

    spawn ssh $LOGIN@$HOSTIP

    expect_after eof { exit 0 }

     

    expect "yes/no" { send "yes\r" }

    expect "password:" { send "$PASS\r" }

    expect "#"

    send "$cmd\r"

    expect "*\r"

    send "exit\r"

     

    其中,expect 和send ,spawn在tcl 中没有找到。

  • VLAN转贴学习

    2009-07-21 23:10:44

    以太网端口有三种链路类型:Access、Hybrid和Trunk。Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口; Trunk类型的端口可以属于多个VLAN,可以接收和发送多个VLAN的报文,一般用于交换机之间连接的端口;Hybrid类型的端口可以属于多个 VLAN,可以接收和发送多个VLAN的报文,可以用于交换机之间连接,也可以用于连接用户的计算机。Hybrid端口和Trunk端口的不同之处在于 Hybrid端口可以允许多个VLAN的报文发送时不打标签,而Trunk端口只允许缺省VLAN的报文发送时不打标签。
    Access端口只属于1个VLAN,所以它的缺省VLAN就是它所在的VLAN,不用设置;Hybrid端口和Trunk端口属于多个VLAN,所以需要设置缺省VLAN ID。缺省情况下,Hybrid端口和Trunk端口的缺省VLAN为VLAN 1
    如果设置了端口的缺省VLAN ID,当端口接收到不带VLAN Tag的报文后,则将报文转发到属于缺省VLAN的端口;当端口发送带有VLAN Tag的报文时,如果该报文的VLAN ID与端口缺省的VLAN ID相同,则系统将去掉报文的VLAN Tag,然后再发送该报文。
    另外需要注意的是:
    (1) Trunk端口不能和isolate-user-vlan同时配置;Hybrid端口可以和isolate-user-vlan同时配置。但如果缺省 VLAN是在isolate-user-vlan中建立了映射的VLAN,则不允许修改缺省VLAN ID,只有在解除映射后才能进行修改。
    (2) 本Hybrid端口或Trunk端口的缺省VLAN ID和相连的对端交换机的Hybrid端口或Trunk端口的缺省VLAN ID必须一致,否则报文将不能正确传输。

    交换机接口出入数据处理过程!
    tag就是普通的ethernet报文,报文结构的变化是在源mac地址和目的mac地址之后,加上了4bytes的vlan信息,也就是vlan tag头;untag就是普通的ethernet报文,比tag报文少了4 bytes字节。
    情况列举 Switch收发 Switch对标记的处理 remark
    Access (接收) Tagged = PVID 不接收 注:部分高端产品可能接收。
    Access (接收) Tagged =/ PVID 不接收 注:部分高端产品可能接收。
    Access (接收) Untagged 接收 增加tag=PVID 从PC
    Access (发送) Tagged = PVID 转发 删除tag
    Access (发送) Tagged =/ PVID 不转发 不处理
    Access (发送) Untagged 无此情况 无此情况 无此情况
    Trunk (接收) Tagged = PVID 接收 不修改tag
    Trunk (接收) Tagged =/ PVID 接收 不修改tag
    Trunk (接收) Untagged 接收 增加tag=PVID
    Trunk (发送) Tagged = PVID If Passing then 转发 删除tag
    Trunk (发送) Tagged =/ PVID If Passing then 转发 不修改tag
    Trunk (发送) Untagged 无此情况 无此情况 无此情况(注)
    Hybrid (接收) Tagged = PVID 接收 不修改tag 对端是trunk
    Hybrid (接收) Tagged =/ PVID 接收 不修改tag 对端是trunk
    Hybrid (接收) Untagged 接收 增加tag=PVID 类Trunk
    Hybrid (发送) Tagged = PVID Tag 和 untag 中列出的vlan可以passing 看Tag项和untag项
    Hybrid (发送) Tagged =/ PVID Tag 和 untag 中列出的vlan可以passing 看Tag项和untag项
    Hybrid (发送) Untagged 无此情况 无此情况 无此情况(注)

    收报文:
    Acess端口
    1、收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则直接丢弃(缺省)
    发报文:
    Acess端口:
    1、将报文的VLAN信息剥离,直接发送出去
    收报文:
    trunk端口:
    1、收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该trunk端口是否允许该 VLAN的数据进入:如果可以则转发,否则丢弃
    发报文:
    trunk端口:
    1、比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,如果不相等则直接发送
    收报文:
    hybrid端口:
    1、收到一个报文
    2、判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则判断该hybrid端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃
    发报文:
    hybrid端口:
    1、判断该VLAN在本端口的属性(disp interface 即可看到该端口对哪些VLAN是untag, 哪些VLAN是tag)
    2、如果是untag则剥离VLAN信息,再发送,如果是tag则直接发送

  • vlan 技术

    2009-07-21 21:43:48

    lan局域网是一个单独的广播域,使用hub ,网桥或者交换机网络设备连接同一网段内的所有节点。

    VLAN,又称虚拟局域网,他的出现减少了不同网络之间通信的时间长的问题 。

    VLANVirtual LAN),翻译成中文是“虚拟局域网”。

    VLAN所指的LAN特指使用路由器分割的网络——也就是广播域

    一方面广播信息消耗了网络整体的带宽,另一方面,收到广播信息的计算机还要消耗一部分CPU时间来对它进行处理。造成了网络带宽和CPU运算能力的大量无谓消耗

    使用交换机和路由器分割广播域的比较?

    二层交换机上分割广播域的技术,就是VLAN二层交换机一般带有多个网络接口,通过利用VLAN,我们可以自由设计广播域的构成,提高网络设计的自由度

    分割广播域时,一般都必须使用到路由器。使用路由器后,可以以路由器上的网络接口(LAN Interface)为单位分割广播域。使用路由器分割广播域的话,所能分割的个数完全取决于路由器的网络接口个数,数目为4个,一般比较少。使得用户无法自由地根据实际需要分割广播域。

    是由位于不同物理局域网段的设备组成。虽然VLAN所连接的设备来自不同的网段,但是相互之间可以进行直接通信,好像处于同一网段中一样,由此得名虚拟局域网。

    有基于不同方法划分的vlan :

    1 基于端口划分

    2基于设备的mac地址划分

    3 基于网络层的IP地址或者协议类型划分

    这种划分VLAN的方法是根据每个主机的网络层地址或协议类型

    4 基于组播划分

    目前使用的是端口划分

     

    802.1q 协议:为标识带有vlan成员的以太帧建立了一种标准方法。实现了不同厂商的vlan 互通。

    VLAN报文格式在源地址后增加了一个4字节的802.1Q标签。 4个字节的802.1Q标签中,包含了2个字节的标签协议标识(TPID--Tag Protocol Identifier,它的值是8100),和两个字节的标签控制信息(TCI--Tag Control Information),TPIDIEEE定义的新的类型,表明这是一个加了802.1Q标签的报文。

    Ÿ            VLAN Identified( VLAN ID ): 这是一个12位的域,指明VLANID,一共4096个,每个支持802.1Q协议的主机发送出来的数据包都会包含这个域,以指明自己所属的VLAN

    Ÿ            Canonical Format Indicator( CFI ):这一位主要用于总线型的以太网与FDDI、令牌环网交换数据时的祯格式。

    Ÿ            Priority:这3 位指明祯的优先级。一共有8种优先级,主要用于当交换机阻塞时,优先发送优先级高的数据包。

     

     TPI 2字节协议标识符以太网为0X8100
    ⑥ P   3位的优先级对应十进制的0—7(802.1Q有效)
    ⑦ C   1位的规范标识符,标明MAC地址是否符合以太网标准,符合为0
    ⑧ VI  12位的VLAN ID 标识帧所属VLAN,范围0—4095

     不同VLAN间互相通信时需要用到路由功能。

    静态VLAN又被称为基于端口的VLANPort Based VLAN)。顾名思义,就是明确指定各端口属于哪个VLAN的设定方法。不适合那些需要频繁改变拓补结构的网络

    根据OSI参照模型哪一层的信息决定端口所属的VLAN

    种类

    解说

    静态VLAN(基于端口的VLAN)

    将交换机的各端口固定指派给VLAN

    动态VLAN

    基于MAC地址的VLAN

    根据各端口所连计算机的MAC地址设定

    基于子网的VLAN

    根据各端口所连计算机的IP地址设定

    基于用户的VLAN

    根据端口所连计算机上登录用户设定

     

      配置vlan 技术:
    端口类型:
     
    收报文:
    Acess端口
    1、收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则直接丢弃(缺省)
    发报文:
    Acess端口:
    1、将报文的VLAN信息剥离,直接发送出去
    收报文:
    trunk端口:
    1、收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该trunk端口是否允许该 VLAN的数据进入:如果可以则转发,否则丢弃
    发报文:
    trunk端口:
    1、比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,如果不相等则直接发送
    收报文:
    hybrid端口:
    1、收到一个报文
    2、判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则判断该hybrid端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃
    发报文:
    hybrid端口:
    1、判断该VLAN在本端口的属性(disp interface 即可看到该端口对哪些VLAN是untag, 哪些VLAN是tag)
    2、如果是untag则剥离VLAN信息,再发送,如果是tag则直接发送     
    VLAN 隔离概念:不同端口属于同一VLAN,但是不同端口之间不能互通。  
    还有转贴一篇,用于实际学习     
  • Ethernal 使用

    2009-07-21 20:32:15

     

    转贴学习  :

    Ethereal是免费的网络协议检测程序,支持Unix,Windows。让您经由程序抓取运行的网站的相关资讯,包括每一封包流向及其内容、资讯可依操作系统语系看出,方便查看、监控TCP session动态等等.

    下面介绍windows下面ethereal 的使用方法。
        一、安装
        1、下载安装winpcap

    http://coolersky.com/download/hacker/aidance/2005/0805/87.html
        2、下载安装ethereal
    http://coolersky.com/download/hacker/sniffer/2005/1227/152.html
        说明:新版本ethereal已经整合winpcap,下载ethereal即可完成安装。
        二、使用
        启动ethereal以后,选择菜单Capature->Start,就OK了。当你不想抓的时候,按一下stop, 抓的包就会显示在面板中,并且已经分析好了。
    nterface:指定在哪个接口(网卡)上抓包。一般情况下都是单网卡,所以使用缺省的就可以了。
        Limit each packet:限制每个包的大小,缺省情况不限制。
        Capture packets in promiscuous mode:是否打开混杂模式。如果打开,抓取所有的数据包。一般情况下只需要监听本机收到或者发出的包,因此应该关闭这个选项。
        Filter:过滤器。只抓取满足过滤规则的包(可暂时略过)。
        File:如果需要将抓到的包写到文件中,在这里输入文件名称。
        use ring buffer:是否使用循环缓冲。缺省情况下不使用,即一直抓包。注意,循环缓冲只有在写文件的时候才有效。如果使用了循环缓冲,还需要设置文件的数目,文件多大时回卷。
        其他的项选择缺省的就可以了。
        2、ethereal的抓包过滤器 
        抓包过滤器用来抓取感兴趣的包,用在抓包过程中。抓包过滤器使用的是libcap过滤器语言,在tcpdump的手册中有详细的解释,基本结构是:[not] primitive [and|or [not] primitive ...]
        个人观点:如果你想抓取某些特定的数据包时,可以有以下两种方法,你可以任选一种,个人比较偏好第二种方式:
        (1)在抓包的时候,就先定义好抓包过滤器,这样结果就是只抓到你设定好的那些类型的数据包;
        (2)先不管三七二十一,把本机收到或者发出的包一股脑的抓下来,然后使用下节介绍的显示过滤器,只让Ethereal 显示那些你想要的那些类型的数据包;
        3、etheral的显示过滤器(重点内容) 
        在抓包完成以后,显示过滤器可以用来找到你感兴趣的包,可以根据协议、是否存在某个域、域值、域值之间的比较来查找你感兴趣的包。
        举个例子,如果你只想查看使用tcp协议的包,在ethereal窗口的左下角的Filter中输入tcp, 然后回车,ethereal就会只显示tcp 协议的包。

      4、在ethereal 使用协议插件 
        ethereal 能够支持许多协议,但有些协议需要安装插件以后才能解,比如H.323,以H.323 协议为例:
        (1)首先下载ethereal 的H.323 插件,下载地址http://www.voice2sniff.org/
        (2)下载完了以后将文件(h323.dll) 解压到ethereal 安装目录的plugin\0.9.x 目录下面,比如我的是0.9.11。
        (3)进行一下设置

    a、启动ethereal
    b、菜单Edit->Preference
    c、单击Protocols 前面的"+"号,展开Protocols
    d、找到Q931 ,并单击
    e、确保"Desegment.... TCP segments" 是选中的(即方框被按下去)
    f、单击TCP 
    g、确保"Allow....TCP streams" 是选中的
    h、确保没有选中"Check....TCP checksum" 和"Use....sequence numbers"
    i、单击TPKT
    j、确保"Desegment....TCP segments" 是选中的
    k、点击Save,然后点击Apply ,然后点击OK

        当然你也完全可以不断地重新安装新版本winpcap 和ethreal, 这样就可以不需在旧的ethreal 的版本中安装新的插件来支持新的协议插件,这也是懒人的一种做法。

     

     

    Ethernal

    Display Options 

    update list of packets in realtime 时时更新报文列

    Automatic scrolling in live capture 在抓包的活动状态中自动滚屏

    Hide capture info dialog 信息对话中隐藏头部

     

    name resolution 名字解析(把名字转换成网络地址)

     

     

  • c++程序学习7

    2009-07-16 11:13:59

     

    (a) int ival = 1.01; 是否合法?合法,把double 型子面值腹给int 型变量,发生隐性类型变幻,ival 得到的值为1

    习题 2.15 下面两个定义是否同?有何不同?

         int month = 9,day = 7;

              int month = 09,day = 07;

    如果上述定义有错的话,那么应该怎么更正呢?

    第一个定义了2个10进制的数,分别是9 和 7;

    第二个定义了一个07,是八进制的数,还有一个是09 ,这个在8进制中是不存在的。

    修改成011 ,这个数字转换成十进制的时候,为1 * 80 = 1  1 * 81 =8 ,加起来就是9

     

    八进制就是逢8进1。

    八进制数采用 0~7这八数来表达一个数。

    八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……

    所以,设有一个八进制数:1507,转换为十进制为:

    用竖式表示:

     

    1507换算成十进制。

     

    第0位 7 * 80 = 7

    第1位 0 * 81 = 0

    第2位 5 * 82 = 320

    第3位 1 * 83 = 512   +

    --------------------------

                  839

    同样,我们也可以用横式直接计算:

    7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839

    结果是,八进制数 1507 转换成十进制数为 839

     

    习题 2.16 假设calc是一个返回double对象的函数。下面哪些是非法定义?改正所有的非法定义。

    (a) int car = 1024,auto = 2048;

    (b) int ival = ival;

    (c) std::cin >> int input_value;

    (d) double salary = wage = 999.99;

    (e) double calc = calc();

     

    a 非法。auto 是关键字,不可以使用。

    c 》 运算符后不能进行变量定义

    d 同一语句中不同的变量初始化应该分开定义:

    double salary = 999.99

    wage = 999.99;

    b 没有语法错误,但是ival 还是没有数值。

     

    习题 2.17 下列变量的初始值(如果有)是什么?

    std::string global_str;

    int global_int;

    int main()

    {

        int local_int;

        std::string local_str;

        // …

        return 0;

    }

     

    global_str 和 local_str 是空字符串,global_int 是0

    local_int 没有初始值。

     

    习题 2.18 解释下列例子中name的意义:

    extern std::string name;

    std::string name(“exercise 3.5a”);

    extern std::string name(“exercise 3.5a”);

     

    声明std::string 变量name在其他地方定义;

    定义std::string 变量name ,并初始化为exercise 3.5a;

    定义std::string 变量name ,并初始化为exercise 3.5a,name 是一个全局变量;

     

    习题 2.19 下列程序中j的值是多少?

    int i = 42;

    int main()

    {

        int i = 100;

        int j = i;

        //…

    }

    解答:局部变量i=100屏蔽了全局变量i=42,j的值是100

     

    习题 2.20 下列程序段将会输出什么?

    int i = 100,sum = 0;

    for(int i =0; i!= 10; ++i)

        sum += i;

    std::cout << i << " " << sum << std::endl;

    解答:for语句中定义的变量i在退出for循环后就不可见,最后输出的I 值仍然是100For循环改变了sum的值,输出从09的和45。所以输出结果为100 45

     

    习题 2.21 下列程序合法吗?

    int sum = 0;

    for(int i =0; i!= 10; ++i)

        sum += i;

    std::cout << "Sum from 0 to " << i << " is " << sum << std::endl;

    因为i的作用域在语句中,输出i不合法。

     

    习题 2.22 下列程序虽然合法,但是风格很糟糕。有什么问题呢?怎样改善?

    for(int i = 0; i < 100; ++i )

        // process i

    问题是程序的可读性差,100的具体含义不清楚;程序的可维护性差。无法修改

    因为出现魔数,修改为const int a=100

    在i< 100 中修改为 i < a ;

     

    习题 2.23 下列哪些语句合法?对于那些不合法的,请解释为什么不合法?

    (a) const int buf;

    (b) int cnt = 0;

    const int sz = cnt;

    (c) cnt ++; sz ++;

     

    a 定义const 变量(常量)时必须进行初始化,而buf 没有;

    b 合法

    c sz 是常量,无法修改数值。

     

     

    习题 2.24 下列哪些定义是非法的?为什么?如何改正?

    (a) int ival = 1.01;     (b) int &rval1 = 1.01;

    (c) int &rval2 = ival;   (d) const int &rval3 = 1;

     

    b 引用必须用与该引用同类型的对象初始化。int &rval1 =ival;

     

    习题 2.25 在上题给出的定义下,下列哪些赋值是非法的?如果赋值合法,解释赋值的作用。

    (a) rval2 = 3.14159;     (b) rval2 = rval3;

    (c) ival = rval3;        (d) rval3 = ival;

     

    d  rval3是一个const 引用,不能进行赋值。

     

     

     

    习题 2.26 (a)中的定义和(b)中的赋值存在哪些不同?哪些是非法的?

    (a) <

  • c++程序学习记录6

    2009-07-08 10:42:17

     

    问题1 如何计算求模?

    100000超过了16位的unsigned short类型的表示范围,编译器对其二进制表示截取低16位,相当于对65536求余(求模,%),得34464。

    问题2

    (a) "Who goes with F\145rgus?\012" 个人认为非法,此处的问号是啥意思?

    习题2.1 int long 和short 类型之间有什么差别?

    都表示整形值,存储空间不同。short 定义半个机器字,int 和long 定义一个机器字长,也就是4个字节,32位。

    习题2.2 整形数包含带符号的signed 和 无符号的unsigned。前者可以定义正数,负数和O ,后者可以定义0和正数。

    习题2.3

    如果在某机器上short类型占16位,那么可以赋给short类型的最大数是什么?unsigned short类型的最大数又是什么?

    short 默认是signed 类型,为 215-1=32767 ,也就是范围从-32767 ~32768

    unsigned 类型只能是正数,最大数为216-1=65535 。也就是范围从0~65535

    习题2.4

    当给16位的unsigned short对象赋值100000时,赋的值是什么?

    16位的unsigned 类型是范围是0~65535 ,赋值为100000时,产生溢出。

    100000超过了16位的unsigned short类型的表示范围,编译器对其二进制表示截取低16位,相当于对65536求余(求模,%),得34464。

    习题2.5

    float类型和double类型有什么差别?

    对于float类型来说,存储位数不同,f存储32位, double 存储64位。

    所以取值范围不同,精度不同。f 表示6位有效数字,而 d 至少表示10位有效数字。

    习题2.7

    解释下列字面值常量的不同之处。

    (a) ’a’,L’a’,"a",L"a"

    (b) 10,10u,10L,10uL,012,0xC

    (c) 3.14,3.14f,3.14L

    ’a’为char型字面值,L’a’为wchar_t型字面值,"a"为字符串字面值,L"a"为宽字符串字面值。

    10为int型字面值,10u为unsigned型字面值,10L为long型字面值,10uL为unsigned long型字面值,012为八进制表示的int型字面值,0xC为十六进制表示的int型字面值。

    3.14为double型字面值,3.14f为float型字面值,3.14L为long double型字面值。

    习题2.8

    确定下列字面值常量的类型:

    (a) ?10 (b) -10u (c) -10. (d) -10e-2

    【解答】

    (a) int型

    (b) unsigned int型

    (c) double型

    (d) double型

    习题2.9

    下列哪些(如果有)是非法的?

    (a) "Who goes with F\145rgus?\012" 个人认为非法

    (b) 3.14e1L                      (c) "two" L"some"

    (d) 1024f                        (e) 3.14UL

    (f) "multiple line

    comment"

    【解答】

    (c) 非法。因为字符串字面值与宽字符串字面值的连接是未定义的。

    (d) 非法。因为整数1024后面不能带后缀f。

    (e) 非法。因为浮点字面值不能带后缀U。

    (f) 非法。因为分两行书写的字符串字面值必须在第一行的末尾加上反斜线。

    习题2.10

    使用转义字符编写一段程序,输出2M,然后换行。修改程序,输出2,跟着一个制表符,然后是M,最后是换行符。

    【解答】

    输出2M、然后换行的程序段:

    // 输出"2M"和换行字符

    std::cout << "2M" << ’\n’;

    修改后的程序段:

    // 输出’2’, ’\t’, ’M’和换行字符

    std::cout << ’2’ << ’\t’ << ’M’ << ’\n’;

    习题2.11

    编写程序,要求用户输入两个数??底数(base)和指数(exponent),输出底数的指数次方的结果。

    程序调试出现问题:

    0x004048c8指令引用的“0x0046f03c"内存。该内存不能为“written”。

    access violation 访问冲突;

     //之前这个句子写错了,删除然后添加下一句话后有结果std::cin>>"please input base and exponent" ;


    #include "stdafx.h"
    #include <iostream>

    int main ()
    {
     int bas,exp;
     long result=1;

     //之前这个句子写错了,删除然后添加下一句话后有结果std::cin>>"please input base and exponent" ;

    std::cout<<"please input base and exponent" <<std::endl;
     std::cin>>bas>>exp;
     for( int cnt=0;cnt<exp;cnt++)
      result*=bas;
     std::cout<<bas
       <<"raised to the power of "
       <<exp
       <<":\t"
       <<result<<std::endl;

        return 0;
    }
       

    please input base and exponent
    2 10
    2raised to the power of 10:     1024
    Press any key to continue

    习题2.12

    区分左值和右值,并举例说明。

    左值(lvalue)就是变量的地址,或者是一个代表“对象在内存中的位置”的表达式。

    右值(rvalue)就是变量的值,见2.3.1节。

    变量名出现在赋值运算符的左边,就是一个左值;而出现在赋值运算符右边的变量名或字面常量就是一个右值。

    例如:

    val1=val2/8

    这里的val1是个左值,而val2和8都是右值。

    习题2.14

    下面哪些(如果有)名字是非法的?更正每个非法的标识符名字。

    (a) int double = 3.14159;  (b) char _;

    (c) bool catch-22;          (d) char 1_or_2 =’1’;

    (e) float Float = 3.14f;

    【解答】

    (a) double是C++语言中的关键字,不能用作用户标识符,所以非法。此语句可改为:double dval = 3.14159;。

    (c) 名字catch-22中包含在字母、数字和下划线之外的字符“-”,所以非法。可将其改为:catch_22;。

    (d) 名字1_or_2非法,因为标识符必须以字母或下划线开头,不能以数字开头。可将其改为:one_or_two;。


     

  • C++ unexpected end of file while 的问题

    2009-06-25 11:34:26

    如何解决:"fatal error C1010:VC++6.0中常出现的"unexpected end of file while looking for precompiled header directive"的问题?

    我想大家在VC6.0中经常回遇到这样的问题,如何解决呢?

    1、看看是否缺少“;”,“}”  
      隐藏得深的是宏、.h文件的问题就要费点心思了

    2、一定是你在类的部分定义被删除了,M$在每个类中定义一些特殊的常量,是成对的,如下:  
      .h:  
      #if   !defined(AFX_CHILDFRM_H__54CA89DD_BA94_11D4_94D7_0010B503C2EA__INCLUDED_)  
      #define   AFX_CHILDFRM_H__54CA89DD_BA94_11D4_94D7_0010B503C2EA__INCLUDED_  
      .......  
      //{{AFX_INSERT_LOCATION}}  
      //   Microsoft   Visual   C++   will   insert   additional   declarations   immediately   before   the   previous   line.  
       
      #endif   //   !defined(AFX_MAINFRM_H__54CA89DB_BA94_11D4_94D7_0010B503C2EA__INCLUDED_)  
      你可以新建一个类,然后把这些拷贝过去或补上就可以了。   
    3、在头部加入   #include   "stdafx.h"

    4、在CPP文件第一行加上#include   "stdafx.h"。  
      或者Rebuild   All.  

    5、

    (1). [Project] - [Settings] - [C/C++] - [Category]
    (2). 选择 [Precomplied Headers]
    (3). 单选 [Not Using Precomplied Headers]
    (4). [OK]

     

    拷贝文件:在工程中的header files 中加入文件:Sales_item.h (注意文件放在工程dami1目录下。)

    出现调试问题:unexpected end of 这个也是文件路径错误导致的,也就是作者说明的第一点 “.h文件的问题”

    习题1.21 类Sales_item 提供了操作对象,下面从标准输入读取数据,使用该数据建立一个Sales_item对象,并将该Sales_item对象写到标准输出:#include  "stdafx.h"
    #include <iostream>
    #include "Sales_item.h"
    int main () {

     Sales_item book;

     std::cin>> book;

     std::cout<< book <<std::endl;

        return 0;
    }

    编辑结果:

    0-201-77353-x 4 24.99
    0-201-77353-x   4       99.96   24.99
    Press any key to continue

    习题1.22 编写程序,读入2个具有相同ISBN的Sales_item对象并产生它们的和。

    #include "stdafx.h"
    #include <iostream>
    #include "Sales_item.h"
    int main () {

     Sales_item book1,book2;

     std::cin>> book1 >> book2;

     std::cout<< book1+book2 <<std::endl;

        return 0;
    }

    编辑结果:

    0-201-78345-x 3 20
    0-201-78345-x 5 35
    0-201-78345-x   8       235     29.375
    Press any key to continue

    习题1.24 编写 程序,读入几笔不同的交易,对于每笔新读入的交易,要确定它的ISBN是否和之前的交易ISBN一样,并且记下每一个ISBN交易的总数。通过给定多比不同的交易来测试程序。这些交易必须代表多个不同的ISBN,但是每个ISBN的记录应分在同一组。

    #include "stdafx.h"
    #include <iostream>
    #include "Sales_item.h"
    int main ()
    {

     Sales_item item1,item2;
     int amount=1 ;
     std::cout<<"please input first item:";
     std::cin>>item1;
     while (std::cin>>item2)
      if (item1.same_isbn(item2))
       amount++;
      else {
       std::cout<<" the previous isbn number is :"<< amount <<std::endl;
                item1=item2;
       amount=1;     
       }
       std::cout<<" the last isbn number is :"<< amount <<std::endl;


        return 0;
    }

    please input first item:
    0-201-78345-x 3 20.00
    0-201-78345-x 2 25.00
    0-201-78342-x 2 25.00
     the previous isbn number is :2

    0-201-78342-x 4 25.00
    0-201-78345-x 4 25.00
     the previous isbn number is :2
    a


    s
     the last isbn number is :1
    Press any key to continue

    这个程序问题在于:在最后的0-201-78345-x 数据不能和之前的合并,而是自行列出。

    总结:判断和之前的交易isbn是否相同,采用了循环比较的方法。先输入一个数字item1,后来又输入另一个数字item2。比较后面输入的item和前面的是否相同。如果相同,就把数值amount递加;如果不同,输出上一个相同ISBN的数值,同时把amount置1 。把item1=item2;
    依次循环比较即可。

    习题1.26 在书店程序中,使用了加法操作符而不是复合赋值操作符将trans 加到total 中?

    原因是在1.51中的操作中可执行的操作中没有复合赋值操作符。

  • c程序学习记录5

    2009-06-25 10:35:15

    习题 1.17 编写程序,要求用户输入一组数,输出信息说明其中有多少负数。

    #include "stdafx.h"
    #include <iostream>
    int main()
    {

    int amount=0,value;
    while(std::cin>>value)
    if (value<=0)
    ++amount;
    std::cout<<"the number of negative value  is "<< amount <<std::endl;

    return 0;
    }

    2
    3
    4
    -2
    s
    the number of negative value  is 1
    Press any key to continue

    习题1.18 编写程序,提示用户输入两个数,并将这两个数范围内的每个数写到标准输出。发现第一次写的程序没有考虑到数字大小颠倒的情况。#include "stdafx.h"
    #include <iostream>
    int main()
    {
    std::cout<<"Please enter two numbers:"<<std::endl;

    int v1,v2;

    std::cin>>v1>>v2;
    int lower,upper;
    if (v1 <= v2){
     lower=v1;
     upper=v2;
    } else {
     lower=v2;
     upper=v1;
    }
    std::cout<<" the  number between "<< lower<<" and "<< upper<<" : "<<std::endl;
    for (int i=lower; i<=upper; i++) {
     std::cout<< i <<std::endl;
    }

    return 0;
    }

     

    调试显示:

    Please enter two numbers:
    6 2
     the  number between 2 and 6 :
    2
    3
    4
    5
    6
    Press any key to continue

    习题1.19 如果上题给定数1000 和 2000,程序将产生什么结果?修改程序,使每一行输出不超过10个数。

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
    std::cout<<"Please enter two numbers:"<<std::endl;

    int v1,v2;

    std::cin>>v1>>v2;
    int lower,upper;
    if (v1 <= v2){
     lower=v1;
     upper=v2;
    } else {
     lower=v2;
     upper=v1;
    }
    std::cout<<" the  number between "<< lower<<" and "<< upper<<" : "<<std::endl;
    for (int i=lower,j=0; i<=upper; ++i) {
    std::cout<< i <<" ";
     ++j;
     if (j==10) {
      j=0;
      std::cout<<std::endl;
     }

    }

    return 0;
    }

    Please enter two numbers:
    1000 2000
     the  number between 1000 and 2000 :
    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009

    ............
    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
    2000 Press any key to continue

    总结:可以在for 循环中添加输出行;

    达到换行目的:可以采用计数,每10个可以输出std::cout<<std::endl;

    同时输出一个数字后,需要输出“ ”以便与另一个数字隔开。

    开始学习的时候,想到程序不知道用什么实现,觉得蛮神秘的,但是后来发现答案全部是已经掌握的知识,而不是需要新知识。也增加了对于概念的理解。

    习题 1.20 编写程序,求用户指定范围内的数的和,省略设置上界和下界的if测试。假定输入数是7和3,按照这个顺序,预测程序运行结果。然后按照给定的数是7和3运行程序,看结果是否与你预测的相符。如果不相符,反复研究关于for和while循环的讨论直到弄清楚其中的原因。
    #include "stdafx.h"
    #include <iostream>
    int main()
    {
    std::cout<<"Please enter two numbers:"<<std::endl;
    int v1,v2;
    std::cin>>v1>>v2;
    int sum=0;
    for (int i=v1; i<=v2; i++) { 
     sum+=i;
    }
    std::cout<<"the sum between "<< v1 << " to "<< v2 << " is:"<< sum <<std::endl;
    return 0;
    }

    Please enter two numbers:
    7 3
    the sum between 7 to 3 is:0
    Press any key to continue

    后来执行完毕结果为0 的原因是 :

    对于for循环,i的初始值为 7 ,判断i小于3为假 ,for语句不执行,结果为0 。
     

  • c程序学习记录4

    2009-06-18 11:36:47

    #include <iostream>
    int main()
    {
    int sum=0,value;

    std::cout<<"Please enter your number:"<<std::endl;

    while(std::cin >> value){
     sum += value;
     std::cout<<" sum is: "<< sum <<std::endl;
    }
    std::cout<<" sum is: "<< sum <<std::endl;
    return 0;
    }

    问题:在输入了合法数字后,红色字体的行不会执行,循环没有跳出。

    Please enter your number:
    2 3 4 5
     sum is: 2
     sum is: 5
     sum is: 9
     sum is: 14

    而在输入不合法的数字,使循环跳出,红色字体执行了,而且显示了Press any key to continuePlease

    enter your number:
    2 3.1
     sum is: 2
     sum is: 5
     sum is: 5
    Press any key to continue

    但是3.1也被修改成了3

  • vc问题:Compiling... ,Error spawning cl.exe 修改办法

    2009-06-18 11:15:59

    可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的
    “Compiling... ,Error spawning cl.exe”错误提示给郁闷过。很多人的
    选择是重装,实际上这个问题很多情况下是由于路径设置的问题引起的,
    “CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\VC98\Bin”下面,
    你可以到相应的路径下找到这个应用程序。

    因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>“Option(选择)”
    —>“Directories(目录)”重新设置“Excutable Fils、Include Files、
    Library Files、Source Files”的路径。很多情况可能就一个盘符的不同
    (例如你的VC装在C,但是这些路径全部在D),改过来就OK了。


    如果你是按照初始路径安装vc6.0的,路径应为:
    executatble files:
    C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
    C:\Program Files\Microsoft Visual Studio\VC98\BIN
    C:\Program Files\Microsoft Visual Studio\Common\TOOLS
    C:\Program Files\Microsoft Visual Studio\Common\TOOLS\WINNT

    include files:
    C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE
    C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
    C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE

    library files:
    C:\Program Files\Microsoft Visual Studio\VC98\LIB
    C:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB

    source files:
    C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
    C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
    C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
    C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC

    如果你装在其他盘里,则仿照其路径变通就行(我就是装在D盘)。
    关键是microsoft visual studio\ 后面的东西要相同。
    本人深受其害,重装多次不管用,上面中文部分为高手借鉴,

    cannot open Debug/mousePosition.exe for writingcannot open Debug/mousePosition.exe for writing

    出现这个的原因是终端的输入屏没有关闭,而且好像没有出现

    Press any key to continue导致的这个问题,关闭后再调试就没有这个错误了

  • c程序学习记录3

    2009-06-18 10:49:59

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
    int sum=0,value;

    std::cout<<"Please enter your number:"<<std::endl;

    while(std::cin >> value){
     sum += value;

    }
    std::cout<<" sum is: "<< sum <<std::endl;
    return 0;
    }

    生成的结果:

    在程序中输入数字,最后一个是小数,这样就生成了总和:

    Please enter your number:
    2 3 4.1
     
     sum is: 9
    Press any key to continue

     

    当输入奇怪之处:

    在上面的程序中,修改

  • 测试用例编写积累

    2009-06-16 17:37:39

    A 测试用例的内容:

    测试目标:分支目标功能的详细阐述;

    测试的环境要求:包含版本要求,环境搭建,需要的软件等;

    详细描述的测试步骤,步骤可以被无误的执行;

    活动和预期的结果;

     

    B 测试用例的质量是客观的:

    需求中要明确的测试点;

    精确的。只测试描述中所说的内容。

    经济的。相关的测试步骤只和该测试目的相一致,不会涉及到其他目的。

    可重用的,自立的。任何人都可以完成测试用例的执行,并且结果相同。

    适合的。该用例可以被执行,不会有不能操作的部分。

    可追溯的。测试目标有其对应着需求点。

    可自我清理的。该程序的完成不会留下执行的痕迹。系统变量和环境不会改变。

    测试用例的提升:

    专业术语要明确,一致。

    测试的易用性。

    明确执行的动作,和测试结果分开。

    使用累积用例。也就是本次测试基于之前的测试步骤之后。需要注意:步骤中说到其他用例时需要完整说明标题。同时,在测试的顺序上和客户保持一致。

    提高生产效率:

    克隆之前的步骤,同时注意修改其不同部分。

    在写测试用例的时候,同时修改测试用例:

    出现问题的地方:

    1 用例步骤太长

    2 用例中引用的术语已经修改

    3 用例不完整,不连贯,步骤错误。

    4 结果包含的小点不明确

    附录A

    测试用例核查表

     质量属性

     ● 精确的 - 只测试描述中所说的将测试的内容。

     ● 经济的 - 只有对于它的目标所需要的步骤

     ● 可重用的、自立的 - 不管是谁测试它都是相同的结果。

     ● 适合的 – 不仅对当前而且对今后的测试者

     ● 可追溯的 – 对应到一个需求

     ● 可自我清理的 - 返回测试环境到未使用状态

     结构和可测试性

     ● 有一个名称和编号

     ● 有一个明确的目标,其中包括什么需求将被测试

     ● 有一个测试方法的描述

     ● 指定设置信息 - 环境、数据、前提测试、安全访问

     ● 进行的活动和预期结果

     ● 陈述需要被保存的任何证据,如报告或抓屏

     ● 留下干净的测试环境

     ● 使用生动的用例语言

     ● 不超过15个步骤

     ● 矩阵不需要超过20分钟的时间来测试

     ● 自动脚本用目标、输入、预期结果来注释

     ● 如果可能的话,设置提供前提测试的替代品

     ● 与其他测试处于正确的商业场景顺序中

     配置管理

     ● 使用命名和编号协定

     ● 以指定的格式、文件类型保存

     ● 对应版本和受测软件相匹配

     ● 包括用例需要的测试对象,如资料库

     ● 存储为可读取形式

     ● 以受控访问的形式存储

     ● 存储在网络备份操作处

     ● 现场外存档

     

     

     

     

     

  • c程序学习记录2

    2009-06-16 17:25:39

     

    容易出现错误的地方:

    please enter two numbers:
    3 7
    3and7
    the bigeer number is7
    Press any key to continue

    修改办法:在双引号扩住的两边都增加空格(and和the bigeer number is) :

    std::cout << v1 <<" and "<< v2 <<std::endl;
    std::cout <<" the bigeer number is "<< upper <<std::endl;

    习题1.16

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
     std::cout<<"please enter two numbers:"<<std::endl;

     int v1,v2;

     std::cin >> v1 >> v2 ;

     

     int lower,upper;

     if(v1<=v2){
        lower=v1;
        upper=v2;
     }else {
        lower=v2;
        upper=v1;
      }
        std::cout << v1 <<" and "<< v2 <<std::endl;
        std::cout <<" the bigeer number is "<< upper <<std::endl;
     //keep executing the while until val is greater than 10
    /* int sum=0;
     for(int val=lower;val<=upper;val++)
      sum+=val;
     std::cout <<"sum of "<<lower<< " to "<< upper<< " is "
       <<sum<<std::endl;
     */  
     
     return 0;
    }

     

  • c程序学习记录

    2009-06-16 16:07:34

    程序执行后,val的值变为11:

    #include <iostream>
    int main()
    {
     int sum=0,val=1;
     //keep executing the while until val is greater than 10
     while (val<=10){
      sum+=val;
      val++;
     }
      std::cout <<val<<std::endl;
      std::cout <<"sum of 1 to 10 inclusive is "
          <<sum<<std::endl;
     
     return 0;
    }

    11
    sum of 1 to 10 inclusive is 55
    Press any key to continue

     

     

    注意:修改以下程序++的位置在val++ 或者++val ,程序结果相同:#include "stdafx.h"
    #include <iostream>
    int main()
    {
     int sum=0,val;
     //keep executing the while until val is greater than 10
     for (val=1;val<=10;val++){

      std::cout <<val<<std::endl;

      sum+=val;
      
     }
      std::cout <<val<<std::endl;
      std::cout <<"sum of 1 to 10 inclusive is "
          <<sum<<std::endl;
     
     return 0;
    }

     

    在val++ 中在for循环内外分别输出数值,显示为内为10 ,外为11,结果显示为55(也就是1 到10的总和) ,重新修改为++val,结果不变:

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
     int sum=0,val;
     //keep executing the while until val is greater than 10
     for (val=1;val<=10;val++){
      std::cout <<val<<std::endl;
      sum+=val;
      
     }
      //std::cout <<val<<std::endl;
      std::cout <<"sum of 1 to 10 inclusive is "
          <<sum<<std::endl;
     
     return 0;
    }

    习题:1.10 1.11

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
     /*int sum=0,val;
     //keep executing the while until val is greater than 10
     for(val=50;val<=100;val++)
      sum+=val;
      */
     int sum=0,val=50;
     while(val<=100){
      sum+=val;
      ++val;
     }
      std::cout <<"sum of 50 to 100 inclusive is "
          <<sum<<std::endl;
     
     return 0;
    }

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
     /*int sum=0,val;
     //keep executing the while until val is greater than 10
     for(val=50;val<=100;val++)
      sum+=val;
      */
     int sum=0,val=50;
     while(val<=100){
      sum+=val;
      ++val;
     }
      std::cout <<"sum of 50 to 100 inclusive is "
          <<sum<<std::endl;
     
     return 0;
    }
    #include "stdafx.h"
    #include <iostream>
    int main()
    {
     /*int sum=0,val;
     //keep executing the while until val is greater than 10
     for(val=50;val<=100;val++)
      sum+=val;
      */
     int sum=0,val=50;
     while(val<=100){
      sum+=val;
      ++val;
     }
      std::cout <<"sum of 50 to 100 inclusive is "
          <<sum<<std::endl;
     
     return 0;
    }

    while循环的条件判断跟在while后面,判断条件比较灵活,可以是各种判断。
    for循环的条件也是跟在FOR后面,不过for循环多了初始条件设置,而且,for循环的条件比较适合用于参数梯级变化的情况。 

     

    在执行c++程序的时候,经常是在原程序上做修改:

    不要着急,心静自然会发现问题:

    最容易出现的问题是:

    1 程序的输入输出部分;这个输出之前都没有把lower 和upper 当作变量来看,导致终端输入两个数子没有反映;

     std::cout <<"sum of "<<lower<< " to "<< upper<< " is "
       <<sum<<std::endl;

    2 程序中变量的定义部分,增加了变量,那么变量是否定义呢?

    3 在循环中的变化;

    第一次写成了val=upper ,所以程序不能执行下去。

    for(int val=lower;val<=upper;val++)

     

    习题1.14

    #include "stdafx.h"
    #include <iostream>
    int main()
    {
     std::cout<<"please enter two numbers:"<<std::endl;

     int v1,v2;

     std::cin >> v1 >> v2 ;

     

     int lower,upper;

     if(v1<=v2){
        lower=v1;
        upper=v2;
     }else {
        lower=v2;
        upper=v1;
      }
        std::cout << lower <<"and"<< upper <<std::endl;
     //keep executing the while until val is greater than 10
     int sum=0;
     for(int val=lower;val<=upper;val++)
      sum+=val;
     std::cout <<"sum of "<<lower<< " to "<< upper<< " is "
       <<sum<<std::endl;
       
     
     return 0;
    }

    终端显示:

    please enter two numbers:
    3 7 //用户输入的数字
    3and7
    sum of 3 to 7 is 25
    Press any key to continue



     

  • c程序刚刚调通

    2009-06-16 11:42:36

    第一个c语言程序:

    出现问题:

    Enter two numbers:
    1 2
    the sum of 1 and 2is3

    出现问题原因是缺少空格:

    #include "stdafx.h"

    #include <iostream>
    int main(int argc, char* argv[])
    {
     std::cout <<"Enter two numbers:"<<std::endl;
     int v1,v2;
     std::cin>>v1>>v2;
     std::cout<< "the sum of "<< v1 <<" and "<< v2 << "is"<<v1+v2<<std::endl;
     return 0;
    }

    std::cout<< "the sum of "<< v1 <<" and "<< v2 << " is "<<v1+v2<<std::endl;

    再次调试,终端显示正确;

    Enter two numbers:
    1 2
    the sum of 1 and 2 is 3

1165/6<123456>
Open Toolbar