C语言实验5:结构体

目录

一、实验要求

二、实验原理

1. 普通结构体

1.1 显示声明结构体变量

1.2 直接声明结构体变量

​编辑

1.3 typedef在结构体中的作用

2. 结构体的嵌套

3. 结构体数组

4. 指向结构体的指针

4.1 静态分配

4.2 动态分配

三、实验内容

1. 学生数据库

代码

截图

分析

2. 书籍信息

代码

截图

分析


一、实验要求

1. 能够理解结构体的定义和基本概念。

2. 熟练掌握结构体的初始化、访问和应用,包括数组的使用。

3. 理解结构体与指针的关系,能够使用指针访问结构体成员。

二、实验原理

1. 普通结构体

struct 结构体名称 {
    // 成员变量定义
};

1.1 显示声明结构体变量

在结构体定义之后,显式声明结构体变量。

例如

struct Person {
    char name[20];
    int age;
};

struct Person person1; // 显式声明结构体变量

 最后一行代码创建了结构体的实例化person1

eg:

#define _CRT_SECURE_NO_WARNINGS //消除strcpy带来的警告
#include<iostream>
using namespace std;

struct Person {
	char name[20];
	int age;
};

int main() {
	struct Person person1,person2; // 显式声明结构体变量
	person1 = { "xiaoming",18 };
	//或者用下面这种方式赋值
	strcpy(person2.name, "xiaofang");//直接复制进去
	person2.age = 19;
	cout << person1.name << " " << person1.age << endl;
	cout << person2.name << " " << person2.age << endl;
	return 0;
}

结果

分析 

1.#define _CRT_SECURE_NO_WARNINGS:
这是一个预处理指令,用于在编译时禁用某些与安全性检查相关的警告,主要用于 Microsoft Visual Studio 编译器。在此例中,用于消除 strcpy 可能引发的安全性警告。
2.struct Person:
定义了一个结构体 Person,包含一个名为 name 的字符数组和一个名为 age 的整数。
3.main 函数:
创建了两个 Person 结构体变量 person1 和 person2。
person1 使用了类似于初始化列表的方式直接赋值,这在 C++11 及以后的标准中是合法的。
person2 使用了 strcpy 函数将字符串 "xiaofang" 复制到 name 成员中,并通过直接赋值给 age 进行赋值。

1.2 直接声明结构体变量

在结构体定义的同时直接声明结构体变量。

例如

struct Point {
    int x;
    int y;
} p1, p2; // 直接声明结构体变量 p1 和 p2

定义结构体Point的同时实例化p1,p2

对其赋值

#include<iostream>
using namespace std;
struct Point {
    int x;
    int y;
} p1, p2; // 直接声明结构体变量 p1 和 p2
int main() {
    p1 = { 3,4 };
    p2 = { 5,6 };
    cout << p1.x <<" "<< p1.y << endl;
    cout << p2.x << " " << p2.y << endl;
	return 0;
}

p1,p2是全局变量

使用直接声明结构体变量的好处就是简单且可以声明全局变量

1.3 typedef在结构体中的作用

typedef 是 C 语言中用来给数据类型取别名的关键字。在结构体的定义中,使用 typedef 可以简化对结构体类型的引用。

不使用typedef:

struct Point {
    int x;
    int y;
};

struct Point p1;

使用typedef:

typedef struct {
    int x;
    int y;
} Point;

Point p1;

 一个是定义简单,实例化复杂些,一个是定义麻烦,实例化简单些

由于结构体只用定义一次,而结构体可能需要多次实例化,建议用typedef struct定义结构体

2. 结构体的嵌套

在结构体中嵌套其他结构体,形成复合结构体。

struct 结构体A {
    // 成员变量定义
    struct 结构体B {
        // 成员变量定义
    } 变量名B;
};

 上述代码在结构体A中定义了一个结构体B,并实例化B

eg:

struct A {
	struct B {
		int year;
	}student;
	int grade;
}xiaoming,xiaofang;
  • 定义了一个结构体 A,其中嵌套了一个结构体 B。结构体 B 包含一个整数成员 year。结构体 A 包含了一个名为 studentB 类型的成员和一个整数成员 grade
  • 同时在全局范围内声明了两个结构体变量 xiaomingxiaofang。

通过结构体的嵌套,可以建立更复杂和层次化的数据结构,使得代码更具可读性和可维护性。

对其实例化:

#include<iostream>
using namespace std;
struct A {
	struct B {
		int year;
	}student;
	int grade;
}xiaoming,xiaofang;
int main() {
	xiaoming = {{19},93 };
	xiaofang.student.year = 18;
	xiaofang.grade = 94;
	return 0;
}

分析

main 函数中,通过初始化列表为 xiaoming 赋值。xiaofangstudent.yeargrade 成员分别被单独赋值。 

切记不能在嵌套中用typedef struct定义结构体!!!

3. 结构体数组

定义数组,每个元素是一个结构体。

即用已定义的结构体来声明一个结构体数组。

struct 结构体名称 数组名[大小];

 例如

#include<iostream>
using namespace std;

struct Person {
	char name[20];
	int age;
};

int main() {
	struct Person person[3]{ {"xiaofang",17},{"xiaoming",18},{"xiaokai",19} };
	for (int i = 0; i < 3; i++) {
		cout << person[i].age <<"  " <<person[i].name << endl;
	}
	return 0;
}

结果为

 

分析

对person数组中的每个元素赋值时要用"{}"

4. 指向结构体的指针

使用指针访问结构体的成员。

struct 结构体名称 *指针名;

 原理类似上一篇文章中的指针

https://mp.csdn.net/mp_blog/creation/editor/135313150

4.1 静态分配

eg:

#include<iostream>
using namespace std;

struct Person {
	char name[20];
	int age;
};

int main() {
	struct Person person1 = { "Alice", 25 }; // 定义结构体变量
	struct Person* ptrPerson = &person1;   // 定义指向结构体的指针
	cout << ptrPerson->age << " " << ptrPerson->name;
	return 0;
}

结果为

 

需要强调的一点是使用指针时访问结构体的成员,可以使用箭头运算符 "->",不能用"."。

4.2 动态分配

使用 new 运算符动态分配结构体内存,并返回指向该内存的指针。

例如:

struct Person *ptrPerson2 = new Person;

使用 delete 运算符释放通过 new 分配的结构体内存。

例如:

delete ptrPerson2;

三、实验内容

1. 学生数据库

定义一个名为 Student 的结构体,用于存储学生信息。结构体应包含以下成员:

rollNumber(整数)
name(最大长度为50的字符串)
marks(浮点数)

编写一个程序,声明一个包含5个 Student 结构体的数组,为每个学生输入信息,然后打印每个学生的详细信息。

代码

#include<iostream>
using namespace std;

typedef struct Student {
	int rollNumber;
	char name[50];
	float marks;
};
int main() {
	Student student[5];
	for (int i = 0; i < 5; i++) {
		cin >> student[i].rollNumber >> student[i].name >> student[i].marks;
	}
	for (int i = 0; i < 5; i++) {
		cout << student[i].rollNumber<<" " << student[i].name <<" " << student[i].marks<<endl;
	}
	return 0;
}

截图

分析

这段代码定义了一个名为 Student 的结构体,用于存储学生的信息,包括学号 (rollNumber)、姓名 (name) 和成绩 (marks)。然后,在 main 函数中,它声明了一个包含5个 Student 结构体的数组 student

接下来,通过一个循环,程序从用户输入中获取每个学生的信息,包括学号、姓名和成绩。最后,通过另一个循环,程序将每个学生的信息输出到标准输出。

2. 书籍信息

代码

#include<iostream>
using namespace std;

typedef struct Book {
	char title[100];
	char author[50];
	float price;
	int publishedYear;
};
int main() {
	Book book[3];
	int index = 0;
	float max_price = 0;
	for (int i = 0; i < 3; i++) {
		cin >> book[i].title >> book[i].author >> book[i].price>> book[i].publishedYear;
	}
	for (int i = 0; i < 3; i++) {
		if (book[i].price > max_price) {
			max_price = book[i].price;
			index = i;
		}
		cout << book[i].title <<" " << book[i].author <<" " << book[i].price << " "<<book[i].publishedYear << endl;
	}
	cout <<"最贵的书籍为"<< book[index].title;
	return 0;
}

截图

分析

这段代码定义了一个名为 Book 的结构体,用于存储书籍的信息,包括书名 (title)、作者 (author)、价格 (price) 和出版年份 (publishedYear)。然后,在 main 函数中,它声明了一个包含3个 Book 结构体的数组 book

通过两个循环,程序从用户输入中获取每本书的信息,包括书名、作者、价格和出版年份。同时,它找到了价格最高的书籍,并记录了其索引。最后,通过循环输出每本书的信息,并额外输出价格最高的书籍的标题。

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

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

相关文章

穿越时光的镜头:2023回顾与2024展望

前言 2023 年就像一本充满着惊喜和挑战的书籍&#xff0c;它的每一页都留下了我生活中不同的痕迹。回顾过去&#xff0c;我发现了许多意想不到的成长和启示&#xff0c;也体验了生活的起起伏伏。 这篇文章是对 2023 年的一个小小总结&#xff0c;也是对未来的一点期许。在这里…

PAT 乙级 1046 划拳

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

Unity中URP下精度修饰符real

文章目录 前言一、real是什么&#xff1f;1、我们在项目的Packages下找到如下文件&#xff1a;2、HAS_HALF(1代表有half精度&#xff0c;0代表没有half精度)3、PREFER_HALF4、REAL_IS_HALF5、如果 real is half6、否则为float 二、总结 前言 在使用雾效时&#xff0c;ComputeFo…

Git使用教程 gittutorial

该教程对该文章的翻译&#xff1a;https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先&#xff0c; 可以使用以下指令获取文档帮助 git help log笔者注&#xff1a;不建议看这个文档&#xff0c;标准的语法介绍…

Lesson 06 vector类(上)

C&#xff1a;渴望力量吗&#xff0c;少年&#xff1f; 文章目录 一、vector是什么&#xff1f;二、vector的使用1. 构造函数2. vector iterator3. vector 空间增长问题4. vector增删查改 三、vector实际使用 一、vector是什么&#xff1f; vector是表示可变大小数组的序列容器…

条款13:以对象管理资源

文章目录 没有管理的情况解决办法之unique_ptr智能指针解决办法之shared_ptr智能指针总结 没有管理的情况 资源是指一旦你使用完它&#xff0c;就需要返回系统的东西。 class Investment { ... }; // 投资类型层次结构的基类 Investment* createInvestment(); // 工厂函数&…

Vue学习计划-Vue3--初识Vue3,vite创建Vue3项目

1. Vue3简介 性能的提升 打包大小减少41%初次渲染快55%&#xff0c;更新渲染快133%内存减少54% 源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking 拥抱TypeScript Vue3可以更好的支持TypeScript 新的特性 Composition Api(组合Api) setupref…

基于CMake的大型C++工程组织

此文适合大型C工程&#xff0c;涉及到多个自定义库&#xff0c;多个第三方库&#xff0c;以及还有给第三方用户进行二次开发的需求下&#xff0c;应对这种复杂编译环境下的工程组织方式的一些经验介绍&#xff0c;希望给大型工业软件的开发者一些参考 一个大型工程&#xff0c…

python统计分析——协方差和pearson相关系数

参考资料&#xff1a;用python动手学统计学 使用数据见代码&#xff1a; dic{"x":[18.5,18.7,19.1,19.7,21.5,21.7,21.8,22.0,23.4,23.8],"y":[34,39,41,38,45,41,52,44,44,49] } cov_datapd.DataFrame(dic) 变量x、y的协方差Cov(x,y)的计算公式如下&am…

解决达梦数据库服务启动失败,错误 2: 系统找不到指定的文件

当在我们在Window环境下使用达梦数据库的过程中,可能会遇到这种错误,重启电脑后达梦数据库突然连接不上了,无法访问,但是我们打开任务管理器查看服务时,会发现DmServiceDMSERVER仍然存在,但是已停止的状态。 点击服务启动时,报错: Windows 无法启动 DmserviceDMSERVER…

类的加载顺序问题-demo展示

面试的的时候经常会被问到包含静态代码块、实例代码块和构造器等代码结构的加载顺序问题&#xff0c;下面借用一个面试题&#xff0c;回顾一下类的代码加载顺序。 public class AooTest {public static void main(String[] args) {AooTest.f1();}static AooTest test1 new Ao…

数据库——建立ER模型及关系模型转换

​ 【实验内容及要求】 使用画图工具或MySQL Workbench等建模工具设计出相应的ER图&#xff0c;将局部ER图合并为一个整体ER模型&#xff0c;在ER模型中填加多样性约束&#xff0c;建立显示主键的ER模型&#xff0c;标识实体的属性&#xff0c;确认主键、外键。将上述ER图转化…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# HeapingVS Stacking第二节 栈基本工作原理 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.cs…

brew 安装openapi-generator提示@@HOMEBREW_JAVA@@/bin/java: No such file or directory

brew 安装openapi-generator之后&#xff0c;运行openapi-generator命令&#xff0c;提示HOMEBREW_JAVA/bin/java: No such file or directory 经过一番查阅&#xff0c;应该是Java没有配置到环境变量中 查询电脑已经安装的Java版本 /usr/libexec/java_home 编辑.bash_profile…

Linux环境grep搜索方法记录

1 grep grep 命令&#xff0c;用来搜索字符串所在位置&#xff0c;可以具体到不同文件&#xff0c;不同行&#xff1b; 在Linux 下&#xff0c;查看命令释义如下 zhaocubuntu2004:~$ grep --help Usage: grep [OPTION]... PATTERNS [FILE]... Search for PATTERNS in each FI…

大数据 - 大数据入门第一篇 | 关于大数据你了解多少?

&#x1f436;1.1 概述 大数据&#xff08;BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…

2023-12-21 LeetCode每日一题(美丽塔 II)

2023-12-21每日一题 一、题目编号 2866. 美丽塔 II二、题目链接 点击跳转到题目位置 三、题目描述 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&a…

[JS设计模式]Prototype Pattern

Prototype pattern Prototype pattern可便于同类型的多个对象共享属性。原型&#xff08;prototype&#xff09;是JS原生的对象&#xff0c;其他对象可以通过原型链&#xff08;prototype chain&#xff09;来访问原型。单独看这句描述可能还是有点儿抽象&#xff0c;下面通过…

过滤器、拦截器、切面

过滤器、拦截器、切面作用范围 原理不同范围不同具体参考[过滤器、拦截器、切面异同](https://juejin.cn/post/7110104873265758222) 执行顺序&#xff1a;过滤器>拦截器>切面 过滤器、拦截器属于请求层面的拦截&#xff1b;切面属于方法层面的拦截 原理不同 过滤器和拦…

Zookeeper-Zookeeper应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。 第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作…