C++ 第七章
C语言程序设计实训教程第7章 指 针
12
2)指针与一维数组 【例 7.6】 下列程序的运行结果是( )。[读 程序写结果,重庆市 2001年第 2次等级考试]
13
14
3)指向字符的指针
15
16
17
18
4)指针与二维数组
19
5)指向一维数组的指针(行指针) 【例 7.18】 对 int(﹡p)[5];的正确描述 是( )。[多选题,重庆市 2003年第 1次等级考 试] A. p是数组名 B. p是指针变量名 C. p数组中有 5个元素 D .p指向一个包含 5个元素的整型数组 E. p是一个整型数组 答案:B D
22
7)指针数组 当数组的元素类型为指针时,叫做指针数组。 【例 7.21】 下列程序的运行结果是( )。 [读程序写结果,重庆市 2004年第 2 次等级考试]
23
8)指针做函数参数 指针做函数参数的主要目的是利用在函数中, 利用指针去操作主调函数中的变量。 【例 7.22】 下列程序在数组中同时查找最大 值下标和最小值下标,并分别存放在 main函数的 变量 max和 min中,请填空。[读程序写结果,重 庆市 2003年第 2次等级考试]
10
【例 7.3】 由于指针的数据类型实际上是指定 指针所能指向对象的数据类型,所以不同数据类型 的指针变量不能相互赋值。( )[判断题,重庆市 2005年第 2次等级考试] 答案:对 分析:在某些特定情况下,可以在不同数据类 型指针之间通过强制类型转换赋值。
11
【例 7.4】 若有定义:long intj,﹡p;,则操 作 j=(long int)p;是合法操作。( )[判断题, 重庆市 2004年第 1次等级考试] 答案:对 【例 7.5】 在 C 语言中,程序
C程序设计(第四版)第7章结构体与共用体
7.1.1
结构体类型的定义
结构体在说明和使用之前,必须先由用 户自己定义。结构体定义的一般形式如下: struct 结构体名 { 成员类型说明符 成员项1; 成员类型说明符 成员项2; …… 成员类型说明符 成员项n; };
其中: 1、struct是C语言中定义结构体的关键字。 2、成员类型说明符是说明每个成员项的数 据类型,可以是基本数据类型,也可以是数组 类型,还可以是另一个已定义的结构体类型。 3、成员名可以和程序中的变量名相同,两 者不代表同一对象。 4、要注意,在结构体定义中的右括号后应 该有分号。
7.1.6
指向结构体的指针
一个结构体类型的数据在内存中都占据一定 的存储空间,我们可以定义一个指针来指向该 结构体类型的数据,该指针变量称为指向结构 体的指针,简称之为结构体指针。我们可以通 过结构体指针来访问结构体类型的数据,如结 构体变量、结构体数组。指向结构体的指针变 量说明形式如下: struct 结构体类型名 *结构体指针变量名;
main() { struct student stu1; struct student *p; p=&stu1; stu1.num=50201001; gets(); stu1.score=89.5;
printf(“No:%ld\nName:%s\nScore:%4.1f\n”,stu1 .num,,stu1.score); printf(“No:%ld\nName:%s\nScore:%4.1f\n”,(*p). num,(*p).name,(*p).score);
3、结构体数组应用举例 【例7-2】现有三个候选人(每个候选人的ID 号分别是1、2、3),选举人投票进行选举, 编写程序统计出每个候选人的得票结果。 程序如下: #define NUM 30 #include <stdio.h> struct elector { int id; char name[20]; int count;
第七章 维生素C
(二)还原作用
1.保护巯基和使巯基再生
已知许多含巯基的酶当其在体内发挥催化作用 时需要有自由的-H,而维生素C能使酶分子中-SH 保持在还原状态,从而保持酶有一定的活性,维 生素C还可使氧化型的谷胱甘肽(G-S-S-G)还原为 还原型的谷胱甘肽(G-SH),使- SH得以再生,从 而保证谷胱甘肽的功能。
C H 2O H L - ly x o n ic a c id
C H 2O H 2 ,3 - d ik e t o - L g lu c o n ic a c id
木糖酸
来苏糖酸
C H 2O H C H HO C C C H 2O H L - x y lo s e O O OH O C C OH OH +
O x y g e n S o c ie t y E d u c a tio n P ro g ra m
维生素C是通过浓度扩散或主动运输机理 被小肠吸收进入血液循环中,摄入量的多少 可由血清维生素C水平的高低来反映.
• 维生素C在体内的保存率与剂量有关,剂 量愈小,在体内保存率愈高,可以完全 不从尿排出。 摄取100mg,可以完全保留 在 体 内。 180mg 时 保留 76%, 1.5g,保 留 50%,大剂量时未被吸收者残留在肠内, 影响渗透压,可引起腹泻。
O
-2H
+2H
O=C O=C O=C HC
O=C-OH O +H2O O=C 氧化 O=C HC-OH
HC HO-CH CH2OH
维生素C
HO-CH CH2OH
脱氢维生素C
HO-CH CH2OH
2,3-二酮古洛糖酸
COOH COOH
草酸
OH HO O O -e -2 H
C 课后习题答案第七章
C++作业答案第7章继承7.1 选择题1.在c++中,类与类之间的继承关系具有( c )。
(a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性2.下列关于类的继承描述中,( a,b )是错误的。
(a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数(b) 派生类也是基类,所以基类具有派生类的全部属性和方法(c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法(d) 一个基类可以有多个派生类,一个派生类可以有多个基类3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员6.不论派生类以何种方式继承基类,都不能使用基类的( b )。
(a) public 成员 (b)private成员(c) protected成员 (d)public 成员和protected成员7.下面描述中,错误的是( b, c )。
(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问(b) 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问(c) 在基类定义的public和protected成员在保护继承的派生类中不可见(d) 在派生类中不可见的成员要变成可访问的需进行访问声明8.在c++中,不能被派生类继承的函数是( b,c )。
(a) 成员函数 (b)构造函数(c) 析构函数 (d)静态成员函数9.在创建派生类对象时,构造函数的执行顺序是( d )。
C语言第7章_指针
退出
指针运算
算术运算 int *p, a[10]; p = a; p++; /*p的值增加多少?*/ 的值增加多少? 的值增加多少 指针的加减运算是以其指向的 指针的加减运算是以其指向的 类型的字节长度为单位的 类型的字节长度为单位的
6000 6001 6002 6003 6004 6005 6006
swap函数的几种错误形式(3/3) 函数的几种错误形式 3/3)
指针p没有确切地址 指针 没有确切地址 void Swap(int *p1, int *p2) { int *p; /*指针 未初始化*/ /*指针p未初始化*/ 指针p未初始化 *p = *p1; *p1 = *p2; *p2 = *p; }
退出
寻址方式
如何读写内存中的数据? 如何读写内存中的数据? 两种寻址方式 直接(寻址)访问 直接(寻址)
通过变量地址直接存取变量内容
0 ┇ 3 6 9 ┇ 3010 2000 变量 i_pointer 变量 i 变量 j 变量 k 内存用户数据区
通过变量的地址访问变量所在的 2000 存储单元
2002 2004
退出
指针运算
赋值运算 指针在使用前一定要赋值 为指针变量赋的值必须是一个地址 main() { int *p; scanf("%d",p); … }
错! 但TC下不报错 下不报错 VC下报错 下报错
main() { int a,*p=&a; scanf("%d",p); … }
退出
指针与函数
指针既然是数据类型,自然可以做函数参数和返回值 指针既然是数据类型, 的类型 指针做函数参数的经典例子: 指针做函数参数的经典例子:
C语言程序设计基础 第7章
模块化程序设计的基本要点是贯彻“自顶向下,逐步细 化”的思想方法,即将一个复杂功能的编程问题,划分成若 干个功能相对简单的子问题。这种划分可以逐层进行,直到 便于编程为止。在C语言中,一个模块的功能由一个函数来 实现。顶层函数是主函数main( )。功能模块与C语言函数的 关系如图7.1所示。
图7.1 模块与函数
第7章 函数——模块化程序设计方法的实现
7.1 模块化程序设计方法与函数 7.2 函数的定义 7.3 函数的调用 7.4 函数调用的条件与函数声明 7.5 函数的嵌套调用和递归调用 7.6 变量的作用域与函数间的数据传递 7.7 用函数实现模块化程序设计 实训任务十三 熟悉函数的功能及其使用方法 实训任务十四 学习模块化程序设计的方法
② 函数功能实现部分,是一个程序段,要依据实现某 种功能的算法进行设计。
③ 函数体最后使用一个“return(返回值);”语句,括 号中的返回值是一个需传带给主调函数的数据对象。如果没 有返回值,可以不要这个语句。VC++ 6.0系统中提倡在 main( )函数体后使用一个“return 0;”语句,表示正常返 回系统,否则会出现警告。如果函数体仅是一对花括号,没 有任何语句,就是空函数。空函数一般是无参函数。
7.2 函 数 的 定 义
怎样定义函数?定义函数要考虑哪些问题?
定义函数要解决两个方面的问题:一是函数间的接口问 题,二是功能实现问题。接口问题包括如何被上层函数调用 ,调用时需传递什么数据,调用返回时需传带什么数据。功 能实现问题就是如何实现模块的过程算法。
函数定义的一般形式为
基类型符 函数名(类型符形式参数 1,类型符形式参数 2,…) {
函数体内数据对象定义或声明部分; 函数功能实现部分; return(返 回值); }
C语言各章节知识点总结
C语言各章节知识点总结C语言是一种通用的高级编程语言,广泛应用于计算机软件开发。
下面是C语言各章节的知识点总结:第一章:C语言简介-C语言起源和发展-C语言的特点和优势-C语言的应用领域-C语言的编译和执行过程-编写第一个C语言程序第二章:C语言基础-C语言的基本数据类型-变量和常量-运算符和表达式- 控制语句(if语句、switch语句、for循环、while循环)-输入和输出-函数的定义和调用第三章:C语言数组-数组的定义和初始化-一维数组和多维数组-数组的应用(排序、查找、统计)- 字符串处理函数(strlen、strcpy、strcat)-字符串的输入和输出第四章:C语言指针-指针的概念和作用-指针变量和指针的运算-指针和数组的关系-指针作为函数参数-动态内存分配第五章:C语言函数高级特性-递归函数-函数指针和回调函数-变量的作用域和存储类别-预处理指令-多文件程序设计第六章:C语言结构体和共用体-结构体的定义和初始化-结构体的嵌套和数组-共用体的定义和应用-枚举类型的定义和使用- typedef的使用第七章:C语言文件处理-文件的概念和分类-文件的打开和关闭-文件的读取和写入-文件的定位和修改-错误处理和异常处理第八章:C语言位运算和位字段-位运算的概念和操作-位掩码和位移操作-位字段的定义和使用-位字段的对齐和优化-位操作的应用第九章:C语言高级编程技术-内存管理和动态内存分配-系统调用和库函数的使用-异常处理和错误处理-多线程编程和进程间通信-嵌入式系统开发技术总结:C语言是一门基础且强大的编程语言,掌握C语言的各章节知识点对于学习和使用C语言是非常重要的。
掌握C语言基础知识可以编写简单的程序,掌握指针和数组等知识可以处理更加复杂的数据结构和算法,掌握高级特性可以编写更加高效和模块化的程序。
通过学习C语言,可以为后续学习其他编程语言打下坚实的基础。
C语言程序设计知识点—第7章 函数
第 7 章:函数
主讲教师:杨剑
1. 本章目标
熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法
2. 函数机制的优点
~6~
C 语言程序设计知识点
主讲教师:杨剑
[练习]若各选项中所用变量已正确定义,函数 fun 中通过 return 语句返回一个函数值,
以下选项中错误的程序是( )
A.main()
{……x=fun(2,10); ……}
float fun(int a,int b){……}
B.float fun(int a,int b){……}
int data; scanf(“%d”,&data); printf(“%d”,add(data)); return 0;
~5~
C 语言程序设计知识点
主讲教师:杨剑
} int add(____②_____) {
int i,sum=0; for(i=1;i<=n;i++)
sum=sum+i; _______③__________ } 答案: ①int add(int); ②int n ③retrun sum;
{
printf(“%d\n”,F(3+5));
}
[练习]程序运行后的输出结果是( )
A.192 B.29
C.25
D.编译出错
答案:D
在 C 语言中,函数返回值的类型最终取决于( )
A.函数定义时在函数首部所说明函数类型
B.return 语句中表达式值的类型 C.调用函数时主调函数所传递的实参类型
第七章 维生素C
Cu+
Cu2+
Semidehydroascorbyl Radical
Ascorbate
4.有机药物或毒物的羟化
合成4-氨基联苯胺及2-萘胺的工人易患膀胱癌。 因而怀疑这些物质的代谢产物,如邻羧或羟胺基的 化合物,在尿中可能为膀胱的致癌物质,
一定量维生素C存在时,可以阻止其氧化.
亚硝酸盐可以与仲或叔胺作用,在胃中形成亚硝 胺,这类物质有致癌作用。在食物添加剂及杀虫剂 中常含有这些胺类。维生素C可与胺竞争,与亚硝 酸盐作用,因而阻止亚硝胺的产生。但它须与亚硝 酸盐同时存在于胃中,其浓度以分子量计,应为亚 硝酸盐的2倍。
O DHA O
OH
O OH C
HO
O
O +H2O
CO CO
O DHA O
H C OH HO C H
CH2OH
2,3-diketOH +
HO C H CH2OH
L-xylonic acid
木糖酸
O OH C
HO C H H C OH
HO C H CH2OH
• 在正常情况下,维生素C体库为1500mg,其大 小不随身体大小而变化,分布在体内水溶液部 分,以肾上腺、胰、脾、唾液及睾丸的浓度最 高。
• 人类维生素C的排出途径主要为尿,大便中维 生素C及通过呼吸道(以CO2及水形式)排出 均甚少。
第二节 维生素C 的生理功能
(一)参与体内的羟化反应
1.胶元的合成
1497年葡萄牙领航员围绕好望角航行到在印度马拉巴尔 海岸,在航海途中他的160个船员因坏血病有100人丧生。
1519年,葡萄牙航海家麦哲伦率领的远洋船队从南美洲 东岸向太平洋进发。三个月后,有的船员牙床破了,有的船 员流鼻血,有的船员浑身无力,待船到达目的地时,原来的 200多人,活下来的只有35人,人们对此找不出原因.
《C语言程序设计教程》(第三版)李凤霞 主编——第七章习题答案
习题七一、单项选择题1、以下程序的输出结果是()。
main(){int i,k,a[10],p[3];k=5;for(i=0;i<10;i++)a[i]=i; /*a: 0 1 2 3 4 5 6 7 8 9 */for(i=0;i<3;i++)p[i]=a[i*(i+1)]; /*p:0 2 6 */for(i=0;i<3;i++)k+=p[i]*2; /* k=5+4+12=21 */printf(“%d\n”,k);}A)20 B)21 C)22 D)232、以下正确的数组定义语句是()。
A)int y[1][4]={1,2,3,4,5}; B)float x[3][ ]={{1},{2},{3}}; C)long s[2][3]={{1},{1,2},{1,2,3}}; D)double t[ ][3]={0};3、以下程序段的输出结果是()。
main(){int m[3][3]={{1},{2},{3}}; m 1 0 0 n 1 2 3int n[3][3]={1,2,3}; 2 0 0 0 0 0printf(“%d\n”,m[1][0]+n[0][0]); 3 0 0 0 0 0printf(“%d\n”,m[0][1]+n[1][0]);}A)0 B)2 C)3 D)10 3 0 24、以下程序的输出结果是()。
main(){int i,x[3][3]={1,2,3,4,5,6,7,8,9}; 1 2 3for(i=0;i<3;i++)printf(“%d,”x[i][2-i]); 4 5 6} 7 8 9A)1,5,9 B)1,4,7 C)3,5,7 D)3,6,95、对以下程序从第一列开始输入数据:2473↙,程序的输出结果是()。
#include “stdio.h”main(){char c;while((c=getchar())!=’\n’){switch (c-‘2’){case 0:case 1:putchar(c+4);case 2:putchar(c+4);break;case 3:putchar(c+3);default:putchar(c+2);}}}A)668977 B}668966 C}66778777 D)66887666、不能正确为字符数组输入数据的是( )。
C语言课件—编译预处理
#include <stdio.h> #define sqr(x) ((x)*(x))
#include "powers.h" #define cube(x) ((x)*(x)*(x))
void main() { int n调;试方法
#define quad(x) ((x)*(x)*(x)*(x))
print1f.("n编u辑mpboerw\teersx.ph2,保\t e存xp3\t exp4\n");
❖宏体及各形参外一般应加括号()
例 #define POWER(x) x*x
x=4; y=6;
z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) 宏展开: z=((x+y)*(x+y));
((x)*(x))
Macro Definition
例. 带参数的宏与函数实现同样功能
第七章 编译预处理
概述 宏定义 文件包含 条件编译
Next chapter
Introduction
作用:编译程序的一部分,将特殊命令扩展到程 序中,生成扩展C源程序
种类
❖宏定义 #define ❖文件包含 #include ❖条件编译 #if--#else--#endif
格式:
❖“#”开头 ❖占单独书写行 ❖语句尾不加分号; ❖定义位置任意,决定其作用域
print2f.("-将---p\to-w---e\tr-s--.h--文\t-件---存--\n放"到); 某一目录下
for(n3=. 1;编n<辑=fMmAaXin;.nc,++将) powers.h包含进来
C语言_7函数
2 必须有某个结束递归条件:这个结束条件是递归 分解的终止点。
例 1. 用递归法求 n! n! =n*(n-1)! n! =1 当n>1时 时 当n=0或n=1时 或 时
例 2.用递归函数计算Febonacci序列的第n项值 函数原形是:f(n)=f(n-1)+f(n-2)
例 3.用递归函数计算xn的值
§4 函数的调用 一、 函数调用的一般形式 函数名(实参表列) 函数名(实参表列) 说明 : 调用无参函数,虽然不需要实参,但括号不能省。 调用无参函数,虽然不需要实参,但括号不能省。
调用函数的方式有三种: 调用函数的方式有三种: 函数语句、函数表达式、函数参数。 函数语句、函数表达式、函数参数。 如: ShowInfor(); m=max(a,b)*20; cout<<max(a,b);
实验题 1.找出1000之内的所有“完数”,判一个数是否 为完数用函数实现 。 2 .编写程序,从键盘上读入一个整数m,然后输出 这个数的全部素数因子,其中判断是否为素数用函 数实现。
§7.5 函数的嵌套调用
函数的嵌套调用
main 函数 ① 调用 a 函数 ⑨ ⑧ 结束 函数不能嵌套定义函数 ②
main
a d e f e
b g h i g
c j
C 程序结构
§2 函数定义
无参函数 形式: 函数名() 形式:函数类型 函数名() { 函数体 } 注意: 注意: 如果一个函数不需要返回值, 如果一个函数不需要返回值,认为函数类型是void类 型 例如: 定义一个ShowInfor函数,显示如下信息: 函数, 例如: 定义一个 函数 显示如下信息: ********* int a,b,c; cin>>a>>b; c=max( a ,b ); cout<<c<<‘\n’; }
第七章(c语言谭版)函数
调用a
调用b
}
}
}
例: 用弦截法求方程的根。
x3–5x2+16x–80=0 方法如下: (1) 取两个不同点x1、x2,如果f(x1)和f(x2)符号相反, 则(x1,x2)区间内必有一个根。如果f (x1)与f (x2)同 符号,则应改变x1、x2,直到f (x1)、f (x2)异号为 止。注意x1、x2的值不应差太大,以保证(x1, x2) 区间只有一根。
float x1, x2; { int i; float x, y, y1; y1=f(x1); do { x=xpoint(x1, x2);
y=f(x);
if (y*y1>0) /*f(x)与f(x1)同符号。*/ {y1=y; x1=x;} else x2=x; } while (fabs(y)>=0.0001); return (x); }
个return.
返回值类型为函数类型。 一般return中的返
回值类型应与函数定义时的类型一致, 不一致时,
以函数定义类型为准。
5. 调用函数应对被调用函数的返回值类型作出说 明:(函数名相当于一变量,但应有所区别)
类型符 函数名( );
它不同于函数的定义(功能定义) 例: 求二实数之和 main ( ) { float add( ); float a, b, c;
hanoi(n, one, two, three)
表示n个盘子从one塔借助于two塔(空)移至three塔。 调用时塔用字符常量'A' ,' B ', ' C '表示。
§7.5 数组作为函数参数
分为两种情况: 1. 数组元素作为实参
c语言 第7章 数组(4)
void sort( int b[],int k) {int i,j,t,flag; for (j=0;j<k-1;j++) {flag=0; for (i=0;i<k-j-1;i++) if (b[i]>b[i+1]) { t=b[i]; b[i]=b[i+1]; b[i+1]=t; flag=1; } if (flag==0) break; } }
上一页 下一页
for(i=0;i<26;i++) if(c[i]) {if(m%8==0)putchar('\n');m++; printf("%c: %-d ",i+'A',c[i]); } printf("\n"); for(i=0;i<26;i++) if(c[i+26]) {if(m%8==0)putchar('\n');m++; printf("%c: %-d ",i+'a',c[i+26]); } }
第四讲:
第 七 章 数组
7.1 7.2 7.3 7.4 7.5 7.6 一维数组 二维数组 数组的应用 字符数组与字符串 数组作为函数的参数 程序举例
7.5 数组作为函数的参数
数组作为函数参数主要有两种情况: 数组元素作为函数的实参:这种情况与普通变量 作实参一样,是将数组元素的值传给形参。形 参的变化不会影响实参数组元素,我们称这种 参数传递方式为“值传递”。 数组名作实参:要求函数形参是相同类型的数 组或指针,这种方式是把实参数组的起始地址 传给形参数组,形参数组的改变也是对实参数 组的改变,称这种参数传递方式为“地址传 递”。
C语言第七章
4、strcpy(字符数组1,字符数组2):
例:main()
把“字符串2”的值拷贝到“字符串1”中。
{char str1[10]; char str2[ ]="Chinese"; strcpy(str1,str2); puts(str1); } 输出: Chinese 说明: (1)字符数组1的长度不应小于字符串2的长度。 (2)“字符数组1”必须写成数组名形式,“串2”可以是字符数 组名,也可以是一个字符串常量。如:strcpy(str1,“China”); (3)拷贝是‘\0‟一起拷贝。 (4)不能用赋值语句将一个字符常量或字符数组直接赋给一个 字符数组。 (5)可以用strcpy函数将字符串2中前面若干个字符拷贝到字符 数组1中去。 例如:strcpy(str1,str2,2);
3、部分元素赋值: int a[3][4] = {{1},{5},{9}}; 1 0 0 0 5 0 0 0 9 0 0 0
仅对a[0][0]、a[1][0]、a[2][0]赋值,编译器自动为未赋
值元素指定初值0。
4、如果对全部元素赋初值,则第一维的长度可以 不指定,但必须指定第二维的长度。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 与下面定义等价: int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
[例6.6]: main() { int i; char c1[ ] = {"How are you?"}; char c2[15]; scanf("%s", c2 ); for(i=0;i<12;i++) printf("%c", c2[i] ); printf("%s", c1 ); } 程序运行时:输入:abcdefghijklmno 结果:abcdefghijklHow are you?
C语言程序设计-第7章 练习题
一、单项选择题1题目1在结构类型的定义中,对于类型标识符后的定义体,使用的起止标记符是一对()。
a. 中括号b. 圆括号c. 圆括号d. 尖括号题目2假定一个结构类型的定义为“struct A{int a,b; double c;};”,则该类型的长度为()。
a. 12b. 10c. 8d. 16题目3假定一个结构类型的定义为“struct D{int a; D* next;};”,则该类型的长度为()。
a. 4b. 8c. 12d. 16题目4假定有结构定义“struct Book{char title[20]; double price;};”,则不正确的语句定义为()。
a. struct Book b=("C++ Programming",27.0)b. struct Book* c[10]c. struct Book d[2][3]d. struct Book a[5]题目5假定有结构定义“struct Book{char title[20]; double price;};”,则正确的语句定义为()。
a. struct Book *x=malloc(6*sizeof(struct Book *));b. struct Book *x=malloc(6,sizeofstruct (Book));c. struct Book *x=calloc(6*sizeof(struct Book));d. struct Book *x=calloc(6,sizeof(struct Book));题目6假定要访问一个结构指针变量x中的数据成员a,则表示方法为()。
a. x(a)b. x{a}c. x.ad. x->a题目7与结构成员访问表达式p->name等价的表达式为()。
a. (*p).nameb. *(p->name)c. d. *题目8在一个链表中,每个结点必然存在着一个指向自身结点类型的指针域,用来保存下一个结点的()。
C语言程序设计教程 第七章 课后习题参考答案
}
}
void print(int a[][N],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
}
void sum(int a[][N],int b[][N],int m,int n)
print(a,size);
reverse(a,size);
printf("\n");
return 0;
}
void print(int a[],int n)
{
int i;
printf("原:\n");
for(i=0;i<n;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
for(i=0;i<n;i++)
input(b,M,N);
print(b,M,N);
printf("A+B=\n");
sum(a,b,M,N);
return 0;
}
void input(int a[][N],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
c语言试题7
第七章结构型、共同型和枚举型一、单项选择题1.对以下结构定义:struct { int len; char *str ; } *p; 表达式(*p)->str++中的++加在(D)A. 指针str上B. 指针p上C. str所指的内容上D. 表达式语法有错2.存放100个学生的数据,包括学号,姓名,成绩。
在如下的定义中,不正确的是(B)。
A.struct student { int sno; char name[20]; float score } stu[100];B.struct student stu[100] { int sno; char name[20]; float score } ;C.struct { int sno; char name[20]; float score } stu[100];D.struct student { int sno; char name[20]; float score } ; struct student stu[100];3.设有定义语句struct { int x ; int y ;} d[2]={{1,3}, {2,7}};则printf (“%d\n”, d[0].y/d[0].x*d[1].x ); 的输出是(D)。
A.0 B.1 C.3 D.64.设有定义语句enum team {my, your = 4, his, her=his+10} ;则printf(“%d,%d,%d,%d\n”, my, your, his, her) ;的输出是(D)。
A.0,1,2,3 B.0,4,0,10 C.0,4,5,15 D.1,4,5,15 5.以下对枚举类型名的定义中正确的是(B)。
A.enum a={one, two, three}; B.enum a {a1, a2, a3} ;C.enum a={‘1’, ’2’, ’3’} ; D.enum a {“one”, ”two”, ”three”} ;6.若有如下定义,则printf (“%d\n”, sizeof (them)) ; 的输出是(C)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.4 用typedef声明新的类型名
说明: (1)typedef可以声明各种类型名,但不能用来定义变量 。用typedef可以声明数组类型、字符串类型,使用比 较方便。 (2)用typedef只是对已经存在的类型增加一个类型名, 而没有创造新的类型。 (3)当在不同源文件中用到同一类型数据(尤其是像数 组、指针、结构体、共用体等类型数据)时,常用 typedef声明一些数据类型,把它们单独放在一个头文 件中,然后在需要用到它们的文件中用#include命令 把它们包含进来,以提高编程效率。 (4)使用typedef有利于程序的通用与移植。有时程 序会依赖于硬件特性,用typedef便于移植。
24
7.2 共用体类型
有时需要使几种不同类型的变量存放到同一段 内存单元中。例如,可把一个整型变量、一个 字符型变量、一个双精度型变量放在同一个地 址开始的内存单元中(见下图)。 union 共用体类型名 {
成员表列
};
25
7.3 枚举类型
如果一个变量只有几种可能的值,可以定义为 枚举(enumeration)类型。所谓“枚举”是指将 变量的值一一列举出来,变量的值只能在列举 出来的值的范围内。 声明枚举类型的一般形式为 enum 枚举类型名 { 枚举常量表列 }; enum weekday{sun,mon,tue,wed,thu, fri,sat};
6
7.1.2 定义及其初始化
前面只是指定了一种结构体类型,它相当于一 个模型,但其中并无具体数据,系统也不为之 分配实际的内存单元。为了能在程序中使用结 构体类型的数据,应当定义结构体类型的变量 ,并在其中存放具体的数据。 1.定义结构体类型变量的方法 (1)先声明结构体类型再定义变量 如上面已定义了一个结构体类型Student,可以 用它来定义结构体变量。如 Student student1, student2;
20
7.1.5 指向结构体变量的指针
所有结点(结构体变量)都是在程序中定义的, 不是临时开辟的,也不能用完后释放,这种链 表称为静态链表。对各结点既可以通过上一个 结点的next指针去访问,也可以直接通过结构 体变量名a,b,c去访问。 动态链表则是指各结点是可以随时插入和删除 的,这些结点并没有变量名,只能先找到上一 个结点,才能根据它提供的下一结点的地址找 到下一个结点。只有提供第一个结点的地址, 即头指针head,才能访问整个链表。如同一条 铁链一样,一环扣一环,中间是不能断开的。
如上面的student1和student2都是student类型 的变量,可以这样赋值:student1= student2; 例如,student1.num表示结构体变量student1 中的成员的值,如果student1的值如图7.2所示 ,则student1.num的值为10001。
(2)可以引用一个结构体变量中的一个成员的值
11
7.1.2 定义及其初始化
2.结构体变量的初始化
和其他类型变量一样,对结构体变量可以在定 义时指定初始值。 也可以采取声明类型与定义变量分开的形式, 在定义变量时进行初始化。
12
7.1.3 结构体变量的引用
在定义了结构体变量以后,当然可以引用这个变 量。 (1) 可以将一个结构体变量的值赋给另一个具 有相同结构的结构体变量。
21
7.1.6 结构体数据作函数参数
(1)用结构体变量名作参数; (2)用指向结构体变量的指针作实参,将结构 体变量的地址传给形参; (3)用结构体变量的引用作函数形参。 优缺点: (1)直观易懂,效率不高; (2)效率较高,程序不够直观,较难懂; (3)兼有前两项的优点。
第七章
自定义数据类型
第七章 自定义数据类型
7.1 结构体类型
7.2 共用体类型 7.3 枚举类型 7.4 用typedef声明新的类型名
2
7.1 结构体类型
7.1.1 结构体概述 7.1.2 定义及其初始化 7.1.3 结构体变量的引用 7.1.4 结构体数组 7.1.5 指向结构体变量的指针 7.1.6 结构体类型数据作为函数参数 7.1.7 用new和delete运算符进行动态分配和 撤销存储空间
定义结构体数组 和定义结构体变量的方法相仿,定义结构体数 组时只需声明其为数组即可。
16
7.1.4 结构体数组
结构体数组的初始化与其他数据类型的数组初 始化一样。 一般形式是在所定义的数组名的后面加上 ={初值表列}; sty[3]={ {10101,″Li Lin″,′M′,18,87.5,″103, Beijing Road″}, {10102,″Zhang Fun″,′M′,19,99,″130 , Shanghai Road″}, {10104,″Wang Min″, ′F′,20,78.5, ″1010, Zhongshan Road″}};
27
7.4 用typedef声明新的类型名
除了用以上方法声明结构体、共用体、枚举等 类型外,还可以用typedef声明一个新的类型名 来代替已有的类型名。如 typedef int INTEGER; //指定用标识符 INTEGER代表int类型 typedef float REAL; //指定用REAL代表 float类型 这样,以下两行等价: ①int i,j; float a,b; ②INTEGER i,j; REAL a,b;
14
7.1.3 结构体变量的引用
(4)不能将一个结构体变量作为一个整体进行输 入和输出。只能对结构体变量中的各个成员分 别进行输入和输出。 (5)对结构体变量的成员可以像普通变量一样进 行各种运算(根据其类型决定可以进行的运算 种类)。 (6)可以引用结构体变量成员的地址,也可以引 用结构体变量的地址。
22
7.1.7 new和delete
在软件开发过程中,常常需要动态地分配和撤 销内存空间,例如对动态链表中结点的插入与 删除。在C语言中是利用库函数malloc和free来 分配和撤销内存空间的。C++提供了较简便而功 能较强的运算符new和delete来取代malloc和 free函数。注意:new和delete是运算符,不是 函数,因此执行效率高。虽然为了与C语言兼容 ,C++仍保留malloc和free函数,但建议用户不 用malloc和free函数,而用new和delete运算符 。
(2)在声明类型的同时定义变量
这种形式的定义的一般形式为 Struct 结构体名 { 成员表列 } 变量名表列;
9
7.1.2 定义及其初始化
(3)直接定义结构体类型变量
其一般形式为: struct //注意没有结构体类型名 { 成员表列 } 变量名表列;
这种方法虽然合法,但很少使用。提倡先定义 类型后定义变量的第(1)种方法。
26
7.3 枚举类型
关于枚举类型的说明: (1)对枚举元素按常量处理,故称枚举常量。 (2)枚举元素作为常量,它们是有值的,C++ 编译按定义时的顺序对它们赋值为0,1,2,3,„ 。也可以在声明枚举类型时另行指定枚举元素 的值。 (3)枚举值可以用来做判断比较。 (4)一个整数不能直接赋给一个枚举变量。
2.用结构体变量和指向结构体变量的指针构成 链表 链表是一种常见的重要的数据结构。下图表示 最简单的一种链表(单向链表)的结构。
链表有一个“头指针”变量,图中以head表示 ,它存放一个地址。该地址指向一个元素。链 表中的每一个元素称为“结点”,每个结点都 应包括两个部分:一是用户需要用的实际数据 ,二是下一个结点的地址。
15
7.1.4 结构体数组
一个结构体变量中可以存放一组数据(如一个 学生的学号、姓名、成绩等数据)。如果有10 个学生的数据需要参加运算,显然应该用数组 ,这就是结构体数组。结构体数组与以前介绍 过的数值型数组的不同之处在于:每个数组元 素都是一个结构体类型的数据,它们都分别包 括各个成员项。
声明一个结构体类型的一般形式为 Struct 结构体类型名 {成员表列};
5
7.1.1 结构体概述
结构体类型名用来作结构体类型的标志。上面 的声明中Student就是结构体类型名。大括号内 是该结构体中的全部成员(member),由它们组 成一个特定的结构体。上例中的num, name, sex, score等都是结构体中的成员。在声明一 个结构体类型时必须对各成员都进行类型声明 ,即: 类型名 成员名; 每一个成员也称为结构体中的一个域(field)。 成员表列又称为域表。成员名的定名规则与变 量名的定名规则相同。
3
7.1.1 结构体概述
编一程序,对学生相关属性进行输入输出操作 。(学生的属性包括:学号,姓名,性别,年 龄,分数和地址) 变量? 数组? 有时需要将不同类型的数据组合成一个有机的 整体,以供用户方便地使用。这些组合在一个 整体中的数据是互相联系的。在一个组合项中 包含若干个类型不同(当然也可以相同)的数 据项。C和C++允许用户自己指定这样一种数据 类型,它称为结构体。它相当于其他高级语言 中的记录(record)。
10
7.1.2 定义及其初始化
关于结构体的几点说明: (1)不要误认为凡是结构体类型都有相同的结构 (2)类型与变量是不同的概念,不要混淆。 (3)对结构体中的成员(即“域”),可以单独使 用,它的作用与地位相当于普通变量。关于对成 员的引用方法见7.3节。 (4)成员也可以是一个结构体变量。 (5)结构体中的成员名可以与程序中的变量名相同 ,但二者没有关系。例如,程序中可以另定义一个 整型变量num,它与student中的num是两回事,互不 影响。
引用结构体变量中成员的一般方式为 结构体变量名.成员名