确 认 供选择的答案 51647933 A-F: 1.数据元素 2.符号 3.记录 4.文件 5.数据 6.数据项 7.数据对象 8.关键字 9.数据结构 G: 1.规则 2.集合 3.结构 4.运算 H: 1.现实性 2.难度 3. 复杂性 4.效率 三 编程题 1.已知输入 x,y,z,三个不相等的整数, 试设计一个算法, 使这三个数按从小到大的顺序输出,并考虑所用算法的比较次数和元素的移动次数。 3 次比较, 最坏情况下移动 7 次 2.向一维数组中第 i 个元素前插入一新的元素。 3.试用 PASCAL 语言编写在输入 20 个数中找出最小或最大数的程序。 1.2 习题解析 1.1 试写一个算法, 自大到小依次输出顺序读入的三个数 X、 Y 和 Z 的值。 void Desceding(int &x, int &y, int &z) { //将 x、 y 和 z 按从大到小的顺序排列 if (x<y) x←→y; if (x<z) x←→z; if (y<z) y←→z; }//Desceding 1.2 试编一个算法求一维数组 float a[n]中的所有元素之和。 float sum(float a[], int n) { // 求数组 a[n]中所有元素之和 for (i=0; i<n; ++i) sum+=a[i]; return sum; }//sum 1.3 分析下列各算法的时间复杂度: (1) void prime(int n){ /* 判断 n 是否是素数 */ for (i=2; ((n%i)!=0)&&(i<sqrt(n)); i++); if i>sqrt(n) printf("%d is a prime number", n) else printf("%d is not a prime number", n); }/* prime */ 最坏情况下 O(sqrt(n)) (2) float sum1(int n){ /* 计算 1! +2! +…+n! */ p=1; sum1=0; for (i=1; i<=n; ++i){ p=p*i; sum1=sum1+p } }/* sum1 */ O(n) (3) float sum2(int n){ /* 计算 1! +2! +…+n! */ sum2=0; for (i=1; i<=n; ++i){ p=1; for (j=1; j<=i; ++j) p=p*j; sum2=sum2+p; } }/* sum2 */ O(n2) (4) void sort(int a[],int n){ /* 将数组 a 中的元素按自小到大的顺序排列 */ for (i=1; i<=n-1; ++i){ k=i; for (j=i+1; j<=n; ++j) if (a[j]<a[k]) k=j; if (k<>j) {x=a[i];a[i]=a[k];a[k]=x;} } }/* sort */ O(n2) (5) void matrimult(a[m][n],b[n][l],c[m][l],int m,int n,int l){ /* a 为 m×n 阶的矩阵, b 为 n×l 阶的矩阵, c 为 m×l 阶的矩阵 */ /* 计算 c=a*b */ for (i=1; i<=m; ++i) for (j=1; j<=l; ++j) c[i,j]=0; for (i=1; i<=m; ++i) for (j=1; j<=l; ++j) for (k=1; k<=n; ++k) c[i,j]=c[i,j]+a[i,k]*b[k,i]; }/* matrimult */ O(n3) 第一章 绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数 { scanf("%d,%d,%d",&x,&y,&z); if(x<y) x<->y; //<->为表示交换的双目运算符,以下同 if(y<z) y<->z; if(x<y) x<->y; //冒泡排序 printf("%d %d %d",x,y,z); }//print_descending 1.17 Status fib(int k,int m,int &f)//求 k 阶斐波那契序列的第 m 项的值 f { int tempd; if(k<2||m<0) return ERROR; if(m<k-1) f=0; else if (m==k-1) f=1; else { for(i=0;i<=k-2;i++) temp[i]=0; temp[k-1]=1; //初始化 for(i=k;i<=m;i++) //求出序列第 k 至第 m 个元素的值 { sum=0; for(j=i-k;j<i;j++) sum+=temp[j]; temp[i]=sum; } f=temp[m]; } return OK; }//fib 分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为 O(m^2).如果采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达 O(k^m). 1.18 typedef struct{ char *sport; enum{male,female} gender; char schoolname; //校名为'A','B','C','D'或'E' char *result; int score; } resulttype; typedef struct{ int malescore; int femalescore; int totalscore; } scoretype; void summary(resulttype result[ ])//求各校的男女总分和团体总分,假设结果已经储存在 result[ ]数组中 { scoretype score; i=0; while(result[i].sport!=NULL) { switch(result[i].schoolname) { case 'A': score[ 0 ].totalscore+=result[i].score; if(result[i].gender==0) score[ 0 ].malescore+=result[i].score; else score[ 0 ].femalescore+=result[i].score; break; case 'B': score.totalscore+=result[i].score; if(result[i].gender==0) score.malescore+=result[i].score; else score.femalescore+=result[i].score; break; …… …… …… } i++; } for(i=0;i<5;i++) { printf("School %d:\n",i); printf("Total score of male:%d\n",score[i].malescore); printf("Total score of female:%d\n",score[i].femalescore); printf("Total score of all:%d\n\n",score[i].totalscore); } }//summary 1.19 Status algo119(int a[ARRSIZE])//求 i!*2^i 序列的值且不超过 maxint { last=1; for(i=1;i<=ARRSIZE;i++) {a[i-1]=last*2*i; if((a[i-1]/last)!=(2*i)) reurn OVERFLOW; last=a[i-1]; return OK; } }//algo119 分析:当某一项的结果超过了 maxint 时,它除以前面一项的商会发生异常. 1.20 void polyvalue() { float ad; float *p=a; printf("Input number of terms:"); scanf("%d",&n); printf("Input the %d coefficients from a0 to a%d:\n",n,n); for(i=0;i<=n;i++) scanf("%f",p++); printf("Input value of x:"); scanf("%f",&x); p=a;xp=1;sum=0; //xp 用于存放 x 的 i 次方 for(i=0;i<=n;i++) { sum+=xp*(*p++); xp*=x; } printf("Value is:%f",sum); }//polyvalue 1.2.1 选择题 【1】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 【】 练习 1 1-4 答: 抽象数据类型通常是指由用户定义, 用以表示应用问题的数据模型, 抽象数据类型由基本的数据类型组成, 并包括一组相关的服务。 答: #include<iostream.h> class compex{ public: complex(){a=b=0;} complex(double x){a=x;b=0;} complex(double x;double y){a=x;b=y;} double get_a(){return a;} double get_b(){return b;} complex operator+(complex x){return complex(a+x.a,b+x.b);} complex operator-(complex x){return complex(a-x.a,b-x.b);} complex operator*(complex x){return complex(a*x.a-b*x.b,a*x.b+b*x.a);} complex operator/ (complex) {return complex((a*x.a+b*x.b)/(x.a*x.a+x.b*x.b),(b*x.a-a*x.b)/(x.a*x.a+x.b*x.b));} private: double a; double b; friend ostream&operator<<costream&str,complex&x) {str<<x.get_a(); if(x.get_b()>0)str<<’f’<<x.get_b()<<’i’; else if(x.get_b()<0)str<<x.get_b()<<’i’; return str;} } 1_7 #include <iostream.h> #include <conio.h> #include "process.h" const arraySize=16; //设数组最大为 16 void cal(int ,int []); void main() { int i,n,A[arraySize]; cout<<"Please input n:(n<=16 设数组最大为 16)"<<endl; cin>>n; if(n>arraySize) { cerr<<"Error, n is too big"<<endl; exit(1); } cal(n,A); cout<<"the result is:"<<endl; A[0]=0; for(i=0;i<=n;i++) cout<<"A["<<i<<"]="<<A[i]<<endl; getche(); } void cal(int n,int B[]) { int j=1,a=1,b=1; int maxInt=65535; //设允许的最大整数为 65535 while(j<=n) { B[j]=(a*j)*(b*2); if(B[j]>maxInt) { cerr<<"Error,beyond maxInt!(设允许的最大整数为 65535)"<<endl; exit(1); } a*=j; b*=2; j++; } } 1-9 (1) 解: void(arrayelement x[],int n) { int i=1; count++; do { count++; x[i]+=2; count++; i+=2; count++; count++; }while(i<=n); i=1; count++; while(i<=(n/2)) { count++; x[i]+=x[i+1]; count++; i++; count++; } } (2) 解: void(arrayelement x[],int n) { int i=1; count++; int a=1; count++; do { count++; x[i]+=2; count++; i+=2; count++; count++; if(a<=n/2) { x[a]+=x[a+1]; count++; a++; count++; } count++; } while(i<=n) } (3) 答: count 的值为(2+(11*n)/2)。 (4) 解: 程序步数计算工作表 行号 程序语句 一次执行所需程序步数 执行频度 程序步数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { int i=1; do { x[i]+=2; i+=2; }while(i<=n); i=1; while(i<=(n/2)) { x[i]+=x[i+1]; i++; } } 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 n n n n n 1 n/2 n/2 n/2 n/2 n/2 1 0 1 n 0 n n n 1 n/2 0 n/2 n/2 0 0 数据结构习题一 -------------------------------------------------------------------------------- 1.1 简述下列概念: 数据、 数据元素、 数据类型、 数据结构、 逻辑结构、 存储结构、 线性结构、 非线性结构。 ◆ 数据: 指能够被计算机识别、 存储和加工处理的信息载体。 ◆ 数据元素: 就是数据的基本单位, 在某些情况下, 数据元素也称为元素、 结点、 顶点、记录。 数据元素有时可以由若干数据项组成。 ◆ 数据类型: 是一个值的集合以及在这些值上定义的一组操作的总称。 ◆ 数据结构: 指的是数据之间的相互关系, 即数据的组织形式。 一般包括三个方面的内容:数据的逻辑结构、 存储结构和数据的运算。 ◆ 逻辑结构: 指各数据元素之间的逻辑关系。 ◆ 存储结构: 就是数据的逻辑结构用计算机语言的实现。 ◆ 线性结构: 数据逻辑结构中的一类, 它的特征是若结构为非空集, 则该结构有且只有一个开始结点和一个终端结点, 并且所有结点都最多只有一个直接前趋和一个直接后继。 线性表就是一个典型的线性结构。 ◆ 非线性结构: 数据逻辑结构中的另一大类, 它的逻辑特征是一个结点可能有多个直接前趋和直接后继。 -------------------------------------------------------------------------------- 1.2 试举一个数据结构的例子、 叙述其逻辑结构、 存储结构、 运算三个方面的内容。 ◆ 例如有一张学生成绩表, 记录了一个班的学生各门课的成绩。 按学生的姓名为一行记成的表。 这个表就是一个数据结构。 每个记录(有姓名, 学号, 成绩等字段)就是一个结点, 对于整个...