C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构

合集下载

c程序设计 第九章 结构体

c程序设计 第九章 结构体

一、概念题二、判断题1. 结构体中的成员不可以单独使用(F)。

2. 成员名可以与程序中的变量名相同,二者不代表同一对象(T)。

3. 不能将一个结构体变量作为一个整体进行输入输出(T)。

4. 结构体变量所占内存长度是各成员占的内存长度之和(T)。

5. 结构体中的成员不可以单独使用(F )。

9. 一个结构体变量的指针就是该变量所占内存段的起始地址(T)。

10. 用结构体变量作实参,形参也必须是同类型的结构体变量(T )。

三、单选题1. 设变量定义如下,则对其中的结构分量num正确的引用是( )。

struct student {int num ;char name[20];float score;} stud[10];A. stud[1].num=10;B. student.stud.num=10;C. struct.stud.num=10;D. struct student.num=10;2. 已知职工记录描述如下,设变量w中的“生日”是“1993年10月25日”,下列对“生日”的正确赋值方式是()。

struct worker{int no;char name[20];char sex;struct birth{ int day; int month; int year;}a;};struct worker w;A day=25;month=10;year=1993;B w.birth.day=25; w.birth.month=10; w.birth.year=1993;C w.day=25; w.month=10; w.year=1993;D w.a.day=25; w.a.month=10; w.a.year=1993;3. 对于以下的变量定义,语句( )在语法和语义上都是正确的。

struct node {float x,y;char s[10];} point={1,2,”abc”},*p;A. *p=point;B. p=&point;C. point=p;D. p->x=point.y;4. 设有以下语句typedef struct S{ int g;char h;} T;则下面叙述中正确的是()。

C语言程序设计第9章

C语言程序设计第9章
09
第9章 指针
能够正确而灵活地运用指针,可以使程序 简洁、紧凑、高效。
第9章 指针
知识目标
要求学生掌握指针的定义与使用 要求学生掌握指针的运算 要求学生掌握指向数组的指针 要求学生掌握指向结构体的指针 要求学生掌握指向函数的指针
技能目标
能够熟练使用数组指针解决多个数 据处理问题。 能够利用指针操作结构体,对结构 体成员进行访问。 能够使用指针解决函数相关问题, 提高执行效率。
9.4 指针与函数
9.4.3 指向函数的指针变量作函数参数
假设函数A在运行过程中要根据不同情况多次调用下列函数: B、C、D和E之一来协助它进行处理,按照以往的做法是,用条件选 择语句将上述函数写在函数A的函数体中的多个位置上,这是一种 笨拙的、灵活性较差的处理方法。现在,可以通过使用函数指针 作为函数参数的方式向函数A传递其它函数的入口地址,从而灵活 地调用其他函数。
struct 结构类型名 *指针变量名
2.当结构体指针指向一个结构体变量时,该指针变量的值就是该 结构体变量的起始地址。用地址运算符“&”就可获得结构变量 的指针。一般形式为:
指针变量名=&结构体变量名;
9.3指针与结构体
9.3.2 指向结构体数组的指针
类似于用指向结构体变量的指针,间接访问结构体成员一样, 也可以用指向结构体数组及其元素的指针来处理结构体数组。可 以把结构体数组的数组名赋值给结构体指针,也就是把结构体数 组的首地址赋值给结构体指针。
9.3指针与结构体
9.3.3 指向结构体的指针作为函数参数
类似于普通指针变量作为函数参数一样,用指向结构的指针 变量作实参时,是属于“地址传递”方式。
9.3指针与结构体
9.3.4 使用指针优化学生成绩的录入和浏览模块

C语言程序设计基础第9章结构

C语言程序设计基础第9章结构

double average;
/*平均成绩*/
};/* 不要遗漏分号 */
struct 结构名 {
类型名 结构成员名1; 类型名 结构成员名2; ••• 类型名 结构成员名n;
};
关键字struct和结构名一起,构成一个数据类型 结构的定义以分号结束,被看作一条语句(结构定义语
句) 一个结构体所占的字节数可以sizeof运算符确定
不同长度、不同维度的数组是不同的类型
结构类型
用户自定义的数据类型
struct student {
struct是C语言关键字 student是用户定义的标识 符,作为结构的名字,必须 和struct联合使用。
int num;
/*学号*/
char name[10]
/*姓名*/
int computer, english, math; /*成绩*/
/*姓名*/
int computer, english, math; /*成绩*/
double average;
/*平均成绩*/
};
#define MaxSize 50 struct student students[MaxSize]; int count = 0;
MaxSize是一个宏,定义为50定用义结了构一st个ru数ct组ssttuuddeenntts
for( i=0; i<count; i++ ) print_student( students[i] );
}
1 单独定义
struct student
{
int num;
/*学号*/
char name[10]
/*姓名*/
int computer, english, math; /*成绩*/

C语言程序设计 第9章 文件

C语言程序设计 第9章  文件

9.3 文件的顺序读写
❖ 【例9.4】fputs函数和fgets函数的使用。
9.3 文件的顺序读写
❖ 9.3.3 fprintf函数和fscanf函数 ❖ fprintf与fscanf函数为格式读写函数,与printf、scanf类似,fprintf与
fscanf用于从文件中读取指定格式的数据和把指定格式的数据写入文件,这 是按数据格式要求进行文件的输入/输出。其一般形式为: ❖ fscanf(fp,format,args); ❖ fprintf(fp,format,args); ❖ 其中,fp为文件指针,format为格式控制字符串,args为输入或输出的地 址列表。 ❖ 例如,若文件指针fp已指向一个已打开的文件文本,a、b分别为整型变量 ,则以下语句从fp所指向的文件中读入两个整数放入变量a和b中。 ❖ fscanf(fp,”%d%d”,&a,&b); ❖ 又如,若文件指针fp已指向一个已打开的文件文本,x、y分别为整型变量 ,则以下语句将x、y中的数据按%d的格式输出到fp所指向的文件中。 ❖ fprintf(fp,"%d%d",&a,&b);
本章小结
❖ 本章主要介绍了以下内容。 ❖ (1)文件的概念 ❖ 介绍了文件及文件指针的基本概念,以及文件的打开与关闭
函数fopen、fclose等。 ❖ (2)文件的顺序读写 ❖ 主要介绍了从文件中输出字符、字符串,以及将字符、字符
串写入文件的函数。 ❖ (3)随机文件的读写及错误检测 ❖ 主要介绍了随机文件读写的应用,以及文件的出错检测。
❖ 在实际读写文件中,人们常常希望能直接读到某一数据 项而不是按物理位置顺序逐个读下来。这种可以任意指 定读写位置的操作称为文件的随机读写。可以想象,只 要能移动位置指针到所需要的地方,实现文件的定位, 就能实现随机读写。

谭浩强C程序设计第三版清华第9章预处理 1 ppt课件

谭浩强C程序设计第三版清华第9章预处理 1 ppt课件
17
例9.3 使用带参的宏 运行情况如下:
#include <stdio.h> #define PI 3.1415926
#define S(r) PI*r*r
r=3.600000 area=40.715038
void main()
{float a,area;
a=3.6;
area=S(a);
printf("r=%f\narea=%f\n",a,area);
7
9.1 宏定义
9.1.1 不带参数的宏定义 宏定义一般 #define 标识符 字符串 形式为: 例如:# define PI 3.1415926
• 宏定义的作用是在本程序文件中用指定的标识符PI 来代替“3.1415926”这个字符串,在编译预处理时 ,将程序中在该命令以后出现的所有的PI都用 “3.1415926”代替。这种方法使用户能以一个简单 的名字代替一个长的字符串。
14
说明:
(8) 对程序中用双撇号括起来的字符串内的字符,即 使与宏名相同,也不进行置换。
(9) 宏定义是专门用于预处理命令的一个专用名词, 它与定义变量的含义不同,只作字符替换,不分 配内存空间。
15
9.1.2 带参数的宏定义
作用:不是进行简单的字符串替换,还要 进行参数替换。 带参数的宏定义一般形式为:
运行情况如下:
L=18.849556 S=28.274333
13
经过宏展开后,printf函数中的输出项L被展开为: 2*3.1415926*3.0
S展开为 3.1415926*3.0*3.0
printf函数调用语句展开为:
printf(“L=%F\NS=%f\n”, 2*3.1415926*3.0,3.1415926*3.0*3.0);

C语言程序设计(何钦铭_颜晖_主编)课件

C语言程序设计(何钦铭_颜晖_主编)课件

区分数字字符和数字
'1'
1
则:'A'+1=66,对应字符 'B'
a
25
转 义 字 符
反斜杠后跟一个字符或数字
字符常量,代表一个字符
'\n' '\101' '\x41' 'A'
所有字符都可以用转义字符表示
a
26
6.2.2 变量
在程序运行过程中,其值可以被改变的量。
变量必须先定义,后使用 定义变量时要指定变量名和数据类型 变量应该先赋值,后引用
a
30
6.3.1 整型数据的输入输出
printf (格式控制, 输出参数1, ... , 输出参数n); scanf (格式控制, 输入参数1, ... , 输入参数n);
格式控制说明 %…
十进制 八进制 十六进制
int
%d
%o
%x
long
%ld
%lo
%lx
unsigned
%u
%o
%x
unsigned long %lu
数据长度 16或32位
16位 32位
a
10
基本数据类型-整型
扩展的整数类型:short long unsigned [int]
有符号整型 无符号整型
数据长度
int
unsigned [int]
16或32位
short [int] unsigned short [int] 16位
long [int] unsigned long [int]
以小数或指数形式输入一个双精度浮点数
输出 printf()

C语言第9章结构体、共用体、枚举

C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类

C语言程序设计实例教程 第3版教学课件9-1

C语言程序设计实例教程 第3版教学课件9-1

printf(" \n ODD文件的内容是: \n" );
while((number=getw(f2))!=EOF )/* getw函数将整数逐个读出,直到文件结尾*/
printf("%4d",number);
/*显示文件内容*/
printf("\n EVEV文件内容是: \n" );
while((number=getw(f3))!=EOF)
【相关知识】
fscanf ( )
格式化方式从文件读出一组数据
fread()
从文件读出一组数据
fwrite()
将一组数据写到文件中
fgets()
从文件读取字符串到数组
fputs()
将字符串写入文件
fseek ( )
将文件内当前访问位置移动到需要的位置
ftell ( ) 给出文件内当前位置相对于文件开始处的偏移量
if((fp=fopen("test","r"))==NULL) /*以只读r的方式打开文件 test*/
{ printf("不能打开文件!\n");
exit(0); }
else
fgets(s,n,fp); /*使用fgets函数从fp所指文件中读n个字符存入s数组中*/
printf("%s",s);
if(number==-1) break ; /*键盘输入数字-1则终止循环*/
putw(number,f1 ) ; }
/*数据写入f1指定的文件中*/
/*putw将输入的一组整数逐个写入文件DATA中,以-1结束,并关闭DATA*/
fclose(f1) ;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第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<>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",&,,&,&,&;math_sum+=;english_sum+=;computer_sum+=;}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 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。

解答:struct student{int num;char name[10];int computer, english, math;};struct student s[5]={{30101, "张一",69,75,84 },{30132, "李二",80,8 5,90},{40231, "王三",71,91,74},{40754, "赵四",65,76,87},{50426, "刘五",81,92,73}};【练习9-5】参考例 9-2,输入并保存 10 个学生的成绩信息,分别输出平均成绩最高和最低的学生信息。

解答:#include<>struct student{int num;char name[10];int computer,english,math;double average;};int main(void){int i,n,max,min;struct student students[50];printf("Input n:");scanf("%d",&n);for(i=0;i<n;i++){printf("Input the info of No.%d:\n",i+1);printf("number:");scanf("%d",&students[i].num);printf("name:");scanf("%s",&students[i].name);printf("math score:");scanf("%d",&students[i].math);printf("english score:");scanf("%d",&students[i].english);printf("computer score:");scanf("%d",&students[i]puter);students[i].average=(students[i].math+students[i].english+stu dents[i]puter)/;}max=min=0;for(i=1;i<n;i++){if(students[max].average<students[i].average) max=i;if(students[min].average>students[i].average) min=i;}printf("max_average_infortmation:\n");printf("number:%d,name:%s,math:%d,english:%d,computer:%d,average: %.2lf\n",students[max].num,students[max].name,students[max].math,stud ents[max].english,students[max]puter,students[max].average);printf("min_average_information:\n");printf("number:%d,name:%s,math:%d,english:%d,computer:%d,average: %.2lf\n",students[min].num,students[min].name,students[min].math,stud ents[min].english, students[min]puter, students[min].average);return 0;}【练习9-6】定义一个 struct student 类型的结构指针,用其实现一个学生信息的输入和输出。

解答:struct student{ /* 学生信息结构定义 */ int num; /* 学号 */char name[10]; /* 姓名 */int computer, english, math ; /* 三门课程成绩 */double average; /* 个人平均成绩 */}s, *p;p = &s;scanf("%d%s%d%d%d", &p->num, p->name, &p->math, &p->english, &p->computer);【练习9-7】改写例 9-3 中的函数 update_score( ),将第一个形参改为结构数组形式。

解答:int update_score(struct student s[],int n,int num,int course,int score) {int i,pos;for(i=0;i<n;i++)if(s[i].num==num)break;if(i<n){switch(course){case 1:s[i].math=score; break;case 2:s[i].english=score; break;case 3:s[i]puter=score; break;}pos = i;}elsepos = -1;return pos;}习题9一、选择题1.下面定义结构变量的语句中错误的是 D 。

A.struct student{ int num; char name[20]; } s;B.struct { int num; char name[20]; } s;C.struct student{ int num; char name[20]; }; struct student s; D.struct student{ int num; char name[20]; }; student s;2.如果有定义语句:struct {int x, y; } s[2] = { { 1, 3 }, { 2, 7 } };则语句:printf(“%d\n”, s[0].y/s[1].x ); 输出结果为 B 。

A.0 B.1 C.2 D.33.根据下面的定义,能打印出字母 M 的语句是 C 。

struct person{char name[10];int age;} c[10] = { “John”, 17, “Paul”, 19, “Mary”, 18, “Adam”, 16 };A.printf(“%c”, c[3].name); B.printf(“%c”, c[3].name[1]);C.printf(“%c”, c[2].name[0]); D.printf(“%c”, c[2].name[1]);4.设有如下定义,则对 data 中的 a 成员的正确引用是 B 。

struct sk{ int a; float b; } data, *p=&data;A.(*p). B.(*p).aC.p-> D.5.对于以下结构定义,(*p)->str++中的++加在 D 。

struct { int len; char *str; } *p;A.指针 str 上 B.指针 p 上C.str 指向的内容上 D.语法错误二、填空题1.“.”称为成员_(分量)_运算符,“->”称为_指向_运算符。

2.完成下列程序,该程序计算 10 名学生的平均成绩。

#include <>#include <>struct student {int num;char name[20];int score;};struct student stud[10];int main(void){int i , sum = 0 ;for(i = 0; i < 10; i++){scanf("%d%s%d ",&stud[i].num,_stud[i].name_,&stud[i].score);sum += stud[i].score;}printf("aver = %d \n", sum/10);return 0;}3.下列程序读入时间数值,将其加 1 秒后输出,时间格式为:hh: mm: ss,即小时:分钟:秒,当小时等于 24 小时,置为 0。

相关文档
最新文档