第9章 结构体、共用体和枚举类型
- 格式:ppt
- 大小:166.50 KB
- 文档页数:20
C语言实验9~12答案实验9 指针概念及指针与一维数组的关系任务一1.阅读分析下面程序,写出运行结果,理解指针概念及“*”与“&”的含义。
a=100,b+2=12*p1=100,*p2+2=122.上机验证下列程序的运行结果。
a=5,b=7,p1=1245052,p2=1245048&a=1245052,5,&b=1245048,b=73.分析下面程序,并运行,理解用指针变量进行输入、输出。
输入并验证输出结果即可4.编写程序,实现从键盘输入两个数,输出时从大到小排列(利用指针概念)。
5,9a=5,b=9max=9,min=5任务2 使用指针访问一维数组1.阅读分析下面程序,写出运行结果,理解指针与数组关系。
s=92.阅读下面程序,理解指针、数组的多种表示法。
a[0]=1p[0]=1*(p+0)=1*(a+0)=1a[1]=2p[1]=2*(p+1)=2*(a+1)=2a[2]=3p[2]=3*(p+2)=3*(a+2)=33.在空格中填上语句,以实现字符串复制的功能。
*p2=*p1;p2++;p1++;4.下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存放在数组c中,当一个字符串结束时停止比较,此时将另一个字符串剩下的字符直接放在数组c的后面,填空完成该程序。
#include#includevoid main( ){int k=0;char a[80],b[80],c[80]={'\0'},*p,*q;p=a;q=b;gets(a);gets(b);while(*p!='\0'&&*q!='\0'){if(*p>*q) c[k]=*p;else c[k]=*q;p++;q++;k++;}if(*p!= '\0') strcat(c,p);else strcat(c,q);puts(c );}5.指出下面程序的问题所在(输出a数组的10个元素),理解指针与数组下标的关系及指针变化情况。
第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。
A) p=2*(int *)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int));C) p=(int *)malloc(2*2); D) p=(int*)calloc(2,sizeof(int));✧考点:动态存储分配函数。
✧分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void * calloc(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。
malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。
答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。
✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。
A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。
✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。
它应该等于结构体每个成员所占的字节数之和。
m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。
C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
《大学计算机技术基础》教学大纲——C语言程序设计课程编号:110333理论学时: 60学分: 4授课对象: 全院一年级学生课程类型:必修课考核方式: 考试一、课程性质与任务课程性质:《C语言程序设计》课程是面向全校的工科类非计算机专业计算机基础教学的公共基础课程之一。
本课程的任务是结合一般数值计算向学生介绍计算机程序设计的基本知识,使学生掌握C语言的基本内容及程序设计的基本方法与编程技巧,了解进行科学计算的一般思路,培养学生应用计算机解决和处理实际问题的思维方法与基本能力,为进一步学习和应用计算机打下基础。
《C语言程序设计》课程教学的主要任务是让学生们了解如何让计算机系统工作的编程方式,掌握实现该编程方法的基本步骤,要求学生能够编写基本的基于字符模式下的应用程序。
二、与其他课程的关系该课程是一门高等学校非计算机专业文理科必修的课程之一。
它是非计算机专业的计算机应用先导课程。
三、课程教学要求的层次通过本课程的学习,使学生了解算法的基本概念,会根据算法编制相应的程序,并初步掌握软件开发的基本技巧,同时也为计算机等级考试和后继课程的学习打下坚实的基础。
本课程的教学主要是让学生们了解如何让计算机系统工作的编程方式,掌握实现该编程方法的基本步骤,要求学生能够编写基本的基于字符模式下的应用程序。
四、教学方法和教学形式建议《C程序设计》是一门应用性很强的课程,它所涉及的内容也十分广泛。
整个教学过程由授课、实验、作业和自学四个环节组成。
授课尽可能采用现代教学手段——多媒体教学形式。
作业未完成者不得参加考试。
实验成绩与期末考试成绩共同评定为课程总成绩。
五、学时分配理论学时分配如下:第1章概述教学目的与要求:1.了解 C 语言的历史和特色。
2.了解 C 程序的构成及其编译和链接方法。
3.掌握 C 程序上机步骤。
教学内容:1.1 C语言的发展历程1.2 算法1.3 简单的C程序1.4 结构化程序设计1.5 C语言程序的运行环境重点:C程序结构,熟悉上机环境TC。
链表操作及实现共用体union枚举类型enum typedef 第9章建立自己的数据类型(4)建立自己的数据类型(复习回顾上次课的内容:◆链式存储◆构建静态链表◆构建动态链表◆链表的操作●插入●删除●带/不带头节点◆听说上机课时体现学计算机的男人都是好男人?今天上机的时候,听一同学发牢骚,说学计算机的男人一定是好人,因为我们每天都对着代码在问自己:“我**的又错在哪儿了?”建立含有n个结点的动态链表例:建立一个如图所示的简单链表,它由n个结点组成,结点数据是一个整数,由用户输入。
链表建立完成后,要求输出各结点中的数据。
n个结点datanext建立含有n 个结点的动态链表data nexthead p1p2解题思路:一般需三个指针,各司其职•head ,指向表头结点(领头羊)•p1,临时指针变量(负责收集收集新结点)•p2,临时指针变量(断后,负责链接新结点)1.若n=0,空链表,直接head=NULL 。
2.若n=1,由malloc 新建一个结点✓p1收集这个结点,故指向它✓这个结点是表头,故head 也指向它✓这个结点还是表尾,故p2也指向它data nexthead p1p2解题思路:一般需三个指针,各司其职3.若n ≥ 2,重复:由p1指向malloc 新建的结点,p2将这个结点连进链表(p2->next=p1),然后p2指向这个新的表尾(p2=p1)data nexthead p2data nextp1data nexthead p2data nextp1data nextheaddata nextp1p2建立含有n 个结点的动态链表解题思路:一般需三个指针,各司其职4.如果链表已经满足结束条件(即达到事前预定的长度,或接收到一个结束标记),那么循环操作就将终止。
新的结点不再被链入结点中。
这个时候,将NULL 赋给p2->next, 表示该结点为整个链表的尾结点。
建立含有n 个结点的动态链表data nextdataNULLp1p2data nextdata nextheaddata next建立含有n个结点的动态链表 源代码1.#include <stdio.h>2.#include <stdlib.h>3.#define LEN sizeof(struct node)4.struct node5.{6.int data;7.struct node * next;8.};9.struct node * initialize(int num)10.{11.struct node * head = NULL;12.struct node * p1, * p2;13.if (num > 0)14.{15.p1 = p2 = (struct node*)malloc(LEN); //表头结点16.scanf("%d", &p1->data);17.head = p1;18.while(num > 1)19.{20.p1 = (struct node*)malloc(LEN);21.scanf("%d", &p1->data);22.p2->next = p1;23.p2 = p1;24.num--;25.}26.p2->next = NULL;27.}28.return head;29.}30.void traverse(struct node * head)31.{32.struct node *p;33.printf("The link nodes are: ");34.p = head;35.if (head != NULL)36.{37.do{38.printf("%d ", p->data);39.p = p->next;40.} while(p != NULL);41.}42.printf("\n");43.}44.int main()45.{46.int numOfNodes = 0;47.struct node * head48.scanf("%d", &numOfNodes);49.head = initialize(numOfNodes);50.traverse(head);51.return0;52.}在链表中插入结点(一般情况)假设存储元素e 的结点为s ,要插入到结点p和p->next 之间a i a i+1*p *p->next p p->nextes*sp->nextp->nexts->next a ia i+1*p*p->nextpes*ss->nextp->nextp->nexts->nexta ia i+1*p*p->nextpes*ss->next 正确的做法:s->next=p->next; p->next=s;错误的做法:p->next=s; s->next=p->next;在链表头插入结点(特殊情况)假设存储元素e 的结点为s ,要插入到指针head 指向的表头结点之前a 1表头结点heades*s方法一:s->next = head; head = s;方法二(增加头结点L )s->next=L->next; L->next=s;a 1表头结点heades*ss->nexta 1*L头指针Les*s1.struct node * insertNode(struct node * head, int position, int value)2.{3.struct node *p, *s;4.p = head;5.if(position == 0) //在表头插入,方法一需要这个分支,方法二则不需要6.{7.s = (struct node*)malloc(LEN);8.s->data = value;9.s->next = p;10.head = s;11.}12.else13.{14.while(position>1 && p->next != NULL) //找到插入位置15.{16.position--;17.p = p->next;18.}19.s = (struct node*)malloc(LEN);20.s->data = value;21.s->next = p->next;22.p->next = s;23.}24.return head;头结点头结点的特点◆位于表头结点之前;◆链表中第一个数据仍存放在表头结点中,头结点的数据域不存放信息或存放其他信息。
9.4课后习题9.4.1项目练习一.练习目的1.进一步巩固结构体类型和共用体类型的定义与引川2.进一步复习链表的建立过程3.进一步巩固枚举类型的定义与枚举元索的引用方法二.练习内容1.用结构体变量表示平面上的一个点(横坐标和纵坐标),输入两个点,求两点Z间的距离。
#include "stdio.h"include "math.h"struct pin{float x;float y;}a,b;main(){printfC*请输入a点的横纵坐标:“);scanf("%f%f"/&a.x,&a.y);printfC'Xn");printf("请输入b点的横纵坐标scanf(,,%f%f"/&b.x,&b.y);printf("\n n);printff"输出a、b 两点之间的距离是:%f",sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));getch();}2.16个同学围成一-圈,从笫1个人开始按1、2、3的顺序报号,凡报到3者退出圈子。
找出最后昭在圈子中的人原来的序号。
ttinclude "stdio.h"#include "stdlib.h"#define LEN sizeof(struct game)struct game{int num;struct game *next;};struct game *creat(){ struct game *head,*p;head=p=(struct game *) malloc(LEN);p->num=l;int i=2;while(i<=16){ p・>next=(struct game *) malloc(LEN);p->next-:>nu m=i;i++;p=p->n ext; }p->next=head; return(head);} struct game *delete(struct game *head) { struct game*pl=head,*p2=head,*x; int k=l;while(pl->next!=pl) {if(k==3) {x=pl; pl=pl->next;p2・>n ext=pl; free(x); x=NULL; k=0;} else {P2=pl; pl=pl->next;}pl->next=NULL;return(pl);}void print(struct game *head){ struct game *p;p=head;while(p!=NULL) {printf("%d\t",p->num);p=p->n ext;}printfCAn");}main(){ struct game *pt,*p;pt=creat();p=delete(pt);print(p);free(p);getch();}3.建立一个链表,每个结点包含的成员为:职工号、工资。
C语言:结构体、共用体、枚举、类型重定义、位运算、预处理C语言除了提供象int,long,float,double、和char这样的基本数据类型之外,还支持数组、Struct、Union、和Enum数据类型。
结构体类型(struct)我们一个数组包含多个成员(元素),每个成员具有相同的数据类型。
一个结构体也能包含多个成员,但每个成员的数据类型可以不同。
例如:(a) struct Student { char Name[10], char Sex, int Age ;float Height; }(b) struct Student S1;这里,(a)定义了struct类型Student,而(b)定义了S1是Student类型的变量。
Student类型包含四个成员:Name,Sex,Age,Height,它们的数据类型分别是字符数组、字符型、整型、和浮点型。
以下是另一例子:struct DATE { int YEAR; int MONTH, int DAY ;}struct DATE d1,d2;注意,struct类型是泛指,而Student和DATE是两个特定的结构体类型。
当定义一结构体类型时,你要指定它的结构体类型名,当定义变量时,要同时写上关键字struct和结构体类型名。
定义结构体类型:我们struct 结构体类型名 { 成员1;成员2;…;成员n; }每一个成员可以是基本类型的变量、数组或指针变量,也可以是其他结构体或共用体类型的变量、数组或指针。
成员虽然不能是本结构体类型的变量,但可以是本结构体类型的指针变量。
定义结构体类型的变量:struct 结构体类型名变量名1,变量名2,…定义结构体变量时也可初始化,如:struct Student S1,S2={ “Zhang San”, ‟M‟, 19, 1.76 },S3;引用结构体类型的变量:(1)引用其成员:结构体变量名。
成员如 strcpy(,”Li Si”); S1.Sex=‟F‟; S1.Age=18; S1.Height=1.72;[0]=‟L‟; [1]=‟i‟; [2]=‟u‟; [3]=‟\0‟;S2.Height = S1.Height + 0.01 ;(1)引用整体就用变量的名字。