C语言程序设计 第8章 函数
《C语言程序设计教程》第三版课后习题参考答案
《C语言程序设计教程》第三版课后习题参考答案C语言程序设计教程第三版课后习题参考答案第一章:C语言概述1.1 C语言的特点答案:C语言是一种通用的、面向过程的程序设计语言,具有高效、简洁、灵活等特点。
它提供了丰富的程序设计元素和功能,适用于各种不同的应用领域。
1.2 C语言程序的基本结构答案:C语言程序由预处理指令、函数声明、函数定义、变量声明和语句组成。
其中,预处理指令用来引入头文件或定义宏,函数声明用来声明函数的名称和参数,函数定义用来实现函数的功能,变量声明用来声明变量的类型和名称,语句用来表达具体的计算过程。
1.3 C语言的数据类型答案:C语言提供了多种数据类型,包括基本类型(整型、浮点型、字符型等)和派生类型(数组、指针、结构体等)。
每种数据类型在内存中占据一定的存储空间,并具有特定的取值范围和操作规则。
1.4 C语言的运算符和表达式答案:C语言支持各种运算符和表达式,例如算术运算符(+、-、*、/等)、关系运算符(>、<、==等)、逻辑运算符(&&、||、!等)等。
通过运算符和表达式可以进行各种数值计算和逻辑判断。
第二章:基本数据类型与运算2.1 整型数据类型答案:C语言提供了不同长度的整型数据类型,包括有符号整型(int、long等)和无符号整型(unsigned int、unsigned long等)。
整型数据类型可以表示整数值,并具有不同的取值范围。
2.2 浮点型数据类型答案:C语言提供了浮点型数据类型(float、double等),用来表示带小数部分的实数值。
浮点型数据可以表示较大或较小的数值,并具有一定的精度。
2.3 字符型数据类型答案:C语言提供了字符型数据类型(char),用来表示单个字符。
字符型数据可以用于表示各种字符(包括字母、数字、符号等)。
2.4 布尔型数据类型答案:C语言不直接支持布尔型数据类型,但可以使用整型数据类型来表示布尔值(0表示假、非零表示真)。
C语言程序设计教程(电子教案)
学习目标
对C语言有一个概括的了解, 能够编写包含键盘输入、计算和 显示输出等操作的简单C程序。
4
主要内容
• C语言的产生与特点 • 简单C程序的组成 • C语言应用程序开发的基本步骤
5
1.1 C语言的产生及特点
C语言是为了编写系统程序而在1968年开始 研发的计算机高级语言
C语言表达能力强,使用灵活,程序结构清 晰,紧凑,可移植性好
指针 类型
17
基本数据类型说明符
整型:int long
字符型:char 实型:float
double long double
18
2.2 常 量
常量∶在程序运行过程中,其值不能被改 变的量。
一. 不同数制整型常量的表示
例如: 12 :十进制数 12
012 :八进制数 12(等于十进 制数10,用前导符0表示八进制数常量)
计算x+y+z,并将结 8果赋给变量sum
显示变量 sum的值
主函数 main()
一般C程序的组成
【例1-2】采用模块结构,改写例1-1的程序。 add(int x,int y,int z )
{ return(x+y+z);
}
函数add()
调用函数 add()
main() { int x,y,z; printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z);
4. 用‘\’ ’表示字符’ ,‘\”’表示字符”, ‘\\ ’表示字符\ 。
5. 用双引号括起来的字符序列表示字符串常量,其 中最后一个字符是字符串结束符‘\0’,不显式 地表示出来。如:“English” 。
C语言程序设计第8单元
二维数组的地址
【例8.9】使用指针变量输出二维数组元素 #include<stdio.h> main() { int a[2][3]={{1,2,3},{4,5,6}},*p;
for(p=a[0];p<a[0]+6;p++) { if((p-a[0])%3==0)printf("\n");
printf("%2d",*p); } }
0x62fe3a
0x62fe3b
0x62fe3c
数组指针的运算
对于指针变量p,可以做以下运算: p++,p--,p+i, p-i, p+=i, p-= i等。
#include <stdio.h> main() { int a[]={1,3,6,7,9,12};
int x,*p=&a[2]; x=(*--p)++; printf("x=%d\n",x); printf("a[1]=%d\n",a[1]); }
0x62fe50
二维数组的地址
#include <stdio.h>
main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,a1是1,1行2指}};针
printf("%x,%x,%x\n",a,a+1,a+2); printf("%x,%x,%x\n",*a,*(a+1),*(a+2)); *a是列指针
二维数组的地址
二维数组名是数组的首地址,二维数组名的基类型不是数组元素类 型,而是一维数组类型,因此,二维数组名a是一个行指针。
2022年C语言程序设计教程(第3版) 谭浩强 课件 最新 8
程序数据区
输入缓冲区 输出缓冲区
外部介质
一般说,二进制文件节省存储空间而且输入输出的速 度快(因为在输出时不需要把数据由二进制形式转换为字 符代码,在输入时也不需要把字符代码先转换成二进制形 式然后存入内存)。如果存入磁盘中的数据只是暂存的中 间结果数据,以后还要调入继续处理的,一般用二进制文 件以节省时间和空间。如果输出的数据是准备作为文档供 给人们阅读的,一般用字符代码文件,它们通过显示器或 打印机转换成字符输出。一般高级语言都能提供字符代码 文件(ASCII文件)和二进制文件,用不同的方法来读写这 两种不同的文件。
f:\\exe3\\file1.txt 文件名是文件的主要标志,它必须符合C语言关于标 识符的规定。 文件名后缀,用于对文件进行补充说明,一般不超过 三个字符,通常用特定的后缀表明文件的类型。例如.txt 表明是纯字符文件,用.c表示是C语言源程序文件, 用.exe表示是可执行文件等。
8.1.3 文件的位置指针与读写方式
fp1 文 件 1 fp2 文 件 2 fp3 文 件 3
的信息
的信息
的信息
区
区
区
8.2.3 文件的打开与关闭——流的创建与 撤销
1. 文件的打开 fopen (文件名,文件操作方式); 说明:
(1)文件名应当包含文件路径、主文件 名和文件后缀,即提供找到文件的有关信 息。
(2)应当理解文件操作用方式的意义。
FILE * fp; char name[20]; int num; float score; if ((fp=fopen(“f:\\C3exe\\file3.txt”,”w”))==NULL) {
C语言程序设计基础 第8章 数据文件处理技术
offset为long型的位移量,以ptname为基准,移动 的字节数。
函数返回值:成功移动返回0,否则返回非0。
10. 函数fseek-例 【例1】 fseek (fp, 40L, SEEK_SET); 表示:将当前位置移到离文件头40个字节处。 【例2】 fseek(fp, 20L, SEEK_CUR); 表示:将当前位置移到离当前位置20个字节处。 【例3】 fseek(fp, -30L, SEEK_END);
文件不能打开时,函数 fopen()将返回空指针值 NULL。 程序应考虑到文件不能正常打开的极端情况,应用以下形式 的代码描述打开一个文件的要求: if ((fp = fopen(fname, "r")) == NULL) { printf("不能打开文件 %s。\n", fname); return; }
fputc()和fgetc()函数-例2
【例2】将一个文件中的数据复制到另一个文件中。 #include <stdio.h>
void main()
{ FILE *in, *out; char ch, infile[40], outfile[40]; gets (infile); if (( in = fopen(infile, "r")) == NULL) { printf ("不能打开源文件 %s\n", infile); scanf ("%*c"); return; } /* 起暂停作用 */
12. 成批读数据函数fread() 形式指向的文件读入count*size个字节,存入buffer。 函数返回值:读取成功返回count值,否则返回0。
说明:常用于二进制文件的读。
C语言程序设计 第3版 第8章 函数
s=a+b;
return s;
}
main()
//主函数
{
int s;
s=sum();
printf("s=%d\n",s);
}
运行结果
2 3↙ s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名(形式参数表列) {
函数体; return 表达式; }
调用方式
函数调用的一般形式:
函数名(实际参数表) 实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。
调用方式:
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。 例如:s=sum(x,y);把sum的返回值赋予变量s。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。 例如:sum(x,y);以函数语句的方式调用函数。
void sum(int a,int b) //自定义函数
{
int s;
s=a+b;
ห้องสมุดไป่ตู้
printf("s=%d\n",s);
} main()
//主函数
{
int x=2,y=3;
sum(x,y);
}
运行结果
s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名( ) {
函数体; return 表达式; }
注意说明:
(1)函数的类型实际上是函数返回值的类型。
《C语言程序设计》 课后习题答案 高等教育出版社
《C语言程序设计》课后习题答案高等教育出版社《C语言程序设计》课后习题答案高等教育出版社第一章:C语言概述1. C语言的特点C语言是一种以处理底层任务和系统编程为目标的高级编程语言。
其特点包括语法简洁、执行效率高、可移植性强等。
第二章:C语言基本数据类型1. C语言中的基本数据类型C语言中的基本数据类型包括整型、字符型、浮点型等。
整型可以进一步细分为有符号整型和无符号整型。
第三章:C语言运算符1. C语言中的运算符C语言中常见的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符等。
这些运算符用于执行各种数学和逻辑操作。
第四章:C语言控制语句1. C语言中的条件语句C语言提供了if语句和switch语句来实现条件判断。
if语句用于执行基于布尔表达式的条件分支,而switch语句用于根据不同的值执行不同的代码块。
第五章:C语言函数1. C语言中的函数定义和调用函数是C语言中的基本模块,用于封装可重用的代码。
函数定义包括函数返回类型、函数名、参数列表和函数体等部分。
第六章:C语言数组1. C语言中的数组定义和使用数组是一组相同类型的数据元素的集合。
C语言中可以使用数组来存储和操作大量数据。
第七章:C语言指针1. C语言中的指针概念指针是一种变量,它存储了内存地址。
通过指针,可以直接访问和修改对应内存地址中的数据。
第八章:C语言字符串1. C语言中的字符串操作字符串是由一系列字符组成的数据类型。
C语言通过字符数组来表示和操作字符串。
第九章:C语言结构体1. C语言中的结构体定义和使用结构体是一种自定义的复合数据类型,它可以包含多个不同类型的成员变量。
第十章:C语言文件操作1. C语言中的文件读写操作文件操作是一种重要的数据输入和输出方式。
C语言提供了一系列函数来实现文件的读写操作。
总结:通过解答以上习题,我们可以更好地掌握C语言的各个方面,提升我们的编程能力和解决问题的能力。
希望本文对读者有所帮助。
C语言程序设计(第八章)
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
C语言程序设计教程第8章文件
8.2.1 文件的打开与关闭
2. 文件关闭函数fclose() 文件一旦使用完毕,为避免文件数据丢失等错误的发生, 可用文件关闭函数将其关闭。 函数调用的一般形式是: fclose(文件指针); 例如: fclose(fp); 正常完成关闭文件操作时,fclose()函数返回值为0, 如果返回非零值则表示有错误发生。
检查各种输入输出函数对文件进行读写时是否 出错,返回值为0表示未出错,否则表示有错。
8.2.2 文件检测与定位
2.文件的定位函数 在文件内部有一个位置指针,用来指向文件中当前被读写 的字节。 在文件打开时,该指针总是指向文件的第一个字节。 它不同于文件指针,文件指针是指向整个文件的,须在 程序中定义说明,只要不重新赋值,文件指针的值是不变的。 文件内部的位置指针是指示文件内部的当前读写位置, 比如每读写一次,该指针均会向后移动,它不需在程序中定 义说明,而是由系统自动设置的。
在stdio.h中定义了两个文件操作过程中经常用到的符号常量
8.2 文件操作
另外 在stdio.h中定义了两个文件操作过程中经常用到的符号常量 NULL:表示空指针,值为0 EOF: 表示文件末尾,值为-1 通过文件指针就可以完成对文件的操作 文件操作的过程一般有如下步骤:
1. 说明一个文件指针; 2. 通过文件名打开文件,并为文件指针赋值; 3. 通过文件指针对文件进行存取(即读或写操作) ; 4. 关闭文件。
8.2.1 文件的打开与关闭
1. 文件打开函数fopen()
文件在进行读写操作之前要先打开,使用完毕要关闭
所谓打开文件,实际上是建立文件的各种信息,并使 文件指针指向该文件,以便进行其它操作。 fopen()函数用来打开一个文件,其调用的一般形式为:
C语言第七讲
•static(静态)型:存放在一般内存区域中,生命期长 •extern(外部)型:用于说明变量是外部的,而不能
用于定义一个变量。
8.8 局部量和全局变量
•局部变量:作用域仅仅局限于定义它的函数,在不
8.4 函数的调用
函数调用:就是一个函数(调用函数)调用另一个
函数(被调用函数) 。 调用前要先说明函数原型,即在调用函数的说明部分 按如下形式说明: 类型说明符 被调用函数名(含类型说明的形参表)
调用形式: 函数名(实参表) 嵌套调用:C语言不允许嵌套定义函数
但可以嵌套调用函数
递归调用:函数直接或间接调用自身
文件包含:是指一个源文件可以将另外一个指定的源文 编译预处理: 是C语言区别于其它高级语言的一个重要
编译预处理——文件包括
C语言编译系统中以“.h”为扩展名的文件称 为头文件,在使用C语言编译系统提供的库函数 进行程序设计时,经常需要在源程序中包含相应 的“头文件”,如“stdio.h”、“string.h”等 。 用C语言设计程序时,通常将全局变量的定 义、符号常量的定义、结构类型的定义以及函数 类型说明等语句放在头文件中。这样,对于需要 该文件的源程序来讲,都可以通过#include语句 将其包含到程序中。正确使用#include语句,将 会减少不必要的重复工作,提高编程效率。
“值传递”举例
main() 每调用一次返回一个值,调用结束立即释 函数原型:在函数使用前对函数的返 {float fc(); 放形参所占内存单元,下次调用重新分配 回类型和参数变量类型进行说明的语句 float sum; sum=fc(50)+fc(100)+fc(150)+fc(200); printf(“sum=%f ”,sum);} float fc(int n) {float s=0; int i; for(i=1; i<=n; i++) s+=1/(float)i; return(s);}
四川大学《c语言程序设计》课件-第8章 结构体与共用体
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员
C语言程序设计教程第8章北京邮电大学出版社.
第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。
《C语言程序设计》课后习题答案第八章
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.2
函数的调用
【练习题 】
用函数实现求两个实数的和。
#include <stdio.h> void main() /*主调函数*/ { float add(float x, float y); /*函数声明*/ float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); 因函数声明与函数首 printf("sum is %f\n",c); 部一致,故把函数声 } 明称为函数原型。 float add(float x,float y) /*被调函数首部*/ { float z; z=x+y; 用函数原型来声明函数,能减少 return(z); 编写程序时可能出现的错误。 }
教学进程
8.2.3 函数的调用
定义函数时,函数名后括号中的变量称为形式参数,即形参。 定义函数时,函数名后括号中的变量称为形式参数,即形参。 在主函数中调用函数时,函数名后括号中的表达式称为实际 参数,简称实参。
【例 】 输入两个整数,要求用一个函数求出其中的大者,并 在主函数中输出此数。
教学进程
a
b
c
d
e
f
教学进程
运行结果: 【例】 函数调用的简单例子。
**************** How do you do! ****************
/*主调函数*/ /*主调函数* #include <stdio.h> void main() { void printstar(); printstar(); void print_message(); print_message(); printstar(); print_message(); printstar(); }
C语言程序设计_2 第8章 数组
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}} a[3][3]={{1 },{4 },{7
.2). 按行连续赋值 把数组元素顺序赋值。例如: 把数组元素顺序赋值。例如:
int a[5][3]={1,2,3,4,5,6,7,8,9} a[5][3]={1
通常写为如下矩阵形式,比较直观: 通常写为如下矩阵形式,比较直观:
二维数组存储是按行排列的, 二维数组存储是按行排列的, 即放完一行之后顺次放入第二 行。
8.2.2 二维数组元素的表示方法
二维数组的元素也称为双下标变量,其表示的形式为: 二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标1][下标 数组名[下标1][下标2] 下标2
其中下标应为整型常量或整型表达式。例如: 其中下标应为整型常量或整型表达式。例如:
8.2 二维数组
只有一个下标的数组称为一维数组, 只有一个下标的数组称为一维数组,其数组 元素称为单下标变量。 元素称为单下标变量。有多个下标的数组称为 多维数组, 其数组元素称为多下标变量。 多维数组, 其数组元素称为多下标变量。 最 常用的是二维数组, 常用的是二维数组,更高维数的数组与二维数 组相似。 组相似。
8.1.2 数组元素的表示方法
数组元素是数组的基本单元,它是一种变量,其标识方法为 数组元素是数组的基本单元, 它是一种变量, 数组名后跟一个下标。下标指定元素在数组中的顺序号。 数组名后跟一个下标。下标指定元素在数组中的顺序号。数组元 素的一般形式为: 素的一般形式为:
数组名[下标] 数组名[下标]
例如,单独使用一个下标变量: 例如,单独使用一个下标变量:
int a[10]; a[10] a[7]=6; a[7]=6
《c语言程序设计教学资料》第8章---数组
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
c语言程序设计第五版课后答案谭浩强第八章课后答案
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
C语言,第8章 数组(字符数组)
(字符数组)
内 容 提 要
• • • • • • • •
•
• •
什么是字符串? 字符数组的作用 字符数组的定义 字符数组的输入和输出 字符数组的初始化 程序实例 字符串复制函数strcpy 字符串连接函数strcat 字符串比较函数strcmp 字符串长度函数strlen 程序实例
什么是字符串?
给字符数组赋值
例如:
char c[]={“boy”}; char c[]=“boy”; char c[]={„b‟, „o‟, „y‟, „\0‟};
赋值后字符数组c在内存中的状态:
c[0] b c[1] c[2] o y c[3] \0
给字符数组赋值
• 从键盘输入:
•
例如:: 使用循环逐个字符输入 #include <stdio.h> int main(void) { char c[20]; int i; for (i=0; i<3; i++) { scanf(“%c”, &c[i]); } c[i] = „\0‟; …….. return 0;
输出结果
printf(“zimu=%d,shuzi=%d,kongge=%d,qita=%d\n",
zimu, shuzi, kongge, qita);
return 0; }
使用字符串处理函数必须加头文件 <string.h>
字符串复制函数strcpy
1. strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去。
例如:输入 My name is chdong!
遇到第一个空格结束,因此只输入 My
字符数组的输出
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.1 问题的提出和程序示例
问题提出: int fac(int n) /* 求某个数 n 的阶乘 */ { int i, x=1; for(i=1; i<=n; i++) x = x * i; return(x); } void main() /* 求组合函数的解 */ { int m, n, cmn; scanf("%d%d", &m, &n); cmn = fac(m) / ( fac(n) * fac(m-n)); printf("cmn = %d", cmn); }
发生函数调用时,实参与形参的传递方式有两种:值传递 方式、地址传递方式。 1.值传递方式
如果参数传递的是数据本身,就称为“值传递”。C语言规 定,数值只能由实参传递给形参,形参不能反过来传值给实 参,即传值是单向的。
值传递过程如下: (1)函数调用时,系统临时创建形参变量; (2)实参将其数值复制一份给形参变量; (3)函数调用过程中,形参的任何改变只发生在被调函数内 部,不会影响到实参; (4)当被调函数运行结束返回主调函数时,形参的存储空间 被自动释放。
编程序求组合函数
C n= . m n!*(m-n)!
m!
8.1 问题的提出和程序示例
void main( ) { int m, n, x=1, y=1, z=1, i, cmn; scanf("%d%d", &m, &n); for(i=1; i<=m; i++) /* 求 m! */ x = x * i; for(i=1; i<=n; i++) /* 求 n! */ y = y * i; for(i=1; i<=m-n; i++) /* 求 (m-n)! */ z = z * i; cmn = x / (y * z); printf("Cmn = %d", cmn); }
(4)当被调函数运行结束返回主调函数时,形参指针 变量自动释放。注意:此时释放的是形参所占的临时存 储空间,而不是释放实参所对应的存储空间。
8.3.4 函数参数的传递方式
【例8-7】
void swap(int *a, int *b) { int t; printf("(2)子函数开始时: *a=%d, *b=%d\n",*a,*b); t = *a; *a = *b; *b = t; printf("(3)子函数结束时: *a=%d, *b=%d\n", *a, *b); } void main( ) { int x = 2, y = 4; printf("(1)子函数调用前: x=%d, y=%d\n", x, y); swap(&x, &y); printf("(4)子函数调用后:x=%d, y=%d\n", x, y); }
函数定义:即定义函数的功能。未经定义的函数不能使用。 函数调用:即执行一个函数,调用函数时,程序跳转到被调用 函数的第一句开始执行,执行至被调用函数的最后一句,然后 程序返回调用该函数处继续向下执行。 函数声明:即通知编译系统该函数已经定义过了。 对于库函数,不需写出函数声明,只需在程序前面用 #include包含具有函数原型的头文件即可; 对于自定义函数,如果函数定义的位置在函数调用之后 ,则前面必须有函数说明;如果函数定义在函数调用之前,则 可以省略函数声明。
8.3.4 函数参数的传递方式
2.地址传递方式
函数的“地址传递方式”顾名思义,就是指实参 与形参之间传递的不是普通数值,而是地址值。
当函数的实参是“地址”时,对应的形参是同类 型的指针变量。发生函数调用时,实参将它的地址 值复制一份给形参指针变量,形参指针变量便指向 了实参所对应的存储单元。于是在被调函数内部, 可以借助形参指针变量间接地修改主调函数中实参 所对应存储单元中的数值。
是否可以减少 相似类型的操 作而使程序变 得简洁?
8.1 问题的提出和程序示例
使用函数的作用及好处:
可以方便地使用其他人已经编写的代码,就像我 们调用系统提供的库函数一样。 可以在后续程序中使用自己编写的代码,避免重 复劳动。 实现结构化程序设计的基本思想。
8.2 函数定义 8.2.1 函数基础知识
8.3.4 函数参数的传递方式
地址传递过程如下: (1)发生函数调用时,系统临时创建形参指针变量; (2)实参将其地址值复制一份给形参,于是形参指针 变量与实参变量间建立了“指向”关系,即形参指针变 量指向了实参所对应的存储空间; (3)函数调用过程中,利用形参指针变量间接地引用 或修改实参对应存储空间中的数值;
8.3.2 函数的调用与返回值
当被调用函数运行结束时,通常函数的调用者 会获得一个确定的值,称为函数的返回值。 情况一:被调用函数运行结束后,返回确定值给 函数调用处,即返回值类型为非空的情况。 情况二:被调用函数运行结束后,对调用者不返 回任何值,即返回值类型为空的情况。 被调用函数的值只能通过return语句返回给调 用者,return语句的一般格式有三种: return (表达式); return 表达式; return;
8.2.2 函数定义的一般形式
函数返回值类型 函数名([类型名 参数1,类型名 参数2],…) { 函数体语句 } 说明: 1. 函数定义由两部分组成——函数首部、函数体。 2. 函数返回值类型是安徽给主调函数的结果的类型。注意: (1)如果不指定,即缺省,就是 int;(2)如果函数无返 回值类型,则说明为void。 3. 函数名:一个有效的标识符。在同一程序中,函数名唯一。 4. 参数列表:表示接收传递进来的数据。 如果有多个参数, 则参数之间用逗号隔开。注意:必须为每个参数指定数据类 型。 5. {}内括起来的是函数体,由说明部分和执行语句组成,它决 定了该函数所要实现的功能。 注意:函数的定义不允许嵌套。
8.3.2 函数的调用与返回值
1.函数的返回值类型为非空
这类函数在定义时,函数首部的“函数返回值类型”需明 确指出数据类型,可以是C语言的基本数据类型、指针类型、 结构体类型等。此时要求被调用函数中使用上述return语句 的前两种格式“return(表达式);”或“return 表达式;”向调用 者返回一个确定值,并且return语句中“表达式”的类型必 须与函数定义时“函数返回值类型保持一致。
8.2.4 有参函数与无参函数 例8.2 定义一个函数fun( ),其功能是用“*”号打 印直角三角形,三角形的行数由函数的形参决定,
程序运行结果: * *** ***** ******* *********
8.2.4 有参函数与无参函数
2、无参函数
函数返回值类型 函数名( ) { 函数体语句 } 括号不可省
8.3 函数调用
8.3.1 函数调用的一般形式
函数定义好后,只有被调用了才能实现该函数的功能,一 个不被调用的函数是没有任何作用的。只有发生了函数调用, 函数体内的语句才会被执行。 函数调用的一般形式: 函数名([实际参数表])
•调用有参函数时,函数名 后的括号内需写入实参。 如:fun(5) •调用无参数时,函数名后 需跟一对空括号。 •用户自定义函数都需“先 定义后调用”,main( )函 数可以调用其它函数,但 不能被其它函数调用,其 它函数之间可以相互调用。
8.3.4 函数参数的传递方式
【例8-6】 #include <stdio.h> void swap(int a, int b) { int t; printf("(2)子函数开始时: a=%d, b=%d\n", a, b); t = a; a = b; b = t; printf("(3)子函数结束时: a=%d, b=%d\n", a, b); } void main( ) { int x = 2, y = 4; printf("(1)子函数调用前: x=%d, y=%d\n", x, y); swap(x, y); printf("(4)子函数调用后: x=%d, y=%d\n", x, y); }
8.2.3 形参与实参的关系
1、形参 函数定义时,函数名后面小括号内的参数就是形 式参数,简称形参。 2、实参 函数调用时,函数名后面小括号内的参数就是实 际参数,简称实参。 实参是有确定值的常量、变量 或表达式。 函数调用时,实参将它的值复制一份给形参,我 们称实参向形参传值。当程序进入到被调用函数内部 时,实参就不能使用了。
【例8-5】定义一个函数max( ),求两个整数中的较大数 。
注意:被调函数体中可以有多个return 语句,但只有其中的一个会被执行, 一旦程序执行到其中某一个return语句, 表示被调用函数运行在此结束,流程 便返回到主调函数。
8.3.3 函数调用的一般形式
在C语言中,调用函数主要有以下三种方式: 1.函数语句形式 C语言中的函数可以只进行某些操作而不返回函数值,这 时的函数调用可作为一条独立的语句。 2.函数表达式形式 函数作为表达式的一项,出现在表达式中,以函数返回值 参与表达式的运算。 3.函数实参形式 函数作为另一个函数调用的实际参数出现。这种情况是把 该函数的返回值作为实参进行传送。
8.3.3 函数调用的一般形式
1.函数语句形式举例 #include <stdio.h> void max(int a, int b) { int m; m = (a > b) ? a : b; printf("%d \n", m); return; } void main(void) { int x = 5, y = 9; max(x, y); }
8.3.2 函数的调用与返回值
【例8-4】定义一个函数max( ),求两个整数中的较大数,并在 main( )函数中调用max( )函数。