《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).结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。 ||

相关推荐
SmartRadio4 分钟前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
guygg885 分钟前
基于捷联惯导与多普勒计程仪组合导航的MATLAB算法实现
开发语言·算法·matlab
fengfuyao9856 分钟前
遗传算法与粒子群算法求解非线性函数最大值问题
算法
LeetCode天天刷20 分钟前
【软件认证】比特翻转【滑动窗口】
算法
froginwe1120 分钟前
Rust 文件与 IO
开发语言
源代码•宸22 分钟前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs
liulilittle23 分钟前
LIBTCPIP 技术探秘(tun2sys-socket)
开发语言·网络·c++·信息与通信·通信·tun
yyy(十一月限定版)23 分钟前
c++(3)类和对象(中)
java·开发语言·c++
s砚山s26 分钟前
代码随想录刷题——二叉树篇(十三)
数据结构·算法
落羽凉笙26 分钟前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python