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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/375270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器

本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例&#xff0c;我们将其用于 BM25 示例。 在这个例子中&#xff1a; 我们将摄取 LangChain 之外的电影样本数据集自定义 ElasticsearchStore 中的检索策略以仅使用 BM25使用自查询检索将问题转…

【成品论文】2024美赛B题完整成品论文23页+3小问matlab代码+数据集汇总

2024 年美国大学生数学建模竞赛&#xff08;2024 美赛&#xff09;B 题&#xff1a; 2024 MCM 问题 B: 搜寻潜水艇 题目翻译&#xff1a; Maritime Cruises Mini-Submarines (MCMS)是一家总部位于希腊的公司&#xff0c;专门制造能够携 带人类到达海洋最深处的潜水艇。潜水艇是…

力扣53. 最大子数组和(滑动窗口,动态规划)

Problem: 53. 最大子数组和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 思路1:滑动窗口 1.为求出最大连续的子数组和,我们逻辑上假设有一个窗口在原数组上滑动, 欲求出最大连续,则需要保证窗口中的所有元素和最起码大于0; 2.即当当前窗口中的元素值的和小于0…

当AGI遇到人形机器人

为什么人类对人形机器人抱有执念 人形机器人是一种模仿人类外形和行为的机器人&#xff0c;它的研究和开发有着多方面的目的和意义。 人形机器人可以更好地适应人类的环境和工具。人类的生活和工作空间都是根据人的尺寸和动作来设计的&#xff0c;例如门、楼梯、桌椅、开关等…

改变终端安全的革命性新兴技术:自动移动目标防御技术AMTD

自动移动目标防御技术通过启用终端配置的自适应防御来改变终端检测和响应能力。产品领导者可以实施AMTD来确保实时威胁响应&#xff0c;并减少检测和响应安全威胁所需的时间。 主要发现 通过动态修改系统配置、软件堆栈或网络特征&#xff0c;自动移动目标防御&#xff08;AMTD…

Retinexformer论文精读笔记

Retinexformer论文精读笔记 论文为2023年ICCV的Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement。论文链接&#xff1a;browse.arxiv.org/pdf/2303.06705.pdf&#xff0c;代码链接&#xff1a;caiyuanhao1998/Retinexformer: “Retinexfo…

初次认识和学习SEO

初探 SEO 初探 SEO SEO 的基本概念 搜索引擎优化&#xff08;英语&#xff1a;search engine optimization&#xff0c;缩写为 SEO&#xff09;&#xff0c;是一种透过了解搜索引擎的运作规则来调整网站&#xff0c;以及提高目的网站在有关搜索引擎内排名的方式 一般的可以理…

k8s 网络策略揭秘:CKA认证必备的网络知识全解析

网络策略&#xff08;NetworkPolicy&#xff09;是Kubernetes中的一种资源对象&#xff0c;用于定义和控制Pod之间的网络通信规则。它允许您在Kubernetes集群中定义详细的网络规则&#xff0c;以控制哪些Pod可以相互通信&#xff0c;以及允许或禁止的流量。网络策略提供了一种实…

【MATLAB源码-第137期】基于matlab的NOMA系统和OFDMA系统对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOMA&#xff08;非正交多址&#xff09;和OFDMA&#xff08;正交频分多址&#xff09;是两种流行的无线通信技术&#xff0c;广泛应用于现代移动通信系统中&#xff0c;如4G、5G和未来的6G网络。它们的设计目标是提高频谱效…

泛型、Trait 和生命周期(上)

目录 1、提取函数来减少重复 2、在函数定义中使用泛型 3、结构体定义中的泛型 4、枚举定义中的泛型 5、方法定义中的泛型 6、泛型代码的性能 每一门编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型&#xff08;generics&#xff09;。泛型是具体类型…

Verilog刷题笔记18

题目&#xff1a;An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false. 解题&#xff1a; module top_module(input a,input b,input sel_b1,input sel_b2,output wire ou…

【excel密码】Excel加密的三种方式

Excel中保存着重要的数据&#xff0c;想要保护数据源&#xff0c;我们会想到给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff…

数据库中间件介绍

数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和大规模应用中&#xff0c;数据库中间件发挥着重要的作用。 什么是数据库中间件&#xff1f; 数据库中间件是一种介…

Unity类银河恶魔城学习记录2-1.2.3.4.5 背景和摄像机相关设置 P42-p45

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ParallaxBackground.cs using System.Collections; using System.Collect…

maven依赖报错处理(或者maven怎么刷新都下载不了依赖)

maven依赖报错&#xff0c;或者不报错&#xff0c;但是怎么刷新maven都没反应&#xff0c;可以试一下以下操作 当下载jar的时候&#xff0c;如果断网&#xff0c;或者连接超时的时候&#xff0c;会自动在文件夹中创建一个名为*lastupdate的文件&#xff0c;当有了这个文件之后…

李沐《动手学深度学习》注意力机制

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《…

Redis学习及总结

Redis 快速入门 Redis属于非关系型数据库 SQL应用场景 数据结构固定相关业务对数据安全性一致性要求高 NoSQL应用场景 数据结构不固定对一致性&#xff0c;安全性要求不高性能要求高 &#x1f3af;需要使用Xftp 传输压缩包到虚拟机上 安装好Redis后&#xff0c; 执行命令…

VMware虚拟机清理瘦身

用了一段时间VMware虚拟机之后&#xff0c;发现内存越来越小&#xff0c;也没装什么软件。。。 1.查询磁盘空间分布 虚拟机中磁盘空间查询 先看一下哪些地方占用的空间大&#xff0c;进行排查。 2.排查VMware复制文件产生的缓存路径 VMware复制文件有一个特点&#xff0c;以…

护眼灯的色温标准是什么?护眼灯参数标准介绍

选择合适的护眼台灯不仅能提升家居的品质&#xff0c;还能为我们的生活增添一份温馨与舒适。不过有些色温调节不当不仅不能达到很好的学习效率&#xff0c;还容易打瞌睡&#xff0c;甚至伤眼睛的情况也有可能出现&#xff0c;那么什么色温有什么标准呢&#xff1f; 一、合适的…

推动海外云手机发展的几个因素

随着科技的不断发展&#xff0c;海外云手机作为一种新兴技术&#xff0c;在未来呈现出令人瞩目的发展趋势。本文将在用户需求、技术创新和全球市场前景等方面&#xff0c;探讨海外云手机在未来的发展。 1. 用户需求的引领&#xff1a; 随着人们对移动性和便捷性的需求不断增长&…