C语言习题及答案
更新时间:2024-01-14 19:18:01 阅读量: 教育文库 文档下载
- c语言基础题库及详解答案推荐度:
- 相关推荐
习题一
【习题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
char c1='a',c2='b',c3='c',c4='\\101',c5='\\116'; printf(\ printf(\}
【习题2-15】写出以下程序的运行结果: #include
int n=177;
printf(\}
【习题2-16】写出以下程序的运行结果: #include
int a,n=0; n+=(a=10);
printf(\}
【习题2-17】写出以下程序的运行结果: #include
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
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】 数学表达式:-5
【习题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
{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
{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
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
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
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
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
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
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 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 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 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→nYa 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 { 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 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 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 { 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 { 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 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 int a,b,x,y; scanf(\x=a*a+b*b; if(x>100){y=x/100;printf(\else printf(\} 【习题3-27】: #include int x; scanf(\ if(x%5==0&&x%7==0) printf(\else printf(\} 【习题3-28】: #include 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 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 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 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 int a,b; char symbol; printf(\ scanf(\ printf(\if(symbol=='-') symbol='+'; else symbol='-'; printf(\} 【习题3-33】: #include { 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 { float s=0,t=1; int n; for(n=1;n<=20;n++) { t=t*n; /*求n!*/ s=s+t; /*将各项累加*/ } printf(\} 【习题3-35】: #include { 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 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 { 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 int i; for(i=1;i<100;i++) if(i*i==i|| i*i0==i) printf(\} 【习题3-39】 参考答案: #include 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 { 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 for(m=2;m<1000;m++) { s=0; for(i=1;i { printf(\ for(i=1;i if(m%i==0)printf(\ printf(\ } } } 方法三:此题用数组方法更为简单。程序如下 #include { 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 { 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 { 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 { 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 { 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 { 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 图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】
正在阅读:
C语言习题及答案01-14
银河T3底板配套胶皮03-30
政府和社会资本合作(PPP)-国际蒙医药 医养结合项目实施方案(编制大纲) - 图文03-17
标杆队建设方案10-18
121班班主任工作计划04-10
参加面试人员需要注意的一些问题11-27
数据库原理及应用(答案已补全)06-09
201X年武警中队年度工作总结范文word版本(5页)12-15
江西财经大学财务管理A卷(2)12-06
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 习题
- 答案
- 语言
- 关于农村重男轻女现象的暑期调研论文
- 2013年进展报告(12.24)
- 信号实验报告
- 快乐英语第十一册unit 1 —unit 3练习题
- 山东省平邑曾子学校八年级地理上册 第二章 第二节 气候(第1课时)学案
- 2018-2024年中国集装箱港口行业市场竞争态势研究报告(目录) - 图文
- 2014年新化完小岗位大练兵,教学大比武方案
- 2016正式版实验室准则及释义
- 第三章50种推荐精油
- 财控中心快乐基金管理制度
- 卸料平台安装旁站记录
- 初中历史总复习提纲(全6册)
- 浅析我国弱势群体的社会保障问题(论文)
- “华为女皇”孙亚芳公认最好的一篇文章:以色列崛起之谜
- 2018东城区高中数学(理)一模试卷及答案
- 最新高考英语词汇260道试题详解
- 2019-2020年度最新人教版最新高三数学一轮复习练习题全套—(含答案)及参考答案 - 图文
- 议论文写作(纸质配套)
- 腹部诊断习题
- 色满乡中心小学校长宣讲简报10.31 - 图文