C语言程序设计(第3版)何钦铭-颜-晖-第10章--函数与程序结构
- 格式:doc
- 大小:41.00 KB
- 文档页数:11
第5章函数【练习5-1】使用函数求1到n之和:输入一个正整数n,输出1~n之和。
要求自定义和调用函数sum(n)求1~n 之和。
若要计算m~n(m<n)之和,又该如何定义函数?试编写相应程序。
解答:#include <stdio.h>int sum(int n);int main(void){int n;int sum;printf("Enter n:")scanf("%d", &n);printf("sum = %d\n", sum(n));return 0;}int sum(int n){int result, i;result = 0;for(i = 1; i <= n; i++)result = result + i;return result;}若要计算m~n(m<n)之和,则需要在main()中定义2 个变量m 和n:scanf("%d%d", &m, &n);printf("sum = %d\n", sum(m, n));同时在函数定义时需设置2 个形参:int sum(int m, int n){int result, i;result = 0;for(i = m; i <= n; i++)result = result + i;return result;}【练习5-2】使用函数找最大值:输入2个数,输出其中较大的数。
要求定义和调用函数max(a, b)找出并返回a、b 中较大的数。
试编写相应程序。
解答:#include <stdio.h>double max(double a, double b);int main(void){int a, b;printf(“Input a and b:”);scanf("%lf%lf",&a, &b);printf("max= %lf\n", max(a, b));return 0;}double max(double a, double b){if(a > b)return a;elsereturn b;}【练习5-3】数字金字塔:输入一个正整数n,输出n行数字金字塔。
C语言知识点清单(杭电姚晔整理)第1章基本数据类型和表达式1.1 关键字和标识符标识符(p8)1.2 基本数据类型常用数据类型(p21,p122),字符型数据(p50,p123),原码反码补码(p120),实型数据的存储(p121)1.3 常量和变量常量和变量的定义(p21),整型字符型实型常量与变量(p123)1.4 输入和输出函数printf(p23),scanf(p27),字符型数据的输入和输出(scanf/printf/getchar/putchar/p51/p128),整型数的输入输出(scanf/printf格式控制p125),实型数的输入输出(scanf/printf格式控制p127) 1.5 常用库函数常用数学函数(p28)1.6 运算符和表达式算术运算(p22),赋值运算(p23),关系运算(p25),逻辑运算(p52),位运算(p140),长度运算符(p142),算术表达式(p131),赋值表达式(p133),关系表达式(p134),逻辑表达式(p136),条件表达式(p139),逗号表达式(p139),运算符的优先级与结合性(p142),复合语句(P33),自动类型转换(p130),强制类型转换(p130)第2章控制结构与语句2.1 结构化程序设计数据表达(p5),流程控制(p6),主要语法单位(p9),C语言的特点(p12)2.2 顺序结构顺序控制结构(p6)2.3 选择结构if-else语句(p26,p45),多分支else-if语句(p47,p60),switch语句(p57)2.3 循环结构for语句(p32),while语句(p69),do-while语句(p73),循环嵌套(p79),循环语句的选用(p82) 2.4 转向语句break语句(p59,p75),continue语句(p76)第3章函数3.1 函数的定义函数首部(p97),函数体(p98),函数原型声明(p100),问题分析思想(p105),模块化设计(p106/p239)3.2 函数的调用调用过程(p98),调用形式(p99),参数传递(p99),返回结果(p100,p104)3.3 嵌套与递归函数的嵌套调用(p238),递归函数基本概念(p241),递归程序设计(p244)3.4 函数与变量局部变量和全局变量(p108),变量生命周期(p112),变量存储的内存分布(p113),静态变量(p113),外部变量(p258),静态全局变量(p258),变量的存储类型及作用域(附录p340)第4章数组4.1 一维数组一维数组的定义和引用(p149),一维数组的初始化(p151),一维数组的编程(p152)4.2 二维数组二维数组的定义和引用(p160),二维数组的初始化(p161),二维数组的编程(p162)4.3 字符串字符数组(p167),字符串(p168),字符串处理函数(gets/puts/strcpy/strcat/strcmp/strlen/p203) 4.4 数组与函数数组名作为函数参数(p196),冒泡排序(p199),命令行参数(p273)第5章指针5.1 指针基本知识地址与指针(p181),指针变量的定义(p182),指针的基本运算(p184),指针变量的初始化(p186) 5.2 指针与数组指针、数组和地址的关系(p192)5.3 指针与字符串字符串与字符指针(p201),用指针数组操作多个字符串(p270)5.4 指针数组与多级指针指针数组的概念(p265),指向指针的指针(p266),二维数组的指针形式(p268),5.5 指针与函数指针作为函数参数(p188),指针实现动态内存分配(malloc/free/p209),指针作为函数返回值(p278),指向函数的指针(p278)第6章结构体6.1 结构体的概念结构的定义(p219),结构变量的定义和初始化(p221),结构变量的使用(p223)6.2 结构体数组结构数组操作(p226)6.3 结构体指针结构指针的概念(p229),结构指针做函数参数(p230)6.4 单向链表链表的概念(p285),单向链表的常用操作(p286)第7章文件7.1 文件概述文件的概念(p299),文本文件与二进制文件(p300),文件结构与文件类型指针(p301),文件处理步骤(p304)7.2 打开与关闭文件打开文件(p306),关闭文件(p308)7.3 文件读写函数字符方式读写函数fgetc/fputc(p309),字符串方式读写函数fgets/fputs(p311),格式化方式读写函数fscanf/fprintf(p314),数据块方式读写函数fread/fwrite(p315),文件定位函数rewind/fseek/ftell(p317),检测文件指针状态函数feof/ferror/clearerr(p317)第8章其他知识点8.1 编译预处理文件包含(p249),常用标准头文件(p251),宏基本定义(p247),带参数的宏定义(p248),条件编译(p252)8.2 共用体联合变量(附录p339)8.3 枚举枚举变量(附录p339)。
c程序设计第三版pdf
引言概述:
《C程序设计第三版》是一本经典的C语言程序设计教材,被广泛应用于计算机科学与技术领域。
本文将从五个大点出发,详细阐述该教材的内容和特点,帮助读者更好地了解和使用该教材。
正文内容:
1. 教材概述
1.1 教材背景
1.2 作者简介
1.3 教材目标与受众
1.4 教材结构与章节安排
1.5 教材特点
2. 基础知识与语法
2.1 C语言基础知识
2.2 数据类型与变量
2.3 运算符与表达式
2.4 流程控制语句
2.5 函数与库函数
3. 数组与指针
3.1 数组的概念与用法
3.2 数组的初始化与操作
3.3 指针的基本概念
3.4 指针与数组的关系
3.5 指针的高级应用
4. 结构与文件操作
4.1 结构的定义与使用
4.2 结构与函数的关系
4.3 文件操作的基本概念
4.4 文件读写操作
4.5 文件指针与文件操作的高级应用
5. 动态内存分配与高级应用
5.1 动态内存分配的概念与原理
5.2 动态内存分配函数
5.3 内存泄漏与内存管理
5.4 链表的概念与应用
5.5 高级应用:递归与算法
总结:
综上所述,C程序设计第三版是一本内容丰富、结构合理的C语言教材。
通过该教材的学习,读者可以系统地掌握C语言的基础知识与语法,了解数组与指针
的使用方法,掌握结构与文件操作的技巧,以及理解动态内存分配与高级应用的概念。
该教材既适合初学者入门,也适合进阶学习,是一本不可多得的经典教材。
读者可以通过阅读该教材并实践编程,提升自己的C语言编程能力。
第4章循环结构【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果是什么?为什么?如果将精度改为 10-3,运行结果有变化吗?为什么?解答:如果对 item 赋初值 0,则程序运行结果是 pi=0,因为 item 为 0 时不满足 while 循环的执行条件,即不执行循环,故 pi 值为 0。
如果将精度改为10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度变大使得 while 循环次数减少,必然影响到π的值。
【练习 4-2】运行例 4-2 程序时,如果将最后一个输入数据改为-2,运行结果有变化吗?如果第一个输入数据是 -1,运行结果是什么?为什么?解答:如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是一结束标志,不进行统计,故任意一个负数都可以。
如果第一个输入数据是-1,运行结果是:Grade averageis 0,因为第一个输入就是-1,则 while 循环条件不成立,不执行循环体。
【练习 4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数 eps,计算序列1-1/4+1/7-1/10+1/13-1/16+…的值,精确到最后一项的绝对值小于eps(保留6位小数)。
试编写相应程序。
解答:#include <stdio.h>#include <math.h>int main(void){int denominator, flag;double item, s,eps;printf(“Input eps:”);scanf(“%lf”,&eps);flag = 1;denominator = 1 ;item = 1.0;s = 0;while(fabs (item) >= eps) {item = flag * 1.0 / denominator;s = s + item;flag = -flag;denominator = denominator +3;}printf ( “s = %f\n”, s);return 0;}【练习 4-4】如果将例 4-3 程序中的 do-while 语句改为下列 while 语句,会影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0){number = number / 10;count ++;}解答:会有影响,因为当输入数据 number 为 0 时,上述 while 循环将不执行,count 值仍为 0,故输出为 0,不符合题目要求。
第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,&pu ter);math_sum+=s1.math;english_sum+=s1.english;computer_sum+=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 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。
第2章C语言编写程序【练习2-1】输出短句(Programming in C is fun!):在屏幕上显示一个短句“Programming in C is fun!”。
试编写相应程序。
解答:#include <stdio.h>int main(void){printf("Programming in C is fun!\n");return 0;}【练习2-2】下列语句的运行结果是什么?与例 2-2 的运行结果有何不同?为什么?printf("Programming is fun. And Programming in C is even more fun!\n"); 解答:运行结果:Programming is fun. And Programming in C is even more fun! 例 2-2 的运行结果分 2 行显示。
原因在于,例 2-2 中在每条输出语句的结尾都采用了‘\n’换行。
【练习2-3】输出倒三角图案:在屏幕上显示如下倒三角图案。
试编写相应程序。
* * * ** * ** **解答:#include<stdio.h>int main(void){printf("* * * *\n * * * \n * * \n * \n");return 0;}【练习2-4】温度转换:求华氏温度150°F 对应的摄氏温度(计算公式同例 2-3)。
试编写相应程序。
解答:#include<stdio.h>int main(void){double celsius,fahr;printf("Enter fahr:\n");scanf("%lf",&fahr);celsius=5.0*(fahr-32)/9;printf("celsius=%.2lf\n",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。
第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 3.14159
#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;
else
if(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.”stdio.h” B.”string.h” C.”math.h”
D.”ctype.h”
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.1
4.宏定义“#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 。