c语言程序设计何钦铭颜晖第10章函数与程序结构

合集下载

C语言程序设计(第3版)何钦铭-颜-晖-第9章--结构

C语言程序设计(第3版)何钦铭-颜-晖-第9章--结构

第9章结构【练习9-1】定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个局部。

解答:struct complex{float real;float imaginary;};【练习9-2】人的出生日期由年、月、日组成,请在例 9-1 中的通讯录结构中增加一个成员:出生日期,用嵌套定义的方式重新定义该结构类型。

解答:struct date{int year;int month;int day;};struct student{int num;char name[10];struct date birthday;int computer,english,math;double average;};【练习9-3】例 9-1 中,如果要计算的是三门课程的课程平均成绩,应该如何改写程序?解答:#include<stdio.h>struct student{int num;char name[10];int computer,english,math;double average;};int main(void){int i, n;double math_sum,english_sum,computer_sum;struct student s1;printf("Input n:");scanf("%d", &n);printf("Input the student's number, name and course scores:\n"); math_sum=english_sum=computer_sum=0;for(i=1;i<=n;i++){printf("No.%d:",i);scanf("%d%s%d%d%d",&s1.num,,&s1.math,&s1.english,&s1 puter);math_sum+=s1.math;english_sum+=s1.english;computer_sum+=s1 puter;}printf("math_ave:%.2lf\nenglish_ave:%.2lf\ncomputer_ave:%.2lf\n", math_sum/n,english_sum/n,computer_sum/n);return 0;}【练习9-4】定义一个包含 5 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。

C语言程序设计 (何钦铭 ) 高教版 第2版 课后习题解答资料

C语言程序设计 (何钦铭 ) 高教版 第2版 课后习题解答资料
39
修改程序,观察语法错误、逻辑错误及改
C语言程序的调试、运行步骤
正方法。 ² 语法错误:可以删除一个分号,使编
编辑
编译
连接
运行
开始
源程序 .c / .cpp
目标程序 .obj
可执行程序 .exe
结果
语法 错误
连接 错误
运行 错误
译出现错误提示,改正之,再编译。 类比写文章有错别字。 ² 逻 辑 错 误 : 将 sum=sum+i 改 为 sum=sum-i,编译、连接、运行,发现 运行结果不符合题目要求。找出错误
int celsius, fahr; fahr = 150; celsius = 5 * (fahr – 32) / 9; printf("fahr = %d, celsius = %d\n", fahr, celsius); return 0; }
2-5 算 术 表 达 式 5*(fahr-32)/9 能 改 写 成 5(fahr-32)/9 吗 ? 为 什 么 ? 如 果 将 其 改 写 为 5/9*(fahr-32),会影响运算结果吗? 解答:
5(fahr-32)/9 不是合法的 C 表达式,因为不能省略运算符*;5/9*(fahr-32)的值为 0。
2-6 一个物体从 100 米的高空自由落下,编写程序,求它在前 3 秒内下落的垂直距离。设重 力加速度为 10m/s2。 解答: #include <stdio.h> int main(void) {
sum = 0 i=1
假 i <= 100?



i能被6整除?
sum = sum + i
i=i+1

C语言程序设计(何钦铭_颜晖_主编)ppt课件

C语言程序设计(何钦铭_颜晖_主编)ppt课件

printf("%d, %x\n", 012, 012);
return 0;
}
0……01010
精选ppt课件2021
32
例6-2(2) 输入整型数据
# include <stdio.h> int main(void) {
int a, b;
input a, b: 17 17 15 17 f, 17
printf("input a, b:");
'\n' '\101' '\x41' 'A'
所有字符都可以用转义字符表示
精选ppt课件2021
26
6.2.2 变量
在程序运行过程中,其值可以被改变的量。
变量必须先定义,后使用 定义变量时要指定变量名和数据类型 变量应该先赋值,后引用
精选ppt课件2021
27
变量名:合法的标识符
变量的定义
整型、实型、字符型数据的存储
6.1.2 基本数据类型
整型、实型、字符型
精选ppt课件2021
4
6.1.1 数据的存储-整型数据
设整数在内存中用2个字节存储
1 000 0001 1000 0001 0 000 0001 1000 0001
符号位 1:负数 0:正数
精选ppt课件2021
5
数值的表示方法-原码 反码 补码
16或32位
short [int] unsigned short [int] 16位
long [int] unsigned long [int]
32位
有符号 short
1 000 0000 0000 0000 -32768 -215

c语言程序设计第10章课件

c语言程序设计第10章课件

a.birthday.year a.birthday.month a.birthday.day
结 构 体 变 量 a 的 各 成 员 可 分 别 表 示 为 a.num、 、a.sex、a.birthday、a.score
9.1 结构体
16
9.1.2 结构体变量的定义与初始化
【例9.6】编写一个统计选票的程序。
scanf("%d/%d/%d",&today.year,&today.month,
&today.day);
printf("Today:%d/%d/%d\n",p->year,p->month,
p->day);
}
9.1 结构体
22
9.1.3 结构体的指针
tab数组
3. 指向结构体数组的指针
【例9.7】利用结构体指针输出一组化学 元素名称及其原子量。
“红领巾”真好
厦门市松柏第二小学 吴小蔚
第9章 结构体与共用体
2
9.1 结构体 9.2 共用体 9.3 枚举类型与类型命名
9.1 结构体
3
9.1.1 结构体与结构体类型的定义
信息管理
一个学生的信息有学号、姓名、性别、年龄、住 址、成绩等。
一本图书的信息有分类编号、书名、作者、出版社、 出版日期、价格、库存量等。
struct date { int year, month, day;}; struct student { char num[8], name[20], sex;
struct date birthday; float score; }a={"9606011","Li ming",'M',{1977,12,9},83},b,c;

C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 习题11 课后答案

C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 习题11 课后答案

//差几分钟
//差几秒
6. *编写函数:把两个链表合并成一个链表,并返回新练表(的表头)-----提高篇 //定义链表结构—职工信息表 struct zg{ char *name; int salary; struct zg *next; } (struct zg* ) merge( struct zg *list1, struct zg *list2) { struct zg *p; for( p=list1; p->next!=NULL; p->next=list2; return list1; } 7. *复制链表 L 到新链表 NEW 上。 (新链表NEW仅有一个表头指针,其余节点需要新建---提高篇 (struct zg*) copy( struct zg *L) { if( L==NULL) { //若源链表是空表,则返回 NULL return NULL; } //L 非空,则逐个复制到 NEW 中 struct zg *NEW, *tail, *p,*q; p= p->next) ; //p 指向链表 list1 的尾部(尾部特征是 next 指针为空)
8~11 略 12. 写一函数,得到一个 16 位二进制数中的任何一位的数值。即给定一个长度为 2B 的整数 x,和一个位数 k,该函数返 回 x 转换成二进制数后的第 k(k=0,1,…,15)位数字 ???????????????? 15 。 。 。 6543210 分析:利用位运算规则:0 或 1 与 0 做按位与&运算,都是 0;0 或 1 与 1 做&运算,都是它本身。 故对给定的 x 和 k, 只需将 x 与一个 16 位二进制数(第 k 位为 1,其余 15 位为 0)按位与即可:若 x 中的第 k 位是 0, 则计算结果是 16 个 0,转换为十进制数就是 0;若 x 中第 k 位是 1,则计算结果是 15 个 0,第 k 位是 1,转换成十进制 数一定不等于 0. 与 x 做按位与的整数是:第 k 位为 1,其余 15 位是 0,即 2 的 k 次幂。 #include<math.h> //pow() int digit( int x, int k) //k=0,…,15 { if( k<0 || k>15) return -1; int y= pow(2,k); if( x&y==0) return 0; else return 1; }

C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 全部课后习题答案

C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 全部课后习题答案

3. /*输入一个学生的数学成绩,低于 60,输出“Fail” ,否则,输出“Pass” 。*/ #include<stdio.h> void main() { double mark; //输入数序成绩 printf(" Input a mark:\n"); scanf("%lf", &mark);
5. /*输入 4 个整数 n, 输出最小值。*/ #include<stdio.h> void main() { int a,b,c,d, min; //输入 4 整数 printf(" Input number of integers n:\n"); scanf("%d%d%d%d", &a,&b,&c,&d);
s ( s a )( s b)( s c), where s
abc 2
源程序: #include<stdio.h> #include<math.h> void main() { double a, b, c, s, area, perimeter; //输入三条边 a,b,c printf(" Input three edges a b c:"); scanf("%lf%lf%lf", &a,&b,&c); //判断 a b c 是否构成三角形 if(a+b>c || a+c>b || b+c>a) { perimeter =a+b+c; s =perimeter/2; area =sqrt( s*(s-a)*(s-b)*(s-c) ); printf(“ area=%.2f, parameter=%.2f \n”, area, parameter); } else printf("These sides do not correspond to a valid triangle. \n"); }

C语言程序设计(何欣铭、颜晖 第2版)课后习题答案

C语言程序设计(何欣铭、颜晖 第2版)课后习题答案

14
62
函数的概念
C语言中有两种类型函数

简单总结本节内容。 使学生了解自定义函数编程结构,能够模 仿编程即可。
标准库函数 自定义函数
函数可以做到一次定义、多次调用 使用自定义函数的程序框架
double fact(int n); int main(void) { …… result = fact(i); …… } /* 定义求 n! 的函数 */
1.3 习题参考答案
1 .对 C 语言来说,下列标识符中哪些是合法的,哪些是不合法的? t o t a l ,_ d e b u g ,L a r g e & T a l l ,C o u n t e r 1 ,b e g i n _ 解答:L a r g e & T a l l 不合法, 其余都合法。 2.改写本章 1.4 节中的流程图 1.2,求 1~100 中能被 6 整除的所有整数的和。 解答:
39
C语言程序的调试、运行步骤
编辑 编译 连接 运行
开始
源程序 .c / .cpp
目标程序 .obj
可执行程序 .exe
结果
语法 错误
连接 错误
运行 错误
修改程序,观察语法错误、逻辑错误及改 正方法。 ² 语法错误:可以删除一个分号,使编 译出现错误提示,改正之,再编译。 类比写文章有错别字。 ² 逻 辑 错 误 : 将 sum=sum+i 改 为 sum=sum-i,编译、连接、运行,发现 运行结果不符合题目要求。找出错误 (调试) ,改正之,再编译、连接、运 行,看结果。类比写文章词不达意。
输入n
i = 2

i<=n/2?
真 真
n能被 i整除?

C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 习题10 课后答案

C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 习题10 课后答案

4. 定义函数 search(int list[], int n, int x), 在长度为 n 的数组 list 中查找元素 x, 并返回 x 在 list 中的下标。 如果 x 在 list 中不存在,则返回-1. 解法 1:使用 break 语句 int search( int list[], int n, int x) { int i, index=-1; //index: x 在 list 中的下标,目前尚未找到,因此初始化为-1 for ( i=0; i<n; i++) //逐个对比 list[i]与 x, 相等则跳出循环,否则继续往下比较,直到整个数组比完 if( list[i]== x ) { index=i; break; } return index; //返回 x 在 list 中的下标 } 解法 2:使用 return 语句—当程序执行到 return 语句,将提前结束循环,并结束函数 search(),返回主函数 main() int search( int list[], int n, int x) { int i ; for ( i=0; i<n; i++) //逐个对比 list[i]与 x, 相等则跳出循环,否则继续往下查找,直到找遍整个数组 if( list[i]== x ) return i; return -1; //当 for 循环正常结束,说明找遍整个数组都找不到 x, 返回-1 }
while ( *p!=’\0’ ){ *s++= *p++; }
while ( *p ){ *s++= *p++; }
9. /*分别用字符数组和字符指针实现自定义函数 strcat(s,t). 将字符串 t 连接到 s 之后,要求返回字符串 s 的首地址*/ 实例: s=”welcome” t=”friend”, m=3, 调用自定义函数 strcpy(s,t,m)后, s=”welcomefriend”, t 保持不变, 仍为”friend” 该函数要求返回 s 的首地址,即首字符的地址,因此函数返回值的类型是字符指针(详见 10.4 节) ,因此函数类型是 char *; 形参有 2 个,分别是两个字符串 s 和 t.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第10章函数与程序结构【练习10-1】使用递归函数计算1到n之和:若要用递归函数计算sum=1+2+3+…+n(n为正整数),请写出该递归函数的递归式子及递归出口。

试编写相应程序。

解答:递归式子: sum(i) = sum(i-1) + i;递归出口: sum(i) = 0;【练习10-2】请完成下列宏定义:① MIN(a,b) 求 a,b 的最小值② ISLOWER(c) 判断 c 是否为小写字母③ ISLEAP(y) 判断 y 是否为闰年④ CIRFER(r) 计算半径为 r 的圆周长解答:① MIN(a, b):求a,b的最小值。

#define MIN(a,b) (a<b) a: b② ISLOWER(c):判断c是否为小写字母。

#define ISLOWER(c) (c>='a'&&c<='z')③ ISLEAP(y):判断y是否为闰年。

#define ISLEAP(y) (y%4==0&&y%100!=0)||y%400==0)④ CIRFER(r):计算半径为r的圆周长。

#define PI#define CIRFER(r) 2*PI*(r)【练习10-3】分别用函数和带参宏实现从 3 个数中找出最大数,请比较两者在形式上和使用上的区别。

解答:(1)函数实现int max(int x,int y,int z){int t;if(x>=y)if(x>=z) t=x;else t=z;elseif(y>=z) t=y;else t=z;return t;}(2)宏实现#define MAX( x, y, z ) x>=y (x>=z x:z) : (y>=z y:z)两者在定义形式上完全不同。

使用上函数是在执行时,从主调函数转到函数 max(),然后再返回到主调函数,函数体始终存在;而宏是在编译预处理时,用条件表达式去替换MAX(int x, int y, int z ),等程序执行时,执行的是条件表达式,而不再存在 MAX(int x, int y,int z )的式子。

习题10一、选择题1.要调用数学函数时,在#include 命令行中应包含 C 。

A.”” B.”” C.”” D.””2.对于以下递归函数 f,调用 f(4),其返回值为 A 。

int f(int n){ if (n) return f(n - 1) + n;else return n;}A.10 B.4 C.0 D.以上均不是3.执行下列程序:#define MA(x, y) ( x*y )i = 5;i = MA(i, i + 1) – 7;后变量 i 的值应为 B 。

A.30 B.19 C.23 D.14.宏定义“#define DIV(a, b) a/b”,经 DIV(x + 5, y - 5) 引用,替换展开后是 A 。

A.x + 5 / y - 5 B.(x + 5 / y – 5)C.(x + 5) / (y - 5) D.(x + 5) / (y - 5);5.定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b 的值进行交换,下列表述中哪个是正确的 C 。

A.不定义参数a和b将导致编译错误 B.不定义参数a、b、t将导致编译错误C.不定义参数 t 将导致运行错误 D.不需要定义参数 a、b、t 类型6.执行下面程序,正确的输出是 A 。

int x = 5, y = 7;void swap ( ){ int z ;z = x ; x = y ; y = z ;}int main(void){int x = 3, y = 8;swap ( ) ;printf ( " %d , %d \n", x , y ) ;return 0 ;}A.3, 8 B.8, 3 C.5, 7 D.7, 57.下面说法中正确的是 A 。

A.若全局变量仅在单个 C 文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出二、填空题语言的编译预处理功能主要包括_条件编译_、_宏定义_和_文件包含_。

2.执行完下列语句段后, i 的值为 5 。

int i;int f(int x){return ((x>0) f(x-1)+f(x-2):1);}i=f(3);3.下列程序段 A 与 B 功能等价,请填写程序段 B 中相应语句。

程序段A:int f( int n ){ if(n<=1)return n;elsereturn f(n-1)+f(n-2);}程序B:int f( int n ){ _int t, t0, t1;_t0=0; t1=1; t=n;while ( _n>1_ ){t = _t0+t1_;t0 = t1;t1 = t;n - -;}return _t;_}5.下面程序用于计算 f(k , n)=1k+2k+…+n k,其中 power(m , n )求 m n。

请填写程序中相应语句。

# include <>int power(int m , int n){ int i ;int p=1;for( i=1 ; i<=n ; i++)p = p * m ;return p ;}int f(int k , int n){int i ;int s=0 ;for( i=1 ; i<=n ; i++)s = s + power(i, k) ;return s ;}int main(void){ int k , n ;scanf(“%d%d”, &k, &n ) ;printf(“f(%d, %d)=%ld” , k, n, f(k, n)) ;return 0;}5.下列递归程序的输出结果为 g=4,g=3,k=6 。

#include <>int fib(int g){ switch(g){case 0: return 0;case 1:case 2: return 2;}printf("g=%d,", g);return fib(g-1) + fib(g-2);}int main(void){int k;k = fib(4);printf("k=%ld\n", k);return 0;}6.下列语句的运算结果为_7,-13____。

#define F(x) x - 2#define D(x) x * F(x)printf("%d,%d", D(3), D(D(3))) ;三、程序设计题1.判断满足条件的三位数:编写一个函数,利用参数传入一个 3 位数 n,找出101~n 间所有满足下列两个条件的数:它是完全平方数,又有两位数字相同,如 144、676 等,函数返回找出这样的数据的个数。

试编写相应程序。

解答:#include<>#include<>int fun(int n);int main(void){int n;printf("Input n: ");scanf("%d",&n);printf("total=%d\n",fun(n));return 0;}int fun(int n){int i,d=0;for(i=101;i<=n;i++)if(((int)sqrt(i)*(int)sqrt(i))==i){if(i/100==(i/10)%10||i/100==i%10||(i/10)%10==i%10)d++;}return d;}2.递归求阶乘和:输入一个整数n(n>0且n<=10),求1!+2!+3!+……n!。

定义并调用函数fact(n)计算n!,函数类型是double。

试编写相应程序。

解答:#include<>double fact(int n);int main(void){int n;printf("Input n:");scanf("%d",&n);printf("1~%d的阶乘和:%.0lf",n,fact(n));return 0;}double fact(int n){int i;double result=1;if(n==1)result=1;else{for(i=1;i<=n;i++)result=result*i;result=result+fact(n-1);}return result;}3.递归实现计算xⁿ:输入实数x和正整数n,用递归函数计算xⁿ的值。

试编写相应程序。

解答:#include<>double power(double x,int n);int main(void){double x;int n;printf("Input x:");scanf("%lf",&x);printf("Input n:");scanf("%d",&n);printf("%lf的%d次方=%lf",x,n,power(x,n));return 0;}double power(double x,int n){double result;if(n==1)result=x;elseresult=x*power(x,(n-1));return result;}4.递归求式子和:输入实数x和正整数n,用递归的方法对下列计算式子编写一个函数。

f(x , n) = x-x²+x³-x4+… + (-1)n-1xⁿ(n>0)试编写相应程序。

解答:#include<>#include<>double f(double x,int n);int main(void){int n;double x;printf("Input x:");scanf("%lf",&x);printf("Input n:");scanf("%d",&n);printf("f(%lf,%d)=%lf\n",x,n,f(x,n));return 0;}double f(double x, int n){if(n==1)return x;elsereturn pow(-1,n-1)*pow(x,n)+f(x,n-1);}5.递归计算函数ack(m,n):输入m和n。

相关文档
最新文档