c语言第8章 编译预处理及位运算习题答案
- 格式:doc
- 大小:111.00 KB
- 文档页数:6
习题答案习题1(参考答案)1.程序与算法的概念及二者的区别是什么?程序:为了实现特定目标或解决特定问题而用计算机语言偏写的指令序列,它由算法和数据结构组成。
算法:(Algorithm)是在有限步骤内求解某一问题所使用的一组定义明确的规则。
通俗地讲,就是计算机解题的步骤。
算法与程序的区别:计算机程序是算法的一个实例,同一个算法可以用不同的计算机语言来表达。
2.简述程序设计语言发展的过程程序设计语言经过最初的机器代码到今天接近自然语言的表达,经过了四代的演变。
一般认为机器语言是第一代,符号语言即汇编语言为第二代,面向过程的高级语言为第三代,面对象的编程语言为第四代。
3.简述高级程序设计语言中面向过程与面向对象的概念。
“面向过程”是一种以过程为中心的编程思想。
首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步地实现,使用的时候依次调用函数即可。
一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。
“面向对象”是一种以事物为中心的编程思想。
面向对象的方法主要是将事物对象化,对象包括属性与行为。
面向过程与面向对象的区别:在面向过程的程序设计中,程序员把精力放在计算机具体执行操作的过程上,编程关注的是如何使用函数去实现既定的功能;而在面向对象的程序设计中,技术人员将注意力集中在对象上,把对象看做程序运行时的基本成分。
编程关注的是如何把相关的功能(包括函数和数据)有组织地捆绑到一个对象身上。
4.C语言程序的特点是什么?(1)C语言非常紧凑、简洁,使用方便、灵活,有32个关键字,有9种流程控制语句。
(2)C语言运算符丰富,共有45个标准运算符,具有很强的表达式功能,同一功能表达式往往可以采用多种形式来实现。
(3)数据类型丰富。
C语言的数据类型有整型、实型、字符型、数组类型、结构类型、共用类型和指针类型,而且还可以用它们来组成更复杂的数据结构,加之C语言提供了功能强大的控制结构,因而使用C语言能非常方便地进行结构化和模块化程序设计,适合于大型程序的编写、调试。
习题七一、选择题1.以下表达中错误的选项是C。
A) 预处理命令必须以#号开头B) 预处理命令可以写成多行C) 预处理命令必须置于源文件的开场处D) 预处理命令以回车完毕2.C语言编译系统对宏替换的处理是在A进展的。
A) 源程序编译前B) 源程序编译时C) 程序连接时D) 程序运行时3.在宏定义#define PI 3.14159 中,是C。
A) 单精度数B) 双精度数C) 字符串D) 由PI位置确定其类型4.设有宏定义#define A B abcd ,那么宏替换时,A。
A) 宏名A用B abcd 替换B) 宏名A B用abcd 替换C) 宏名A 和宏名B都用abcd 替换D) 语法错误,无法替换5.以下有关宏的表达中错误的选项是A。
A) 宏名必须使用大写英文字母B) 宏替换不占用程序的运行时间C) 宏参数没有数据类型D) 宏名没有数据类型6.以下宏定义,最不会引起二义性的是D。
A) #define ADD(a,b) a+bB) #define ADD(a,b) (a)+(b)C) #define ADD(a,b) (a+b)D) #define ADD(a,b) ((a)+(b))7.设有宏定义#define M 3+2 那么表达式2 * M * 3 的值为B。
A) 30 B) 12C) 10 D) 138.设有宏定义#define Y(n) (4*n) 那么表达式3+Y(5+1)的值为B。
A) 21 B) 24C) 27 D) 309.设有宏定义:#define N 3#define M N+2那么表达式2*M/N的值为A。
A) 6 B) 3C) 3.333 D) 错误替换为2*3 + 2 /3,其中,2/3是整除,值为110.在#include命令中,#include后面的文件名用双引号定界,那么系统寻找被包含文件的方式是 D 。
A) 在C系统的include文件夹查找B) 在源程序所在文件夹查找C) 先在C系统的include文件夹查找,查找失败后再到源程序所在文件夹查找D) 先在源程序所在文件夹查找,查找失败后再到C系统的include文件夹查找11.〔不要求〕设有以下A、B两个程序段,那么说法正确的选项是B。
位运算练习题2007-06-12 10:311.以下运算符中优先级最低的是(C)优先级最高的是( B )A.&&B.&C.||D.|B )2. 如有运算符 sizeof,<<,^&=, 则它们按优先级由高到低的正确摆列次序是( ,&=,<<,^ ,<<,^,&= C.^,<<,sizeof,&= D,<<,^,&=sizeofB )3. 在 C 语言中,要求运算数一定是整型或字符型的运算符是( A.&& B.& C.! D.||(float) 是( C)A.一种函数调用 B. 一个不合法的表示形式 C. 一个整型表达式 D. 一个浮点表达式5. 表达式 0x13&0x17 的值是( B)6.以下程序的运转结果是( C ),70 ,0 ,50 ,76Char x=56; x=x&056; printf(“%d,%n”,x,x);7. 若 x=2,y=3 则 x&y 的结果是( B )D,58. 在履行完以下 C 语句后, B 的值是( B 或 C )注:最好选B,C语言中无bool 型charZ=`A`);intB;B=((241&15)&&(Z|`a`);9. 表达式 0X13|0x17 的值是 ( B)10. 若 a=1,b=2;则a|b的值是(D)11. 如有以下程序段,则履行以下语句后x,y 的值是分别是(C)int x=1,y=2; x=x^y; y=y^x; x=x^y;=1,b=2 =2,y=2 =2,y=1 ==112. 表达式 0x13^0x17 的值是(A)13. 请读程序片段,输出结果是:(C)int x=20; printf((“%d n”,~x);14. 表达式 ~0x13 的值是( 0xffffffec)选项中无答案15. 在们运算中,操作数每右移一位,其结果相当于(B)A. 操作数乘以 2B. 操作数除以 2C. 操作数除以 4D. 操作数乘以416.在位运算中,操作数每左移一位,其结果相当于( A )A. 操作数乘以 2B. 操作数除以 2C. 操作数除以 4D. 操作数乘以417.设有以下语句。
c语言第8章-编译预处理及位运算习题答案编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。
A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C 语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。
A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。
A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
第1章习题参考答案1、选择题(1)C (2)C (3)D (4)B (5)D(6)D (7)C (8)A (9)A (10)C2、填空题(1)函数、一个主函数、函数。
(2) /*、*/ 。
(3) 连接。
(4) # 。
(5) main 。
(6) /*……*/ 。
(7) .h 。
(8) F5 。
(9) .exe (10) .exe 、 .obj 、.exe 。
3、程序设计题(1) #include <stdio.h>void main(){printf(" *\n");printf(" * S *\n");printf(" *\n");}(2) #include <stdio.h>void main(){printf("*****************\n");printf("Your are welcome!\n");printf("-----------------\n");}(3) #include <stdio.h>void main(){char c1,c2;printf("请输入c1和c2的值:");c1=getchar();scanf(" %c",&c2);printf("c1=%c\n",c1);printf("c2=");putchar(c2);printf("\n");}第2章习题参考答案1、简述算法的概念。
答:算法就是为解决一个具体的问题而使用的确定的、有限的方法和步骤。
2、算法应具备哪些特性?答:算法应具备有穷性、确定性、可行性、输入、输出等五种特性。
3、分别说明什么是自然语言描述法?什么是框图语言描述法?什么是伪语言描述法?什么是N-S框图语言描述法?它们的优缺点各是什么?答:①用人们日常使用的语言来描述算法,称为算法的自然语言描述法。
第一章 C语言概述一、选择题:1、一个C程序的执行是从( A )。
A本程序的main函数开始,到main函数结束B本程序文件的第一个函数开始,到本程序文件的最后一个函数结束C本程序的main函数开始,到本程序文件的最后一个函数结束D本程序文件的第一个函数开始,到本程序main函数结束2、在 C 语言中,每个语句必须以( D )结束。
A. 回车符B. 冒号C. 逗号D. 分号3、C 语言规定:在一个源程序中,main函数的位置( C )。
A. 必须在最开始B. 必须在系统调用的库函数的后面C. 可以任意D. 必须在最后4、一个C 语言程序是由( B )。
A. 一个主程序和若干子程序组成B. 函数组成C. 若干过程组成D. 若干子程序组成5、下列说法中错误的是( D )。
A. 主函数可以分为两个部分:主函数说明部分和主函数体B. 主函数可以调用任何非主函数的其他函数C. 任何非主函数可以调用其他任何非主函数D. 程序可以从任何非主函数开始执行6、用 C 语言编写的源文件经过编译,若没有产生编译错误,则系统将( C )。
A. 生成可执行目标文件B. 生成目标文件C. 输出运行结果D. 自动保存源文件二、填空题:1、C 语言只有 32 个关键字和 9 种控制语句。
2、每个源程序有且只有一个 main 函数,系统总是从该函数开始执行C语言程序。
3、C 语言程序的注释可以出现在程序中的任何地方,它总是以 \* 符号作为开始标记,以 */ 符号作为结束标记。
4、C 语言中,输入操作是由库函数 scanf 完成的,输出操作是由库函数 printf 完成的。
5、系统默认的C 语言源程序文件的扩展名是 .c ,经过编译后生成的目标文件的扩展名是 .obj ,经过连接后生成的可执行文件的扩展名是 .exe 。
6、C 语言的标识符只能由字母、数字和下划线三种字符组成。
第三章数据类型、运算符和表达式一、选择题:1、以下选项中,不正确的 C 语言浮点型常量是( C )。
位运算练习题2007-06-12 10:31更1. 以下运算符中优先级最低的是(C)优先级最高的是(B )A.&&B.&C.||D.|2. 若有运算符sizeof,<<]&=, 贝陀们按优先级由高到低的正确排列次序是( B ),& =,<<,A ,<<,A,&= C.A,<<,sizeof,&= D,<<,A,&=sizeof3. 在C语言中,要求运算数必须是整型或字符型的运算符是(B )A.&&B.&C.!D.||(float)是(C)A. —种函数调用B. 一个不合法的表示形式C. 一个整型表达式D. 一个浮点表达式5. 表达式0x13&0x17的值是(B)6. 以下程序的运行结果是(C ),70 ,0 ,50 ,76Char x=56; x=x&056; printf( “ %d,% n” ,x,x);7. 若x=2,y=3 则x&y 的结果是( B )D,58. 在执行完以下C语句后,B的值是(B或C)注:最好选B,C语言中无bool型charZ='A');intB;B=((241&15)&&(Z|'a');9. 表达式0X13|0x17 的值是(B)10. 若a=1,b=2; 则a|b 的值是( D)11. 若有以下程序段,则执行以下语句后x,y 的值是分别是(C)int x=1,y=2; x=x A y; y=y A x; x=x A y;=1,b=2 =2,y=2 =2,y=1 ==112. 表达式0x13A0x17 的值是(A)13. 请读程序片段,输出结果是:(int x=20; printf(( “%d n”,~x);14. 表达式~0x13 的值是 ( 0xffffffec)选项中无答案15. 在们运算中,操作数每右移一位,其结果相当于A.操作数乘以2B.操作数除以2C.操作数除以4D.操作数乘以416.在位运算中,操作数每左移一位,其结果相当于( A )A. 操作数乘以2B. 操作数除以2C. 操作数除以4D. 操作数乘以417.设有以下语句。
目录重要次重要重复或欲删除基础第一章 C语言概述1.1 选择题1.2 填空题第二章数据类型、运算符与表达式2.1 选择题2.2 填空题第三章最简单的C程序设计3.1 选择题3.2 填空题第四章逻辑运算和判断选取控制4.1 选择题4.2 填空题4.3 编程题第五章循环控制5.1 选择题5.2 填空题5.3 编程题第六章数组6.1 选择题6.2 填空题6.3 编程题第七章函数7.1 选择题7.2 填空题7.3 编程题第八章编译预处理8.1 选择题8.2 填空题8.3 编程题第九章指针9.1 选择题9.2 填空题9.3 编程题第十章结构体和共用体10.1 选择题10.2 填空题10.3 编程题第十一章位运算11.1 选择题11.2 填空题11.3 编程题第十二章文件12.1 选择题12.2 填空题12.3 编程题第一章 C语言概述1.1 选择题*1.1一个C程序的执行是从。
A)本程序的main函数开始,到main函数结束B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束C)本程序的main函数开始,到本程序文件的最后一个函数结束D)本程序文件的第一个函数开始,到本程序main函数结束参考答案:A参考分析:C语言总是从main函数开始,main函数结束。
但是C语言中存在一个exit(0)函数,它可以使得程序在任何时候、任何位置结束程序的运行。
如果不考虑exit(0)等函数的特殊作用,C则总是在main函数结束。
*1.2以下叙述正确的是。
A)在C程序中,main函数必须位于程序的最前面B)在C程序的每一行只能写一条语句C)C语言本身没有输入输出语句D)在对一个C程序进行编译的过程中,可发现注释中的拼写错误参考答案:C参考分析:C程序对main函数的位置没有任何要求;其书写格式自由,一行可以写多条语句,一条语句(多关键字语句)可以写在多行;C语言忽略注释,把注释看作是一个空格,不会对注释中的内容进行语法检查。
编译预处理和动态存储分配及答案编译预处理和动态存储分配一、选择题(1)有以下程序 main(){ char p[]={'a', 'b', 'c'}, q[]=\ printf(\ %d\\n\ };程序运行后的输出结果是 A)4 4 B)3 3 C)3 4 D)4 3(2)有以下程序# define f(x) (x*x) main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ; printf(\ }程序运行后的输出结果是 A)64, 28 B)4, 4 C)4, 3 D)64, 64(3)有以下程序 main(){ char a[7]=\ i,j; i=sizeof(a); j=strlen(a); printf(\ %d\\n\}程序运行后的输出结果是 A)2 2 B)7 6 C)7 2 D)6 2(4)以下叙述中正确的是 A)预处理命令行必须位于源文件的开头B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示 D)宏替换不占用程序的运行时间(5) 有以下程序 main( ){ char a[]=”abcdefg”,b[10]=”abcdefg”;printf(“%d %d\\n”,sizeof(A) ,sizeof(B) ); }执行后输出结果是 A) 7 7 B) 8 8 C) 8 10 D) 10 10(6) 有以下程序#define f(x) x*x main( ) { int i;i=f(4+4)/f(2+2); printf(“%d\\n”,i); }执行后输出结果是 A) 28 B) 22 C) 16 D) 4(7) 有以下程序 #include #define F(X,Y) (X)*(Y) main (){ int a=3, b=4;printf(\}程序运行后的输出结果是 A) 12 B) 15 C) 16 D) 20(8) 有以下程序main(){ char s[]=\printf(\}执行后输出结果是A) 赋初值的字符串有错 B) 6,7 C) 5,6 D) 6,6(9) 有以下程序main(int arge,char *argv[]) { int n,i=0; while(arv[1][i]!='\\0'{ n=fun(); i++;} printf(%d\\n\}int fun(){ static int s=0; s+=1; return s; }假设程序经编译、连接后生成可执行文件exam.exe,若键入以下命令行 exam 123 则运行结果为(10) 有以下程序 main(){ char a[ ]={‘a’,‘b’,‘c’,‘d’, ‘e’, ‘f’, ‘g’,‘h’,‘\\0’};inti=sizeof(a); j=strlen(a); printf(“%d,%d\\b”i,j); }程序运行后的输出结果是 A)9,9 B)8,9 C)1,8 D)9,8(11) 程序中头文件typel.h 的内容是: #define N 5 #define M1 N*3 程序如下:i,j; #define “type1.h” #define M2 N*2 main() { int i;i=M1+M2; printf(“%d\\n”,i); }程序编译后运行的输出结果是: A) 10 B) 20 C) 25 D) 30(12) 有以下程序 #include main() { char *p,*q;p=(char*)malloc(sizeof(char)*20); q=p; scanf(“%s%s”,p,q);printf(“%s%s\\n”,p,q); }若从键盘输入:abc def,则输出结果是: A) def def B) abc def C) abc d D) d d(13) 若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是 A) p=2*(int*)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int)); C) p=(int*)malloc(2*2);D) p=(int*)calloc(2,sizeof(int));(14) 以下程序的输出结果是 main(){ char st[20]= “hello\\0\\t\\\\\\”; printf(%d %d\\n”,strlen(st),sizeof(st)); }A) 9 9 B) 5 20C) 13 20 D) 20 20(15) 以下程序的输出结果是amovep(int p, int (a)[3],int n) { int i, j; for( i=0;i 感谢您的阅读,祝您生活愉快。
c语言位试题及答案1. 位运算符“&”的作用是什么?答案:位运算符“&”的作用是对两个整数的对应位进行逻辑与操作。
2. 请解释“左移”和“右移”操作。
答案:左移操作符“<<”将操作数的所有位向左移动指定的位数,右侧空出的位用0填充。
右移操作符“>>”将操作数的所有位向右移动指定的位数,左侧空出的位用符号位的值填充。
3. 如何使用位运算符实现整数的奇偶判断?答案:可以通过判断整数与1进行“与”操作的结果来判断奇偶。
如果结果为1,则整数为奇数;如果结果为0,则整数为偶数。
4. 请写出一个C语言程序,实现将一个整数的二进制表示中的所有1变为0,所有0变为1。
答案:```c#include <stdio.h>int main() {int num;printf("Enter an integer: ");scanf("%d", &num);num = ~num; // 取反操作printf("Result: %d\n", num);return 0;}```5. 位运算符“^”的作用是什么?答案:位运算符“^”的作用是对两个整数的对应位进行逻辑异或操作。
6. 在C语言中,如何使用位运算符实现一个整数的二进制表示中的特定位的设置、清除和翻转?答案:使用位运算符“|”设置特定位,使用“&”清除特定位,使用“^”翻转特定位。
7. 请写出一个C语言程序,实现将一个整数的二进制表示中的第n位设置为1。
答案:```c#include <stdio.h>int main() {int num, n;printf("Enter an integer and the position to set: "); scanf("%d %d", &num, &n);num |= (1 << (n - 1)); // 设置第n位为1printf("Result: %d\n", num);return 0;}```8. 位运算符“|”的作用是什么?答案:位运算符“|”的作用是对两个整数的对应位进行逻辑或操作。
《C语言程序设计》习题解答国荣隋雪莉闵芳目录第1章 C语言程序设计概述 (2)第2章数据类型及其运算 (3)第3章语句与输入输出 (4)第4章选择结构程序设计 (6)第5章循环结构程序设计 (9)第6章数组 (12)第7章函数 (15)第8章编译预处理 (18)第9章指针 (19)第10章结构体与共用体 (21)第11章位运算 (25)第12章文件操作 (26)第1章 C语言程序设计概述1. 函数、main()函数2. /*、*/3. .C、.OBJ、.EXE4. 顺序结构、选择结构、循环结构三、编程题1.【参考代码】#include<stdio.h>int main( ){printf( "(学校名称)\n" ) ;printf( "()\n" ) ;return 0 ;}2.【参考代码】#include<stdio.h>int main( ){printf( "(学校名称)\n()\n" ) ;return 0 ;}第2章数据类型及其运算注:第5题B选项为:'\'' '\017' '\t'二、填空题1. 字母、数字、下划线2. 1、4、4、83. -164. 3.55. 06. 97. 68. -609. y%2==110. 1、0、1三、程序阅读题1. b2. 03. 04. 10,25. 9,10,9,106. 3,1,0,07. 3,20,30,1第3章语句与输入输出1. 123.472. D3. 回车4. 10,2三、程序阅读题1. 2612. 203. 201,104. y=4630y=46305. *3.140000,3.142*6. c:dec=120,oct=170,hex=78,ASCII=x7. x=1 y=2 *sum*=310 squared is : 1008. 2 48 20.2 20.29. x+y+z=4810. 55, ,A四、编程题1.【参考代码】#include<stdio.h>int main( ){char ch;printf("请输入一个字符:\n");scanf("%c",&ch);printf("%c的ASCII码为:%d\n", ch,ch);return 0 ;}2.【参考代码】#include<stdio.h>#define PI 3.1416int main( ){double r, h;double cl,cs,cv;printf("请输入圆的半径:");scanf("%lf", &r);printf("请输入圆柱高:");scanf("%lf", &h);cl=2*PI*r;cs=PI*r*r;cv=PI*r*r*h;printf("圆的周长为:%.4lf\n", cl);printf("圆的面积为:%.4lf\n", cs);printf("圆柱的体积为:%.4lf\n", cv);return 0 ;}3.【参考代码】#include<stdio.h>int main( ){int splitInt,one,ten,hundred;printf("输入要处理的整数:");scanf("%d",&splitInt);hundred = splitInt/100;ten = splitInt%100/10;one = splitInt%10;printf("个位:%d,十位:%d,百位:%d\n",one,ten,hundred);return 0 ;}第4章选择结构程序设计1. 102. 2,2,23. 64. 97,b5. c=-16. 88887. 20,08. 2,19. 1,12,22,1-2,210. a=1,b=3三、程序完善题1. a>b、c>x四、编程题1.【参考代码】#include<stdio.h>int main( ){int a, b, c,d,min;printf("输入4个整数:");scanf("%d%d%d%d",&a,&b,&c,&d);if(a < b) min = a;else min = b;if(c < min) min=c;if(d<min) min=d;printf("%d\n",min);return 0 ;}2.【参考代码】#include<stdio.h>int main( ){int num,a,b,c,d;printf("请输入一个四位整数:");scanf("%d",&num);a=num/1000;b=num%1000/100;c=num%100/10;d=num%10;printf("各位数字之和为:%d\n",a+b+c+d);return 0 ;}3.【参考代码】#include<stdio.h>int main( ){int x;printf("请输入x:");scanf("%d",&x);printf("y的值为:");if(x<0)printf("%d\n",x);else if(x<50)printf("%d\n",3*x-2);else if(x<100)printf("%d\n",4*x+1);elseprintf("%d\n",5*x);return 0 ;}4.【参考代码】#include<stdio.h>int main( ){int dj;float zl,je,yfk;printf("请输入等级(1~4): ");scanf("%d",&dj);if (dj>4||dj<1){printf("无此等级的苹果!\n");return 0;}printf("请输入重量(公斤): ");scanf("%f",&zl);printf("\n");switch (dj){case 1 : je=5.5*zl; break;case 2 : je=4.3*zl; break;case 3 : je=3.0*zl; break;case 4 : je=2.5*zl; break;}printf("您选择苹果级别: %d 级\n",dj);printf("您购买苹果重量: %.2f公斤\n",zl);printf("您应付金额为: %.2f元\n",je);printf("\n");printf("顾客所付金额: ");scanf("%f",&yfk);if (yfk<je){printf("Data Error!\n");return 0;}printf("应找您: %.2f元\n",yfk-je);return 0 ;}第5章循环结构程序设计1. 1,2,02 . m=4,n=23. A2C4E64. 1325. 46. k=0,m=57. x=88. 1.69. 998988三、程序完善题1. ( ch > 'Z' && ch <= 'Z' + 4 ) ||(ch > 'z' ) ch - 262. k k/10 continue3. i + t * 10 s = s + t4. fabs( t ) >= 1e-6 f = -f5. i<10 j%3 !=0四、编程题1.【参考代码】#include<stdio.h>int main( ){int n , i , j , k ;printf( "Output:\n" ) ;for(n = 100 ; n < 1000 ; n++ ){i = n % 10 ; /* 个位 */j = ( n / 10 ) % 10 ; /* 十位 */k = n / 100 ; /* 百位 */if ( n == i * i * i + j * j * j + k * k * k )printf( "%d\n" , n ) ;}return 0 ;}2. 【参考代码】#include<stdio.h>int main ( ){int i , m , n , t , p , k ;printf( "Please input: " ) ;scanf ( "%d,%d" , &m , &n ) ;if( m < n ){t = n ;n = m ;m = t ;}p = m * n ;while ( n != 0 ) /* 余数不为0,继续相除,直到余数为0 */ {i = m % n ;m = n ;n = i ;}k = p / m ;printf( "%d,%d\n" , m , k );return 0 ;}3. 【参考代码】#include<stdio.h>int main( ){int i , n , t , sum ;t = 1 ;sum = 0 ;printf( "Please input: n = " ) ;scanf( "%d" , &n ) ;for( i = 1 ; i <= n ; i++ ){t = t * i ;sum = sum + t ;}printf( "1!+2!+…+%d!= %d\n" , n , sum ) ;return 0 ;}4. 【参考代码】#include<stdio.h>int main( ){int i , m ;double sum = 0 , k = 1 ;printf( "Please input : m=" ) ;scanf( "%d" , &m ) ;for( i = 1 ; i <= m ; i++ ){sum = sum + k / i ;k = -k ;}printf( "sum=%4.2f\n" , sum ) ;return 0 ;}第6章数组1 82 43 0,24 125 t*M6 mo7 fwo三、程序完善题1 k = i j = ia[k] = max a[j] = min2 sum += score[i] score[i]<avg3 s[i] = s[i] + a[i][j] printf( "\n" ) ;4 j = strlen( str ) – 1 str[j] = k5 ( c = getchar( ) ) != '#' num[c-'A'] += 1四、编程题1. 【参考代码】#include<stdio.h>#define N 5int main( ){int a[N] , i , j , r , temp ;printf( "Please input %d numbers\n" , N ) ;for( i = 0 ; i < N ; i++ )scanf( "%d" , &a[i] ) ;for( i = 0 ; i < N - 1 ; i++ ){r = i ;for( j = i + 1 ; j < N ; j++ )if( a[j] < a[r] )r = j ;if( r != i ){temp = a[r] ;a[r] = a[i] ;a[i] = temp ;}}printf( "The array after sort:\n" ) ;for( i = 0 ; i < N ; i++ )printf( "%5d" , a[i] ) ;printf( "\n" ) ;return 0 ;}2. 【参考代码】#include<stdio.h>int main( ){int a[10] = { 1 , 2 , 3 , 6 , 7 , 8 , 9 , 10 } ;int x , j , k = 0 ;printf( "Please input :x= " ) ;scanf( "%d" , &x) ;if( x > a[7] )a[8] = x ;else{for( j = 0 ; j < 8 ; j++ )if( x < a[j] )break ;for(k = 8 ; k > j ; k-- )a[k] = a[k - 1] ;a[j] = x ;}for( j = 0 ; j < 9 ; j++ )printf( "%5d" , a[j] ) ;printf( "\n" ) ;return 0 ;}3. 【参考代码】#include<stdio.h>int main( ){int a[5][5] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21, 22,23,24} ;int i , j ,sum = 0 ;for ( i = 0 ; i < 5 ; i++ ){for ( j = 0 ; j < 5 ; j++)printf( "%4d" , a[i][j] ) ;printf( "\n" ) ;}for( i =0 ;i < 5 ; i++ )sum += a[i][i] ;printf( " sum=%4d\n" , sum ) ;return 0 ;}4. 【参考代码】#include<stdio.h>int main( ){char s1[100] , s2[30] ;int i , j ;printf( "Please input s1:" ) ;gets( s1 ) ;printf( "Please input s2:" ) ;gets( s2 ) ;for( i = 0 ; s1[i] != '\0' ; i++ ) ;for( j = 0 ; s2[j] != '\0' ; j++ , i++ ) s1[i] = s2[j] ;s1[i] = '\0' ;printf( "Output\ns1:" ) ;puts( s1 ) ;return 0 ;}5. 【参考代码】#include<stdio.h>int main( ){char s1[100] ;int i ;printf( "Please input s1:" ) ;gets( s1 ) ;for( i = 0 ; s1[i] != '\0' ; i++ ) ;printf( "The length of s1 is %d\n" ,i ) ;return 0 ;}第7章函数1 max is 22 a=1,b=23 1 114 a=11,b=12,c=25 66 7 8 97 8 178 0 1 2 0 1 2三、程序完善题1 float area ( float r ) return s2 z = fun( x , y ) z = z * x3 count =fun( score ) count++四、编程题1. 【参考代码】#include<stdio.h>int main( ){void f(int n) ;int n ;printf( "Please input: n= " ) ;scanf( "%d" , &n ) ;if( n <= 0)printf( "Wrong number!\n" ) ;elsef( n ) ;return 0 ;}void f(int n){if( n % 2 == 1 )printf( "%d is a odd number.\n" , n ) ;elseprintf( "%d is a even number.\n" , n ) ; }2. 【参考代码】#include < stdio.h >#include < math.h >int main( ){void f( int m ) ;int m ;printf( "Please input: m= " ) ;scanf( "%d" , &m ) ;f( m ) ;return 0 ;}void f( int m ){int i , k ;k = sqrt( m );for(i = 2 ; i <= k ; i++ )if( m % i == 0 )break;if (i >= k + 1 )printf( "%d is a Prime Number.\n" , m ) ;elseprintf( "%d is not a Prime Number.\n" , m ) ; }3. 【参考代码】#include<stdio.h>int gys( int m , int n ){int r ;r = m % n ;while( r != 0 ){m = n ;n = r ;r = m % n ;}return n ;}int gbs( int m , int n , int r ){return m * n / r ;}int main( ){int m , n , t ;printf( "Please input(m,n):" ) ;scanf( "%d%d" , &m , &n ) ;if( m < n ){t = m ;m = n ;n = t ;}t = gys( m , n ) ;printf( "gys=%d\n" , t ) ;t = gbs( m , n , t ) ;printf( "gbs=%d\n" , t ) ;return 0 ;}4. 【参考代码】#include<stdio.h>int main( ){void mystrcat( char s1[100] , char s2[30] ) ;char s1[100] , s2[30] ;printf( "Please input s1:" ) ;gets( s1 ) ;printf( "Please input s2:" ) ;gets( s2 ) ;mystrcat( s1 , s2 ) ;printf( "Output\ns1:" ) ;puts( s1 ) ;return 0 ;}void mystrcat( char s1[100] , char s2[30] ){int i , j ;for( i = 0 ; s1[i] != '\0' ; i++ ) ;for( j = 0 ; s2[j] != '\0' ; j++ , i++ )s1[i] = s2[j] ;s1[i] = '\0' ;}第8章编译预处理1 6,182 153 5第9章指针二、填空题1. 地址, NULL(或0)2 . char a, *p; , scanf("%c", &a); , p=&a;3. *m4. for( k=0; k<10; k++ )5. *(p+i) , p[i] , *(x+i)6. str[i]或*( str + i ) , i三、程序阅读题1. gae2. bcdABCD3. 7, 8, 84. 8 45. 3 14 26. efgh7. w,one8. 7四、程序完善题1. a[i] 或 *( a + i )2. *p!='\0' *p-'0'3. p1 p2-x4. max(int a , int b ); p = max四、编程题1.【参考代码】#include<stdio.h>void sort( int *a , int *b , int *c );int main(){int m , n , t ;printf( "Please input(m n t):" ) ;scanf( "%d%d%d" , &m , &n , &t ) ;sort( &m , &n , &t ) ;printf( "The result is :%d\t%d\t%d\n" , m , n , t ) ;return 0 ;}void sort( int *a , int *b , int *c ){int temp ;if( *a > *b ) { temp = *a ; *a = *b ; *b = temp ; }if( *a > *c ) { temp = *a ; *a = *c ; *c = temp ; }if( *b > *c ) { temp = *b ; *b = *c ; *c = temp ; }}2.【参考代码】程序1:#include <stdio.h>int strcompare( char *str1 , char *str2 );int main( ){int m ;char s1[20] , s2[20] , *p1 , *p2 ;printf( "Please input(string1):" ) ;scanf( "%s" , s1 ) ;printf( "Please input(string2):" ) ;scanf( "%s" , s2 ) ;m = strcompare ( s1 , s2 ) ;printf( "The result of strcompare is: %d\n" , m ) ;return 0 ;}int strcompare( char *str1 , char *str2 ){int i = 0 ;while( ( *( str1 + i ) == *( str2 + i ) ) &&( *( str1 + i ) != '\0' ) ) i++ ;return( *( str1 + i ) - *( str2 + i ) ) ;}程序2:#include <stdio.h>int strcompare( char *str1 , char *str2 );int main( ){int m ;char s1[20] , s2[20] , *p1 , *p2 ;printf( "Please input(string1):" ) ;scanf( "%s" , s1 ) ;printf( "Please input(string2):" ) ;scanf( "%s" , s2 ) ;p1 = s1 ;p2 = s2 ;m = strcompare ( p1 , p2 ) ;printf( "The result of strcompare is: %d\n" , m ) ;return 0 ;}int strcompare( char *str1 , char *str2 ){int i = 0 ;while( ( *( str1 + i ) == *( str2 + i ) ) &&( *( str1 + i ) != '\0' ) ) i++ ;return( *( str1 + i ) - *( str2 + i ) ) ;}程序3:#include <stdio.h>int strcompare( char str1[] , char str2[] );int main( ){int m ;char s1[20] , s2[20] , *p1 , *p2 ;printf( "Please input(string1):" ) ;scanf( "%s" , s1 ) ;printf( "Please input(string2):" ) ;scanf( "%s" , s2 ) ;p1 = s1 ;p2 = s2 ;m = strcompare ( p1 , p2 ) ;printf( "The result of strcompare is: %d\n" , m ) ;return 0 ;}int strcompare( char *str1 , char *str2 ){int i = 0 ;while( ( str1[i] == str2[i] ) &&( str1[i] != '\0' ) )i++ ;return( str1[i]- str2[i] ) ;}第10章结构体与共用体1. 112 . p->next=head->next head->next=p3. p->next三、程序阅读题1. 51,60,212. 163. 1001,ChangRong,1098.0四、程序完善题1. sizeof( struct ps ) 或 sizeof( bt )2. p=p->next3. person[i].sex五、编程题1.【参考代码】#define N 3#include <stdio.h>struct student{char num[6] ;char name[8] ;int score[2] ;float ave ;} ;void input( struct student stu[N] ) ;void average( struct student stu[N] ) ;int max( struct student stu[N] ) ;int main( ){int i , j ;struct student stu[N] ;input( stu ) ;average( stu ) ;printf( "No\tName\tScore1\tScore2\tAverage\n" ) ;for( i = 0 ; i < N ; i++ ){printf( "%s\t%s\t" , stu[i].num , stu[i].name ) ;for( j = 0 ; j < 2 ; j++ )printf( "%d\t" , stu[i].score[j] ) ;printf( "%8.2f\n" , stu[i].ave ) ;}i = max( stu ) ;printf( "\nThe max is:\n" ) ;printf( "No\tName\tScore1\tScore2\tAverage\n" ) ;printf( "%s\t%s\t" , stu[i].num , stu[i].name ) ;for( j = 0 ; j < 2 ; j++ )printf( "%d\t" , stu[i].score[j] ) ;printf( "%5.2f\n" , stu[i].ave ) ;return 0;}void input( struct student stu[N]){int i , j ;for(i=0;i<N;i++){printf("\nPlease input No%d student:\n",i+1);printf("No:");scanf("%s",stu[i].num);printf("Name:");scanf("%s",stu[i].name);for(j=0;j<2;j++){printf("score %d:",j+1);scanf("%d",&stu[i].score[j]);}}}void average( struct student stu[N]){int i , j , sum ;for(i=0;i<N;i++){for(j=0 , stu[i].ave = 0 ;j<2;j++)stu[i].ave += stu[i].score[j];stu[i].ave = stu[i].ave / 2 ;}}int max( struct student stu[N]){int i , max , index;max = stu[0].ave ;index = 0 ;for( i = 1 ; i < N ; i++ ){if( max < stu[i].ave ){max = stu[i].ave ;index = i ;}}return index;}2.【参考代码】#include<stdio.h>#include<stdlib.h>struct node{short int data ;struct node *next ;} ;typedef struct node NODE ;struct node *CreatLink( ) ;void PrintLink( NODE *head ) ;int max( NODE *head );int main( ){NODE *head ;int max_value ;head = CreatLink( ) ;PrintLink( head ) ;max_value = max( head ) ;printf( "The max is:%d\n" , max_value ) ;return 0 ;}struct node *CreatLink( ){NODE *head , *p , *q ;short int num ;head = ( NODE * )malloc( sizeof( NODE ) ) ;head->next = NULL ;p = head ;printf( "Please input( end of -1)!:\n" ) ;scanf( "%d" , &num ) ;while( num != -1 ){q = ( NODE *)malloc( sizeof( NODE ) ) ;q->data = num ;p->next = q ;p = q ;scanf( "%d" , &num ) ;}p->next = NULL ;return head ;}void PrintLink( NODE *head ){NODE *p;p = head->next ;printf( "The data is:\n" ) ;while( p != NULL ){printf( "%4d" , p->data ) ;p = p->next ;}printf( "\n" ) ;}int max( NODE *head ){NODE *p;short int max = -32768;p = head->next ;while( p != NULL ){if( max < p->data )max = p->data ;p = p->next ;}return max ;}第11章位运算1. 0000 11112 . x | ff003. 4 3三、程序阅读题1. 02. 11 223. 0四、编程题1.【参考代码】#include<stdio.h>int main(){short int data , low ,high ;printf( "Please input( short int):" ) ;scanf( "%d" , &data ) ;low = data & 0x00ff ; /* 0x00ff表示低字节全1 */high = data & 0xff00 ; /* 0xff00表示高字节全1 */printf( "data:0x%x,the value of low byte is:0x%x\n" , data , high ) ;printf( "data:0x%x,the value of high byte is:0x%x\n" , data , low ) ;return 0 ;}2.【参考代码】#include <stdio.h>int main( ){short int data , result ;printf( "Please intput(short int):" ) ;scanf( "%d" , &data ) ;result = data ^ 0x000f ; /* 0x000f表示低4位全1,高12位全0 */printf( "The data is 0x%x \nThe result is :0x%x\n" , data,result ) ;return 0 ;}第12章文件操作二、填空题1. 二进制 ASCII(文本)2 . FILE *fp # include <stdio.h>3. n – 1 buf的首地址4. 15. 用以获得文件读写位置标记指针的位置,函数返回值为当前文件读写位置标记指针相对于文件开头的字节数6. 使文件读写位置标记指针重新返回文件的开头三、程序阅读题1. 1 22. end3. 34. hello,四、程序完善题1. ! feof (fp) fgetc (fp)2. fopen (“num.dat”,”r”) fp,”%d”,&temp z++3. ( ch=getchar() ) ch , fp五、编程题1.【参考代码】#include<stdio.h>#include<stdlib.h>#include<string.h>int main( ){FILE *fp ;char str[100] , filename[10] ;int i = 0 ;if( ( fp = fopen( "upper.txt" , "w+" ) ) == NULL ){printf( "Cannot open file!\n" ) ;exit( 0 ) ;}printf( "Please input(string):\n" ) ;gets( str ) ;while( str[i] != '!' ){if( str[i] >= 'a' && str[i] <= 'z' )str[i] = str[i] - 32 ;fputc( str[i] , fp ) ;i++ ;}rewind( fp ) ;fgets( str , strlen( str ) + 1 , fp ) ;printf( "\nThe result is :\n" ) ;printf( "%s\n" , str ) ;fclose( fp ) ;return 0 ;}2.【参考代码】#include<stdio.h>#include<stdlib.h>#define N 5struct student{char num[10] ;char name[8] ;int score[3] ;float ave ;} stu[N] ;int main( ){int i , j , sum ;FILE *fp ;for( i = 0 ; i < N ; i++ ){printf( "\nPlease input student information: \n" , i + 1 ) ;printf( "No:" ) ;scanf( "%s" , stu[i].num ) ;printf( "Name:" ) ;scanf( "%s" , stu[i].name ) ;sum = 0 ;for( j = 0 ; j < 3 ; j++ ){printf( "Score%d:" , j + 1 ) ;scanf( "%d" , &stu[i].score[j] ) ;sum += stu[i].score[j] ;}stu[i].ave = sum / 3.0 ;}if( ( fp = fopen( "stud.dat" , "w" ) ) == NULL ){printf( "cannot open stud for write!\n" ) ;exit( 0 ) ;}for( i = 0 ; i < N ; i++ ){fwrite( &stu[i] , sizeof( struct student ) , 1 , fp ) ;}fclose( fp ) ;if( ( fp = fopen( "stud.dat" , "r" ) ) == NULL ){printf( "cannot open stud for read!\n" ) ;exit( 0 ) ;}printf( "\nNo\tName\tScore1\tScore2\tAverage\n" ) ;for( i = 0 ; i < N ; i++ ){fread( &stu[i] , sizeof( struct student ) , 1 , fp ) ;printf( "\n%s\t%s\t%d\t%d\t%5.2f\n" , stu[i].num , stu[i].name , stu[i].score[0] , stu[i].score[1] , stu[i].score[2] ,stu[i].ave ) ;}fclose( fp ) ;return 0 ;}3.【参考代码】#include<stdio.h>#include<stdlib.h>#define N 5struct student{char num[10] ;char name[8] ;int score[3] ;float ave ;} stu[N] ;int main( ){int i , j , min , index ;FILE *fp ;struct student temp ;/*从stud.dat文件中读入数据,存放在stu数组中*/if( ( fp = fopen( "stud.dat" , "r" ) ) == NULL ){printf( "cannot open stud for read!\n" ) ;exit( 0 ) ;}printf( "\nThe data is :" ) ;printf( "\nNo\tName\tScore1\tScore2\tAverage\n" ) ;for( i = 0 ; i < N ; i++ ){fread( &stu[i] , sizeof(struct student ) , 1 , fp ) ;printf( "\n%s\t%s\t%d\t%d\t%5.2f\n" , stu[i].num , stu[i].name , stu[i].score[0] , stu[i].score[1] , stu[i].score[2] ,stu[i].ave ) ;}fclose( fp ) ;/*对stu数组中数组元素按其平均值数据域排序*/for( i = 0 ; i < N -1 ; i++ ){min = stu[i].ave ;index = i ;for( j = i + 1 ; j < N ; j++ ){if( min > stu[j].ave )index = j ;}if( index != i ){temp = stu[i] ;stu[i] = stu[index] ;stu[index] = temp ;}}/*将排序之后的stu数组存放在stu_sort文件中*/if( ( fp = fopen( "stu_sort.dat" , "w" ) ) == NULL ){printf( "cannot open stud for write!\n" ) ;exit( 0 ) ;}for( i = 0 ; i < N ; i++ ){fwrite( &stu[i] , sizeof(struct student) , 1 , fp ) ;}fclose( fp ) ;/*将stu_sort文件中的数据,读出存放在stu数组中*/. .页脚if( ( fp = fopen( "stu_sort.dat" , "r" ) ) == NULL ){printf( "cannot open stud for read!\n" ) ;exit( 0 ) ;}printf( "\nThe result is:" ) ;/*将stu数组中的数据输出*/printf( "\nNo\tName\tScore1\tScore2\tAverage\n" ) ;for( i = 0 ; i < N ; i++ ){fread( &stu[i] , sizeof(struct student) , 1 , fp ) ;printf( "\n%s\t%s\t%d\t%d\t%5.2f\n" , stu[i].num , stu[i].name ,stu[i].score[0] , stu[i].score[1] ,stu[i].score[2] , stu[i].ave ) ;}fclose( fp ) ;return 0 ;}。
谭浩强c语言程序设计第二版答案谭浩强教授的《C语言程序设计》第二版是一本广受好评的C语言教材,它不仅详细介绍了C语言的基础知识,还通过大量的实例和习题来帮助读者加深理解。
以下是对该书中一些习题的答案解析,但请注意,这些答案仅供参考,实际编程时还需要根据具体问题进行调整。
第一章:C语言概述1. 问题1:为什么C语言既具有高级语言的特点,又具有低级语言的特点?- 答案:C语言具有高级语言的特点,因为它提供了丰富的数据类型、结构化编程和抽象能力。
同时,它又具有低级语言的特点,因为它允许直接访问内存地址,进行位操作,并且具有高效的运行速度。
第二章:数据类型、运算符与表达式1. 问题1:如何理解C语言中的变量?- 答案:变量是程序中存储数据的容器,它们具有特定的数据类型,用来存储整型、浮点型、字符型等数据。
变量在使用前需要声明,声明时需要指定变量的类型和名称。
2. 问题2:C语言中的运算符有哪些?- 答案:C语言中的运算符包括算术运算符(如+、-、*、/、%)、关系运算符(如<、>、==、!=)、逻辑运算符(如&&、||、!)、位运算符(如&、|、^、~、<<、>>)等。
第三章:控制结构1. 问题1:请解释if-else语句的工作原理。
- 答案:if-else语句是一种条件控制结构,它根据条件表达式的真假来决定执行哪一段代码。
如果条件表达式为真,则执行if语句块中的代码;如果为假,则执行else语句块中的代码。
2. 问题2:while循环和do-while循环有什么区别?- 答案:while循环先判断条件再执行循环体,如果条件为假,则不执行循环体。
do-while循环则先执行一次循环体,然后再判断条件,即使条件为假,循环体也会至少执行一次。
第四章:函数1. 问题1:函数的作用是什么?- 答案:函数是一段具有特定功能的代码块,可以被重复调用。
函数的使用可以提高代码的复用性,降低程序的复杂度,并且使程序结构更加清晰。
C语言程序设计课后习题1—8参考答案习题1参考答案一、简答题1、冯诺依曼计算机模型有哪几个基本组成部分?各部分的主要功能是什么?答:冯诺依曼计算机模型是由运算器、控制器、存储器、输入设备、输出设备五大功能部件组成的。
运算器又称算术逻辑部件,简称ALU,是计算机用来进行数据运算的部件。
数据运算包括算术运算和逻辑运算。
控制器是计算机的指挥系统,计算机就是在控制器的控制下有条不紊地协调工作的.存储器是计算机中具有记忆能力的部件,用来存放程序和数据.输入设备是用来输入程序和数据的部件。
输出设备正好与输入设备相反,是用来输出结果的部件。
2、简述计算机的工作原理。
答:计算机的工作原理可简单地概括为:各种各样的信息,通过输入设备,进入计算机的存储器,然后送到运算器,运算完毕把结果送到存储器存储,最后通过输出设备显示出来。
整个过程由控制器进行控制。
3、计算机软件系统分为哪几类?答:软件内容丰富,种类繁多,通常根据软件用途将其分为两大类:系统软件和应用软件。
系统软件是指管理、监控、维护计算机正常工作和供用户操作使用计算机的软件。
这类软件一般与具体应用无关,是在系统一级上提供的服务。
系统软件主要包括以下两类:一类是面向计算机本身的软件,如操作系统、诊断程序等。
另一类是面向用户的软件,如各种语言处理程序(像BC、VC等)、实用程序、字处理程序等。
在操作系统的基础上运行。
4、什么叫软件?说明软件与硬件之间的相互关系。
答:软件是指计算机程序及有关程序的技术文档资料。
两者中更为重要的是程序,它是计算机进行数据处理的指令集,也是计算机正常工作最重要的因素。
在不太严格的情况下,认为程序就是软件。
硬件与软件是相互依存的,软件依赖于硬件的物质条件,而硬件则需在软件支配下才能有效地工作.在现代,软件技术变得越来越重要,有了软件,用户面对的将不再是物理计算机,而是一台抽象的逻辑计算机,人们可以不必了解计算机本身,可以采用更加方便、更加有效地手段使用计算机。
编译原理8参考答案编译原理8参考答案编译原理是计算机科学中的一门重要课程,它研究的是将高级语言转化为机器语言的过程。
在编译原理的学习过程中,学生们经常会遇到各种难题,而参考答案则是帮助他们解决这些问题的有力工具。
下面是一些编译原理8的参考答案,希望能对学习者有所帮助。
1. 什么是编译器?编译器是一种将高级语言转化为机器语言的程序。
它负责将源代码进行词法分析、语法分析、语义分析等一系列处理,最终生成可执行的目标代码。
2. 请简述编译器的工作原理。
编译器的工作原理主要包括以下几个步骤:- 词法分析:将源代码分解为一个个的词法单元。
- 语法分析:根据语法规则将词法单元组织成语法树。
- 语义分析:对语法树进行类型检查、语义检查等操作。
- 中间代码生成:将语法树转化为中间代码,比如三地址码、四元式等。
- 代码优化:对中间代码进行优化,提高程序的执行效率。
- 目标代码生成:将优化后的中间代码转化为目标机器代码。
- 目标代码优化:对目标机器代码进行优化,进一步提高执行效率。
3. 什么是词法分析?词法分析是编译器的第一步,它将源代码分解为一个个的词法单元。
词法单元包括关键字、标识符、运算符、常量等。
词法分析器通常使用正则表达式、有限自动机等方法进行实现。
4. 什么是语法分析?语法分析是编译器的第二步,它根据语法规则将词法单元组织成语法树。
语法分析器通常使用上下文无关文法和语法分析算法(如LL(1)、LR(1)等)进行实现。
5. 什么是语义分析?语义分析是编译器的第三步,它对语法树进行类型检查、语义检查等操作。
语义分析器通常使用符号表、类型检查规则等进行实现。
6. 什么是中间代码生成?中间代码生成是编译器的第四步,它将语法树转化为中间代码。
中间代码是一种介于源代码和目标代码之间的抽象表示形式,可以是三地址码、四元式、虚拟机指令等。
7. 什么是代码优化?代码优化是编译器的第五步,它对中间代码进行优化,提高程序的执行效率。
第1章C语言概述一、简答题1.(1)语言简洁、紧凑,使用方便、灵活;(2)运算符丰富;(3)具有丰富的数据类型;(4)具有结构化的控制语句;(5)语法限制不太严格,程序设计自由度大;(6)C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接访问硬件;(7)生成目标代码质量高,程序执行效率高;(8)用C语言写的程序可移植性好,基本上不作修改就能用于各种型号的计算机和各种操作系统。
2.顺序结构,分支结构,循环结构3.所谓算法就是为解决一个问题而采取的方法和步骤。
算法的特性:有穷性、确定性、输入、输出、可行性。
表示算法的方式:(1)用自然语言表示;(2)用流程图表示;(3)用N—S流程图表示;(4)用伪代码表示;(5)用计算机语言表示。
二、算法1.瓶子A里盛有醋瓶子B里盛有酱油那一个空瓶C将A中的醋倒入C将B中的酱油倒入A将C中的醋倒入B2.输入一个数放在a中max = a以下步骤重复9次:输入一个数放在a中如果a>max,max=b打印max的值3.如果a<btemp=aa=bb=temp如果c>atemp1=atemp2=ba=cb=temp1c=temp2否则如果c>btemp=bb=cc=temp打印a,b,c的值4.i=1sum=0sum=sum+ii=i+1打印sum 的值5.如果(n 除以3的余数为0 并且 n 除以5的余数为0)n 能够同时被3和5整除否则n 不能够同时被3和5整除6.i=101以下语句循环50遍:j=2flag=1当j<(i 除以2的整数部分)时循环以下语句:如果i 除以j 的余数为零flag=0退出该循环如果flag=1打印i 的值i=i+17.如果m<ntemp=mm=nn=tempi=nj=1做以下循环,直到m 能够被i/j 整除:如果i 能够被j 整除并且m 能够被i/j 整除i/j 即是m 和n 的最大公约数跳出循环否则j=j+1打印i/j 的值8.data=b*b —4*a*c如果data >0否则如果data=0x1=x2=—b/2否则无实数解三、编程题1.main (){adata b x 2)(1+-=a data b x 2)(2--=printf(“ How do you do? \n”);printf(“##############################\n”);}2.main(){int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“sum=%d”,a+b+c);}第二章数据类型与表达式一、单项选择题1. B2. C3. A4. A5. D6. B7.B8.A9.C 10. D二、写出下列程序的运行结果1.aabb cc abcAN2.ab97983. 9,11,9,104.a=2,b=3,c=25.s1=2.500000s2=3三、编程题main(){char c1='c',c2='h',c3='i',c4='n',c5='a';c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;printf("%c%c%c%c%c\n",c1,c2,c3,c4,c5);}第三章顺序程序设计选择题1)B 2)D 3)D 4)A 5)B 6)A 7)B 8)A 9)D 10)D 11)C 12)D 13)A填空题1)b 2)261 3)25 21 37 4)abc 5)5.0,4,c=3 6)3编程题#define pi 3.1415926main( ){float h, r, l, sv, sz ;printf(“请输入圆的半径r,圆柱高h:\n”) ;scanf(“%f,%f”,&r, &h) ;l=2*pi*r ;s=pi*r*r ;sv=3.0/4.0*pi*r*r*r ;sz=pi*r*r*h ;printf(“圆周长为:l=%6.2f, 圆面积为:s=%6.2f\n”, l, s) ;printf(“求体积为:sv=%6.2f, 圆柱体积为:sz=%6.2f\n”, sv, sz) ;}2、main( ){float c, f ;printf(“请输入一个华氏温度:\n”) ;scanf(“%f”, &f) ;c=(5.0/9.0)*(f-32) ;printf(“摄氏温度为:%6.2f\n”, c) ;}第四章循环程序设计一、选择题1.D2.D3.D4.C5.D6.A7.B8.B9.A 10.D.11.B 12.A 13.B 14.C 15.C 16.C 17.D 18.B19.D 20.D 21.A二、填空题1.5858582.03.204.89215.20,07.1,3,28.Year%400==0year%100!=0count++三、编程题1.main(){long a;scanf(“%ld”,&a);if (a>=10000&&a<=99999)printf(“这是个五位数”);else if (a>=1000&&a<=9999) printf(“这是个四位数”);else if (a>=100&&a<=999) printf(“这是个三位数”);else if (a>=10&&a<=99) printf(“这是个二位数”);else if (a>=0&&a<=9)printf(“这是个一位数”);elseprintf(“输入错误”);}2.main(){int a;int g,s,b;//个位、十位、百位printf("水仙花数有:\n");for(a=100;i<=999;a++){g=a%10;s=a/10%10;b=a/100;if (a==g*g*g+s*s*s+b*b*b) printf("%d ",a);}printf("\n");}4、main(){int i,n;printf("input n:");scanf("%d",&n);for(i=2;i<=n;i++){while(i!=n)if(n%i==0){printf("%d*",i);n/=i;}else break;}printf("%d\n",n);}5、#include “stdio.h”main(){char c;int w,x,y,z;w=x=y=z=0;while((c=getchar())!=’\n’){if((c>’a’&&c<’z’)||(c>’A’&&c<’Z’)) w++;else if (c==’’)x++;else if (c>’0’&&c<’9’)y++;else z++}printf(“英文字母个数:%d\n”,w);printf(“空格个数:%d\n”,x);printf(“数字个数:%d\n”,y);printf(“其他字母个数:%d\n”,z);}6、main(){float h=100,t;int j;for(j=1;j<10;j++){t=h/2;h+=(t*2);}printf(“共经过:%f 米\n”,h);printf(“第十次反弹 %f 米\n”,t);}第五章数组一、单项选择题1. B2. A3. C4. C5. D6. B7.C8.B9.C 10. B二、写出下列程序的运行结果1.S=3682.*************************3.S1=18S2=104.!margorP5.数字0的出现次数是:3数字1的出现次数是:2数字2的出现次数是:2数字3的出现次数是:2数字4的出现次数是:0数字5的出现次数是:1数字6的出现次数是:1数字7的出现次数是:1数字8的出现次数是:1数字9的出现次数是:1三、编程题1.#include "stdio.h"main(){int a[11];int i,j,t;printf("input 10 number:\n");for (i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");for (i=1;i<=9;i++)for (j=1;j<=10-i;j++)if (a[j]<a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf("the sorted number is:\n");for (i=1;i<11;i++)printf("%4d",a[i]);2.#include "stdio.h"main(){int a[11],i,b;printf("imput 10 sorted number:\n");for (i=0;i<10;i++)scanf("%d",&a[i]);printf("input an integer:\n");scanf("%d",&b);for (i=9;i>=0&&a[i]>b;i--)a[i+1]=a[i];a[i+1]=b;printf("sorted numbers:\n");for (i=0;i<11;i++)printf("%5d",a[i]);}3.#include "stdio.h"main(){int a[5],i,j,t;printf("input 5 integer:\n");for (i=0;i<5;i++) /*输入5个整数*/scanf("%d",&a[i]);for (i=0,j=4;i<j;i++,j--) /*逆序存放*/{t=a[i];a[i]=a[j];a[j]=t;}for (i=0;i<5;i++) /*逆序存放后重新输出*/printf("%5d",a[i]);}4.#include "stdio.h"main(){int i,j,a[10][10]={{1},{1,1}};for (i=2;i<10;i++) /*给二维数组每个元素赋值*/ {a[i][0]=1;for (j=1;j<=i;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];}for (i=0;i<10;i++) /*输出二维数组*/{for (j=0;j<=i;j++)printf("%-5d",a[i][j]);printf("\n");}}5.#include "stdio.h"main(){int a[3][4],i,j,max,row,col;printf("input 3*4 matrix:\n");for (i=0;i<3;i++) /*输入3*4矩阵*/for (j=0;j<4;j++)scanf("%d",&a[i][j]);max=a[0][0]; row=0; col=0;for (i=0;i<3;i++) /*寻找矩阵中的最大值及其行列号*/ for (j=0;j<4;j++)if (max<a[i][j]){max=a[i][j]; row=i, col=j;}printf("\n数组中最大的数是%d,其行号是%d,列号是%d\n",max,row,col);}6.#define N 3#define M 4#include "stdio.h"main(){int a[N][M],i,j,k,max,row,col;printf("input %d*%d matrix: \n",N,M);for (i=0;i<N;i++) /*输入二维矩阵*/for (j=0;j<M;j++)scanf("%d",&a[i][j]);for (i=0;i<N;i++) /*求鞍点*/{max=a[i][0]; row=i; col=0;for(j=1;j<M;j++) /*求矩阵中每一行的最大值及其所行列号*/ if (max<a[i][j]){max=a[i][j]; col=j;}for (k=0;k<N;k++) /*判断每一行的最大值在其所在列是否最大*/ if (a[k][col]<max)break;if (k==N) /*得到鞍点*/{printf("the point is %d,row=%d,col=%d\n",max,row,col);break;}}if (i==N) /*没有鞍点*/printf("no point\n");}7.#include "stdio.h"main()/*word=0表示未出现单词,如出现单词就置word为1.num用来统计单词个数*/char c;printf("please input a string :\n");while ((c=getchar())!='\n')if (c==' ')word=0;else if (word==0){word=1; num++;}printf("There are %d words in the line\n",num);}8.#include "stdio.h"main(){int i,j,uppn,lown,dign,span,othn;/*uppn,lown,dign,span,othn分别存放英文大写字母、小写字母、数字、空格和其他字符的个数*/char text[3][80];uppn=lown=dign=span=othn=0;for(i=0;i<3;i++){gets(text[i]);for(j=0;j<80&&text[i][j]!='\0';j++){if(text[i][j]>='A'&&text[i][j]<='Z')uppn++;else if(text[i][j]>='a'&&text[i][j]<='z')lown++;else if(text[i][j]>='0'&&text[i][j]<='9')dign++;else if(text[i][j]==' ')span++;elseothn++;}}for(i=0;i<3;i++)printf("%s\n",text[i]);printf("uppn=%d\n",uppn);printf("lown=%d\n",lown);printf("dign=%d\n",dign);printf("span=%d\n",span);printf("othn=%d\n",othn);}9.#include "stdio.h"main()char str1[20],str2[20];printf("input two strings:\n");gets(str1);gets(str2);j=strlen(str1); /*求字符串1的长度*/for (i=0;str2[i]!='\0';i++,j++) /*字符串合并*/str1[j]=str2[i];str1[j]='\0'; /*加上字符串结束标志*/puts(str1);}10.#include "stdio.h"main(){int i,n;char str1[20],str2[20];printf("input two strings:(no more than 20 characters)\n");gets(str1); gets(str2);n=strlen(str1)<strlen(str2)?strlen(str1):strlen(str2); /*n中存放较短字符串的长度*/for (i=0;i<n&&str1[i]==str2[i];i++);printf("%d\n",str1[i]-str2[i]);}第六章函数与编译预处理一、单项选择题1. C2. B3. B4. B5. A6. B7.A8.C9.D 10. A二、写出下列程序的运行结果1.92.4,B8,B3.-4.0000004.a=6,b=55.48三、编程题1.main(){int n;printf("input n(n>0):\n");scanf("%d",&n);if (prime(n))printf("%d is a sushu\n",n);else printf("%d is not a sushu\n",n);}int prime(int n){int flag=1,i;for (i=2;i<=n/2&&flag==1;i++) if (n%i==0) flag=0;return(flag);}2.#define N 3convert(int array[3][3]){ int i,j,t;for (i=0;i<N-1;i++)for (j=i+1;j<N;j++){t=array[i][j];array[i][j]=array[j][i]; array[j][i]=t;}}main(){int i,j;int a[N][N];printf("input a:\n");for (i=0;i<N;i++)for (j=0;j<N;j++)scanf("%d",&a[i][j]);printf("Array a:\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%5d",a[i][j]);printf("\n");}convert(a);printf("a de zhuanzhi is:\n"); for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%5d",a[i][j]);printf("\n");}}3. #include <stdio.h>#include <string.h>main(){char str[100];printf("input a string:\n") ;gets(str);inverse(str);printf("the reversed string is:%s\n",str);}inverse(char str[]){char t;int i,j;for (i=0,j=strlen(str)-1;i<j;i++,j--){t=str[i];str[i]=str[j];str[j]=t;}}4. #include <stdio.h>concat(char str1[],char str2[]){ int i=0,j;while (str1[i]!='\0')i++;for (j=0;str2[j]!='\0';i++,j++)str1[i]=str2[j];str1[i]='\0';}main(){char str1[100],str2[100];gets(str1);gets(str2);concat(str1,str2);puts(str1);}5. main(){char str[80];printf("input a string (4 ge shu zi zi fu):\n"); scanf("%s",str);insert(str);printf("result is:\n%s\n",str);}insert(char str[]){int i;for (i=strlen(str);i>0;i--){str[2*i]=str[i];str[2*i-1]=' ';}}6. #include "stdio.h"int i,ndight,nwhite,nletter,nother;count(char str[]){ndight=nwhite=nletter=nother=0;for (i=0;str[i]!='\0';i++)if (str[i]>='0'&&str[i]<='9')ndight++;else if ((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')) nletter++;else if (str[i]==' ')nwhite++;else nother++;}main(){char text[80];printf("input a string:\n");gets(text);count(text);printf("ndight=%d,nletter=%d,nwhite=%d,nother=%d\n",ndight,nletter,nwhite,nothe r);}7. #define N 10#include <stdio.h>sort(char str[]){int i,j;char t;for (i=1;i<N;i++)for (j=0;j<N-i;j++)if (str[j]>str[j+1]){t=str[j];str[j]=str[j+1] ;str[j+1]=t;}}main(){char str[N];int i ;printf("Input 10 ge zi fu:\n");gets(str);sort(str);printf("The sorted result:\n") ;for(i=0;i<N;i++)printf("%c",str[i]);}8. #include <stdio.h>#include <string.h>#define N 10void input_e(int num[],char name[N][8]){int i;for (i=0;i<N;i++){ printf("input gong hao:");scanf("%d",&num[i]);printf("input name:");getchar();gets(name[i]);}for (i=0;i<N;i++)printf("%5d%10s\n",num[i],name[i]);}void sort(int num[],char name[N][8]) /*选择法排序*/{int i,j,min,temp1;char temp2[8];for (i=0;i<N-1;i++){min=i;for (j=i+1;j<N;j++)if (num[j]<num[min]) min=j;temp1=num[i];strcpy(temp2,name[i]);num[i]=num[min];strcpy(name[i],name[min]);num[min]=temp1;strcpy(name[min],temp2);}printf("the sorted result:\n");for (i=0;i<N;i++)printf("%5d%10s\n",num[i],name[i]);}void search(int n,int num[],char name[N][8]) /*折半查找法*/ {int top,bott,mid,find;find=0;top=0;bott=N-1;if ((n<num[0])||(n>num[N-1]))find=-1;while ((find==0)&&(top<=bott)){mid=(bott+top)/2;if (n==num[mid]){find=1; printf("%d name is:%s\n",n,name[mid]);}else if (n<num[mid])bott=mid-1;else top=mid+1;}if ((find==-1)||(find==0))printf("%d is not found.\n",n);}main(){int num[N],number,c,flag;char name[N][8];input_e(num,name);sort(num,name);for (flag=1;flag;){printf("please input chazhao de gonghao:"); /*输入查找的工号*/ scanf("%d",&number);search(number,num,name);printf("continue Y/N?"); /*是否继续查找*/getchar();c=getchar();if (c=='N'||c=='n')flag=0;}}9. #include "stdio.h"#define MAX 10main(){char str[MAX];char c;int i;i=0;printf("input number(16 jinzhi): "); /*输入一个十六进制的数*/while((c=getchar())!='\n'&&i<MAX){ str[i]=c;i++;}str[i]='\0';printf("result is :%d\n",htod(str));int htod(char s[]){int i,n;n=0;for(i=0;s[i]!='\0';i++){if (s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';if (s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;if (s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;}return(n);}10. #define SWAP(a,b) t=a;a=b;b=tmain(){int a,b,t;printf("input a,b:") ;scanf("%d,%d",&a,&b);SWAP(a,b);printf("result:a=%d,b=%d\n",a,b);}11. #define SURPLUS(a,b) ((a)%(b)) main(){int a,b;printf("input a,b:");scanf("%d,%d",&a,&b);printf("result is: %d\n",SURPLUS(a,b)); }12. main(){int a,b,c;printf("input a,b,c:");scanf("%d,%d,%d",&a,&b,&c);printf("max=%d\n",max(a,b,c));}int max(int x,int y,int z){int t;t=(x>y ? x : y);return(t>z?t:z);}#define MAX(x,y) ((x)>(y)?(x):(y))main(){int a,b,c;printf("input a,b,c:");scanf("%d,%d,%d",&a,&b,&c);printf("max=%d\n",MAX(MAX(a,b),c));}13. #include "stdio.h"#define CHANGE 1#define MAX 80main(){char str[MAX];int i;printf("input a string:\n");gets(str);#if (CHANGE){ for (i=0;str[i]!='\0';i++)if (str[i]>='a'&&str[i]<'z'||str[i]>='A'&&str[i]<'Z')str[i]=str[i]+1;else if (str[i]=='z'||str[i]=='Z')str[i]=str[i]-25;}#endifprintf("%s\n",str);}第七章指针一、选择题1)A 2)D 3)D 4)C 5)B 6)B 7)B 8)C 9)B 10)C 11)A 12)A 13)A 14)C 15)B 16)A 17)C 18)B 19)D 20)B二、阅读下面程序,写出程序运行结果1)abcdeedcba 2)1113151719 3) 11,97,114)3 6 5)6385三、编程题1、main( ){ int a[10],i,temp,*p=a;printf("Please input array a:\n"); for(i=0;i<10;i++)scanf("%d",&a[i]);printf("array a:\n");for(i=0;i<10;i++)printf("%4d",a[i]);for(i=0;i<5;i++){ temp=p[i];p[i]=p[10-i-1];p[10-i-1]=temp;}printf("\n Now array a:\n");for(i=0;i<10;i++)printf("%4d",a[i]);}2、main( ){ int a[3][3],*p,i,j;printf("please input matrix:\n"); for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);p=&a[0][0];move(p);printf("\n Now matrix:\n");for(i=0;i<3;i++){ for(j=0;j<3;j++)printf("%4d",a[i][j]);printf("\n");}}move(int *q){ int i,j,t;for(i=0;i<3;i++)for(j=i;j<3;j++){ t=*(q+3*i+j);*(q+3*i+j)=*(q+3*j+i);*(q+3*j+i)=t;}}3、#include <stdlib.h>#include <alloc.h>#include <string.h>#include <stdio.h>main( ){int binary();void insert();char *temp,*ptr1[6]={"BASIC","DATA","PASCAL","SQL","USE"}; int i;ptr1[5]=malloc(20);printf("\n");printf("original string:\n");for(i=0;i<5;i++)printf("%s\n",ptr1[i]);printf("input search string:\n");temp=malloc(20);gets(temp);i=binary(ptr1,temp,5);printf("i=%d\n",i);insert(ptr1,temp,5,i);printf("output strings:\n");for(i=0;i<6;i++)printf("%s\n",ptr1[i]);}int binary(char *ptr[],char *str,int n){int hig,low,mid;low=0;hig=n-1;if(strcmp(str,ptr[0])<0) return(0);if(strcmp(str,ptr[hig])>0) return(n);while(low<=hig){mid=(low+hig)/2;if(strcmp(str,ptr[mid])<0)hig=mid-1;else if(strcmp(str,ptr[mid])>0)low=mid+1;else return(mid);}return(low);}void insert(char *ptr[],char *str,int n,int i){int j;for(j=n;j>i;j--)strcpy(ptr[j],ptr[j-1]);strcpy(ptr[i],str);}4、main( ){ int i;char *p[6],str[6][20];for(i=0;i<6;i++)p[i]=str[i];printf("Input 6 strings:\n");for(i=0;i<6;i++)scanf("%s",p[i]);sort(p);printf("Now the strings:\n");for(i=0;i<6;i++)printf("%s\n",p[i]);}sort(char *q[ ]){ int i,j;char *t;for(i=0;i<5;i++)for(j=0;j<5-i;j++)if(strcmp(*(q+j),*(q+j+1))>0){ t=*(q+j);*(q+j)=*(q+j+1);*(q+j+1)=t;}}5、main( ){ int m;char str1[20],str2[20],*p1,*p2;printf("please input two strings:\n"); scanf("%s",str1);scanf("%s",str2);p1=str1;p2=str2;m=stringcmp(p1,p2);printf("result is %d:\n",m);}stringcmp(char *p1,char *p2){ int i=0;while(*(p1+i)==*(p2+i))if(*(p1+(i++))=='\0') return(0);return((*p1+i)-*(p2+i));}6、main( ){ char str1[30],str2[30],str3[100];int i=0,j=0,k=0;printf("please input two strings:\n");scanf("%s",str1);scanf("%s",str2);while(str1[i]!='\0' && str2[j]!='\0'){ str3[k++]=str1[i++];str3[k++]=str2[j++];}while(str1[i]!='\0')str3[k++]=str1[i++];while(str2[j]!='\0')str3[k++]=str2[j++];str3[k]='\0';printf("\n%s\n",str3);}第八章结构体一、选择题1、C2、B3、C4、D5、B6、A7、D8、C9、C 10、B二、填空题1、342、03、514、10,x5、364041三、编程题1、 struct complex{float x; /*实部*/float y; /*虚部*/}main(){struct complex c1={5,3},c2={2,6};float t1,t2;t1=c1.x*c2.x - c1.y*c2.y;t2=c1.x*2.y + c1.y*c2.x;printf(“The two complexs product is:”); printf(“%.2f%+.2f i\n”,t1,t2);}2. struct student{char name[10]; /**/int number; /*学号*/float x; /*成绩*/float y; /*成绩*/}main( ){struct student s[45];int i;void max();void average();void sort();for (i=0;i<45;i++)scanf(“%s%d%f%d”,s[i].name,&s[i].number,&s[i].x,&s[i].y); /*输入学生的、学号、两门课程成绩*/max(s,45);average(s,45);sort(s,45);}void max(struct student *a,int n){float temp;char na[10];int i ,num;temp=a[0].x+a[0].y;for (i=1;i<n;i++)if(temp<a[i].x+a[i].y) /*求总分最高的学生、学号*/{temp=a[i].x+a[i].y;strcmp(na,a[i].name);num=a[i].number;}printf(“%s,%d”,na,num);}void average(struct student *b,int n){float aver1,aver2,s1,s2;int i ;s1=s2=0;for(i=0;i<45;i++) /*求每门课程的总成绩*/{s1+=b[i].x;s2+=b[i].y;}aver1=s1/45;aver2=s2/45;for(i=0;i<45;i++)if(b[i].x<aver1&&b[i].y<aver2)/*输出两门课程都低于平均成绩的学生*/printf(“%s,%d\n”,b[i].name,b[i].number);}void sort(struct student *c,int n){float t;int i,j ;struct student temp;for (i=0;i<n-1;i++) /*改进的选择法排序可参考课本P89页*/ {k=i ;for(j=i+1;j<n;j++)if(c[k].x<c[j].x)k=j;if(k!=i){temp=c[i];c[i]=c[k];c[k]=temp;}for(i=0;i<n;i++)printf(“%s,%.2f\n”,c[i].n,c[i].x);}3. typedef struct Ljian{int pname;int wnum;struct Ljian *next;}Part;/*用户自定义零件结构体类型*/# include “stdio.h”main( ){int n=1;Part *head,*p1,*p2;head=NULL;p1=( Part * ) malloc (sizeof(struct Ljian));/*创建第一个结点*/scanf(“%d%d”,&p1->pname,&p1->wnum);p1->next=NULL;while(n<=10) /*将结点加入链表*/{if(n==1)head=p1; /*是第一个结点,作表头*/elsep2->next=p1; /*不是第一个结点,作表尾*/p2=p1;p1=( Part *) malloc(sizeof(struct Ljian));/*开辟下一个结点*/scanf(“%d%d”,&p1->pname,&p1->wnum);p1->next=NULL;n++;}}4.#include<stdlib.h>#include<stdio.h>#include<conio.h>#define LEN sizeof(struct student)typedef struct student{ long num; /*学号*/float score; /*成绩*/struct student *next;} STU; /*用户自定义学生结构体类型*/STU *Create ( ) /*创建链表* /{int n=0;STU *p1,*p2,*head;head=NULL;p1=(STU *)malloc(LEN); /*创建第一个结点*/scanf("%ld,%f",&p1->num,&p1->score);p1->next=NULL;while(p1->num!=0) /*将结点加入链表*/{++n;if(n==1) /*是第一个结点,作表头*/head=p1;else /*不是第一个结点,作表尾*/p2->next=p1;p2=p1;p1=(STU *)malloc(LEN); /*开辟下一个结点*/scanf("%ld,%f",&p1->num,&p1->score);p1->next=NULL;}free(p1); /*释放最后一个结点所占的存*/ return (head); /*返回链表的头指针*/}void print(STU *head) /*输出链表* /{STU *p;p=head;do{printf("%ld\t%5.1f\n",p->num,p->score);p=p->next;}while(p!=NULL);}STU *merge(STU *p1,STU *p2) /*合并链表* /{STU *p,*head , *s1,*s2;s1=p1;s2=p2;while(s1->next!=NULL)s1=s1->next;/*将指针s1指向链表1的最后一个节点*/while(s2->next!=NULL)s2=s2->next;/*将指针s2指向链表2的最后一个节点*/if(s1->num<p2->num){s1->next=p2;head=p1;}/*因为两个链表都是按学号升序排列,如果链表1的最后一个节点中的学号小于链表2的第一个节点中的学号,则直接将链表2插入到链表1的后面*/else if(s2->num<p1->num){s2->next=p1;head=p2;}/*如果链表2的最后一个节点中的学号小于链表1的第一个节点中的学号,则直接将链表1插入到链表2的后面*/else{ if(p1->num<p2->num) /*确定两个链表的顺序* /{head=p=p1;p1=p1->next;}else{head=p=p2;p2=p2->next;}while(p1!=NULL && p2!=NULL)if(p1->num<p2->num){p->next=p1;p=p1;p1=p1->next;}else{p->next=p2;p=p2;p2=p2->next;}if(p1!=NULL)p->next=p1;/*如果链表2的节点插入完,则将链表1直接插到后面*/elsep->next=p2; /*如果链表1的节点插入完,则将链表2直接插到后面*/}return head;}***注:红字部分仅仅是对程序的改进,删掉也不影响程序的功能和运行****void main(){STU *listA,* listB,*head;printf("Please input first link listA information:\n");listA =Create ( );print(listA);printf("\nPlease input second link listB information:\n");listB =Create ( ) ;print(listB);printf("\nThe merged link is:\n");head=merge(listA, listB);print(head);getch( ); /*为便于观察结果,等待键入任意键*/}。
8.1 编写两个函数,分别求两个证书的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个整数由键盘输入。
void main(){ int Mgy(int x,int y);int Mgb(int z);int a,b,mgy,mgb;printf("请输入两个数:\n");scanf("%d,%d",&a,&b);mgy=Mgy(a,b);mgb=Mgb(a,b,mgy);printf("两个数的最大公约数为%d,最小公倍数为%d\n",mgy,mgb);}int Mgy(int x,int y){ int r,temp;if(x<y){ temp=x;x=y;y=temp;}while(x%y!=0){ r=x%y;x=y;y=r;}return y;}int Mgb(int x,int y,int z){ return (x*y/z);}8.2 求方程ax²+bx+c=0的根,用三个函数分别求当b²-4ac大于零、等于零和小于零时的根,8.3编写一个判素数的函数,在主函数输入一个整数,输出是否是素数的信息。
#include<math.h>void main(){ int Isprime(int a);int m,temp=0;printf("请输入一个数:\n");scanf("%d",&m);temp=Isprime(m);if(temp==0) printf("%d不是素数。
\n",m);else printf("%d是素数。
\n",m);}int Isprime(int a){ int i,k,flag;if(a==0||a==1) flag=0;else{ k=sqrt(a);for(i=2;i<=k;i++)if(a%i==0) flag=0; }return flag; }8.8 写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一格空8.9编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符8.10 写一个函数,输入一行字符,将此字符串中最长的单词输出。
c语言第8章编译预处理及位运算习题答案编译预处理习题一.单项选择题1.在宏定义#defineA3.897678中,宏名A代替一个()。
A)单精度数B)双精度数C)常量D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“<>”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C语句6.#defineA3.897678#includemain(){printf(“A=%f”,A);}程序运行结果为()。
A)3.897678=3.897678B)3.897678=AC)A=3.897678D)无结果7.有宏定义:#defineLI(a,b)a某b#defineLJ(a,b)(a)某(b)在后面的程序中有宏引用:某=LI(3+2,5+8);y=LJ(3+2,5+8);则某、y的值是()。
A)某=65,y=65B)某=21,y=65C)某=65,y=21D)某=21,y=218.有以下程序#definef(某)(某某某)main(){inti1,i2;i1=f(8)/f(4);i2=f(4+4)/f(2+2);printf(\}程序运行后的输出结果是A)64,28B)4,4C)4,3D)64,649.以下程序的输出结果是#defineM(某,y,z)某某y+zmain(){inta=1,b=2,c=3;printf(“%d\\n”,M(a+b,b+c,c+a));}A)19B)17C)15D)1210.有以下程序#defineN5#defineM1N某3#defineM2N某2main(){inti;i=M1+M2;printf(“%d\\n”,i);}程序编译后运行的输出结果是:A)10#defineN2#defineMN+1#defineNUM2某M+1#main(){inti;for(i=1;i<=NUM;i++)printf(“%d\\n”,i);}该程序中的for循环执行的次数是A)5B)6C)7D)812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
作业八:函数程序设计答案(一)选择题(30分)1.以下正确的函数定义形式是A__。
A)double fun(int x,int y)B)double fun(int x;int y)C)double fun(int x,int y);D)double fun(int x,y);2.以下正确的函数形式是D__。
A)double fun(int x,int y){ z=x+y; return z; }B)fun(int x,y){ int z; return z; }C)fun(x,y){ int x,y; double z; z=x+y; return z; }D)double fun(int x,int y){ double z; z=x+y; return z; }(重要)3.以下正确的说法是A__。
在C语言中A)实参和与其对应的形参各占用独立的存储单元B)实参和与其对应的形参共占用一个存储单元C)只有当实参和与其对应的形参同名时才共占用存储单元D)形参是虚拟的,不占用存储单元4.若调用一个函数,且此函数中没有return语句,则正确的说法是D__。
该函数A)没有返回值B)返回若干个系统默认值C)能返回一个用户所希望的函数值D)返回一个不确定的值(重要)5.以下不正确的说法是B__。
C语言规定A)实参可以是常量、变量或表达式B)形参可以是常量、变量或表达式C)实参可以为任意类型D)形参应与其对应的实参类型一致6.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是B__。
A)地址传递B)单向值传递C)由实参传给形参,再由形参传回给实参D)由用户指定传递方式7.以下程序有语法性错误,有关错误原因的正确说法是C__。
main(){int G=5,k;void Prt_char();……k=Prt_char(G);……}A)语句void prt_char();有错,它是函数调用语句,不能用void 说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线8.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是B__。
编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。
A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。
A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。
A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
A) 整型原码B) 整型补码 C)数值原码 D) 数值补码13.在位运算中,若左移时丢弃的高位不包含1,则每左移一位,相当于_____。
A)操作数乘以2 B)操作数除以2 C)操作数除以4 D)操作数乘以414.设 int b=8;表达式(b>>2)/(b>>1)的值是________。
A) 0 B) 2 C) 4 D) 815.若定义unsigned int a=3,b=10;printf("%d\n",a<<2|b==1);则运行结果为________。
A)13 B)12 C)8 D)14二.填空题1.C提供的预处理功能主要有__宏定义____、__文件包含____、___条件编译__等三种。
2.C规定预处理命令必须以____#______开头。
3.在预编译时将宏名替换成____宏定义中的“字符串”___的过程称为宏展开。
4.预处理命令不是C语句,不必在行末加______;_____。
5.以头文件stdio.h为例,文件包含的两种格式为:_ # include〈stdio.h〉_,_#include”stdio.h”_。
6.定义宏的关键字是___define______。
7.设有如下运算符:&、|、~、<<、>>、^,则按优先级由低到高的排列顺序为_~、<<、>>、&、^、|______。
8.设二进制数i为00101101,若通过运算“i^j”,使i的高4位取反低4位不变,则二进制数j的值应为__11110000____。
9.设无符号整型变量a为6,b为3,则表达式b&=a的值为____2____。
10.整型变量x和y的值相等且为非0值,则表达式x^y的结果为____零____。
二、阅读程序题1.以下程序输出结果是150。
# include〈stdio.h〉# define MAX(x,y) (x)>(y)?(x):(y)main(){int i,z,k;z=15;i=z-5;k=10*(MAX(i,z));printf(“%d\n”,k);}2.以下程序输出结果是23 。
# include〈stdio.h〉# define ADD(y) 3.54+y# define PR(a) printf(“%d”,(int)(a))# define PR1(a) PR(a);putchar(‘\n’)main(){int i=4;PR1(ADD(5)*i);}3.设有如下宏定义:#define MYSWAP(z,x,y) {z=x;x=y;y=z;}以下程序段通过宏调用实现变量a、b内容交换,请填空。
float a=5,b=16,c;MYSWAP( c ,a,b);4.下列程序的输出结果是1000 10。
#define N 10#define s(x) x*x#define f(x) (x*x)main(){ int i1,i2;i1=1000/s(N);i2=1000/f(N);printf(“%d %d\n”,i1,i2);} 5.以下程序输出结果是8 20 12 。
main( ){int b=5;#define b 2#define f(x) b*(x)int y=3;printf(“%d”,f(y+1));#undef bprint f(“%d”,f(y+1));#define b 3printf(“%d\n”,f(y+1));}6.下列程序的输出结果是11。
#define NX 2+3#define NY NX*NXmain(){ int i=0,m=0; for(;i<NY;i++)m++; printf(“%d\n”,m);}7.下列程序的输出结果是MIN。
#define MAX(a,b) a>b#define EQU(a,b) a==b#define MIN(a,b) a<bmain(){ int a=5,b=6;if(MAX(a,b)) printf(“MAX\n”);if(EQU(a,b)) printf(“EQU\n”);if(MIN(a,b)) printf(“MIN\n”);}8.下列程序的输出结果是0 1 1。
#define TESTmain( ){ int x=0,y=1,z; z=2*x+y;#ifdef TESTprintf(“%d %d ”,x,y);#endifprintf(“%d\n”,z);}三.编程题1. 定义一个带参的宏,求两个整数的余数。
通过宏调用,输出求得的结果。
#define R(m,n) (m)%(n)#include <stdio.h>void main(){ int m,n;printf("enter two integers:\n");scanf("%d%d",&m,&n);printf("remainder=%d\n",R(m,n));}2. 分别用函数和带参的宏,从3个数中找出最大者。
#include <stdio.h>#define MAX(a,b) ((a)>(b)?(a):(b)) // implementation by MACROint max3(int a,int b,int c) //implementation by function{int m;m=a>b?a:b;m=m>c?m:c;return m;}void main(){ int m,n,k;printf("enter 3 integer:\n");scanf("%d%d%d",&m,&n,&k);printf("1. MACRO max=%d\n",MAX(MAX(m,n),k));printf("2. function max=%d\n",max3(m,n,k));}3. 输入一个整数m,判断它能否被3整除。
要求利用带参的宏实现。
#include <stdio.h>#define DIVIDEDBY3(m) (m)%3==0void main(){ int m;printf("enter a integer:\n");scanf("%d",&m);if(DIVIDEDBY3(m))printf("%d is divided by 3\n",m);elseprintf("%d is not divided by 3\n",m);}。