C++程序设计第二章作业讲评
C语言程序设计第二章作业参考答案

《C语言程序设计》第2章作业布置日期:2017-10-23 截止日期:2017-11-3一、单选题(每小题4分,共100分)1、以下说法中正确的是____。
A、C语言程序总是从第一个函数开始执行B、在C语言程序中,要调用的函数必须在main()函数中定义C、C语言程序总是从main()函数开始执行D、C语言程序中的main()函数必须放在程序的开始部分2、若一个void型函数定义中没有return语句,则调用该函数时,函数______。
A、没有返回值B、返回若干个系统默认值C、返回一个用户所希望的函数值D、返回一个不确定的值3、一个C程序的执行是________。
A、从本程序的main函数开始,到本程序的main函数结束B、从本程序的main函数开始,到本程序的最后一个函数结束C、从本程序的第一个函数开始,到本程序的最后一个函数结束D、从本程序的第一个函数开始,到本程序的main函数结束4、若已定义x和y为double类型,且x=1,则表达式y=x+3/2的值是______。
A、1B、2C、2.0D、2.55、设a为整型变量,能表达数学关系10<a<15的C语言表达式是______。
A、10<a<15B、a>10&&a<15C、a>10 and a<15D、a>10||a<15</a<156、若k是int型变量,且有下面的程序片段:k=-3;if(k=3) printf("####");else printf("&&&&");上面程序片段的输出结果是A、####B、&&&&C、####&&&&D、上面程序段语法错误,无输出结果7、下面程序的输出是:main(){int x=10,y=3;double z;z=x/y;printf("%6.2f\n",z);}A、0B、3.00C、3.33D、18、若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为:A、a<>0B、a!=0C、a>0 OR a<0D、a>0 AND a<09、设j为int 型变量,则下面for循环语句的执行结果是:for(j=10;j>3;j=j-1){ if(j%3!=0)j=j-1;j=j-2;printf("%d",j);}A、6 3B、7 4C、6 2D、7 310、若想通过以下输入语句使a=5.0,b=4,c=3,则输入数据的正确形式是:int b,c; float a;scanf("%f,%d,%d",&a,&b,&c);A、5.0 4 3B、5.0, 4, 3C、5.0, 4, c=3D、a=5.0, b=4, c=311、若执行以下语句后,celsius变量的结果是______。
C语言程序设计教案第2章4 -6

(3)关系或逻辑表达式的值只有两个:真(非零)和假(零)。
(4)分析复杂表达式时,应先找优先级别最高的运算符,同时,注意”()”的优先级别很高,它往往可以改变表达式的运算次序。通过分析复杂表达的运算逻辑,推导出短路原则。
(5)编写一个输出复杂表达式的值及每个参与变量的值的程序。预估程序结果,然后与实验结果对比,从而深入理解短路原则及表达式的运算规律。
【问题】ppt中的程序有哪些错误
【实践】基于强制类型范围缩放数据处理技术的成绩分档程序的设计与实现
授课阶段总结
本节内容以实践为主,以当前所学的知识点,学生可以组织起一个逻辑上相对完整的程序,所以本小节以程序设计思维的训练为重点内容。首先,引导学生设计一个可以进行人机交互的界面—编写一个计算器的菜单,通过选择进行计算,把第一章的计算语句copy到适当的位置(增量开发)。然后,运用本章的知识点,设计具有一定的容错能力和设计技巧(强制类型转换与归一化处理)的学生成绩分档程序。两个例子都用到了本章所介绍的if和switch嵌套句型。
2.4 应用实例(1学时)
教学内容
(1)计算器程序设计。
(2)强制类型转换。首先讲解数据类型之间的转换规则,然后讲解转换的方法及用途。
(3)学生成绩档案管理—成绩等级划分。
讲解思路
(1)本小节主讲设计思想,所以每一个例题都必须有流程图来表达设计思想,通过讲解流程图帮学生梳理思路。然后,把对编程实现时用到技巧及难点进行讲解。
(2)掌握switch多路选择语句,在解决问题时,能够正确选择switch和if语句。
(3)掌握选择语句的流程图的算法描述方法
重点:if选择结构和switch选择结构。
c程序设计第二章解析

重点: • 编程的思维 • 分支结构的实现(if 语句、switch 语句) • 循环结构的实现(while语句、do while语句、for语句)
算法的概念
算法:
算法是解决问题的步骤。
计算机算法的特征:
(1) 可执行性 (2) 确定性 (3) 有穷性 (4) 可输入输出信息
分析:读入三个数,先求出两个数中较大者, 再将该大数与第三个数比较,求出最大数。
a>=b?
输入3个数a,b,c
int main(){
int a, b, c, max; cout<<"输入三个正数:";
[t] max赋值a
[f] max赋值b
cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b <<'\t‘<<"c="<<c<<endl;
c>max?
[f] [t]
if(a>=b) max=a;
max赋值c
else max=b;
if (c>max) max=c;
输出max
cout<< “最大数为:”<<max<<endl;
return 0; }
课后编程:任意4个数找最小值; 例题2.5活动图
例2.4 输入一个年份,判断是否为闰年
#include<iostream> using namespace std; int main () { int year;
c程序设计 谭浩强 第2章

我们的任务是用计算机解题,就是用计算机实现算法; 用计算机语言表示算法必须严格遵循所用语言的语法 规则。 【例2.7】求1×2×3×4×5用C语言表示。 main() { int i,t; t=1; i=2; while(i<=5) { t=t*i; i=i+1; } printf(“%d”,t); }
2.5.6计算机语 言
2.6结构化程序 设计方法 作业
15
将例2.2的算用流程图表示。
第二章 程序的灵魂— 算法 2.1设计步骤 2.2算法的概念 2.3算法举例 2.4算法的特性 2.5算法的表示 2.5.1自然语言 2.5.2流程图 2.5.3基本结构 2.5.N-S流程图 2.5.5伪代码
2.5.6计算机语 言
2.5.6计算机语 言
2.6结构化程序 设计方法 作业
14
【例2.6】将例2.1求5!的算用流程图表示。
第二章 程序的灵魂— 算法 2.1设计步骤 2.2算法的概念 2.3算法举例 2.4算法的特性 2.5算法的表示 2.5.1自然语言 2.5.2流程图 2.5.3基本结构 2.5.N-S流程图 2.5.5伪代码
18
三.三种基本结构和改进的流程图
第二章 程序的灵魂— 算法 2.1设计步骤 2.2算法的概念 2.3算法举例 2.4算法的特性 2.5算法的表示 2.5.1自然语言 2.5.2流程图 2.5.3基本结构 2.5.N-S流程图 2.5.5伪代码
顺序结构:
2.5.6计算机语 言
2.6结构化程序 设计方法 作业
2.6结构化程序 设计方法 作业
如果,n表示学生学号,ni表示第i个学生学号; g表示学生成绩,gi表示第i个学生成绩; 则算法可表示如下: S1: 1→i S2: 如果gi≥80,则打印ni和gi,否则不打印 S3: i+1→i S4:若i≤50, 返回S2,否则,结束。
C语言教案:习题讲解及第二章知识总结.doc 免费

(int)a+b;/*表示将变量a的类型强制转换成int型后,再进行运算*/
(2)经强制类型转换后,得到的是一个所需类型的中间变量,原来变量的类型并没有发生任何变化。
【例1】分析下面程序的运行结果
/* EX2-5.C */
main()
main( )
{
int m,n, k;
m=5; n=10;
k=(--m)+(--n);
printf("m=%d,n=%d,k=%d\n",m,n,k);
m=5, n=10;
k=(m--)+(n--);
教 学 活 动 流 程 设 计
旁注
printf("m=%d,n=%d,k=%d\n",m,n,k);
n=k*3;printf("%d",n);
m=n%j;printf("%d",m);
m=m-i;printf("%d",m);
n=k/j;printf("%d",n);
}
运行结果为:
56180-22
【分析】整型数据不管进行什么样的算术运算得出的结果仍为整型数据。
【例4】分析下面程序的运行结果。
/* EX2-8.C */
}
运行结果为:
m=4, n=9, k=13
m=4, n=9, k=15
【本章小结】
本章主要介绍了C语言中有关数据与数据计算的基本概念和规则。重点讲解了以下几个方面的内容:
(1)C语言的数据类型有四类:基本类型、构造类型、指针类型和空类型。
《C++程序设计》(第2版)教学资源 主教材习题解答 C++第二章习题解答

第二章 基本控制结构程序设计习题一.基本概念与基础知识自测题2.1 程序阅读题 2.1.1 设有说明: int a=3, b=100;下面的循环语句执行 (1) 次,执行后a 、b 的值分别为 (2) 、 (3) 。
while (b/a>5){if (b-a>25) a++; else b/=a; }解答:(2)17 (3)1002.1.2 设有说明: int x,y,n,k;下面程序段的功能是备选答案中的 (1) ,当n=10,x=10打印结果是 (2) 。
cin>>x>>n; k=0; do {x/=2; k++; }while (k<n); y=1+x; k=0; do {y=y*y; k++; }while (k<n); cout<<y<<endl; 备选答案: A. n n x y )1(+= B. n n x y 2)21(+= C. n n x y )21(+= D. n n x y 21)21(++=解答:第一个循环使x 成为:n x 2;y 成为:n x 21+;第二个循环使y 成为:nn x 2)21(+;(1)B考虑整除,当x 连除4次2以后即为0,所以:n x2为0 (2)12.1.3 请看如下程序段: if (num==1) cout<<”Alpha”; else if (num==2) cout<<”Bata”;else if (num==3) cout<<”Gamma”;else cout<<”Delta”;当num 的值分别为1、2、3时,上面程序段的输出分别为(1) 、(2) 、(3) 。
解答:检查条件语句与字符串输出概念: (1)Alpha (2)Bata (3)Gamma2.1.4 执行下面程序段后,m 和k 的值分别为 (1) 、 (2) 。
面向对象程序设计第二章课后答案说课讲解

面向对象程序设计第二章课后答案1.什么是命名空间,如何访问命名空间的成员?【解答】为了解决不同文件中同名变量的问题,C++标准中引入命名空间的概念。
命名空间(namespace)是一种特殊的作用域,命名空间可以由程序员自己来创建,可以将不同的标识符集合在一个命名作用域内,这些标识符可以类、对象、函数、变量、结构体、模板以及其他命名空间等。
在作用域范围内使用命名空间就可以访问命名空间定义的标识符。
有3种访问方法:(1)直接指定标识符,访问方式为:命名空间标识符名∷成员名。
(2)使用using namespace命令(3)使用using关键词声明2.什么是内联函数,它有什么特点?哪些函数不能定义为内联函数?【解答】用inline关键字声明或定义的函数称为内联函数。
C++中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。
内联函数(inline function)的定义和普通函数相同,但C++对它们的处理方式不一样。
在编译时,C++将用内联函数程序代码替换对它每次的调用。
这样,内联函数没有函数调用的开销,即节省参数传递、控制转移的开销,从而提高了程序运行时的效率。
但是,由于每次调用内联函数时,需要将这个内联函数的所有代码复制到调用函数中,所以会增加程序的代码量,占用更多的存储空间,增大了系统空间方面的开销。
因此,内联函数是一种空间换时间的方案。
函数体内有循环语句和switch语句,递归调用的函数不能定义为内联函数。
3.什么是函数重载?在函数调用时,C++是如何匹配重载函数的?【解答】函数重载是指两个或两个以上的函数具有相同的函数名,但参数类型不一致或参数个数不同。
编译时编译器将根据实参和形参的类型及个数进行相应地匹配,自动确定调用哪一个函数。
使得重载的函数虽然函数名相同,但功能却不完全相同。
在函数调用时,C++是匹配重载函数规则如下:首先寻找一个精确匹配,如果能找到,调用该函数;其次进行提升匹配,通过内部类型转换(窄类型到宽类型的转换)寻求一个匹配,如char到int、short到int等,如果能找到,调用该函数;最后通过强制类型转换寻求一个匹配,如果能找到,调用该函数。
C 程序设计(谭浩强完整版)第二章解析

data
Program
CPU
运算器
内存
外存
硬盘 软盘
2000H (2000H)+(2002H) 2001H 2002H
3
3+5=?
2003H
2004H
5
8 内存
用一个字节表示整数,范围为-128~127;用两个字节表 示整数,范围为-32768~ 32767。一般用四个字节表示 整数。(举例)
#include<iostream.h> #define PRICE 30 //常量,在程序中保持不变 void main(void) { int num, total; //定义变量,在内存中开辟区间 num=10; //变量赋值,10为常量 num total
total=num*PRICE;
cout<<“total=“<<total; //输出结果
2)若一个常量定义为长整型数,则在其后加l或L进行区 分。 如:32l 32L 564L等,内存为其分配四个字节存储。
一个数在内存中为
11111111111111111111111111111111
当这个数为有符号数时,是-1;为无符号数时,是232-1
内存中的数是以补码的形式存放的。(举例说明)
#include <iostream.h>
#include<iostream.h>
b 1111111111111111
实型数据
实型数又称浮点数,有两种表示方式: 1)十进制形式: 23.0 2) 指数形式: 23E1 后面必须是整数。 24.5 145e-1 3.56789
356789e1 e前有数字,
c语言程序设计第二章课后参考答案[修改版]
![c语言程序设计第二章课后参考答案[修改版]](https://img.taocdn.com/s3/m/2df6a308770bf78a642954c3.png)
第一篇:c语言程序设计第二章课后参考答案第二章:C程序的基本结构一、单项选择题1、以下不是C语言的特点的是________。
A)语言的表达能力强B)语言定义严格C)数据结构系统化D)控制流程结构化2、TC编译系统提供了对C程序的编辑、编译、连接和运行环境,以下可以不在该环境下进行的环节是________。
A)编辑和编译B)编译和连接C)连接和运行D)编辑和运行3、以下不是二进制代码文件是________。
A)标准库文件B)目标文件C)源程序文件D)可执行文件4、下面个选项组中,均属于C语言关键字的一组是________。
A)auto,enum,includeB)switch,typedef,continue C)signed,union,scanf D)if,struct,type5、下面四组字符串中,都可以用作C语言标识符的是________。
A)print B)I \am C)signed D)if _maf scanf 3mf ty_pr mx_2d mx_ a.f x1# aMb6 AMB A&B 5XY6、以下不属于流程控制语句的是_________。
A)表达式语句B)选择语句C)循环语句D)转移语句7、下面描述中,不正确的是________。
A)C语言的函数体由一系列语句和注释组成。
B)注释内容不能单独写在一行上。
C)C程序的函数说明部分包括对函数名、函数类型、形式参数等的定义和说明。
D)scanf和printf是标准库函数而不是输入和输出语句。
8、下面描述中,正确的是________。
A)主函数的花括号必须有,而子函数中的花括号是可有可无的。
B)一个C程序行只能写一个语句。
C)主函数是程序启动时的唯一入口。
D)函数体包含了函数说明部分。
二、填空题1、一个完整的C程序至少要有一个________函数。
(主函数)2、标准库函数不是C语言本身的组成部分,它是由__________提供的功能函数。
C语言程序设计教学课件作者第2版乌云高娃课件源程序及习题答案第2章顺序结构流程及应用课件

试一试
调试问题2.4程序,观察运行结果
■ 问题2.4 Tony因学习努力,成绩突出,上半学年 获奖学金2500元,下半学年获奖学金3000元。用 scanf函数输入数据,计算Tony本学年所获得的 奖学金并输出结果。
■ 【解题步骤】 1.定义变量iPrize1、iPrize2和iSum用来存放上半
算术运算符的优先级和结合方 向
C语言规定了运算符的优先级和结合方 向,在表达式求值时,先按运算符的优 先级别高低次序执行,再按运算符的结 合方向结合(相同优先级时)。例如先 乘除后加减,如表2-8所示。
试一试
问题2.9 函数f(x)=3x3+2x2+x+1,编一 程序计算并输出f(3)值。
【解题步骤】 1.定义整型变量iX、iY; 2.从键盘输入一个自变量的值; 3.计算函数值; 4.输出函数值;
试一试
问题2.1新生入学需要保存学生数据,现在定义 整型变量存放年龄、学号,定义字符变量存放 性别,定义浮点型变量存放入学分数和班费。
int iAge=20,iNum=201; char cSex=’m’; /*f:female(女), m:male (男)*/ float fScore,fSum; fScore=580.5; fMoney=78.5
试一试
■ 问题2.5 从键盘输入一个小写字母,将其转 化为大写字母输出。
■ 【解题步骤】 1. 定义字符变量ch用来存放从键盘输入的数
据。; 2. 输出提示信息; 3. 从键盘接收一个小写字母存入ch; 4. 将字符ch转换为大写字母,即ch-32后仍存
入到ch; 5.输出字符变调量试c问h中题的2.字5程符序;,观察运行结果
小结
■ 格式化输出函数printf中双引号括起来的内 容除了%d等格式说明符外,其它字符原样 输出。同样格式化输入函数scanf中双引号 括起来的内容除了%d等格式说明符外,其 它字符照原样输入。
C#程序设计教程 第二章 第二部分

《C#程序设计教程》第二章(第二部分)例2.10 把1~100之间含有因子3的数输出。
代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 例2._10{class Program{static void Main(string[] args){//int m = 0;for (int n=1;n<=100;n++){if (n%3!=0){continue;}Console.WriteLine(n);//m = m + 1;//Console.WriteLine(m);}}}}截图:例2.11 求1~100之间所有素数。
代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 例2._11{class Program{static void Main(string[] args){int m, k, n = 0;for (m = 2; m <= 100;m++ ){for (k = 2; k < m;k++ ){if (m%k==0){break;}}if (k >= m){Console.Write("{0,-4}",m);if (++n % 10 == 0){Console.WriteLine("\n");}}}}}}截图:例2.12 求1~100之间所有素数。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 例2._12{class Program{public static bool prime(int m){for (int i = 2; i < m; i++){if (m % i == 0){return false;}}return true;}static void Main(string[] args){int m, k, n=1;Console.Write("{0,-4}",2);for (m = 3; m < 100;m+=2){if (prime(m)){Console.Write("{0,-4}",m);if (++n%10==0){Console.WriteLine("\n");}}}Console.Read();}}}截图:例2.13 用goto语句编写百钱百鸡问题的程序。
C程序设计语言 (第二版) 课后答案第二章

Exercise 2-1Write a program to determine the ranges of char , short , int , and long variables, both signed and unsigned , by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.#include <stdio.h>#include <limits.h>intmain (){printf("Size of Char %d\n", CHAR_BIT);printf("Size of Char Max %d\n", CHAR_MAX);printf("Size of Char Min %d\n", CHAR_MIN);printf("Size of int min %d\n", INT_MIN);printf("Size of int max %d\n", INT_MAX);printf("Size of long min %ld\n", LONG_MIN);printf("Size of long max %ld\n", LONG_MAX);printf("Size of short min %d\n", SHRT_MIN);printf("Size of short max %d\n", SHRT_MAX);printf("Size of unsigned char %u\n", UCHAR_MAX);printf("Size of unsigned long %lu\n", ULONG_MAX);printf("Size of unsigned int %u\n", UINT_MAX);printf("Size of unsigned short %u\n", USHRT_MAX);return 0;}Exercise 2-2Write a loop equivalent to the for loop above without using && or || .#include <stdio.h>#define lim 100void main(){int i=0, c;char s[lim];while(i<lim-1){c=getchar();if(c='\n')break;if(c= EOF)break;++i;s[i]=c;}}Exercise 2-3Write the function htoi(s) , which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F .#define YES 1#define NO 0int htoi(s[]){int a ,I ,b ,n ;if(s[i]=='0'){++i;if(s[i]=='x'||s[i]=='X'){++i;}}n=0;b=YES;if( ;b==YES;++i){if(s[i]>='0'&&s[i]<='9')a=s[i]-'0';else if(s[i]>='a'&&s[i]<='z')a=s[i]-'a'+10;else if(s[i]>='A'&&s[i]<='Z')a=s[i]-'A'+10;elseb=NO;if (b==YES)n=16*n+a;}return n;}Exercise 2-4Write an alternate version of squeeze(s1,s2) that deletes each character in the string s1 that matches any character in the string s2 . void squeeze2(char s1[], char s2[]){int i, j, k;int instr2 = 0;for(i = j = 0; s1[i] != '\0'; i++){instr2 = 0;for(k = 0; s2[k] != '\0' && !instr2; k++){if(s2[k] == s1[i]){instr2 = 1;}}if(!instr2){s1[j++] = s1[i];}}s1[j] = '\0';}Exercise 2-5Write the function any(s1,s2) , which returns the first location in the string s1 where any character from the string s2 occurs, or -1 if s1 contains no characters from s2 . (The standard library function strpbrk does the same job but returns a pointer to the location.) int any(char s1[], char s2[]){int i;int j;int pos;pos = -1;for(i = 0; pos == -1 && s1[i] != '\0'; i++){for(j = 0; pos == -1 && s2[j] != '\0'; j++){if(s2[j] == s1[i]){pos = i;}}}return pos;Exercise 2-6Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.#include <stdio.h>unsigned setbits(unsigned x, int p, int n, unsigned y){return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n));}int main(void){unsigned i;unsigned j;unsigned k;int p;int n;for(i = 0; i < 30000; i += 511){for(j = 0; j < 1000; j += 37){for(p = 0; p < 16; p++){for(n = 1; n <= p + 1; n++){k = setbits(i, p, n, j);printf("setbits(%u, %d, %d, %u) = %u\n", i, p, n, j, k);}}}}return 0;}Exercise 2-7Write a function invert(x,p,n) that returns x with the n bits that begin at position p inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.#include <stdio.h>int main(void){unsigned x;int p, n;for(x = 0; x < 700; x += 49)for(n = 1; n < 8; n++)for(p = 1; p < 8; p++)printf("%u, %d, %d: %u\n", x, n, p, invert(x, n, p));return 0;}Exercise 2-8Write a function rightrot(x,n) that returns the value of the integer x rotated to the right by n bit positions.#include <stdio.h>int main(void){unsigned x;int n;for(x = 0; x < 700; x += 49)for(n = 1; n < 8; n++)printf("%u, %d: %u\n", x, n, rightrot(x, n));return 0;}Exercise 2-9In a two's complement number system, x &= (x-1) deletes the rightmost 1-bit in x . Explain why. Use this observation to write a faster version of bitcount .int bitcount(unsigned x){int b;for (b = 0; x != 0; x >>= 1)if (x & 01)b++;return b;}Exercise 2-10Rewrite the function lower, which converts upper case letters to lower case, with a conditional expression instead of if-else .#include <stdio.h>#include <string.h>#define TEST#define ORIGINAL 0#define SOLUTION 1#define PORTABLE_SOLUTION 0#if ORIGINALint lower(int c){if(c >= 'A' && c <= 'Z')return c + 'a' - 'A'; elsereturn c;}#endif。
C语言程序设计第2章解析

C语言程序段计第2章基本数据及其运算•:•学习目标㈢掌握c语言的基本数据类型及其运算。
•:•学习内容m整型、实型和字符型数据m常量和变量的概念和使用2.1 一个C 程序实例【例2・1】计算圆的而积,半径为10cm 。
【程序代码】 #include H stdio.h f,main(){int r;float area ; r=10; area=3.14*r*r;printf (n %f\n H , area);2.2基本数据类型1. 整数类型•:•整型:在计算机内存中占据2个字节的存储 空间,表示的数值范围^-32768-3276乙 如图所示。
C 语言约定其数据类型标识 符为int 。
图整型数据的存储格式•:•长整型:在计算机内存中占据4个字节的存储空间,表示的数值范围为-231 -231-1,如图 2・2所示,其数据类型标识符为long o)1}程序输出结果为:图长整型数据的存储格式2. 实数类型实型数据也叫浮点数,指带有小数部分的非整数 数值,比如像123.45和1.2X109这类数据。
•:•单精度型:类型标识符为float,占据4个字节, 其有效位为7位,如图2-3所示。
•:•双精度型:类型标识符为double,占据8个 字节,有效位为16位左右。
31 I)分图2・3浮点型数据的〃储格式3. 字符类型•:•字符类型数据包括两种:单个字符和字符串,例如“A,是字符,而“ABW 是字符串。
•:.在计算机中字符是以ASCII 码的形式存储的, 一个字符只占"I 个字节的存储空间,如图2・4所 7 c<> 1 OOO O O 1图2-4字符’A'的存储格式❖字符类型的标识符为char 。
提示:字符与ASCII 码的对应关系可查阅附录A 。
2.3常量和变量2.3.1常量“小数形式:比如123.45oc 指数形式:比如1.2345e2 (相当于123.45 ) zjs O •:•整型常量: 比如整数123。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
t
q
– 从原链提取一个结点,插入 到新链前面。
template <class ElemType> void LinkList<ElemType>::Reverse() { LinkNode<ElemType> *p = head->next; //原链第一个结点指针 LinkNode<ElemType> *q; //原链结点删除过程临时指针 //处理头结点,使其指向空链 head->next = NULL; tail = head;
优化GetElem(ElemType &e, int i)
template<class ElemType> bool LinkList<ElemType>:: GetElem(ElemType &e, int i) const { if (i < 1 || i > len) return false; LinkNode<ElemType> *p; int k = 1; p = head->next; while (k < i) { p = p->next; •每次查找从头开始 k++; •用变量pos记录当前 } 查找序号; e = p->data; •用指针current记录当 return true; 前查找位置; } •缩短查找长度 template<class ElemType> bool LinkList<ElemType>:: GetElem(ElemType &e, int i) const { int k ; LinkNode<ElemType> *p; if (i < 1 || i > len) return false; if (i == pos) { //如果是当前位置 e = current->data; return true; } if (pos == 0 || i < pos) { //如果在当前位置前面,从头开始 p = head->next; k = 1; } else { //如果在当前位置后从pos开始 p = current; k = pos; } while (k < i) { p = p->next; k++; } e = p->data; current = p; pos = i; return true; }
P47 第6题
• 题目解读
– 条件:有序单链表 – 要求:提高算法的时间性能到O(m+n)
• 问题:原算法的效率问题在哪里?
template<class T> void mergelist(LinkList<T> &La, LinkList<T>&Lb, LinkList<T> &Lc) { int k, i, j, La_len, Lb_len; 每个结点访问1次的时间 T ai, bj; 复杂度是O(n),n个结点都 k=1;i=j=1; 全部结点插入O(m+n) 有可能被访问,为O(n*n) La_len=La.Length(); Lb_len=Lb.Length(); while ( i<=La_len && j<=Lb_len ) //出现重复处理语句 优化1: Lc.Append(ai ); { La.GetElem(ai, i); Lb.GetElem(bj, j); if (ai<bj) template<class ElemType> { Lc.Insert(ai,k ); i++; } bool LinkList<ElemType>::GetElem(ElemType &e, int i) else const { { Lc.Insert(bj,k ); j++; } if (i < 1 || i > len) return false; k++; LinkNode<ElemType> *p = head->next; int k = 1; } while (k < i) { //O(n) while (i<= La_len) k++; {La.GetElem(ai, i); Lc.Insert(ai,k p );= p->next; } k++; i++; } e = p->data; while (j<=Lb_len) return {Lb.GetElem(bj, j); Lc.Insert(bj, k); true; } k++; j++; } }
• 思路:
– 用原存储空间 – 调整链接关系 h
p q
p = head->next; head->next = NULL; tail = head;
p
q
p ∧
– 把头结点游离出来,用于新链的头结点。
t
h
∧
q
∧
q = p; p = p->next; q->next = head->next; head->next = q;
template <class ElemType> void SqList1<ElemType>::Reverse() { ElemType temp; //临时存储 int l = len/2; for (int i = 0; i < l; i++) { temp = elem[i]; elem[i] = elem[len-i-1]; elem[len-i-1] = temp; } 边界测试:
while (p) { //在原链中提取一个结点q q = p; p 结点 q->next = head->next; head->next = q; if (tail == head) //特别处理第一个结点 { tail = q; } } }
template <class ElemType> class LinkList: public List<ElemType> // {释放单链表中的所有数据结点 public: template <class ElemType> LinkList(); void LinkList<ElemType>::Clear() // 拷贝构造函数。从现有的单链表拷贝构造出一个单链表 LinkList(const LinkList<ElemType>&); ~LinkList(); // 构造一个带表头结点的空单链表 { template<class ElemType> bool IsEmpty()const {return len <= 0;} LinkNode<ElemType> template<class ElemType> *p = head->next, *q; int Length()const {return len;} void Clear(); LinkList<ElemType>::LinkList(const LinkList<ElemType> &r) LinkList<ElemType>::LinkList() while (p) { bool GetElem const; bool SetElem( const ElemType&,int); { (ElemType&,int) q = p->next ; { int LocateElem(const ElemType&) const; delete p;0; CopyFrom(r);// 从 r所引用的链表中复制所有的结点(值) = 0; pos = int LocatePrior(const ElemType&) len const; p = q; pos ElemType&) = 0; head = new LinkNode<ElemType> ; int LocateNext(const const = ; tail } = NULL; bool Insert(constcurrent ElemType&, int); head->next = NULL; current = NULL; 还有哪些成员函数 tail = head; bool Append(const ElemType&); }可以进一步优化以 } head->next = NULL; bool Delete(ElemType&,int); 提高访问效率? len = 0; pos = 0; current = NULL; void Traverse() const; } LinkList<ElemType> operator=(const LinkList<ElemType>&); void Reverse(); private: int len; int pos; void CopyFrom(const LinkList<ElemType>&); LinkNode<ElemType> *head; LinkNode<ElemType> *tail; LinkNode<ElemType> *current; };
第二章作业讲评
P47:第1题
• 题目关键词解读——锻炼理解能力
– “就类模板写一成员函数”
• 就类模板——基于类模板 • 增加一个成员函数