C语言程序与设计_第8章_源程序代码.doc_第1页
C语言程序与设计_第8章_源程序代码.doc_第2页
C语言程序与设计_第8章_源程序代码.doc_第3页
C语言程序与设计_第8章_源程序代码.doc_第4页
C语言程序与设计_第8章_源程序代码.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

源程序代码和习题答案说明:1)以下给出的所有源程序代码都在Visual C+ 6.0环境中运行验证过;若需要,可以将每一题的代码复制到C语言环境中; 2)为了书上印出的源程序代码格式清楚,在源程序代码中增加了一些西文空格; 3)用P标明了一些源程序代码的页码(红色字); 4)为方便读者查对,习题答案直接写在题中(红色字)第8章 结构体、共用体和链表P241:【例8-1】利用结构体类型编写程序,实现输入、存储两个学生的个人信息(信息包括姓名和年龄),交换两个学生的信息,计算两人的平均年龄,然后输出交换和计算的结果。#include struct stu_xx char name10; int age; ; main( ) struct stu_xx s1 , s2 , t ; float ave_age ; scanf(%s%d , , &s1.age ) ; /* 输入第1个学生信息 */ scanf(%s%d , , &s2.age ) ; /* 输入第2个学生信息 */ t = s1; s1 = s2 ; s2 = t ; /* 交换两个学生的信息 */ ave_age = ( s1.age + s2.age ) / 2.0f ; /* 计算两人的平均年龄 */ printf(%s %d t %s %d t , , s1.age , , s2.age ) ; printf( ave_age = %.2f , ave_age ) ;三、任务的实现方法1:使用初始化方法。程序如下:# include struct stu_xx /* 定义结构体类型 */ char num5 , name10 ; float score 4 ; ;main( ) struct stu_xx s1 = 3001 , zhang , 98.0 , 78.0 , 76.0 , 80.0 ; printf( Num t Name t Cht Math t En t C n ) ; /* 输出表头 */ printf(%s t %s t %-6.0f t %-6.0f t %-6.0f t %-6.0f n , s1.num , , s1.score0 , s1.score1 , s1.score2 , s1.score3 ) ; 方法2:从键盘输入数据。程序如下:(定义结构体类型同上,此处略) # include main( ) struct stu_xx s1 ; /* 定义结构体变量 */ printf( 请输入Num Name Score (4) : n ) ; /* 输出提示信息 */ scanf(%s%s%f%f%f%f , s1.num , , &s1.score0 , &s1.score1 , &s1.score2 , &s1.score3 ) ; printf( Num t Name t Cht Math t En t C n ) ; /* 输出表头*/ printf(%s t %s t %-6.0f t %-6.0f t %-6.0f t %-6.0f n , s1.num , , s1.score0 , s1.score1 , s1.score2 , s1.score3 ) ;运行结果:运行程序,显示:请输入Num Name Score (4) : 3001 zhang 98 78 76 80输出:Num Name Ch Math EnC3001 zhang 98 78 7680【例8-2】设学生基本信息有学号、姓名、出生日期(年、月、日)和3科成绩(英语、数学、C语言),分别用初始化和输入的方法保存并输出一个学生的基本信息。分析: 学生的出生日期包含了3个数据,可定义为一个日期型结构体类型。3科成绩也包含了3个数据,也可定义为一个成绩结构体类型。 学生的基本信息有4项,将其定义为学生基本信息结构体类型。保存1个学生信息,需要1个同类型结构体的变量。方法1:使用初始化的方法保存并输出一个学生的基本信息。程序如下:struct date /* 定义日期结构体类型date */ int year , month , day ; ;struct score /* 定义成绩结构体类型score */ int en , math , c ;struct stu_xx /* 定义学生基本信息结构体类型stu_xx */ char num5 , name10 ; struct date d ; /* d成员为结构体类型date */ struct score s ; /* s成员为结构体类型score */;# include main( ) struct stu_xx s1 = 3001 , Wang , 1989, 1 , 3 , 98 , 99 , 80 ; printf( Num t Name t year t month t day t en t math t C n ) ; printf(%s t %s t %d t %d t %d t %d t %d t %d n , s1.num , , s1.d.year , s1.d.month , s1.d.day , s1.s.en , s1.s.math, s1.s.c ) ; 方法2:使用从键盘输入数据的方法保存并输出一个学生的基本信息。程序如下:(定义结构体类型同上,此处略)# include main( ) struct stu_xx s1 ; /* 定义结构体变量 */ scanf(%s%s%d%d%d%d%d%d , s1.num , , &s1.d.year , &s1.d.month , &s1.d.day , &s1.s.en , &s1.s.math , &s1.s.c ) ; printf( Num t Name t year t month t day t en t math t C n ) ; printf(%s t %s t %d t %d t %d t %d t %d t %d n , s1.num , , s1.d.year , s1.d.month , s1.d.day , s1.s.en , s1.s.math , s1.s.c ) ; 运行程序,输入:3001 zhang 19891 3 98 99 80输出:Num Nameyear month date enmath C3001 zhang 19891 3 98 99 80【例8-3】编写程序,利用结构体数组存储和显示3个学生的信息。方法1:使用初始化方法。程序如下:# include struct stu_xx /* 定义结构体类型 */ char num5 , name10 ; int age ; ;main( ) struct stu_xx s3 = 3001 , Sun , 18 , 3002 , Li , 19 , 3003 , Zhao , 20 ; /*定义结构体数组并初始化*/ int i ; printf( Num t Name t age n ) ; /* 输出表头 */ for ( i = 0 ; i 3 ; i + ) /* 输出3个学生信息 */ printf( %s t %s t %d n , si.num , , si.age ) ;方法2:从键盘输入数据。程序如下:(定义结构体类型略)# include main( ) struct stu_xx s3 ; /* 在主函数中定义结构体数组 */ int i ; printf( please input Num Name Age : n ) ; /* 输出提示信息 */ for ( i = 0 ; i 3 ; i + ) /* 输入3个学生信息 */ scanf(%s%s%d , si.num , , &si.age ) ; printf( Num t Name t Age n ) ; /* 输出表头 */ for ( i = 0 ; i 3 ; i + ) /* 输出3个学生信息 */ printf(%s t %s t %d n , si.num , , si.age ) ; 运行程序,显示:please input Num Name Age :输入:3001 Sun183002 Li193003Zhao20输出:NumNameAge3001 Sun183002 Li193003Zhao20【例8-4】使用指向结构体变量的指针变量来访问结构体变量的各个成员。程序如下:# include struct stu_xx char num5 , name10 ; int age ; ; main( ) struct stu_xx s = 3001 , Sun , 18 , *p = &s ; printf( Num : %s t , p-num ) ; printf( Name : %s t , ) ; printf( Age : %d n , ( *p ).age ) ;运行结果:Num : 3001 Name : Sun Age : 18【例8-5】使用指向结构体数组的指针来访问数组元素。程序如下:# include struct stu_xx char num5 , name10 ; int age ; ; main( ) struct stu_xx s3 = 3001 , Sun , 18 , 3002 , Li , 19 , 3003 , Zhao , 20 ; struct stu_xx *p ; int i ; printf( Num t Name t Age n ) ; /* 输出表头 */ /* 程序段1:输出3个学生信息 */ p = s ; for ( i = 0 ; i num , p-name , p-age ) ; /* 程序段2:输出3个学生信息 */ p = s ; for ( i = 0 ; i num , ( p + i )-name , ( p + i )-age ) ;【例8-6】用指向结构体的指针变量作函数参数。程序如下:# include struct stu_xx char num5 , name10 ; int age ; ; void output ( struct stu_xx *p ) /* 函数形参为struct stu_xx 类型的指针变量 */ printf( %s t %s t %dn , p-num , p-name , p-age ) ; main( ) struct stu_xx s3 = 3001 , Sun , 18 , 3002 , Li , 19 , 3003 , Zhao , 20 ; int i ; printf( Num t Name t Age n ) ; for ( i = 0 ; i 3 ; i + ) output( &si ) ; /* 调用语句。函数实参为struct stu_xx 类型的数组元素地址 */三、任务的实现1)利用结构体数组处理多名学生信息(2)实现的程序:# include # define N 3struct stu_xx /* 学生结构体 */ char num5 , name10 ; float score 4 ; ; main( ) struct stu_xx sN ; int i ; float aveN , sumN; for ( i = 0 ; i N ; i+) scanf( %s%s%f%f%f%f , si.num , , &si.score0 , &si.score1 , &si.score2 , &si.score3 ) ; printf(Numt Namet cht matht en t ct avet sumn ) ; for ( i = 0 ; i N ; i + ) sumi= si.score0 + si.score1 + si.score2 + si.score3; avei = sumi / 4.0 ; /* 计算平均分 */ printf(%s t %s t %-4.1f t %-4.1f t %-4.1ft %-4.1f , si.num , , si.score0 , si.score1 , si.score2 , si.score3 ) ; printf(t %-4.1f , sumi ) ; /* 输出该学生的总分 */ printf(t %-4.1f n , avei ) ; /* 输出该学生的平均分 */ 运行程序,输入的数据及输出结果如图8-4 所示。图8-4 【项目8-任务2】运行结果2)使用函数处理多名学生信息(2)实现的程序:# include # define N 3struct score /* 定义成绩结构体类型score */ float ch , math , en , c;struct stu_xx char num5 , name10 ; struct score s ; ; void output ( struct stu_xx *p ) /* 输出学生信息函数 */ printf(%s t %s t %-4.1f t %-4.1f t %-4.1f t %-4.1f , p-num , p-name , p-s.ch , p-s.math , p-s.en , p-s.c ) ;float getsum( struct stu_xx *p ) /* 计算学生总分函数 */ float sum ; sum = p-s.ch + p-s.math + p-s.en + p-s.c ; return sum;main( ) struct stu_xx sN ; int i ; float aveN , sumN ; printf( 请输入 Num Name Score (4) : n ) ; for ( i = 0 ; i N ; i+ ) scanf( %s%s%f%f%f%f , si.num , , &( si.s.ch ) , &( si.s.math ) , &( si.s.en ) , &( si.s.c ) ) ; printf(Numt Namet cht matht en t ct avet sumn ) ; for ( i = 0 ; i N ; i + ) sumi= getsum( &s i ); avei = sumi / N ; /* 计算平均分 */ output ( &s i ) ; /*输出学生的信息 */ printf(t %-4.1ft %-4.1f n , sumi , avei ) ; 运行结果同上题。【例8-7】共用体应用举例。# include union un /* 定义共用体类型 */ char a ; int b ; ; struct stu_xx /* 定义结构体类型 */ char c ; int d ; ;main( ) union un un1 ; /* 定义共用体类型变量 */ struct stu_xx stu1; /* 定义结构体类型变量 */ un1.a = A ; un1.b = 97; /* 给共用体类型变量un1的成员赋值 */ stu1.c = C ; stu1.d = 98 ; /* 给结构体类型变量stu1的成员赋值 */ printf( a = %c , b = %d t , un1.a , un1.b ) ; printf( c = %c , d = %d n , stu1.c , stu1.d ) ;运行结果:a = a , b = 97 c = C , d = 98【例8-8】枚举类型应用举例。程序如下:# include main( ) enum weekday sun , mon , tue , wed , thu , fri , sat a , b , c ; a = sun ; b = wed ; c = fri ; printf( %d , %d , %d , a , b , c ) ;运行结果:0 , 3 , 5【例8-9】用typedef定义别名应用举例。# include typedef struct stu_xx /* 指定结构体类型struct stu_xx的别名为MSTU */ char num5 ; char name10 ; int age ; MSTU ;main( ) MSTU a = 3001 , Sun , 18 ; /* 用别名定义了一个变量a */ printf(%s %s %d , a.num , , a.age ) ;三、任务的实现(2)实现的程序:# include # include /* 程序段1:建立学生信息单链表的结点结构 */struct stu_node int num ; char name10 ; struct stu_node *next ; ;/* 程序段2:建立单链表函数,函数返回类型为struct stu_node类型的地址 */struct stu_node *creat( void ) struct stu_node *head , *tail , *p ; int num ; head = tail = NULL ; printf( 建立单链表,请输入结点数据(num为0输入结束):n ) ; printf( input num : ) ; scanf ( %d , &num ) ; while( num != 0 ) /* 建立新结点 */ p = ( struct stu_node * ) malloc( sizeof ( struct stu_node ) ) ; p - next = NULL ; p - num = num ; printf( input name : ) ; scanf( %s , p - name ) ; if ( head = NULL ) head = p ; /* 新结点作为链表的第一个结点 */ else tail - next = p ; /* 新结点链入原链表尾 */ tail = p ; /* 新结点成为链表的最后一个结点 */ printf( input num : ) ; scanf( %d , &num ) ; /* 输入新的学号 */ return head ; /* 链表第一个结点的地址作为函数的返回值 */* 程序段3:输出链表信息函数 */void out ( struct stu_node *head ) struct stu_node *p ; printf( n print records : ) ; printf( n num name n ) ; p = head ; if ( head != NULL ) do printf( %d %s n , p - num , p - name ) ; p = p - next ; while( p != NULL ) ;/* 程序段4:插入链表信息函数*/struct stu_node *insert ( struct stu_node *head , struct stu_node *s ) struct stu_node *p , *q ; if ( ( head = NULL ) | ( s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论