C语言第六章
int max(int a,int b)
{
…
形参a、b的 作用范围
}
特别注意
int max(int a,int b) {int z; int a; …… }
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
函数体
{ 内部变量声明部分 语句
}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
C语言程序设计基础
第六章 函数和变量
本节提要
• 函数的定义、参数、值 • 普通调用、嵌套调用、递归调用 • 数组作函数参数 • 变量的作用域和存储方式
主模块
模块1
模块2
模块n
模块 1_1
模块 1_n
模块 2_1
模块 2_n
模块 n_1
模块 n_n
6.2.1 无参函数的定义形式
函数首部 类型标识符 函数名()
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
运行结果:
############ 123456
############
6.2.2 有参函数的定义形式
函数 首部
类型标识符 函数名(形式参数列表)
{
函数体
内部变量声明部分 语句
}
现代格式
int max(int a,int b) {
if(a>b) return a; else return b; }
传统格式
int max(a,b) int a,b; { if(a>b) return a; else return b; }
main() {printsign();
printdata(); printsign(); } void printsign() {printf("#####a() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
void printdata() {printf(“ 1 2 3 4 5 6\n");}
main() {printsign();
printdata(); printsign(); } void printsign() {printf("############\n");}
void printdata() {printf(“ 1 2 3 4 5 6\n");}
大学C语言程序设计 第六章
2.函数表达式: 2.函数表达式: 函数表达式
功能:将函数作为表达式的一部分。 功能:将函数作为表达式的一部分。 如: c=2*max(a,b); 要点:要求函数带回一个确定的值,以参加表达式的运算。 要点:要求函数带回一个确定的值,以参加表达式的运算。
3.一个函数作为另一个函数的参数: 3.一个函数作为另一个函数的参数: 一个函数作为另一个函数的参数
若不需要函数带回任何值,可使用: 若不需要函数带回任何值,可使用:
void printstar(){ …} } void print_message(){…} print_message(){ }
例exp6_5:函数返回值的类型与其定义的 exp6_5:函数返回值的类型与其定义的 类型不符的情况。 类型不符的情况。
一函数的定义重点二函数的调用重点1函数的一般调用2函数的嵌套调用3函数的递归调用三数组作为函数的参数难点四局部变量与全局变量难点五变量的存储类别难点六内部函数与外部函数1概述2函数定义的方法重点3函数的参数难点4函数的返回值难点1c程序的基本结构回顾2什么是函数
第六章
[教学要求] 教学要求]
函
数
1.理解函数的功能。 理解函数的功能。 2.掌握函数定义的一般形式(重点)。 掌握函数定义的一般形式(重点)。 掌握函数的形参与实参的对应关系、 3.掌握函数的形参与实参的对应关系、参数传递方法及函数返回值 的概念(难点) 的概念(难点) 。 掌握函数调用的基本方法(重点) 4.掌握函数调用的基本方法(重点) 。 掌握函数嵌套调用的一般过程(重点) 5.掌握函数嵌套调用的一般过程(重点) 。 了解函数递归调用的几种形式。 6.了解函数递归调用的几种形式。 掌握数组名作为函数的参数的一些特点(难点) 7.掌握数组名作为函数的参数的一些特点(难点) 。 8.掌握局部变量与全局变量的概念及它们的使用特点(难点) 。 掌握局部变量与全局变量的概念及它们的使用特点(难点) 掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 9.掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 10.了解内部函数与外部函数的含义。 10.了解内部函数与外部函数的含义。
C语言 第六章 数组
6
6.1 排序问题
3. 初始化
类型名 数组名[数组长度]={初值表}; 初值表中依次放着数组元素的初值。例如: int a[10]={1,2,3,4,5,6,7,8,9,10}; 静态存储的数组如果没有初始化,系统自动给所有的数组元素赋0。 即 static int b[5]; 等价于 static int b[5]={0,0,0,0,0}; 初始化也可以只针对部分元素,如 static int b[5]={1,2,3}; 只对数组b的前3个元素赋初值,其余元素的初值为0。又如 int f[20]={0,1}; 对数组f的前两个元素赋初值,其余元素的值 不确定。
18
6.2 矩阵中最大值的位置
4. 使用二维数组编程
例7:定义一个3*2的二维数组a,数组元素的值由下式给 出,按矩阵的形式输出a。a[i][j]=i+j(0≤i ≤2, 0≤j ≤1), 见文件p131ex7-6.cpp
i
j
第1次 第2次 第3次 第4次 第5次
第6次
0 0 1 1 2
2
0 1 0 1 0
9
6.1 排序问题
4. 使用一维数组编程
例4:输入一个正整数n(1<n≤10), 再输入n个整数,将它们存入 数组a中。 ① 输出最小值和它所对应的下标。 ② 将最小值与第一个数交换,输 出交换后的n个数。 数组的长度在定义时必须确定, 如果无法确定需要处理的数据 数量,至少也要估计其上限, 并将该上限值作为数组长度。 因为n ≤10,数组长度就取上 限10。此外,如果用变量 index记录最小值对应的下标, 则最小值就是a[index]。 见p124ex7-4.cpp
8
6.1 排序问题
4. 使用一维数组编程
c语言 高级 教程 第六章
• 但结构不能整体地加以比较
结构和函数(续)
• 可以定义返回结构的函数:
/*makepoint: make a point from x and y components */ struct point makepoint(int x, int y) { struct point temp; temp.x = x; temp.y = y; return temp; } 用makepoint初始化结构变量(另一种结构变量初始化的方法): struct rect screen; struct point middle, makepoint(int, int); screen.pt1 = makepoint(0,0); screen.pt2 = makepoint(XMAX, YMAX); middle = makepoint((screen.pt1.x+screen.pt2.x)/2, (screen.pt1.y +screen.pt2.y)/2)
• 结构的指针十分常用:
struct point origin, *pp; pp = &origin; 但是,通过指针求结构的方法虽然直观,然而十分繁琐 printf(“origin is (%d,%d)\n”, (*pp).x, (*pp).y); 续)
• 为方便,特别为通过结构的指针存取结构的成员设计了一个 更方便的写法: <指针>-><成员>
结构组成的数组(续)
• /* getword: get next word or character from input */ int getword(char *word, int lim) { int c, getch(void); void ungetch(char); char *w = word; while (isspace(c = getch( ))) ; if (c != EOF) *w++ = c; if (!isalpha(c)) { *w = ‘\0’; return c; } for ( ; --lim > 0; w++) if (!isalmun(*w = getch())) { ungetch(c); break; } *w = ‘\0’; return word[0]; }
C语言第6章
4
(2)访问地址运算符 访问地址的运算符有两个,“*”和“[]”,它们的使用形 式不同,但功能等价,都用来访问指定地址中的数据。
① []运算符
[]是一个二元运算符,其使用格式为: add[exp] 其中,add和exp作为[]的两个运算量:add是一个地址量,exp 是整型表达式,表示从add开始的偏移量。 add[exp]的功能是从地址add开始,向高地址方向偏移exp 个数据单元后,取该地址中的值。 思考:x 是一个简单变量,&x是它的地址,(&x)[0]表示什么?
19
【例】用指针进行两个变量值的交换。
#include <stdio.h> void main() { int a,b,t,*pa=&a,*pb=&b; scanf("%d%d",pa,pb); // 相当于scanf("%d%d",&a,&b); t=*pa; /* 等价于t=a;或t=pa[0]; */ *pa=*pb; /* 等价于a=b;或pa[0]=pb[0]; */ *pb=t; /* 等价于b=t;或pb[0]=t; */ printf("%d %d\n",*pa,*pb); printf("%d %d\n",a,b); } 思考:如果将程序中的*pa=*pb改为pa=pb,程序的运行结果将会 发生什么变化?如果将变量t定义为指针变量*t,应如何修改程序, 才能正确实现变量交换?
char c= 'A',*pc=&c; float a=3.0,*pa=&a;
10
指针变量指向变量示意图
pa FF74 FF70 FF71 FF72 FF73 FF74 a 3.0 FF75 FF76 FF77 FF78 pc FF7C FF79 FF7A FF7B c A FF7C
C语言程序设计课件第6章 类与对象
2021/7/13
18
【例6.5】 使用构造函数替代例6.3中SetTime() 成员函数,并在主函数中,使用构造函数设置 时间为15时19分56秒并显示该时间。 构造函数也可以重载。关于重载的概念将在第 7章详细介绍,这里先看一个例子。 【例6.6】 构造函数重载定义示例。
【2021例/7/163 .8】 构造函数的调用。
21
6.3.2 析构函数 1.析构函数的特点 当对象创建时,会自动调用构造函数进行初始 化。当对象撤消时,也会自动调用析构函数进 行一些清理工作,如释放分配给对象的内存空 间等。与构造函数类似的是:析构函数也与类 同名,但在名字前有一个“~”符号,析构函数 也具有公有属性,也没有返回类型和返回值, 但析构函数不带参数,不能重载,所以析构函 数只有一个。 【例6.9】 析构函数程序举例。
26
6.4 对象数组与对象指针 6.4.1 对象数组 对象数组是指数组的每一个元素都是相同类型对象的 数组,也就是说,若一个类有若干个对象,把这一系 列的对象用一个数组来表示。对象数组的元素是对象, 不仅具有数据成员,而且还有成员函数。
对象数组的定义和普通数组的定义类似,一般格式如 下: 类名 数组名[第一维大小][第二维数组大小] 其中,类名是指该数组元素属于该类的对象,方括号 内的数组大小给出了某一维元素的个数。一维对象数 组只有一对方括号,二维对象数组要有两个方括号对, 等等。
25
普通构造函数在建立对象时被调用,而复制构造函数
在用已有对象初始化一个新对象时被调用。复制构造
函数被调用通常发生在以下3种情况:
(1)程序中需要新建一个对象并用一个类的对象
C语言(第06章)
6.3 函数声明
函数声明是对所用到的函数的特征进行必要的声明。编译 函数声明是对所用到的函数的特征进行必要的声明。编译 系统以函数声明中给出的信息为依据,对调用表达式进行 检测,以保证调用表达式与函数之间的参数正确传递。在 主调函数中,要对在本函数中将要调用的函数事先作一声 句末的分号不可少 明。 函数声明的一般形式:
函数定义的外部性: 函数定义的外部性:
/*不允许出现如下形式的定义 /*不允许出现如下形式的定义*/ 不允许出现如下形式的定义*
函数不能嵌套定义:一个函数不能定义在别的函 Func1() 数的内部。或者说,函数只能定义在别的函数的 { … 外部,它们都是平行的,互相独立的,即不允许 /*应改为如下形式的定义 应改为如下形式的定义* /*应改为如下形式的定义*/ Func2() 出现如下形式的定义: Func1() { … 一个程序如果用到多个函数,允许把它们定义在 { … } 不同的文件中,也允许一个文件中含有不同程序 } … 中的函数。即在一个文件中可以包含本程序用不 Func2() } 到的函数,它们不被本程序调用。
a b x y 3 5 … 3 5
6.5 嵌套调用和递归调用
函数的嵌套调用:
C语言的函数不允许嵌套定义(既将一个函数 语言的函数不允许嵌套定义(既将一个函数 的定义放在另一个函数的函数体中) C语言允许在一个函数的执行过程中又调用另 一个函数。这种调用称为函数的嵌套调用。 一个函数。这种调用称为函数的嵌套调用。
函数的类型: 函数的类型:
通常把函数返回值的类型称为函数的类型,即函数定义时 所指出的类型。 函数在返回前要先将表达式的值转换为所定义的类型,再 返回到主调函数中的调用表达式。即如果函数值的类型和 return 语句中表达式的值得类型不一致,则以函数定义为 准,函数类型决定返回值的类型。 int型与char型函数在定义时可以不定义类型(即不写int或 int型与char型函数在定义时可以不定义类型(即不写int或 char),系统隐含指定为int型。 char),系统隐含指定为int型。 对不需要使用函数返回值的函数,应定义为void类型。 对不需要使用函数返回值的函数,应定义为void类型。
高树芳C语言程序设计--第六章
[解决方案]设置一个长度为10的类型为整型的数组
存储老题的年龄。
程序代码
5
6.1 一维数组的定义与使用
相关知识: 1.数组的概念 同类型的一组数据。 2.数组的维数 下标的个数 3.一维数组的定义 类型 数组名[常量表达式] 4.一维数组元素的引用 数组名[下标],如:a[1]
6
6.1 一维数组的定义与使用
案例6-10 输出中文大写数字 [案例任务] C语言的字符串知识
[解决方案]使用两维字符数组存储汉字的“壹”
和“拾”等字符串数据。
程序代码
28
6.3字符数组及字符串
相关知识: C语言的字符串知识应用: 数字转换为中国大写汉字数字字符。
29Biblioteka 编写C程序,输入8个整数,将其逆序输出,同 时要输出它们的和。
10
6.2 二维数组的定义与使用
案例6-4 求二维数组中最大数 案例6-5 整数四则运算测试程序
11
6.2 二维数组的定义与使用
案例6-4 求二维数组中最大数
[案例任务]
对于如下3×4的矩阵: 1 2 3 4 6 9 5 4 -10 10 0 -5 编程求出其中的最大值,并输出其所在的行 号和列号。
24
6.3字符数组及字符串
[课堂训练6-4] 统计字符数组中某类字符的个数。设有 一个长度不超过30的字符串s,统计其 中数字字符、大写字母、小写字母、其 它字符的个数。
25
6.3字符数组及字符串
案例6-9字符串处理函数 [案例任务] 从键盘输入两个字符串s1,s2,要求使用 字符串的常用处理函数strlen、strcat、 strcpy、strcmp等。
[解决方案]见流程图。
程序代码
C语言 — 第六章 数组(大学使用教程)
数组常用的循环形式
法一 int i,a[100]; for(i=0;i<100;i++) a[i]=i; 法二 int i,a[100]; for(i=0;i<=99;i++) a[i]=i;
C程序中常用的是第一种方法。 程序中常用的是第一种方法。 此法中,循环变量的终值是“小于”而非“等于” 此法中,循环变量的终值是“小于”而非“等于” 数组长度!否则将导致“越界”的发生。 数组长度!否则将导致“越界”的发生。
数
组
• 数组是一组有序的同类型数据 。 • 数据称为数组的元素。 数据称为数组的元素。
6
数组的用处
保存大量同类型的相关数据 – 如矩阵运算,表格数据等 如矩阵运算,
数组的特点
快速地随机访问 一旦定义, 一旦定义,不能改变大小
7
§6.1 数组的定义与初始化
数组的定义 : 数组在使用前要进行定义: 名称、类型、维数、 数组在使用前要进行定义 名称、类型、维数、大小 定义格式: 定义格式: 类型标识符 数组名[常量表达式1][常量表达式2]…… 数组名[常量表达式1][常量表达式2] 1][常量表达式2]
如有数组 int a[5]; 其中数据为:2、4、23、6、78 其中数据为: 、 、 、 、 则存放情况如下: 则存放情况如下:
12
数组在内存 中的首地址
2000 2002
2的低位字节 的低位字节 2的高位字节 的高位字节 4的低位字节 的低位字节 4的高位字节 的高位字节
a[0] a[1] a[2] a[3] a[4]
即a=2000
2004 2006 2008
int a[5]={ 2,4, 23,6,78 };
大一c语言第六章知识点
大一c语言第六章知识点在大一的C语言课程中,第六章是一个相对重要的章节,它主要讲解了关于函数的知识点。
函数是C语言编程中不可或缺的组成部分,它能够将一段可复用的代码组织起来,提高代码的重用性和可读性。
本文将从函数的定义、函数参数、函数返回值和递归等四个方面,介绍第六章的主要知识点。
函数的定义是C语言程序中的一种代码块,它包含了一系列的语句。
函数可以有输入参数和返回值,也可以没有。
在C语言中,函数的定义由函数头和函数体组成。
函数头通常包括函数的返回类型、函数名和参数列表。
例如,下面是一个简单的函数定义的例子:```cint add(int a, int b){int sum = a + b;return sum;}```在上述例子中,函数名为add,它有两个参数a和b,返回值类型为int。
函数体中的语句实现了两个整数相加的功能,并将结果通过return语句返回。
函数参数是函数定义中的一部分,它用于向函数传递一些值。
函数参数可以分为两类:值传递和引用传递。
在值传递中,函数的参数会接收到实际参数的一个副本,而不是原始参数本身。
而在引用传递中,函数的参数会接收到实际参数的地址,从而可以直接修改实际参数的值。
值传递可以通过在函数定义中使用值参数来实现,而引用传递则需要使用指针参数。
函数返回值是函数执行完成后返回给调用者的值。
在前面的例子中,add函数将两个整数相加的结果通过return语句返回。
在函数执行过程中,可以使用return语句提前结束函数的执行,并返回一个结果。
如果函数没有返回值,可以将返回类型设置为void。
递归是指一个函数调用自己的过程。
递归函数通常包含两部分:基本情况和递归调用。
基本情况指的是函数的输入参数满足某个条件时,函数不再调用自己,而是返回一个确定的结果。
而递归调用指的是函数在处理一部分问题的同时,通过调用自身来处理更小规模的相同问题。
递归函数可以让问题的解决过程更为简洁和优雅,但需要注意避免无限递归的情况。
C语言程序设计 第6章
#include <stdio.h> #include <stdlib.h> main( ) { int a[10]; /*定义数组*/ int k,j; float ave,s; k=0;s=0.0; for(j=0;j<10;j++) /*用数组存放10个随机整数*/ a[j]=rand()%50; printf("数组中的值:"); for(j=0;j<10;j++) /*输出10个随机整数*/ printf("%6d",a[j]); printf("\n"); for(j=0;j<10;j++) { if(a[j]%2==0) /*如果数组元素的值为偶数*/ {s+=a[j];k++;} /*累加及偶数个数计数*/ } if(k!=0) {ave=s/k; printf("偶数的个数:%d\n偶数的平均植:%f\n",k,ave);} }
(2)定义一个二维数组a[N][5],数组每行存放一名 学生的数据,每行前4列存放学生4门单科成绩,第5列 存放学生的总分。 (3)输入N个学生的单科成绩,存入二维数组a中。 (4)通过变量sum累加计算每位学生的总分,然后 赋值给每行的最后一个元素。 (5)输出数组第5列上的值,即为每个学生的总分。
for(i=0;i<N;i++) { sum=0; for(j=0;j<4;j++) /*计算当前学生的总分*/ sum+=a[i][j]; a[i][4]=sum; } for(i=0;i<N;i++) /*输出每个学生的总分*/ printf("第%d个学生的总分为:%d\n",i+1,a[i][4]); }
