C程序设计基础课后复习资料第四章Word格式文档下载.docx
- 文档编号:22011667
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:27.43KB
C程序设计基础课后复习资料第四章Word格式文档下载.docx
《C程序设计基础课后复习资料第四章Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C程序设计基础课后复习资料第四章Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
=0;
j--,k++)
a[j][i-j]=k;
for(i=0;
{for(j=0;
j<
j++)
setw(3)<
a[i][j];
}
4.intf(int[],int);
{inta[]={-1,3,5,-7,9,-11};
cout<
f(a,6)<
intf(inta[],intsize)
{inti,t=1;
for(i=0;
size;
i++)
if(a[i]>
0)t*=a[i];
returnt;
5.intf(int[][3],int,int);
{inta[][3]={0,1,2,3,4,5,6,7,8};
f(a,3,3)<
intf(inta[][3],introw,intcol)
{inti,j,t=1;
for(i=0;
row;
for(j=0;
col;
{a[i][j]++;
if(i==j)t*=a[i][j];
returnt;
6.#include<
voidtest1(int*a1)
{a1=newint(5);
*a1="
*a1<
voidtest2(int*&
a2)
{a2=newint(5);
*a2="
*a2<
{int*p=newint
(1);
test1(p);
test1:
*p1="
*p<
test2(p);
test2:
*p2="
7.#include<
{chars[]="
abccda"
;
inti;
charc;
for(i=1;
(c=s[i])!
='
\0'
;
{switch(c)
{case'
a'
:
%'
continue;
case'
b'
$'
break;
c'
*'
d'
#'
8.#include<
{char*str[]={"
c++"
"
basic"
pascal"
};
char**p;
p=str;
3;
*(p+i)<
9.#include<
{chars1[]="
Fortran"
s2[]="
Foxpro"
char*p,*q;
p=s1;
q=s2;
while(*p&
&
*q)
{if(*p==*q)
*p;
p++;
q++;
10.#include<
string.h>
voidmain()
{charstr[][10]={"
vb"
},s[10];
strcpy(s,(strcmp(str[0],str[1])<
0str[0]:
str[1]));
if(strcmp(str[2],s)<
0)strcpy(s,str[2]);
s<
4.2思考题
1.数组说明语句要向编译器提供什么信息?
写出一维数组、二维数组说明语句的形式。
2.数组名、数组元素的区别是什么?
归纳一维数组元素地址、元素值不同的表示形式。
有说明
intaa[3],*pa=aa;
使用aa或pa,写出3个以上与aa[2]等价的表达式。
3.要把一维数组inta[n*n]的元素传送到二维数组intb[n][n]中,即在程序中要执行
b[i][j]=a[k];
写出k->
i,j的下标变换公式,并用程序验证之。
4.有以下函数
voidquery()
{int*p;
p=newint[3];
//……
delete[]p;
p=newdouble[5];
//……
出现了编译错误。
请分析错误的原因,并把上述程序补充完整,上机验证你的判断。
5.有以下程序根据输入值,调用函数create建立并初始化动态数组,令a[i]=i。
该程序运行后,主函数不能返回期望值。
请分析程序的错误原因并修改之。
#include<
voidcreate(int*,int);
{int*a,len;
cin>
>
len;
create(a,len);
for(inti=0;
i++)cout<
a[i]<
endl;
delete[]a;
voidcreate(int*ap,intn)
{ap=newint[n];
for(inti=0;
n;
i++)ap[i]=i;
请写出一维数组、二维数组说明语句的形式。
【答案】
数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组长度(元素的个数)等信息。
一维数组说明语句为:
类型数组名[表达式]
二维数组说明语句为:
类型数组名[表达式1][表达式2]
若有说明
intaa[3],*pa=aa;
请使用aa或pa,写出3个以上与aa[2]等价的表达式。
【答案】
数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;
而数组元素是下标变量,性质相当于普通变量。
对一维数组aa第i个元素的地址可以表示为:
&
aa[i]aa+i;
对一维数组aa第i个元素的值可以表示为:
a[i]*(a+i);
与aa[2]等价的表达式:
*(aa+2)*(&
a[2])*(pa+2)pa[2]
3.要把一维数组inta[m*n]的元素传送到二维数组intb[m][n]中,即在程序中要执行
b[i][j]=a[k];
请写出k→i,j的下标变换公式,并用程序验证。
【答案】
转换公式i=k/nj=k%n
验证程序:
#include<
iostream>
usingnamespacestd;
intmain()
{constintM=3,N=4;
intk,a[M*N]={1,2,3,4,5,6,7,8,9,10,11,12},b[M][N];
inti,j;
cout<
"
arraya:
endl;
for(k=0;
k<
M*N;
k++)
b[k/N][k%N]=a[k];
k++)cout<
a[k]<
'
**Afterconvert**"
arrayb:
for(i=0;
i<
M;
i++)
{for(j=0;
j<
N;
j++)cout<
b[i][j]<
cout<
}
}
voidquery()
{int*p;
p=newint[3];
//……
delete[]p;
p=newdouble[5];
}
在语句p=newdouble[5];
中企图把动态浮点型数组的地址写入整型指针p,造成错误。
错误为errorC2440:
“=”:
无法从“double*”转换为“int*”。
改正方法:
增加一个double*q指针。
voidquery()
{int*p;
p=newint[3];
delete[]p;
double*q;
q=newdouble[5];
delete[]q;
}
5.有以下程序根据输入值,设计功能是调用函数create建立并初始化动态数组,令a[i]=i。
但该程序运行后不能得到期望结果,请分析程序的错误原因并修改之。
voidcreate(int*,int);
{int*a=NULL,len;
cin>
create(a,len);
for(inti=0;
len;
cout<
delete[]a;
a=NULL;
voidcreate(int*ap,intn)
{ap=newint[n];
for(inti=0;
}
函数create中,指针参数int*ap是地址值的参数。
调用函数时接受实际参数a的地址值作为初制值。
ap仅是局部变量,ap=newint[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数ap无关。
程序没有编译错误,但main不能获得动态数组。
修改方法是把ap改为指针引用参数。
voidcreate(int*&
int);
//函数原型声明,使用引用参数
ap,intn)//函数定义
i++)ap[i]=i;
4.3编程题
1.已知求成绩的平均值和均方差公式:
,其中n为学生人数,
为第i个学生成绩。
求某班学生的平均成绩和均方差。
答案4.3-1
math.h>
{doubles[]={76,85,54,77,93,83,90,67,81,65};
doublesum1=0,sum2=0,ave,dev;
intn,i;
n=sizeof(s)/sizeof(double);
//求数组元素的个数
sum1+=s[i];
ave=sum1/n;
sum2+=pow(s[i]-ave,2);
dev=sqrt(sum2/n);
rve="
ave<
dev="
dev<
2.用随机函数产生10个互不相同的两位整数存放到一维数组中,并输出其中的素数。
答案4.3-2
stdlib.h>
time.h>
{inta[10],i,j;
longm;
srand(time(0));
//为随机数生成器设置种子值
{l:
a[i]=rand();
//产生随机数存放到数组中
if(a[i]<
10||a[i]>
=100)gotol;
for(j=0;
i;
if(a[i]==a[j])gotol;
{doublem=sqrt(a[i]);
for(j=2;
=m;
j++)
if(a[i]%j==0)break;
if(j>
m)
是素数!
3.将一组数据从大到小排列后输出,要求显示每个元素及它们在原数组中的下标。
答案4.3-3
{inta[]={38,6,29,1,25,20,6,32,78,10};
intindex[10];
inti,j,temp;
index[i]=i;
=8;
for(j=i+1;
=9;
if(a[i]<
a[j])
{temp=a[i];
a[i]=a[j];
a[j]=temp;
temp=index[i];
index[i]=index[j];
index[j]=temp;
index[i]<
4.从键盘上输入一个正整数,判别它是否为回文数。
所谓回文数是指正读和反读都一样的数。
例如,123321是回文数。
答案4.3-4
在程序中,首先拆分整数的每位数字按顺序存放到一个一维数组中。
然后用两个变量记录数组元素最大和最小的下标值,它们是两个高端和低端指针。
在循环中,比较这两个下标指示对称位置的元素,并使两个指针同时向中间移动(i++,j--)。
只要发现一个不相等的元素,表示该整数不是回文数。
如果直至i==j,都没有发现不相等的元素,则该整数是回文数。
{intb[10],i,j,k,flag;
longnum,n;
num="
cin>
num;
k=0;
n=num;
do
//拆分整数,把各数字放入数组b
{
b[k++]=n%10;
n=n/10;
}while(n!
=0);
flag=1;
//判断标志
i=0;
j=k-1;
//设置指示下标的指针
while(i<
j)
if(b[i++]!
=b[j--])
//对称位置元素不相等
{flag=0;
break;
if(flag)cout<
num<
是回文数!
elsecout<
不是回文数!
本题判断一个整数是否为回文数,可以不用数组拆分数字,直接用高位与低位数字比较。
还可以把程序写成递归方式。
5.把两个升序的整型数组合并为一个升序数组。
设计好你的算法,以得到较高的运行效率。
答案4.3-5
把两个长度为m和n的有序数组a、b归并为长度m+n的有序数组c,可以利用原数组a、b的有序性,分别用指针i和j指示数组a和b的当前元素下标,当a[i]<
b[j],把a[i]写入数组c,否则把b[j]写入数组c。
若其中一个数组的元素读完,则应把另一个数组的剩余元素全部写入数组c。
{inta[4]={1,2,5,7};
intb[8]={3,4,8,8,9,10,11,12};
intc[12],i,j,k;
i=j=k=0;
while(i<
4&
8)
if(a[i]>
b[j])
//当a[i]>
b[j],把b[i]写入数组c
{c[k]=b[j];
k++;
j++;
else
//当a[i]<
=b[j],把a[i]写入数组c
{c[k]=a[i];
i++;
while(i<
4)
{c[k]=a[i];
}
//把数组a的剩余元素写入数组c
while(j<
{c[k]=b[j];
//把数组b的剩余元素写入数组c
k;
c[i]<
6.输入一个星期几号,输出相应的英文单词。
要求使用指针数组实现。
答案4.3-6
{char*weekday[7]={"
sunday"
monday"
tuesday"
wednesday"
thursday"
friday"
saturday"
};
intd;
pleaseinputweekday:
d;
if(d>
=0&
d<
=6)cout<
d<
---"
*(weekday+d)<
elsecout<
inputerror!
7.编写函数:
(1)在一个二维数组中形成如以下形式的n阶矩阵:
(2)去掉靠边元素,生成新的n-2阶矩阵;
(3)求矩阵主对角线下元素之和;
(4)以方阵形式输出数组。
在main函数中调用以上函数进行测试。
答案4.3-7
由于本题没有给定矩阵的阶数n,从而应按输入的要求建立动态数组。
需
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 基础 课后 复习资料 第四