77范文网 - 专业文章范例文档资料分享平台

C语言程序设计及实验指导练习及习题参考答案(8--10)

来源:网络收集 时间:2019-01-10 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

C语言程序设计及实验指导练习及习题参考答案(8—10章)

8

练习参考答案 1、练习

8-1. 如果有定义:int m, n = 5, *p = &m; 与m = n 等价的语句是 B 。 A.m = *p; B. *p = *&n; C. m = &n; D. m = **p;

8-2. 设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1, float op2, float *psum, float *pdiff),其中op1 和op2 是输入的两个数,*psum 和*pdiff 是计算得出的和与差。 解答:

#include int main (void) {

float op1, op2, sum, diff;

void sum_diff(float op1, float op2, float *psum, float *pdiff); printf(“input op1 and op2: “); scanf(“%f%f”, &op1, &op2); sum_diff(op1, op2, &sum, &diff);

printf(“%f+%f=%f; %f-%f=%f \\n”,op1,op2,sum,op1,op2,diff); return 0; }

void sum_diff(float op1, float op2, float *psum, float *pdiff) {

*psum = op1 + op2; *pdiff = op1 – op2; }

8-3. 两个相同类型的指针变量能不能相加?为什么? 解答:

不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地 址相加并不能保证结果为一个有效的地址值,因而在C 语言中指针变量相加是非法的。 8-4. 根据表8.2 所示,这组数据的冒泡排序其实循环到第6 遍(即n-2)时就已经排好序了, 说明有时候并不一定需要n-1 次循环。请思考如何改进冒泡排序算法并编程实现(提示:当 发现一遍循环后没有数据发生交换,说明已经排好序了)。

解答:设置一个标志变量flag,进入一轮循环前设置为0,在循环中有发生数据交换就改写 flag 值为1。当该轮循环结束后检查flag 值,如果变为1 说明发生了数据交换,还没有排好 序,如果为0 说明没有发生交换,已经排好序。 #include

void bubble (int a[ ], int n); int main(void) {

int n, a[8]; int i;

printf(\scanf(\

printf(\for (i=0; i

printf(\for (i=0; i

printf(\return 0;

}

void bubble (int a[ ], int n) /* n 是数组a 中待排序元素的数量 */ {

int i, j, t, flag;

for( i = 1; i < n; i++ ) { /* 外部循环 */

flag=0;

for (j = 0; j < n-i; j++ ) /* 内部循环 */

if (a[j] > a[j+1])

{ /* 比较两个元素的大小 */

t=a[j]; a[j]=a[j+1]; a[j+1]=t; /* 如果前一个元素大,则交换 */ flag=1; /* 发生交换,flag 置为1 */ }

if (flag==0) /* 如果一轮循环没有发生数据交换,排序结束*/

break;

} }

8-5. 重做例8-9,要求使用选择排序算法。 解答:

#include

void bubble (int a[ ], int n); int main(void) {

int n, a[8]; int i;

printf(\scanf(\

printf(\for (i=0; i

scanf(\bubble(a,n);

printf(\

for (i=0; i

printf(\return 0;

}

void bubble (int a[ ], int n) /* n 是数组a 中待排序元素的数量 */ {

int i, j, t, index;

for( i = 0; i < n-1; i++ ) { /* 外部循环 */

index=i;

for (j = i+1; j < n; j++ ) /* 内部循环 */

if (a[j] < a[index])

index = j;

t=a[i]; a[i]=a[index]; a[index]=t; } }

8-6. 在使用scanf()函数时,输入参数列表需要使用取地址操作符&,但当参数为字符数组 名时并没有使用,为什么?如果在字符数组名前加上取地址操作符&,会发生什么? 解答:

因为字符数组名的值是一个特殊的固定地址,可以看作是常量指针,因此不需要再使用 取地址符来获取该数组的地址。

如果在字符数组名str 前加上取地址操作符&,那么对其取地址&str 可以看做是这个数 组的第一个元素的地址,由于数组地址和数组第一个元素的地址相同,所以&str 表示地址值和str 表示的地址值是相等的。对scanf()的变长参数列表的话,编译器只负责参数传递,怎么解释后边的几个地址的含义, 是由前边的字符串确定的。所以使用scanf(“%s”,str)和 scanf(“%s”,&str)都能通过编译且正常执行。

8-7. C 语言不允许用赋值表达式直接对数组赋值,为什么? 解答:

数组名可以看作是常量指针,因为不可以对一个常量进行赋值,所以不允许用赋值表达式直接对数组进行赋值。

8-8. 输入一个字符串,把该字符串的前3 个字母移到最后,输出变换后的字符串。比如输入“abcdef”,输出为“defabc”。 解答:

# include # include # include # define MAXLINE 100 int main (void) {

char line [MAXLINE], str[4]; int i;

printf (\gets(line);

if (strlen(line)<3)

{

printf(\字符串长度小于3,不符合要求!\\n\exit(1);

}

for (i=0;i<3;i++)

str[i]=line[i]; str[i]='\\0';

for(i=3; line[i]!='\\0';i++)

line[i-3]=line[i]; line[i-3]= '\\0'; strcat(line,str);

printf (\return 0;

}

**8-9. 使用动态内存分配的方法实现例8-9 的冒泡排序。 解答:

#include #include

void bubble (int a[ ], int n); int main(void) {

int n, *p; int i;

printf(\scanf(\

/*为数组p 动态分配n 个整数类型大小的空间 */ if ((p=(int *)calloc(n, sizeof(int))) == NULL) {

printf(\exit(1); }

printf(\for (i=0; i

scanf(\bubble(p,n);

printf(\for (i=0; i

printf(\free(p); return 0; }

void bubble (int a[ ], int n) /* n 是数组a 中待排序元素的数量 */ {

int i, j, t;

for( i = 1; i < n; i++ ) /* 外部循环 */

for (j = 0; j < n-i; j++ ) /* 内部循环 */

if (a[j] > a[j+1]) /* 比较两个元素的大小 */ {

t=a[j]; a[j]=a[j+1]; a[j+1]=t; /* 如果前一个元素大,则交换 */ } }

2 习题参考答案

一、选择题

1.下列语句定义x 为指向int 类型变量a 的指针,其中哪一个是正确的 B 。 A.int a, *x = a; B.int a, *x = &a; C.int *x = &a,a; D.int a, x = a;

2.以下选项中,对基本类型相同的指针变量不能进行运算的运算符是 A 。 A.+ B.- C.= D.==

3.若有以下说明,且0<=i<10,则对数组元素的错误引用是 C 。

int a[] = {0,1,2,3,4,5,6,7,8,9}, *p = a,i;

A.*(a+i) B.a[p-a+i] C.p+i D.*(&a[i])

4.下列程序的输出结果是 B 。

int main(void) {

int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3; printf(“%d”, *++p); return 0; }

A.3 B.4 C.a[4]的地址 D.非法

5.对于下列程序,正确的是 A 。

void f(int *p) {

*p = 5; }

int main(void) {

int a, *p; a = 10; p = &a; f(p);

printf(“%d”, (*p)++); return 0; }

A.5 B.6 C.10 D.11 二、填空题

1. 下列函数在一维数组a 中将x 插入到下标为i(i>=0)的元素前。如果i>=元素的个数,则x 插入到末尾。原有的元素个数存放在指针n 所指向的变量中,插入后元素个数加1。请填

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C语言程序设计及实验指导练习及习题参考答案(8--10)在线全文阅读。

C语言程序设计及实验指导练习及习题参考答案(8--10).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/419153.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: