C语言习题及答案

更新时间:2024-01-14 19:18:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题一

【习题1-1】C语言源程序最多可能由________________部分组成?

A) 预处理部分 B)变量说明部分 C) 函数原型声明部分 D)函数定义部分

【习题1-2】一个完整的C语言源程序最少必须有_______。

A)若干个主函数 B)若干个函数 C)且只能有一个主函数 D)一个函数

【习题1-3】C语言以函数为源程序的基本单位最主要有利于_______。

A)程序设计结构化 B)程序设计模块化 C)程序设计简单化 D提高程序设计有效性

【习题1-4】要使得C语言编写的程序能够在计算机上运行并得出正确结果,必

须要先经过_______________________________________。 A)编辑和链接 B)编译和链接 C)修改和运行 D运行并输入数据

【习题1-5】选择一个C语言集成开发环境并启动它,然后分别输入【例1-1】、【例1-2】、【例1-3】的源程序,依次编译、链接、运行,看看能否达到预想的结果?从中了解程序的开发过程。

习题二

一、单项选择题

【习题2-1】 已知’A’的ASCII代码是65,以下程序的输出结果是( ) #include \main( )

{ int c1=65,c2=66; printf(\; }

A. 因输出格式不合法,输出错误信息 B. 65,66 C. A,B D. 65,66

【习题2-2】若变量已正确定义,要将a和b中的数进行交换,下面不正确的语句组是( )

A. a=a+b,b=a-b,a=a-b; B. t=a,a=b,b=t; C. a=t,t=b,b=a; D. t=b;b=a;a=t;

【习题2-3】 若k是整型变量,则以下程序段的输出是( ) k=-8567;

printf (“|%d|\\n”,k);

A. 输出格式不正确 B. 输出为|008567|

C. 输出为|8567| D. 输出为|-8567| 【习题2-4】下列可作变量的标识符是( ) A. 3rt B. je_c C.$89 D. a+6

【习题2-5】C语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符( )

A.必须为字母或下划线 B.必须为下划线 C.必须为字母

D.可以是字母、数字和下划线中的任一种字符

【习题2-6】 C语言并不是非常严谨的算法语言,在以下关于C语言的不严谨的叙述中,错误的说法是( )

A. 大写字母和小写字符的意义相同

B. 有些不同类型的变量可以在一个表达式中运算

C. 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D. 同一个运算符号在不同的场合可以有不同的含义 二、简答题

【习题2-7】 C语言数据类型有哪几类?基本数据类型包括哪几类? 【习题2-8】 C语言中十进制、八进制和十六进制整常量是如何表示的? 【习题2-9】 C语言为什么规定对所用到的变量“先定义,后使用”,这样做有什么好处?

【习题2-10】C语言中的语句有几类?控制语句有哪些?

【习题2-11】 怎样区分表达式和表达式语句?为什么有人称C为表达式语言?

【习题2-12】字符常量与字符串常量有什么区别? 【习题2-13】下面各数用八进制和十六进制数表示: (1)10 (2)32 (3)75 (4)-617 (5)-111 (6)2483 (7)-28654 (8)21003 三、阅读程序写结果或填空

【习题2-14】写出以下程序的运行结果: #include main() {

char c1='a',c2='b',c3='c',c4='\\101',c5='\\116'; printf(\ printf(\}

【习题2-15】写出以下程序的运行结果: #include main() {

int n=177;

printf(\}

【习题2-16】写出以下程序的运行结果: #include main() {

int a,n=0; n+=(a=10);

printf(\}

【习题2-17】写出以下程序的运行结果: #include main() {

int a=5,b=7;

float x=67.8564,y=-789.124; char c='A';

long n=1234567; unsigned u=65535; printf(\printf(\printf(\

printf(\

printf(\printf(\

printf(\printf(\printf(\

printf(\}

【习题2-18】写出以下程序的运行结果: #include main() {

int i,j,m,n; i=8; j=10; m=++i; n=j++;

printf(\}

【习题2-19】下面运算表达式的值是: x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7

【习题2-20】下面运算表达式的值是: (float)(a+b)/2+(int)x%(int)y

设a=2,b=3,x=3.5,y=2.5

【习题2-21】 写出下面赋值表达式运算后a的值,设原来a=12; (1)a+=a (2) a-=2 (3)a*=2+3 (4) a/=a+a

(5)a%=(n%=2),n 的值等于5 (6)a+=a-=a*=a

【习题2-22】 数学表达式:-55或x<-5又是如何表达?请写出相应的C语句。 四、编写程序题

【习题2-23】 设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积(4πR2)、圆球体积(V=4πR3/3)、圆柱体积。用scanf()输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编写程序。

5【习题2-24】 输入一个华氏温度,要求输出摄氏温度。公式为c=(F-32),

9输出要有文字说明,取2位小数。

【习题2-25】 编程序,用getchar()函数读入两个字符给cl、c2,然后分别用putchar()函数和printf()函数输出这两个字符。并思考以下问题:

(1)变量c1、c2应定义为字符型或整型?抑或二者皆可? (2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?

(3)整型变量与字符变量是否在任何情况下都可以互相代替?如“char c1,c2;”与“int cl,c2;”是否无条件地等价?

【习题2-26】编写程序,从终端键盘输入圆的半径r,圆柱的高h,分别计算出圆周c1、圆面积cs和圆柱的体积cvz。输出计算结果要求有文字说明,并取小数点后两位数字。

【习题2-27】编写程序,读入一个字母,输出与之对应的ASCII码,输入输出都要有相应的文字提示。

习题三

一、单项选择题

【习题3-1】“基本结构”不具有以下特点( ) A. 只有一个入口,只有一个出口 B. 没有死循环 C. 没有永远执行不到的语句 D. 不允许退出循环 【习题3-2】 在流程图中,菱形框表示的操作是( ) A. 数据的输入输出 B. 程序的开始 C. 条件判断 D. 赋值 【习题3-3】以下程序的运行结果是( ) #include main()

{int m=5,n=10;

printf(\}

A. 5,9 B.6,9 C. 5,10 D.6,10 【习题3-4】逻辑运算符两侧的数据类型( )

A. 只能是0和1 B. 只能是0或非0正数 C. 只能是整型或字符型数据 D. 可以是任何类型的数据 【习题3-5】下列关系表达式结果为假的是( ) A. 0!=1 B. 2<=8

C. (a=2*2)= =2 D. y=(2+2)= =4 【习题3-6】下列运算符中优先级最低的是( ) A. ?: B. += C. >= D. = =

【习题3-7】写出下面各逻辑表达式的值。设a=3,b=4,c=5。 a+b>c&&b==c a||b+c&&b-c !(a>b)&&!c||1

!(x=a)&&(y=b)&&0 !(a+b)+c-1&&b+c/2 二、简单题

【习题3-8】什么是算法?算法有哪些特性?从日常生活中举出几个算法的例子。

【习题3-9】算法有哪些描述方法?各有什么优缺点? 【习题3-10】结构化的算法有哪几种结构?试分别描述。

【习题3-11】选择语句和循环语句对条件的判断的标准是什么?(即何值为真、何值为假?)

三、用传统流程图表示求解以下问题的算法。

【习题3-12】有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换(即A瓶原来盛醋,现改盛酱油,B瓶则相反);

【习题3-13】依次将10个数输入,要求将其中最大的数打印出来; 【习题3-14】有三个数a、b、c,要求按大小顺序把它们打印出来; 【习题3-15】求1+2+3+…+100;

【习题3-16】判断一个数n能否同时被3和5整除; 【习题3-17】将100~200之间的素数打印出来; 【习题3-18】求两个数m和n的最大公约数;

【习题3-19】求方程式ax2+bx+c=0的根(a、b、c从键盘输入)。 四、编写程序题

【习题3-20】有一函数

(x?1) ?x ? y??2x-1 (1?x?10)

?3x-11 (x?100) ?

}

【习题4-21】在以下程序的下划线处填写适当的语句使程序执行的结果4,16,256。

test( )

{ int x=2; x=x*x;printf(\ }

main( )

{test( );test( );test( );}

【习题4-22】下列程序的输出结果是 #include int f(int c)

{static int a=10; int b=++a;

return(a+b+c);} main( )

{printf(“%d”,f(f(5)));}

【习题4-23】以下函数调用语句中实参的个数是________?

Sub1((x1,x2),(x3,x4,x5),x6)

四、程序设计题

【习题4-24】编写一个递归函数计算 1+X+2X2+3X3+???+nXn

1 n=0

F(n,x)=

F(n-1,x)+n Xn n>0

【习题4-25】编写递归程序的输出如右所示的结果

* *** *****

【习题4-26】编写递归程序的输出杨辉三角形 (?1)N?1【习题4-27】编写程序计算: S= ? 直到N!>106为止。

N?1N!

【习题4-28】编写程序计算1~100之间的素数,并按照由大到小的次序输出。

习题五

一、单项选择题

【习题5-1】在C语言中,数组名代表了__________。

A) 数组的全部元素值 B)数组中第一个元素的值 C) 数组中元素的个数 D)数组中第一个元素的地址

【习题5-2】不能把字符串\赋予数组a的语句是_______ 。

A)char a[8]={'c','h','i','n','a'} B)char a[]=\

C)char a[8];a=\ D)char a[8];strcpy(a,\

【习题5-3】设有如下定义语句:

int a[10]={1,2,3,4,5,6,7,8,9,10};

则下面是正确的数组元素的是 。

A)a[a[2]+1] B)a(4) C)a[10] D)a[a[4]+5]

【习题5-4】设a,b是两个已定义的字符数组,则下面语句中正确的是 。

A)gets(a,b); B)scanf(\C)scanf(\ D)gets(\

【习题5-5】设有定义:

int j=2,a[]={1,2,3,4,5};

则数组a[j]的值为 。

A)2 B)3 C)4 D)5

【习题5-6】C语言中,一维数组下标的最小值是 。

A)随便 B)根据说明 C)1 D)0

【习题5-7】下面描述中不正确的是 。

A)字符数组中可以存放字符串

B)可以对字符数组进行整体输入、输出 C)可以对任何数组进行整体输入、输出

D)不能通过赋值运算符\对字符数组进行整体赋值

【习题5-8】若有说明:

char a[]=\

char b[]={'A','B','C','D','E','F'};

则下面描述中正确的是 。

A) a数组长度比b数组长 B) a和b不相同,a是指针数组 C) a数组和b数组长度相同 D) a和b完全相同

二、阅读程序写结果或填空题 【习题5-9】设有定义语句:

char c[][5]={\

则数组c是 ⑴ 维数组,数组中共有 ⑵ 个元素,数组元素c[0][1]= ⑶ 。

【习题5-10】设有定义语句:

char s[15]={\

则表达式strlen(s)的值为 。

【习题5-11】下面程序是求二维数组a主对角线上的元素和,请在划线处填上恰当的内容,以完成程序的功能。 #include main() {

int a[3][3]={1,2,3,2,3,4,3,4,5},s=0,k; for(k=0;k<3;k++)

s=s+ ;

printf(\ }

【习题5-12】下面程序的功能是将一维整型数组a循环左移一位,第一个数据存放到最后。例如假设数组为3,7,2,6,5,9,则循环左移后数组变成7,2,6,5,9,3。请在划线处填上恰当的内容,以完成程序的功能。 #include main() {

int a[10],k,t;

for(k=0;k<10;k++) scanf(\ t= ⑴ ;

for(k=1;k<10;k++) a[k-1]= ⑵ ; a[9]= ⑶ ;

for(k=0;k<10;k++) printf(\ }

【习题5-13】下面程序功能是将数组a,b合并,且合并后的数组也是从小到大排序。请在划线处填上恰当的内容,以完成程序的功能。

#include main() {

int a[7]={2,5,8,12,14,19,21},b[5]={13,15,21,25,30},c[12]; int i=0,j=0,k=0,m; while(i<7&&j<5) {

if(a[i]

}

if(i<7)

for(m=i;m<7;m++)

{ c[k]= ⑵ ;k++;}

else

for(m=j;m<5;m++) { c[k]=b[m];k++;}

for(k=0; ⑶ ;k++) printf(\ }

【习题5-14】阅读下面程序,写出运行结果。

#include main() {

int m,n;

for(m=1;m<6;m++) {

for(n=5;n>=m;n--) printf(\

for(n=1;n<=2*m-1;n++) printf(\printf(\

} }

【习题5-15】阅读下面程序,写出运行结果。 #include main() {

int n[3],i,j,k; for(i=0;i<3;i++) n[i]=0; k=2;

for(i=0;i<=k;i++) for(j=0;j<=i;j++) n[j]=n[i]+1; for(i=0;i<=k;i++)

printf(\

printf(\ }

【习题5-16】阅读下面程序,写出运行结果。 #include main() {

int j,ch,a[8];

for(j=0;j<8;j++) a[j]=0; while((ch=getchar())!='\\n')

if(ch>='0'&&ch<='7') a[ch-'0']++; for(j=0;j<8;j++)

printf(\ }

程序运行时输入:12345678900987654321234806↙ 三、编写程序题

【习题5-17】已知整型数组a中有10个元素,整型数组b中有6个元素。编程将那些在数组a中而不在数组b的数据组成新数组c并输出。

【习题5-18】已知a是3×4的整型二维数组,编程求数组a中所有外围元素之和。

【习题5-19】不用strcmp函数,编程判断两个长度不超过20的字符串的大小:若第一个字符串大于第二个字符串输出1;若两个字符串相等输出0;否则输出-1。

【习题5-20】输入长度不超过20的字符串,编程判断其中字母的个数。

【习题5-21】已知整型数组a中有10个元素,编程将其中某个数k删除,输出删除后的数组。

习题六

一、选择题

【习题6-1】变量的指针,其含义是指该变量的________ A)值 B)地址 C)名 D)一个标志

【习题6-2】若有语句int *point,a; 则point=&a;中运算符&的含义是_____ A)位与运算 B)逻辑与运算 C)取指针内容 D)取地址

【习题6-3】若x是整型变量,pb是整型的指针变量,则正确的赋值表达式是

A) pb=&x B) pb=x; C) *pb=&x; D) *pb=*x 【习题6-4】下面程序段的运行结果是_________ char *s=\ s+=2;

printf(\

A)cde B)字符’c’ C)字符’c’的地址 D)无确定的输出结果 【习题6-5】设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是______

A)c=*p1+*p2; B)p2=c C)p1=p2 D)c=*p1*(*p2); 【习题6-6】若有定义语句 char a[]=\ char *p=\

则以下不正确的叙述是________. A)a+1表示的是字符t的地址

B)p指向另外的字符串时,字符串的长度不受限制 C)p变量中存放的地址值可以改变 D)a中只能存放10个字符

【习题6-7】若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为___

A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j 【习题6-8】 设有如下定义:int (*ptr)( ); 则以下叙述中正确的是:

A)ptr是指向一维组数的指针变量

B)ptr是指向int型数据的指针变量

C)ptr是指向函数的指针,该函数返回一个int型数据

D)ptr是一个函数名,该函数的返回值是指向int型数据的指针 【习题6-9】设有定义int (*ptr)[m];其中的标识符ptr是 A)m个指向整型变量的指针

B)指向m个整型变量的函数指针

C)一个指向具有m个整型元素的一维数组的指针

D)具有m个指针元素的一维指针数组,每个元素都只能指向整型量 【习题6-10】若要用下面的程序片段使指针变量p指向一个存储整型变量的动态存储单元:int *p;

p=__________ malloc( sizeof(int));

则应填入

A) int B) int * C) (*int) D) (int *)

二、阅读下列程序,填空或给出程序运行结果。

【习题6-11】以下程序的功能是:通过指针操作,找出三个整数中的最小值并输

出。

#include \ main() {

int *a,*b,*c,num,x,y,z; a=&x; b=&y; c=&z;

printf(\输入3个整数:\ scanf(\

printf(\ num=*a;

if (*a>*b) _______; if (num>*c) _______;

printf(\输出最小整数:%d\\n\ }

【习题6-12】下面程序的功能是将两个字符串s1和s2连接起来,将s2连接到

s1后面。请填空。 #include “stdio.h” #include “string.h” main()

{ char s1[80],s2[80]; gets(s1); gets(s2); conn(s1,s2); puts(s1); }

conn(char *p1,char *p2) { while(*p1) ______; while(*p2)

{ *p1=______; p1++; p2++; }

*p1=’\\0’; }

【习题6-13】以下程序将数组a中的数据按逆序存放,请填空。

#define M 8

#include “stdio.h” main()

{ int a[M],i,j,t; for(i=0;i

t=*(a+i); *(a+i)= _______; *(______)=t;

i++; j--; }

for(i=0;i

【习题6-14】给出程序运行结果。

#include “stdio.h” void f(int *x,int *y); main() {

int a[8]={1,2,3,4,5,6,7,8},i,*p,*q; p=a;q=&a[7]; while(p

{ f(p,q); p++;q--;} for(i=0;i<8;i++) printf(\}

void f(int *x,int *y) { int t;

t=*x;*x=*y;*y=t; }

【习题6-15】给出以下程序的输出结果: #include “stdio.h”

void prt(int *m,int n); main() {

int a[]={1,2,3,4,5},i; prt(a,5);

for(i=0;i<5;i++) printf(\void prt(int *m,int n) { int i;

for(i=0;i

【习题6-16】给出下面程序的运行结果

#include “stdio.h” #include “string.h”

void fun(char *w,int n); main()

{ char *p;

p=\ fun(p,strlen(p)); puts(p); }

void fun(char *w,int n) { char t,*s1,*s2; s1=w;s2=w+n-1; while(s1

{t=*s1++;*s1=*s2--;*s2=t;} }

【习题6-17】给出下面程序的运行结果

#include “stdio.h” main() {

char a[]=\char *p1,*p2; int i;

p1=a;p2=b; for(i=0;i<7;i++)

if(*(p1+i)==*(p2+i)) printf(\%c\}

三、程序设计题(本章所有习题要求使用指针方法处理)

【习题6-18】有n个整数,设计程序,将前面各个数按顺序向后移动k个位置,

将最后k个数按顺序移动到最前面。

【习题6-19】编写程序,求出矩阵中每个行的累加和,要求用动态数组存储行的

累加和。

【习题6-20】找出一个二维数组的鞍点,即该位置上的元素在该行中最大,在列

上最小,也可能没有鞍点。

【习题6-21】编写程序判断是否是回文字符串。回文是一种“从前向后读”和“从

后向前读” 都相同的字符串。如:“rotor”。

【习题6-22】编制一个字符替换函数,实现已知字符串str中,所有属于ch中的

字符都用ch2中对应字符代替。函数原型: void replace(char *str, char ch, char ch2)

【习题6-23】编写一个函数,删除一个字符串的指定字符,函数原型: int delStr(char *str, char ch)

先判断字符是否出现在字符串中,如果未出现,则返回0,如果字符出现一次或多次,则返回字符的个数。

【习题6-24】编写函数把参数字符串中的字符反序排列, 函数原型:

void reversestr(char * str)

使用指针,不要使用数组下标,也不要声明局部数组来临时存储。

习题七

一、单选题

【习题7-1】设有以下说明语句:

struct ex {

int x;float y;char z; }example;

则下面的叙述中不正确的是________。 A) struct是结构体类型的关键字 B) example是结构体类型名 C) x,y,z都是结构体成员名 D) struct ex是结构体类型 【习题7-2】有如下定义

struct person

{char name[9]; int age;};

struct person class[10]={ \根据上述定义,能输出字母M的语句是________。 A) prinft(\

B) pfintf(\C) prinft(\D) printf(\【习题7-3】若有下面的说明和定义:

struct test {

int a; char b; float c; union u

{char ul[5];int u2[2];} ua; } myaa;

则sizeof(struct test )的值是________。 A) 12 B) 19 C) 14 D) 4

【习题7-4】已知赋值语句Wang.year=2005;判断Wang是________类型的变量。

A)字符或文件 B)整型和枚举 C)联合或结构 D)实型或指针 【习题7-5】运行程序:

struct st {

int x; int *y; }*p;

int d[4]={10,20,30,40};

struct sta[4]={20,&d[0],30,&d[1],40,&d[2],50,&d[3]}; main() { p=a;

printf(\}

则输出结果是________。

A) 11 B) 21 C) 31 D) 41 【习题7-6】设有以下说明:

struct stud {

char num[6]; int s[4]; double ave; }a,*p;

则变量a在内存所占字节数是________。

A) 18 B) 22 C) 11 D) 5 【习题7-7】以下程序的输出结果是________。

struct HAR {

int x, y;

struct HAR *p; }h[2]; main() {

h[0].x=1;h[0].y=2; h[1].x=3;h[1].y=4; h[0].p=&h[1];h[1].p=h;

printf(\}

A) 2 3 B) 1 4 C) 4 1 D) 3 2

【习题7-8】以下对结构体类型变量的定义中,不正确的是________。

A) typedef struct aa B) #define AA struct aa { int n; AA {int n; float m; float m; }AA; }td1; AA td1;

C) struct D) struct {int n; { int n; float m; float m; }aa; }td1; struct aa td1;

【习题7-9】设有结构体及其数组和指针变量的定义语句

struct{int x;}y[2],p=y;

则下列表达式中不能正确表示结构体成员的是________。 A)(*p).x B)*(p+1).x C)*(p) D)*p.x 【习题7-10】下列程序的输出结果是________。

struct abc { int a,b,c; }; main() {

struct abc s={1,2,3}; int t; t=s.a,s.c;

printf(\}

A) 1 B) 2 C) 3 D) 无结果 【习题7-11】有以下程序:

#include

union pw { int i;

char ch[2]; }a; main() {

a.ch[0]=13; a.ch[1]=0;

printf(\}

执行上述程序后的输出结果是________。 A)13 B)14 C)208 D)209

【习题7-12】变量a所占内存字节数是________。

union U {

char st[4]; int i; long l; };

struct A {

int c; union U u; }a;

A) 4 B) 5 C) 6 D) 8 【习题7-13】若定义union uex{int i;float f;char c;}ex;则sizeof(ex)的值是________。

A)4 B)5 C)6 D)7 【习题7-14】以下程序的输出结果是________。

union myun { struct

{int x, y, z; } u; int k; }a; main() {

a.u.x=4;a.u.y=5;a.u.z=6; a.k=0;

printf(\} A) 4 B) 5 C) 6

D) 0

【习题7-15】若定义union ex{int i;float f;char a[10];}x;则sizeof(x)的值是________。

A)4 B)6 C)10 D)16 【习题7-16】设有以下说明语句

typedef struct { int n; char ch[8]; } PER;

则下面叙述中正确的是 A) PER 是结构体变量名 B) PER是结构体类型名

C) typedef struct 是结构体类型 D) struct 是结构体类型名

【习题7-17】下面说明中,正确的是________。

A) typedef v1 int; B) typedef v2=int; C) typedef int v3; D) typedef v4: int;

【习题7-18】以下各选项企图说明一种新类型名,其中正确的是_______。

A)typedef a1 int; B)typedef a2=int C)typedef int a3; D)typedef a4;int;

【习题7-19】以下枚举类型的定义中正确的是________。

A)enum a={one,two,three}; B)enum a{\C)enum a={\ D)enum a{one=8,two=9,three}; 【习题7-20】设有定义

enum team{my,your=3,his,her=his+5};

则枚举元素my,your,her的值分别是________。 A)032 B)134 C)039 D)035 【习题7-21】整型变量x和y的值相等且为非0值,则下面表达式中结果为零的是________。

A) x||y B) x|y C) x&y D) x^y 【习题7-22】设 int b=8;表达式(b>>2)/(b>>1)的值是________。

A) 0 B) 2 C) 4 D) 8 【习题7-23】运行下面程序:

main() {

char x=034;

printf(\}

则输出结果是________。 A) 34 B) 70 C) 340 D) 034 【习题7-24】若定义unsigned int a=3,b=10;

printf(\|b==1); 则运行结果为________。

A)13 B)12 C)8 D)14

二、编程题

【习题7-25】编写程序。从键盘输入10本书的名称和定价,并存在结构体数组

中,从中查找出定价最高和最低的书的名称和定价,并打印出来。 【习题7-26】编写程序。设有以下结构体类型说明:

struct student {

char num[10],name[10]; float s[4]; double ave; };

要求:编写两个函数,函数fun1把10名学生放在一个结构体数组中。从键盘输入学生的学号、姓名和4门成绩,然后计算出平均分放在结构体对应的域中;函数fun2输出10名学生的记录。主函数调用函数fun1和函数fun2,不使用全局变量,函数之间的数据全部用参数传递。

【习题7-27】定义结构体类型complex表示复数,实数部分名为rp,虚数部分

名为ip,都用整型数表示。编写一套函数,实现复数运算,并用主函数调用这些函数。函数包括: (1)读一个复数;(2)输出一个复数;(3)计算两个复数的和与差。 【习题7-28】已有两个链表x和y,每个链表的结点包括学号和成绩,要求把两

个链表合并,按学号升序排列。 【习题7-29】解决百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值

钱一。百钱买百鸡,问鸡翁、母、雏各几只”。要求:用结构体数组记录所有的情况,并显示结果,请用指针方式操作。

习题八

一、单选题

【习题8-1】以读写方式打开一个已有的文件file1,下面有关fopen函数正确的

调用方式为________。

A)FILE *fp;fp=fopen(\ B)FILE *fp;fp=fopen(\; C)FILE *fp;fp=fopen(\ D)FILE *fp;fp=fopen(\【习题8-2】在C程序中,可把整型数以二进制形式存放到文件中的函数是

__________。

A) fprintf函数 B) fread函数 C) fwrite函数 D) fputc函数

【习题8-3】函数调用语句fseek(fp,10,1)的含义是_______。

A)将文件指针移到距离文件头10个字节处 B)将文件指针移到距离文件尾10个字节处 C)将文件指针从当前位置后移10个字节 D)将文件指针从当前位置前移10个字节 【习题8-4】若fp是指向某文件的指针,且已读到此文件末尾,则库函数feof(fp)

的返回值是_______。

A) EOF B) 0 C) 非零值 D) NULL 【习题8-5】在C语言中,用w+方式打开一个文件后,可以执行的文件操作是

________。

A)可任意读写 B)只读 C)只能先写后读 D)只写 【习题8-6】下面的程序执行后,文件test.txt中的内容是

#include

void fun(char *fname ,char *st) {

FILE *myf; int i;

myf=fopen(fname,\for(i=0;i

main() {

fun(\}

A) hello, B) new worldhello, C) new world D) hello,rld 【习题8-7】若要打开A盘上user1子目录下名为abc1.txt的文本文件进行读、

写操作,则正确语句是___。

A) fopen(\ B) fopen(\C) fopen(\ D) fopen(\【习题8-8】有以下程序

#include main() {

FILE *fp;

int i=10,j=30,k,n;

fp=fopen(\ fprintf(fp,\ fprintf(fp,\ fclose(fp);

fp=fopen(\

fp=fscanf(fp,\ printf(\ fclose(fp); }

程序运行后的输出结果是________。

A) 10 30 B) 20 30 C) 30 50 D) 30 20

【习题8-9】fread和fwrite函数常用来要求一次输入/输出________数据。

A)一个整数 B)一个实数 C)一个字节 D)一组

【习题8-10】feof函数用来判断文件是否结束,如果文件没有结束,则返回值是

________。

A)-1 B)0 C)1 D)EOF

【习题8-11】当顺利执行了文件关闭操作时,fclose函数的返回值是________。

A)0 B)Ture C)-1 D)1

【习题8-12】下列语句中,不能将文件型指针fp指向的文件内部指针置于文件

头的语句是________。 (注:假定能正确打开文件)

A)fp=fopen(\ B)rewind(fp) C)feof(fp) D)fseek(fp,0L,0) 二、简答题

【习题8-13】举例说明文本文件和二进制文件的适用场合。 【习题8-14】什么是文件?C语言中的文件如何分类? 【习题8-15】写出在C程序中使用文件的操作步骤。 三、编程题

【习题8-16】编写一个程序,将两个文件中的内容合并输出到另一个文件中。 【习题8-17】编写一个程序,统计命令行中提供的某一文本文件中汉字的个数(提

示:可以简单认为汉字的两个字节内码的ASCII值都大于160)。

【习题8-18】建立一个文件,其中含有若干个学生的学号、姓名、出生日期、入

学成绩信息。然后,从这个文件中读出每个学生的学号和姓名,输入其“C程序设计”课程的成绩,并把这些信息保存到一个新文件中。

习题一参考答案:

【习题1-1】ABCD 【习题1-2】C 【习题1-3】B 【习题1-4】B 【习题1-5】略

习题二参考答案:

一、单项选择题

【习题2-1】~【习题2-6】:CCDBAA

二、简答题 【习题2-7】:

C语言提供了丰富的数据类型,可以根据这些数据类型构造出不同的数据结构。C中的数据类型包括基本类型、构造类型、指针类型、空类型等。其中基本类型包括整型、字符型、实型(浮点型)等。 【习题2-8】:

C中整常数的表示

整型常量即整常数。C整常数可用以下三种形式表示: 1十进制整数; ○

2八进制整数。以数字0开头的数是八进制数,如0123表示八进制数123;○ 3十六进制整数。以0x开头的数是十六进制数。如0x123,代表十六进制○

数123。 【习题2-9】:

C规定对所有的变量要“先定义,后使用”,这样规定有以下好处: (1)便于纠错;

(2)便于编译系统为变量分配存储空间; (3)运算合法性检查。 【习题2-10】:

C语句可以分为以下五类:

(1).控制语句。 完成一定的控制功能; (2).函数调用语句; (3)表达式语句; (4)空语句;

(5)可以用{ }把一些语句括起来成为复合语句。 C只有9种控制语句,它们是: (1)if( )~else~(条件语句) (2)for( ) ~ (转向语句) (3)while( )~ (循环语句) (4)do~while( ) (循环语句) (5)continue(结束本次循环语句)

(6)break(中止执行switch或循环语句) (7)switch(多分支选择语句) (8)goto(转向语句)

(9)return(从函数返回语句) 【习题2-11】:

表达式不是独立存在的,它存在于其它表达式、语句、函数参数里,表达式后面加上一个分号,就变成表达式语句,如

i=i+1 (是表达式,不是语句) i=i+l; (是语句)

表达式能构成语句是C语言的一个特色。其实“函数调用语句”也是属于表达式语句,因为函数调用也属于表达式的一种,只是为了便于理解和使用,我们把“函数调用语句”和“表达式语句”分开来说明。由于C程序中大多数语句是表达式语句(包括函数调用语句), 所以有人把C语言称作“表达式语言”。 【习题2-12】:

字符常量就是一个字符,用单引号括起来,占一个字节;而字符串常量是由若干个字符组合而成,用双引号括起来,存贮时自动在后面加“\\0”,即使同样是一个字符,字符串常量后面还要加一个“\\0”。 【习题2-13】:

(1)12,a;(2)40,20;(3)113,4b;(4)176627,fd97;(5)177621,ff91;(6)4663,9b3;(7)110022,9012;(8)51013,520b。

三、阅读程序写结果或填空 【习题2-14】:

aa bb cc abc A N

【习题2-15】:261 【习题2-16】:10 【习题2-17】:

57

5 7

67.856400,-789.124023 67.856400 ,-789.124023

67.86, -789.12,67.8564,-789.1240,67.856400,-789.124023 6.78564e+01, -7.9e+02 A,65,101,41

1234567,4553207,d687 65535,177777,ffff,-1 COMPUTER, COM

【习题2-18】:9,11,9,10 【习题2-19】:2.5 【习题2-20】:3.5

【习题2-21】: (1)14,(2)10,(3)60,(4)0,(5)0,(6)0 【习题2-22】: x>-5&&x<5

x>5||x<-5

四、编写程序题 【习题2-23】

main()

{

float r,h,C1,Sa,Sb,Va,Vb; scanf(\ C1=2*3.14*r; Sa=3.14*r*r; Sb=4*Sa;

Va=4*3.14*r*r*r/3; Vb=Sa*h;

printf(\

printf(\ }

【习题2-24】

main() {float F,c;

printf(\请输入一个华氏温度:\\n\scanf(\

c=5.0/9.0*(F-32); /*注意5和9 要实型表示,否则5/9的值为0*/ printf(\摄氏度为:%5.2f\\n\ }

【习题2-25】

#include\ main()

{char c1,c2;

printf(\请输入两个字符c1,c2:\\n\c1=getchar(); c2=getchar();

printf(\用putchar语句输出结果为:\\n\putchar(c1); putchar(’ ’); putchar(c2);

printf(\用printf语句输出结果为:\\n\printf(\}

(1)都可以;

(2)用printf()函数;

(3)不是在任何情况下,因为char只有一个字节,而int有2个字节。能表示的范围不一样。 【习题2-26】:

#include #define PI 3.14159 main() {

float r,h,cl,cs,cvz;

printf(\scanf(\cl=2*PI*r; cs=PI*r*r; cvz=cs*h;

printf(\printf(\

printf(\}

【习题2-27】:

#include main() {

char ch;

printf(\scanf(\

printf(\}

习题三参考答案:

一、单项选择题

【习题3-1】~【习题3-6】: DCADCB。 【习题3-7】:

(1) 0 ,(2) 1 ,(3) 1 ,(4) 0 ,(5) 1 。 二、简单题 【习题3-8】:

程序解决问题是按指定的次序执行一系列操作的结果,按照次序执行操作的过程描述称为算法。

算法的特性:(1)有穷性;(2)确定性;(3)有零个或多个输入;(4)有一个或多个输出;(5)有效性。

举例:菜谱操作步骤、乐谱、施工图纸等等。 【习题3-9】:

(1)自然语言,(2)伪代码,(3)流程图,(4)计算机语言。

自然语言通俗易懂,但有歧义性;伪代码方便实用,但没有流程图明晰,容易犯逻辑错误;流程图明晰但绘制和修改时比较繁琐;计算机语言表示算法严谨,但无法做到算法设计的第一步就使用计算机语言,读程序比看流程图要费神很多。

【习题3-10】:

顺序结构,由顺序执行的一组语句或者结构组成。(2)分支结构,根据判断条件,做出取舍,要么执行A分支要么执行B分支,必须执行其中的一个,不可全执行也不可全不执行。(3)循环结构,由需要反复执行的一段代码或者结构组成。任何算法功能都可以通过以上三种基本程序结构的组合来实现。

【习题3-11】:非0为真,0为假。

三、用传统流程图表示求解以下问题的算法。

【习题3-12】~【习题3-19】:如下图3-12~3-19所示。

开 始1→n输入maxY开 始输入a、b、cYNn≥10N输入aa>ba与b互换N开 始A→CB→AC→B结 束a>maxYa→maxn+1→nYab打印c、b、a打印max结 束打印a、c、b打印a、b、c 结 束

3-12 3-13 3-14

其中的符号“→”表示“倒给”,例如“A→C”“将A瓶中的液体倒给C瓶”

开 始100→n2→iYi?n开 始0→sum1→nNn被i整除开 始输入nYNi+1→in→in>100Ysum+n→sumn+1→nn被3整除Yn被5整除Y打印:n能被3、5整除NNi

3-15 3-16 3-17

开 始输入m、nYN开 始输入a、b、cd=b2-4acYNm>nm与n互换d≥0Nm/n的余数→rr=0Nn→mr→nYYx1,x2=-b/(2a)d=0x1=(-b+d )/(2a)x1=(-b-d )/(2a)p=-b/(2a)q=/(2a)打印x1,x2打印:x1=p+qix2=p-qi打印n结 束结 束

3-18 3-19

四、编写程序题 【习题3-20】:

#include

main() {int x,y;

printf(\输入x:\ scanf(\

if(x<1) /* x<1 */ { y=x;

printf(\ }

else if (x<10) /* 1≤x-10 */ { y=2*x-1;

printf(\ }

else /* x≥10 */ { y=3*x-11;

printf(\ } }

【习题3-21】:

#include main()

{ long int num;

int indiv,ten,hundred,thousand,ten_thousand,place;

/*分别代表个位、十位、百位、千位、万位和位数*/ printf(\请输入一个整数(0~99999):\ scanf(\ if (num>9999) place=5; else if(num>999) place=4; else if(num>99) place=3; else if(num>9) place=2; else place=1;

printf(\ ten_thousand=num/10000; thousand=num/1000; hundred=num/100; ten=num0/10; indiv=num; switch(place)

{ case 5: printf(\ printf(\反序数字为;\

printf(\ break;

case 4: printf(\ printf(\反序数字为:\

printf(\

break;

case 3: printf(\ printf(\反序数字为:\

printf(\ break;

case 2: printf(\ printf(\反序数字为:\ printf(\ break;

case 1: printf(\ printf(\反序数字为:\ printf(\ break; } }

【习题3-22】:

(1) 用if语句编程序。 #include main() { long i;

float bonus,bon1,bon2,bon4,bon6,bon10;

bon1=100000*0.1; /*利润为10万元时的奖金*/ bon2=bon1+100000*0.075; /*利润为20万元时的奖金*/ bon4=bon2+200000*0.05; /*利润为40万元时的奖金*/ bon6=bon4+200000*0.03; /*利润为60万元时的奖金*/ bon10=bon6+400000*0.015; /*利润为100万元时的奖金*/ printf(\请输入利润i:\ scanf(\ if(i<=100000)

bonus=i*0.1; /*利润在10万元以内按0.1提成奖金*/ else if(i<=200000)

bonus=bon1+(i-100000)*0.075; /*利润在10万至20万元时的奖金*/ else if(i<=400000)

bonus=bon2+(i-200000)*0.05; /*利润在20万至40万元时的奖金*/ else if(i<=600000)

bonus=bon4+(i-400000)*0.03; /*利润在40万至60万元时的奖金*/ else if(i<=1000000)

bonus=bon6+(i-600000)*0.015; /*利润在60万至100万元时的奖金*/ else

bonus=bon10+(i-1000000)*0.01; /*利润在100万元以上时的奖金*/ printf(\奖金是.2f\\n\ }

此题的关键在于正确写出每一区间的奖金计算公式。例如利润在10万元至20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即100000*0.1;②10万元以上部分应得的奖金。即(num-100000)*0.075。同理,20万~40万这个区间的奖金也应由两部分组成:①利润为20万元时应得的奖金,即100000*0.1*10万*0.075;②20万元以上部分应得的奖金,即(num-200000)*0.05。程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon1、bon2、bon4、bon6、hon10;然后再加上各区间附加部分的奖金。

(2) 用switch语句编程序。

输入利润i,确定相应的提成等级branch #include main() { long i;

float bonus, bon1, bon2, bon4, bon6, bon10; int c;

bon1=100000*0.1;

bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(\请输入利润i:\ scanf(\ c=i/100000; if(c>10) c=10; switch(c)

{ case 0: bonus=1*0.1;break;

case 1: bonus=bon1+(i-100000)*0.075;break; case 2 :

case 3: bonus=bon2+(i-200000)*0.05; break; case 4:

case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8:

case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; }

printf(\奖金是.2f\ }

【习题3-23】:

#include main()

{ int t,a,b,c,d;

printf(\请输入4个整数:\

scanf(\

printf(\ if(a>b) {t=a; a=b; b=t;} if(a>c) {t=a; a=c; c=t;} if(a>d) {t=a; a=d; d=t;} if(b>c) {t=a; b=c; c=t;} if(b>d) {t=b; b=d; d=t;} if(c>d) {t=c; c=d; d=t;}

printf(\排序结果如下:\\n\

printf(\ }

【习题3-24】:

#include main()

{ int p,r,n,m,temp;

printf(\请输入两个正整数n,m:\ scanf(\ if(n

{ temp=n; n=m; m=temp; } /*把大数放在n中,小数放在m中*/ p=n*m; /*先将n和m的乘积保存在p中,以便求最小公倍数时用*/ while(m!=0) /*求n和m的最大公约数*/ { r=n%m; n=m; m=r; }

printf(\它们的最大公约数为:%d\\n\

printf(\它们的最小公倍数为:%d\\n\ /*P是原来两个整数的乘积*/ }

【习题3-25】:

#include main() { char c;

int letter=0,space=0,digit=0,other=0; printf(\请输入一行字符:\\n\ while((c=getchar())!='\\n')

{ if(c>='a'&&c<='z'||c>='A'&&c<='z') letter++; else if(c==' ') space++;

else if(c>='0'&&c<='9') digit++; else other++; }

printf(\字母数=%d, 空格数=%d, 数字数=%d, 其他字符数\\ =%d\\n\}

【习题3-26】:

#include main() {

int a,b,x,y;

scanf(\x=a*a+b*b;

if(x>100){y=x/100;printf(\else printf(\}

【习题3-27】:

#include main() {

int x;

scanf(\

if(x%5==0&&x%7==0) printf(\else printf(\}

【习题3-28】:

#include main() {

int x; float y;

scanf(\if(x<0) y=0;

else if(x>0&&x<=10) y=x;

else if(x>10&&x<=20) y=10;

else if(x>20&&x<40) y=-0.5*x+20; else y=-1; if(y!=-1) printf(\else printf(\}

【习题3-29】:

#include main() {

int x;

scanf(\

if((x%3==0)&&(x%5==0)&&(x%7==0))

printf(\else if((x%3==0)&&(x%5==0))

printf(\else if((x%3==0)&&(x%7==0))

printf(\else if((x%5==0)&&(x%7==0))

printf(\else if(x%3==0)

printf(\else if(x%5==0)

printf(\else if(x%7==0)

printf(\

else printf(\}

【习题3-30】:

#include main() {

float x; int y;

printf(\scanf(\switch(x<0) {

case 1:y=-1;break; case 0:switch(x==0)

{case 1:y=0;break; defaut:y=1; } }

printf(\}

【习题3-31】:

#include main() {

int score,temp,log;char grade; log=1; while(log) {

printf(\scanf(\if(score>100||score<0)

printf(\else log=0;

}

if (score==100) temp=9;

else temp=(score-score)/10; switch(temp) {

case 0: case 1: case 2: case 3: case 4:

case 5: grade='E';break; case 6: grade='D';break; case 7: grade='C';break; case 8: grade='B';break; case 9: grade='A';break; }

printf(\}

【习题3-32】:

#include main() {

int a,b; char symbol;

printf(\

scanf(\

printf(\if(symbol=='-') symbol='+';

else symbol='-';

printf(\}

【习题3-33】:

#include main()

{ int a,n,i=1,sn=0,tn=0; printf(\:\

scanf(\ while(i<=n)

{ tn=tn+a; /*赋值后的tn为i个a组成数的值*/ sn=sn+tn; /*赋值后的sn为多项式前i项之和*/ a=a*10; ++i; }

printf(\}

【习题3-34】:

#include main()

{ float s=0,t=1; int n;

for(n=1;n<=20;n++)

{ t=t*n; /*求n!*/

s=s+t; /*将各项累加*/ }

printf(\}

【习题3-35】:

#include main()

{ int n1=100,n2=50,n3=10; float k;

float s1=0,s2=0,s3=0;

for(k=1;k<=n1;k++) /*计算1到100的和*/ s1=s1+k;

for(k=1;k<=n2;k++) /*计算l到50各数的平方和*/ s2=s2+k*k;

for(k=1;k<=n3;k++) /*计算1到10各数的倒数和*/ s3=s3+1/k;

printf(\总和=%8.2f\\n\}

【习题3-36】:

#include main() { int i,j,k,n;

printf(\水仙花”数是:\ for(n=100;n<1000;n++) { i=n/100; j=n/10-i*10; k=n;

if(n==i*i*i+j*j*j+k*k*k) printf(\ }

printf(\}

【习题3-37】:

#include main()

{

int day=0,num=2; float sum=0.0,ave; while(num<=100) {

sum+=0.8*num; day++;num*=2; }

ave=sum/day;

printf(\}

【习题3-38】:

#include main() {

int i;

for(i=1;i<100;i++)

if(i*i==i|| i*i0==i) printf(\}

【习题3-39】 参考答案:

#include main() {

int i,x,y; long last=1;

printf(\scanf(\for (i=1;i<=y;i++) last=last*x00;

printf(\}

【习题3-40】:

方法一:程序如下

#define M 1000 /*定义寻找范围*/ #include main()

{ int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10; int i,a,n,s;

for(a=2;a<=M;a++) /*a是2~1000之间的整数.检查它是否完数*/ { n=0; /*n用来累计a的因子的个数*/

s=a; /*s用来存放尚未求出的因子之和,开始时等于a*/ for(i=1;i

{ n++; /*n加1,表示新找到一个因子*/

s=s-i; /*s减去已找到的因子,s的新值是尚未求出的因子之和*/ switch(n) /*将找到的因子赋给k1,…,k10*/

{ case 1: k1=i;break; /*找出的第1个因子赋给kl*/ case 2: k2=i;break; /*找出的第2个因子赋给k2*/ case 3: k3=i;break; /*找出的第3个因子赋给k2*/ case 4: k4=i;break; /*找出的第4个因子赋给k4*/ case 5: k5=i;break; /*找出的第5个因子赋给k5*/ case 6: k6=i;break; /*找出的第6个因子赋给k6*/ case 7: k7=i;break; /*找出的第7个因子赋给k7*/ case 8: k8=i;break; /*找出的第8个因子赋给k8*/ case 9: k9=i;break; /*找出的第9个因子赋给k9*/ case 10:k10=i;break; /*找出的第l0个因子赋给kl0*/ } }

if(s==0) /*s=0表示全部因子都已找到*/ { printf(\

if(n>1)printf(\表示a至少有2个因子*/

if(n>2)printf(\至少有3个因子,故应再输出1因子*/ if(n>3)printf(\以下类似*/ if(n>4)printf(\ if(n>5)printf(\ if(n>6)printf(\ if(n>7)printf(\ if(n>8)printf(\ if(n>9)printf(\ printf(\ } } }

方法二:程序如下 #include main() { int m,s,i;

for(m=2;m<1000;m++) { s=0;

for(i=1;i

{ printf(\ for(i=1;i

if(m%i==0)printf(\ printf(\ }

} }

方法三:此题用数组方法更为简单。程序如下 #include main()

{ int k[100]; int i,a,n,s;

for(a=2;a<1000;a++) { n=0; s=a;

for(i=1;i

k[n]=i; /*将找到的因子赋给k[1]),…,k[10]*/ }

if(s==0)

{ printf(\ for(i=1;i

【习题3-41】:

#include main()

{ int i,t,n=20;

float a=2,b=1,s=0; for(i=1;i<=n;i++) { s=s+a/b; t=a;

a=a+b; /*将前一项分子与分母之和作为下一项的分子*/

b=t; /*将前一项的分子作为下一项的分母*/

}

printf(\}

【习题3-42】:

#include main()

{ float sn=100,hn=sn/2; int n;

for(n=2;n<=10;n++)

{ sn=sn+2*hn; /*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反弹的高度*/ }

printf(\第10次落地时共经过%fm。\\n\ printf(\第10次反弹%fm。\\n\}

【习题3-43】:

#include main()

{ int day,x1,x2; day=9; x2=1;

while(day>0)

{ x1=(x2+1)*2; /*第l天的桃子数是第2天桃子数加1后的2倍*/

x2=x1; day--; }

printf(\}

【习题3-44】:

#include

main()

{ int i,j,k;

for(i=0;i<=3;i++) /*输出上面4行*号*/ { for(j=0;j<=2-i;j++) /*输出*号前面的空格*/ printf(\

for(k=0;k<=2*i;k++) /*输出*号*/ printf(\

printf(\ /*输出完一行*号后换行*/

}

for(i=0;i<=2;i++) /*输出下面3行*号*/ { for(j=0;j<=i;j++)

printf(\ /*输出*号前面的空格*/

for(k=0;k<=4-2*i;k++) /*输出*号*/ printf(\

printf(\ /*输出完一行*号后换行*/

} }

【习题3-45】 参考答案:

用迭代法求平方根的算法如下: (1)设定一个x的初值x0 ;

(2)用上述公式求出x的下一个值x1 ;

(3)再将x1代人上述公式,求出x的下一个值x2 ;

(4)如此继续下去,直到前后两次求出的x值(xn+1和xn)满足以下关系: |xn+1-xn|<10-5

为了便于程序处理,今只用变量x0和x1,先令x的初值x0=a/2(也可以是另外的值),求出x1 ;如果此时|x1-x0|≥10-5,则使x1→x0 ,然后用这个新的x0求出下一个x1 ,如此反复,直到|x1-x0|

#include #include main()

{ float a,x0,x1;

printf(\:\

scanf(\ /*输入a的值*/

x0=a/2;

x1=(x0+a/x0)/2; do

{ x0=x1;

x1=(x0+a/x0)/2; }

while(fabs(x0-x1)>=1e-5);

printf(\}

【习题3-46】:牛顿迭代法又称牛顿切线法。它采用以下的方法求根:先任意设定一个与真实的根接近的值x0作为第一次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,求出f(x2);再作切线……如此继续下去,直到足够接近真正的根x*为止,,见图3.1。

yf(x)f(xk)f(xk+1)x*0xk+2xk+1xkx图 3.1

从图3.1可以看出,

f'(x0)=f(x0)/(x1-x0)

因此: x1=x0-f(x0)/f'(x0)

这就是牛顿迭代公式。可以利用它由x0求出x1,然后再由x2求出x3?? 设 f(x)=2x3-4x2+3x-6

可以写成以下形式: f(x)=[(2x-4)x+3]x-6

同样,f'(x)可写成: f'(x)=6x2-8x+3=(6x-8)x+3 用这种方法表示的表达式,在运算时可节省时间。例如求f(x)只需要进行3次乘法和3次加法,而原来的表达式要经过多次指数运算、对数运算和乘法、加法运算,花费时间较多。现在由于计算机的运算速度愈来愈快,这点时间开销是微不足道的,这是以前计算机的运算速度较慢时所提出的问题。由于过去编写的程序往往采用这种形式,所以我们在此也顺便介绍一下,以便在阅读别人所写的程序时知道其所以然。

#include #include main()

{ float x,x0,f,f1; x=1.5; do

{ x0=x;

f=((2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x=x0-f/f1;

}while(fabs(x-x0)>=1e-5);

printf(\}

为了便于循环处理,程序中只设了x0和x,x0代表前一次的近似根,x代表后一次的近似根。求出一个x后,把它的值赋给x0,然后用它求下一个x0由

于第一次执行循环体时,需要对x0赋值,故在开始时应先对x赋一个初值(今为1.5,也可以是接近真实根的其他值)。 【习题3-47】:

先分析题目。按题意,画出图3.2的示意图。

ABCABC×××XYZX

图中带“×”符号的虚线表示不允许的组合。从图中可以看到:① X既不与A比赛,又不与C比赛,必然与B比赛;② C既不与X比赛,又不与Z比赛,必然与y比赛;③ A只能与Z比赛,见图3.3。

以上是经过逻辑推理得到的结论。用计算机程序处理此问题时,不可能立即就得出此结论,而必须对所有组合一一检验,看它们是否符合条件。

开始设计程序时,并不知道A、B、C与X、Y、Z中的哪一个进行比赛,可以假设:A与i比赛,B与j比赛,C与k比赛;即:

A—i B—j C—k

i、j、k分别是X、Y、Z之一,且i、j、k互不相等(一个队员不能与对方的两个队员比赛)。N—S图见图3.4。

FOR i='X' TO 'Z'FOR j='X' TO 'Z'TFOR k='X' TO 'Z'i≠k AND j≠kTT打印'A'-'C'-ki≠'X' , k≠'X'k≠'Z' i 'B'-jFFi≠j图 3.2图 3.3

其中,外循环使i由'X'变到'Z',中循环使j由'X'变到'Z'(但i不应与j相等)。然后,对每一组i、j的值,找符合条件的k值。k同样也可能是'X'、'Y'、'Z'之一。但k也不应与i或j相等。在i≠j≠k的条件下,把i≠'x'和l≠'X'以及K 'Z'的i、j、k的值输出即可。

#include main()

图3.4×Y××ZF{ char i,j,k; /*i是a的对手;j是b的对手;k是c的对手*/ for(i='X';i<='Z';i++) for(j='X';j<='Z';j++) if(i!=j)

for(k='X';k<='Z';k++) if(i!=k&&j!=k)

if(i!='X'&&k!='X'&&k!='Z')

printf(\}

说明:

(1)整个执行部分只有一个语句,所以只在语句的最后有一个分号。请读者弄清楚循环和选择结构的嵌套关系。

(2)分析最下面一个if语句中的条件:i≠'X',k≠'X','k'≠'Z',因为我们已事先假定A—i,B—j,C—k,由于题目规定A不与X对抗,因此i不能等于'X';同理,C不与X、Z对抗,因此k不应等于'X'和'Z'。

(3)题目给的是A、B、C、X、Y、Z,而程序中用了加撇号的字符常量'X'、'Y'、'Z',这是为什么?这是为了在运行时能直接打印出字符'A'、'B'、'C'、'X'、'Y'、'Z',以表示三组对抗的情况。

习题四参考答案:

一、单项选择题

【习题4-1】~【习题4-7】ACDBBBD 二、判断题(正确用×错误用√标记)

【习题4-8】~【习题4-13】 ×√×√√√

三、阅读程序写结果或填空

【习题4-14】s=10,t=25 【习题4-15】1: result is 4

2: result is 6 3: result is 8

【习题4-16】s=16 【习题4-17】10 【习题4-18】7 【习题4-19】x=9 【习题4-20】12 【习题4-21】static 【习题4-22】51 【习题4-23】3 四、程序设计题 【习题4-24】

double func(int n,float x) {if (n= =0) return 1;

else return func(n-1,x)+n*pow(x,n); }

【习题4-25】

PRTStar(char c,int n)

{if(n>0) {printf(\}

main( ) {int i,n;

scanf(\ for(i=1;i<=n;i++)

{PRTStar(' ',n-i); /*输出每行左端空格*/ PRTStar('*',2*i-1); /*输出每行的*号*/ printf(\ } }

【习题4-26】

从杨辉三角形的特点出发,可以总结出: ⑴ 第N行有N+1个值(设起始行为第0行); ⑵ 对于第N行的第J个值: (N>=2) 当J=1或J=N+1时: 其值为1 当J!=1且J!=N+1时: 其值为第N-1行的第J-1个值与第N-1行第J个值之和。 将这些特点提炼成数学公式可表示为: c(x,y) = 1 当 x=1 或 x=N+1 c(x,y) = c(x-1,y-1) + c(x-1,y) 其它 程序如下: int c(int x,int y)

{if((y==1)||(y==x+1)) return(1); else return c(x-1,y-1) + c(x-1,y); } main( )

{ int i,j,n=13; printf(\

while( n>12 )scanf(\for(i=0;i<=n;i++)

{ for(j=0;j

【习题4-27】

main( )

{ long k=2,N=1; float f=1,S=0;

while(N<=1E6) {S+=f/N; f= -f;

N=N*k++; }

printf(\}

【习题4-28】

int IsPrime(int x) {int k;

for(k=2;k<=x/2;k++) if(x%k==0) break; if(k>x/2) return 1; else return 0; } main( ) { int k;

for(k=99;k>=1;k--)

if(IsPrime(k)) printf(\ }

习题五参考答案:

一、单项选择题

【习题5-1】~【习题5-8】 DCABBDCA 二、阅读程序写结果或填空题 【习题5-9】~ ⑴ 二 ⑵ 4 ⑶ 'B' 【习题5-10】5

【习题5-11】a[k][k]

【习题5-12】⑴ a[0] ⑵ a[k] ⑶ t 【习题5-13】⑴ b[j] ⑵ a[m] ⑶ k<12 【习题5-14】运行结果为:

【习题5-15】1 1 1

【习题5-16】

本文来源:https://www.bwwdw.com/article/c7mo.html

Top