C语言学习知识程序设计(第3版)何钦铭颜晖第5章函数
- 格式:doc
- 大小:63.57 KB
- 文档页数:10
C语言程序的设计何钦铭颜晖第5章函数第5章函数是《C语言程序的设计》第3版中的一个重要章节,本章主要介绍了函数的概念、使用、声明与定义、函数参数以及递归等内容。
这一章的内容对于初学者来说可能比较抽象,但是通过系统的学习,可以帮助读者更好地理解和运用函数。
首先,本章开始介绍了函数的概念,函数是C语言程序中的基本组成单位,它可以完成特定的任务。
函数可以实现代码的重用,提高程序的可读性和维护性。
在编写程序时,我们可以将功能相对独立的代码块封装为函数,通过调用函数来完成任务,而不需要重复编写相同的代码。
接着,本章介绍了函数的使用方法。
包括函数的调用、函数的返回值、函数的参数传递等。
函数的调用是通过函数名和参数列表来实现的,函数可以有返回值也可以没有返回值。
函数的参数可以是基本类型或者数组、结构体等复合类型。
通过实例的讲解,读者可以更好地理解函数的使用方法。
在接下来的内容中,本章详细介绍了函数的声明与定义。
函数的声明是在函数调用之前声明函数的存在,用于告诉编译器函数的签名和返回值类型。
函数的定义是实现函数功能的具体代码。
函数的声明和定义可以放在同一个文件中,也可以分别放在不同的文件中。
通过函数的声明和定义,可以提高程序的可维护性和可读性。
然后,本章介绍了函数参数的相关内容。
函数参数是函数调用时传递给函数的值或变量,函数可以通过参数来接收外部传入的数据。
在C语言中,函数参数可以是值传递或者指针传递。
通过实例的讲解,读者可以更好地理解函数参数的使用方法。
最后,本章介绍了递归的概念和应用。
递归是函数调用自身的过程,通过递归可以解决一些问题,比如阶乘、斐波那契数列等。
递归虽然有一定的局限性,但可以简化程序的实现过程。
通过递归的学习,读者可以更好地理解递归算法的思想和应用。
总之,第5章函数是《C语言程序的设计》第3版中的一个重要章节,介绍了函数的概念、使用、声明与定义、函数参数和递归等内容。
通过学习本章,读者可以掌握函数的基本概念和使用方法,提高程序的设计能力和代码的重用性。
第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。
C语言程序设计何钦铭颜晖第5章函数函数在C语言中有很多优点。
首先,函数可以将一个复杂的问题分解为多个简单的子问题,从而提高代码的可读性和可维护性。
通过将程序分解为多个函数,我们可以更好地组织代码,使得程序结构更加清晰明了。
其次,函数可以提高代码的重复利用性。
通过将常用的功能封装在函数中,我们可以在程序的不同部分多次调用这些函数来完成相同的任务,而不需要重复编写相同的代码。
这样不仅可以减少代码量,还可以提高代码的可重复使用性。
此外,函数可以提高代码的可扩展性和模块化。
将功能相关的代码封装在一个函数中,可以使得它们更加独立,从而方便对程序进行扩展或修改。
如果我们需要修改一些功能,只需要修改对应的函数而不影响其他部分的代码,这样可以减少错误和改动的影响范围。
在C语言中,函数的定义包括函数头和函数体两部分。
函数头包括函数的返回类型、函数名和参数列表,用来声明函数的类型和参数信息。
函数体包括函数的具体实现,是函数执行具体任务的地方。
C语言中的函数使用方法如下:```c返回类型函数名(参数列表)函数体return 返回值;```其中,返回类型指定函数的返回值类型,可以是基本数据类型(如int、float等)或自定义的结构体类型。
函数名是函数的标识符,用来唯一标识一个函数。
参数列表包括函数的参数类型和参数名,用来接收调用函数时传递的参数。
函数体是函数的具体实现代码,它包含了函数要执行的任务和具体的算法逻辑。
return语句用于返回函数的返回值并结束函数的执行。
C语言中的函数可以分为库函数和用户自定义函数两种类型。
库函数是由C语言提供的一系列函数,它们以函数库的方式被编译成目标文件,并通过链接器与用户程序进行链接。
库函数包括C标准库(如stdio.h、stdlib.h等)和操作系统提供的函数(如文件IO、内存管理等),它们可以直接在C程序中使用。
用户自定义函数是程序员根据实际需求自己编写的函数,它们可以根据不同的功能和需求来定义,从而实现各种不同的任务。
何钦铭《C语言程序设计》(第3版)课后习题参考答案习题11.对C 语言来说,下列标识符中哪些是合法的,哪些是不合法的?total, _debug, Large&Tall, Counter1, begin_解答:合法标识符:total, _debug, Counter1;不合法标识符:Large&Tall, begin_。
2.改写本章1.4 节中的流程图1.2,求1~100 中能被6 整除的所有整数的和。
解答:3.改写本章1.4 节中的程序,求1~100 中能被6 整除的所有整数的和,并在编程环境中验证该程序的运行结果。
解答:#include <stdio.h>int main(void){int i, sum = 0;for(i = 1; i <= 100; i++)if (i % 6 == 0)sum = sum + i;printf("%d", sum);return 0;}4.对于给定的整数n(n>1),请设计一个流程图判别n 是否为一个素数(只能被1 和自己整除的整数),并分析该流程图中哪些是顺序结构、哪些是分支结构与循环结构。
解答:在流程图中,分支结构和循环结构如图1.2 所示,自上而下的2 个实线框和2 个虚线组成了顺序结构。
习题21.求整数均值:输入4 个整数,计算并输出这些整数的和与平均值,其中平均值精确到小数点后1 位。
试编写相应程序。
解答:#include <stdio.h>int main (void){int num1, num2, num3, num4;double average, sum;scanf ("%d%d%d%d", & num1, & num2, & num3, & num4);sum = num1+ num2+ num3 + num4;average = sum / 4;printf ("Sum = %.0f; Average = %.1f\n", sum, average);return 0;}2.阶梯电价:为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50 千瓦时(含50 千瓦时)以内的,电价为0.53 元/千瓦时;超过50 千瓦时的,超出部分的用电量,电价上调0.05 元/千瓦时。
C语言程序设计(第3版)何钦铭-颜-晖-第6章--回顾数据类型和表达式第6章回顾数据类型和表达式【练习6-1】输入一个十进制数,输出相应的八进制数和十六进制数。
例如:输入31,输出37 和1F。
解答:#include <stdio.h>int main(void){int x;scanf("%d", &x);printf("%o %x\n", x, x);return 0;}【练习6-2】在程序段:printf("input a, b: ");scanf("%o%d", &a, &b);printf("%d %5d\n", a, b); /* %5d 指定变量b 的输出宽度为5 */中,如果将scanf("%o%d", &a, &b) 改为scanf("%x%d", &a, &b),仍然输入__17 ___17__,输出是什么?解答:23 17(中间有三个空格)【练习6-3】如果字符型变量ch 的值是大写字母,怎样的运算可以把它转换为小写字母?解答:ch=ch-‘A’+‘a’;【练习6-4】证明下列等价关系。
(1)a&&(b||c) 等价于a&&b||a&&c。
(2)a||(b&&c)等价于(a||b)&&(a||c)。
(3)!(a&&b)等价于!a||!b。
(4)!(a||c)等价于!a&&!b。
解答:(1)a b c a&&(b||c) a&&b a&&c a&&b||a&&c0(假) 0(假) 0(假) 0 0 0 00(假) 0(假) 非0(真) 0 0 0 0a b a||b !(a||b) !a !b !a&&!b 0(假) 0(假) 0 1 1 1 10(假) 非0(真) 1 0 1 0 0非0(真) 0(假) 1 0 0 1 0非0(真) 非0(真) 1 0 0 0 0习题61.设float x=2.5, y=4.7; int a=7;,printf(“%.1f”, x+a%3*(int) (x+y)%2/4)的结果为 AA.2.5 B.2.8 C.3.5 D.3.82.执行下列程序段的输出结果是 D 。
《C语⾔程序设计》-何钦铭第⼀章引⾔1.2 程序与程序设计语⾔冯 · 诺依曼模型的存储程序概念:将程序与数据共同存储结构化的程序设计⽅法:将复杂程序划分为若⼲个相互独⽴的模块(⼀个模块可以是⼀条语句、⼀段程序或⼀个函数等)使完成每个模块的⼯作变得单纯⽽明确,在设计⼀个模块时不受其他模块的牵连。
同时,通过现有模块积⽊式的扩展就可以形成复杂的、更⼤的程序模块或程序1.3 C语⾔的发展历史与特点C语⾔的特点:(拥有底层操作能⼒)1.结构化语⾔2.易于移植3.简洁紧凑,使⽤⽅便灵活4.强⼤的处理能⼒5.⽣成的⽬标代码质量⾼,运⾏效率⾼第⼆章⽤C语⾔编写程序2.3 计算分段函数#include <stdio.h> //编译预处理指令程序运⾏时,⾸先从main函数开始运⾏%f指定输出时保留6位⼩数,%.2f则指定输出时保留2位⼩数循环体语句只能是⼀条语句(如果循环体语句由多条语句组成,必须⽤⼤括号把他们括起来,变成⼀条复合语句)整型数据的输出格式控制说明%md,指定了数据的输出宽度为m(包括符号位)。
若数据的实际位数(含符号位)⼩于m,左端补空格;若⼤于m,按实际位数输出实型数据的输出格式控制说明 %m.nf,指定了输出浮点型数据时保留n位⼩数,且输出宽度是m(包括符号位和⼩数点)。
若数据的实际位数(含符号位)⼩于m,左端补空格;若⼤于m,按实际位数输出f是针对浮点型数据⽽⾔,若输出数据为整型,则%m.nf应改为%md赋值运算符左边只能是⼀个变量第三章分⽀结构ch = getchar() //从键盘输⼊⼀个字符,并赋值给变量chputchar(输出参数); //输出参数是字符型变量或字符型常量第四章循环结构else和 if 的匹配准则:else与最靠近它的、没有与别的 else 匹配过的匹配do-while语句:循环条件需要在循环体中明确,且⾄少会执⾏⼀次循环体do {循环体语句} while (表达式);//判断⼀个数是否为素数#include <stdio.h>int main() {int i,m;printf("Enter a number:");scanf("%d", &m);for(i=2;i<=m/2;i++)if(m%i==0)break; //若m能被某个i整除,则m不是素数,提前结束循环if(i>m/2 && m!=1) //若循环正常结束,说明m不能被任何⼀个i整除printf("%d is a prime number! \n", m);elseprintf("No! \n");return 0;}break语句强制循环结束,不再执⾏循环体中位于其后的其他语句,break语句应该和if语句配合使⽤,即条件满⾜时,才执⾏break跳出循环;否则若break⽆条件执⾏,意味着永远不会执⾏循环体中break后⾯的其他语句continue语句:跳过循环体中continue后⾯的语句,继续下⼀次循环,continue语句⼀般也需要与if语句配合使⽤break语句和continue语句的区别在于,break结束循环,⽽continue跳过后⾯语句继续循环。
第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行数字金字塔。
习题参考答案 习题一 1./*在C语言中,下列标识符中哪些是合法的,哪些不合法?”*/合法:total, _debug, Counter1, begin_不合法:Large&Tall2. /*写出流程图,求1~100中能被6整除的所有整数之和*/3./*写出源程序,求1~100中能被6整除的所有整数之和”。
*/#include<stdio.h>void main(){int sum=0, i;for(i=1; i<=100; i++)if( i%6==0) sum =sum+i;sum);printf(“sum=%d”,}4./*画流程图,判别整数n是否是素数*/习题参考答案 习题十1.选择题(1) A(2) C(由于p指向x, 等式p≡&x, *p≡x成立. 故&*p≡&x≡p)(3) B (int c[]={1, 7, 12}; → c[0]=1, c[1]=7, c[2]=12. 而k=c, 即k指向数组c的首元素c[0]。
printf(“…”, *++k); 输出参数*(++k)的值是*(k+1), 即c[1] )(4) D (对字符数组只能在定义的同时赋初值,但不能在定义之后再用‘=’赋值)(5) D(*p[3]是由3个整型指针组成的数组,p是数组名,代表该数组的基地址,是地址常量,不能对p赋值,故A,C错。
*p代表p[0]这个指针,a[0]是普通整型变量,两者不应互相赋值,故B错。
p[0]=&a[0]或p[0]=a,都是正确的,作用是令p[0]这个指针指向数组a的首元素a[0])(6) D ( 指针数组元素p[3]是一个指针,指向a[3*3]=a[9], 即*p[3]==a[9] 而二维数组元素p[3][2]= *(p[3]+2)=*(&a[9]+2)=*(&a[11])=a[11])2./*写输出结果*/(1) 3,2,5 # 3,3,4 #注: z是全局变量,它在p()中有效,但在main()中另有与它同名的局部变量,所以在main()中无效。
c程序设计第三版笔记C程序设计第三版笔记C语言是一种广泛使用的计算机编程语言,以其高效性、灵活性和强大的功能而闻名。
《C程序设计》第三版是一本经典的C语言教材,由Brian W. Kernighan和Dennis M. Ritchie共同编写,后者也是C语言的共同创造者。
以下是根据该教材整理的一些关键笔记。
第1章:C语言简介- C语言的特点:简洁、结构化、高效。
- 程序的基本结构:预处理器指令、函数、变量声明、语句和表达式。
- 基本数据类型:整型(int)、字符型(char)、浮点型(float)和双精度型(double)。
第2章:数据类型、运算符和表达式- 变量声明:类型说明符和变量名。
- 常量:整数常量、浮点常量、字符常量和字符串常量。
- 运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符。
- 表达式求值:优先级和结合性。
第3章:控制语句- 条件语句:if、if...else、switch。
- 循环语句:while、do...while、for。
- 跳转语句:break、continue、goto、return。
第4章:函数- 函数定义:返回类型、函数名、参数列表、函数体。
- 函数调用:参数传递、返回值。
- 作用域规则:局部变量、全局变量。
- 递归函数:递归调用和基础情况。
第5章:指针- 指针变量:声明和初始化。
- 指针与数组:数组名作为指针使用。
- 指针与函数:指针作为参数、返回指针的函数。
- 指针的指针和动态内存分配。
第6章:结构体和其他数据类型- 结构体:定义、初始化、访问成员。
- 联合体:内存共享特性。
- 枚举类型:定义和使用。
- 位字段:存储位模式。
第7章:预处理器- 宏定义:#define和#undef。
- 文件包含:#include。
- 条件编译:#ifdef、#ifndef、#endif。
第8章:输入和输出- 标准库函数:printf、scanf。
- 格式化输出:格式说明符。
第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行数字金字塔。
试编写相应程序。
解答:#include <stdio.h>int main(void){int n,i,j;printf(“Enter n:”);scanf("%d", &n);for(i = 1; i <= n; i++){for(j = 1; j <= n - i; j++)printf(" ");for(j = 1; j <= i; j++)printf("%d ", i);putchar('\n');}return 0;}【练习5-4】思考:若把例 5-9 中静态变量 f 定义成普通局部变量,还能实现计算 n!吗?请上机检验。
若把 f 换成全局变量又会如何?解答:若把例 5-9 中静态变量 f 定义成普通局部变量,无法实现计算 n!,因为函数返回后 f 单元被系统回收,不再保存原有数据。
若把 f 换成全局变量,则能实现计算 n!,因为 f 的作用范围和生命周期一直存在。
习题5一、选择题1.在 C 语言程序中,若对函数类型未加显式说明,则函数的隐含类型为 D 。
A.void B.double C.char D.int 2.下列程序的输出结果是 D 。
fun(int a, int b, int c){ c = a * b; }int main(void){ int c;fun(2, 3, c);printf(”%d\n”, c);return 0;}A.0 B.1 C.6 D.无法确定3.建立自定义函数的目的之一是 B(优先)、C 。
A.提高程序的执行效率 B.提高程序的可读性C.减少程序的篇幅 D.减少程序文件所占内存4.以下正确的函数定义形式是 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)5.以下不正确的说法是 C 。
A.实参可以是常量、变量或表达式C.形参可以是常量、变量或表达式B.实参可以是任何类型D.形参应与对应的实参类型一致6.以下正确的说法是 D 。
A.实参与其对应的形参共同占用一个存储单元B.实参与其对应的形参各占用独立的存储单元C.只有当实参与其对应的形参同名时才占用一个共同的存储单元D.形参是虚拟的,不占用内存单元二、填空题1.下列程序的输出结果为 2357 。
#include <stdio.h>int fun3(int m);int main(void){ int n;for (n = 1; n < 10; n++)if (fun3(n) == 1) printf("%d ", n);return 0;}int fun3(int m){ int i;if (m == 2 || m == 3) return 1;if (m < 2 | |m % 2 == 0) return 0;for (i = 3; i < m; i = i + 2)if (m % i == 0) return 0;return 1;}2.输入若干个正整数,判断每个数从高位到低位各位数字是否按值从小到大排列,请根据题意,将程序补充完整。
#include <stdio.h>int fun1( int m );int main(void){ int n;scanf("%d", &n);while (n > 0) {if(fun1(n))printf("%d 中各位数字按从小到大排列\n", n);scanf("%d", &n);}}int fun1( int m ){ int k;k = m % 10;while(m)if( m / 10 % 10 > k)return 0;else { m = m/10 ; k = m % 10; }return 1;}3.下列函数输出一行字符:先输出 kb 个空格,再输出 n 个指定字符(由实参指定)。
请根据题意,将程序补充完整。
#include <stdio.h>void print( int kb, int n, char zf ){ int i;for(i = 1; i <= kb; i++)printf(“ ”);for (i = 1; i <= n; i++ )printf(“%c”, zf);}三、程序设计题1.使用函数计算分段函数的值:输入 x,计算并输出下列分段函数 f(x) 的值。
要求定义和调用函数 sign(x) 实现该分段函数。
试编写相应程序。
1 x > 0f(x)= 0 x = 0-1 x < 0解答:#include <stdio.h>int main(void){int sign(int x);int x, y;scanf("%d",&x);y = sign(x);printf("sign(%d) = %d\n", x, y);return 0;}int sign(int x){int y;if(x>0) y=1;else if (x==0) y=0;else y=-1;return y;}2.使用函数求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。
要求定义和调用函数 even(n)判断数的奇偶性,当 n 为偶数时返回 1,否则返回 0。
试编写相应程序。
解答:#include <stdio.h>int even(int n);int main(void){int n, sum;scanf("%d",&n);sum = 0;while(n > 0){if(even(n) == 0) sum = sum + n;scanf("%d", &n);}printf("The sum of the odd numbers is %d.\n", sum);return 0;}int even(int n){int y;if (n % 2 == 0) y = 1;else y = 0;return y;}3.使用函数计算两点间的距离:给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留2位小数)。
要求定义和调用函数dist(x1,y1,x2,y2)计算两点之间的距离。
试编写相应程序。
解答:#include<stdio.h>#include<math.h>double dist(double x1,double y1,double x2,double y2);int main(void){double x1,y1,x2,y2;printf("Enter x1 and y1:");scanf("%lf%lf",&x1,&y1);printf("Enter x2 and y2:");scanf("%lf%lf",&x2,&y2);printf("Distance=%.2lf",dist(x1,y1,x2,y2));return 0;}double dist(double x1,double y1,double x2,double y2){double distance;distance=sqrt(pow(fabs(x2-x1),2)+pow(fabs(y2-y1),2));return distance;}4.利用函数计算素数个数并求和:输入两个正整数 m 和 n(1<=m, n<=500),统计并输出 m 和 n 之间的素数的个数以及这些素数的和。
要求定义并调用函数prime(m)判断 m 是否为素数。
试编写相应程序。