《C程序设计》上机实验报告(八)之结构体和共用体

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 实验内容: 1.运行程序 #include <stdio.h> struct mn { int x,*y; }; void main() { int a[]={15,20,25,30}; struct mn aa[]={35,&a[0],40,&a[1],45,&a[2],50,&a[3]},*p; p=aa; printf("%d",++p->x); printf("%d",(++p)->x); printf("%d",++(p->x)); } 要求: 1. 分析程序,预测出上述程序的运行结果。 (2)输入并调试上述源程序。 (3)运行程序,将分析结果和实际结果对照比。若不同,找出原因。 |
| 2. 程序改错 下面给定程序中setup的功能是:建立一个链表,链表中的每个结点有一个int类型的数据域,输入0时标志链表结束。例如,输入1 2 3 4 0,则应输出1,2,3,4。 请修改setup函数中的错误,使它得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 #include <stdio.h> #include <conio.h> typedef struct node { in tdata; struct node *next; }NODE; #define LEN sizeof(NODE) NODE *setup() { NODE *head=NULL,p1,*p2,*s; int n=0; p2=(NODE*)malloc(LEN); s=p2; p1=s; scanf("%d",&p1->data); while(p1->data) { n++; if(n==1) head=p1; else p2->next=pq; p1=p2; p1=(NODE*)malloc(LEN); scanf("%d",&p1->data); } p2=NULL; return head; } void main() { |

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| NODE *p; clrscr(); p=setup(); while(p) { printf("%d",p->data); p=p->next; } } 要求: (1)分析改正源程序中的错误。 (2)对源程序进行编译、连接、运行。 (3)写出程序运行的正确结果。 程序: #include <stdio.h> #include<stdlib.h> //应用malloc函数开辟动态存储区域应包含的文件 #include <conio.h> typedef struct node { int data; //in tdata -> int data struct node* next; }NODE; #define LEN sizeof(NODE) NODE* setup() { NODE* head = NULL, * p1, * p2, * s; //指针变量p1 int n = 0; p2 = (NODE*)malloc(LEN); s = p2; p1 = s; scanf("%d", &p1->data); while (p1->data != 0) { n++; if (n == 1) head = p1; else p2->next = p1; p2 = p1; p1 = (NODE*)malloc(LEN); scanf("%d", &p1->data); } |

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| p2->next = NULL; //p2指向的下一个节点为NULL return head; } int main() { NODE* p; system("cls"); p = setup(); while (p) { printf("%d", p->data); p = p->next; } } 3.编写程序 编写一个程序,建立结构体类型表示一个学生的基本情况,包含以下成员项:学号、姓名、三门课的成绩、三门课的平均成绩。用该结构说明一个变量和一个指针,并完成成员项的输入、计算平均值、输出结果。 在以上结构的基本上建立一个班级学生的基本情况(数组)。计算出每个学生三门课的平均成绩,输出平均成绩最高的学生的各成员项值。以5个学生为例调试程序。 程序: #include<windows.h> #define N 5 struct student { char name[8]; char num[6]; float score[3]; float ave; }stu[N]; int main() { int i, j, maxi; float sum, max, average; for (i = 0; i < N; i++) { printf("input scores of student %d:\n", i + 1); printf("NO:"); scanf("%s", stu[i].num); printf("Name:"); |

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| scanf("%s", stu[i].name); for (j = 0; j < 3; j++) { printf("score%d:", j + 1); scanf("%f", &stu[i].score[j]); } } average = 0; max = 0; maxi = 0; for (i = 0; i < N; i++) { sum = 0; for (j = 0; j < 3; j++) sum += stu[i].score[j]; stu[i].ave = sum / 3.0; average += stu[i].ave; if (sum > max) { max = sum; maxi = i; } } average = average / N; printf("NO. Name score1 score2 score3 average\n"); for (i = 0; i < N; i++) { printf("%5s%10s", stu[i].num, stu[i].name); for (j = 0; j < 3; j++) { printf("%9.2f", stu[i].score[j]); printf("%9.2f\n", stu[i].ave); } } printf("average=%5.2f\n", average); printf("The highest score is :student %s,%s\n", stu[maxi].num, stu[maxi].name); printf("The score are :%4f,%4f,%4f average:%4f\n", stu[maxi]. score[0], stu[maxi].score[1], stu[maxi].score[2], stu[maxi].ave); |

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| return 0; } 7.编写程序 已知head指向一个不带头结点的环链表,链表中每个结点包含数据域(num)和指针域(link)。数据域存放整数,第i个结点的数据域值为i。编写函数,利用环形链表模拟猴子选大王的过程:从第一个结点开始循环"报数",每遇到k的整数倍,就将相应的结点删除。如此循环直到链表中剩下一个结点,就是猴王。 实现方法及要求: 1. 声明如下结构体 struct list { int num; List *link; }; 1. 环链表的建立 环链表的建立 将最后一个结点的 程序: #include <stdio.h> #include <malloc.h> //函数malloc(),free()的头文件 #include <stdlib.h> //函数exit()的头文件 /*声明结构体*/ struct list { int num; list* link; }; /* 建立环链表*/ list* creat(int n) //参数n是结点个数,参数k是删除结点的基数 { int i = 1; //为结点数据赋值 list* head; //定义指向链表起始地址的指针,作用是将第一个结点和最后一个结点连接起来 list* pSet; //开辟存储空间,建立结点 list* pEnd; //连接前后结点 head = NULL; pEnd = head; do { pSet = (list*)malloc(sizeof(list)); //开辟存储空间 |

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| if (pSet == NULL) { printf("没有足够空间,申请失败!"); exit(0); } if (head == NULL) head = pSet; //如果是头结点,由head指向头结点 else pEnd->link = pSet; //如果不是头结点,建立前一结点和新建结点的连接 pSet->num = i; //为结点的数据赋值 if (pSet->num > n) { pEnd->link = head; free(pSet); break; //结束循环 } else pEnd = pSet;//pEnd建立连接后,指向新建结点 ++i; } while (1); return head; } /*输出环链的值*/ void printList(list* head) { list* pSet = head; if (pSet == NULL) { printf("链表为空"); return; // 退出函数,返回到主函数 } while (1) { printf("%4d", pSet->num); pSet = pSet->link; if (pSet->link == head) { printf("%4d", pSet->num); 9.编写程序 定义一个结构体变量,包括年、月、日。计算该日在本年中是第几天? 要求及提示: (1)写一个函数days,实现上面的计算。由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 (2)注意闰年问题。 程序: |

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| pSet = pSet->link; if (pSet->link == head) { printf("%4d", pSet->num); break; } } printf("\n"); } /*选猴王*/ void choice(list* head, int k) { int i = 1; //记录报数 list* pEnd = head; while (pEnd->link != pEnd) { if (i % k == 0) //整数倍时删除结点 { pEnd->link = pEnd->link->link; printList(pEnd->link); } if (++i % k != 0) pEnd = pEnd->link; } printf("\n猴王是编号%d的猴子!\n", pEnd->num); } int main() { list* head; int n; //n是结点个数 int k; //出局猴子数字的基数 printf("请输入猴子个数n>0:"); scanf("%d", &n); if (n <= 0) { printf("数据有误!"); exit(0); } head = creat(n); //调用建立环链表函数 printList(head); //输出环链表 printf("请输入出局猴子数字的基数k:"); scanf("%d", &k); |

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| printList(head); //输出环链表 printf("请输入出局猴子数字的基数k:"); scanf("%d", &k); choice(head, k); //调用选猴王函数 } 9.编写程序 定义一个结构体变量,包括年、月、日。计算该日在本年中是第几天? 要求及提示: (1)写一个函数days,实现上面的计算。由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 (2)注意闰年问题。 程序: struct data { int year; int mon; int day; }d1; int main() { int i, days = 0; int day_tab[13] = { 0,31,28,31,30,31,30,31,30,31,30,31,30 }; printf("input year,month,day:"); scanf("%d %d %d", &d1.year, &d1.mon, &d1.day); for (i = 1; i < d1.mon; i++) days = days + day_tab[i]; days = days + d1.day; if (d1.year % 4 == 0 && d1.year % 100 != 0 || d1.year % 400 == 0) days = days + 1; printf("%d %d %d days=%d", d1.year, d1.mon, d1.day, days); } |

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 程序测试及运行结果: 1. 2. |

|---|---|
| 3. 7. 9. > 结果分析与讨论: > 1.分析结构体与共用体在类型定义、变量说明、成员项引用等方面的异同。 > 答: > 相同:声明、变量定义、引用方式和结构体类型都相同 > 不同: > (1).结构体使用的是字节对齐的方法,共用体变量所占内存长度等于最长成员的长 度 > (2).结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。 > (3).结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。 ||

相关推荐
前端每日三省1 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
凡人的AI工具箱14 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
chnming198730 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙32 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂32 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
VertexGeek33 分钟前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz33 分钟前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
湫ccc39 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
程序伍六七43 分钟前
day16
开发语言·c++
wkj0011 小时前
php操作redis
开发语言·redis·php