C语言实验5:结构体

news2025/1/21 1:01:51

目录

一、实验要求

二、实验原理

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据库开发实践》之触发器【知识点罗列+例题演练】

一、什么是触发器&#xff1f; 1.概念&#xff1a; 简单来说触发器就是一种特殊的存储过程&#xff0c;在数据库服务器触发事件的时候会自动执行其SQL语句集。 2.构成四要素&#xff1a; &#xff08;1&#xff09;名称&#xff1a;要符合标识符命名规则 &#xff08;2&am…

跳跃表原理及实现

一、跳表数据结构 跳表是有序表的一种&#xff0c;其底层是通过链表实现的。链表的特点是插入删除效率高&#xff0c;但是查找节点效率很低&#xff0c;最坏的时间复杂度是O(N)&#xff0c;那么跳表就是解决这一痛点而生的。 为了提高查询效率&#xff0c;我们可以给链表加上索…

ORACLE Primavera Unifier v23.12 最新虚拟机(VM)分享下载

引言 根据上周的计划&#xff0c;我近日简单制作了一个基于ORACLE Primavera Unifier 最新版23.12的虚拟机演示环境&#xff0c;里面包括了unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机&#xff0c;请您与Oracle 销售代表联…

pngPackerGUI_V2.0是什么工具?

pngPackerGUI_V2.0是什么工具&#xff1f; png图片打包plist工具&#xff0c;手把手教你使用pngPackerGUI_V2.0此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。1.下载并解压缩软件&#xff0c;得到如…

关于“Python”的核心知识点整理大全53

目录 18.2.7 Django shell 注意 18.3 创建网页&#xff1a;学习笔记主页 18.3.1 映射 URL urls.py urls.py 注意 18.3.2 编写视图 views.py 18.3.3 编写模板 index.html 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 感谢大家的支…

VitulBox中Ubuntu虚拟机安装JAVA环境——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项

前言 在进行之后操作是请下载好JDK&#xff0c;之后的内容是以Ubuntu虚拟机中安装java环境续写。 提示&#xff1a;以下操作是在虚拟机hadoop用户下操作的&#xff0c;并为安装java环境作准备 一、更新APT 为了确保Hadoop安装过程顺利进行&#xff0c;建议用hadoop用户登录…

MCS接口技术----定时/计数,中断

目录 一.中断系统相关寄存器 1.51单片机中断系统的总体结构&#xff1a; 2.中断源的中断级别&#xff08;由高到低&#xff09;&#xff1a; 3.与中断有关的四个寄存器&#xff1a; &#xff08;1&#xff09;TCON---定时控制寄存器 &#xff08;2&#xff09;IE---中断允…

一二三应用开发平台文件处理设计与实现系列之3——后端统一封装设计与实现

背景 前面介绍了前端通过集成vue-simple-uploader实现了文件的上传&#xff0c;今天重点说一下后端的设计与实现。 功能需求梳理 从功能角度而言&#xff0c;实际主要就两项&#xff0c;一是上传&#xff0c;二是下载。其中上传在文件体积较大的情况下&#xff0c;为了加快上…

2013年第二届数学建模国际赛小美赛B题寄居蟹进化出人类的就业模式解题全过程文档及程序

2013年第二届数学建模国际赛小美赛 B题 寄居蟹进化出人类的就业模式 原题再现&#xff1a; 寄居蟹是美国最受欢迎的宠物品种&#xff0c;依靠其他动物的壳来保护。剥去寄居蟹的壳&#xff0c;你会看到它柔软、粉红色的腹部卷曲在头状的蕨类叶子后面。大多数寄居蟹喜欢蜗牛壳&…

Java集合/泛型篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、说说LinkHashSet( HashSet+LinkedHashMap)二、HashMap(数组+链表+红黑树)三、说说ConcurrentHashMap前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

加强->servlet->tomcat

0什么是servlet jsp也是servlet 细细体会 Servlet 是 JavaEE 的规范之一&#xff0c;通俗的来说就是 Java 接口&#xff0c;将来我们可以定义 Java 类来实现这个接口&#xff0c;并由 Web 服务器运行 Servlet &#xff0c;所以 TomCat 又被称作 Servlet 容器。 Servlet 提供了…

数据结构: 位图

位图 概念 用一个bit为来标识数据在不在 功能 节省空间快速查找一个数在不在一个集合中排序 去重求两个集合的交集,并集操作系统中的磁盘标记 简单实现 1.设计思想:一个bit位标识一个数据, 使用char(8bit位)集合来模拟 2.预备工作:a.计算这个数在第几个char b.是这个ch…

「实验记录」CS144 Lab1 StreamReassembler

目录 一、Motivation二、SolutionsS1 - StreamReassembler的对外接口S2 - push_substring序列写入ByteStream 三、Result四、My Code五、Reference 一、Motivation 我们都知道 TCP 是基于字节流的传输方式&#xff0c;即 Receiver 收到的数据应该和 Sender 发送的数据是一样的…

C#-CSC编译环境搭建

一.Microsoft .NET Framework 确保系统中安装Microsoft .NET Framework相关版本下载 .NET Framework 4.7 | 免费官方下载 (microsoft.com)https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/net47 二.编译环境搭建 已经集成编译工具csc.exe,归档至gitcode,实现us…

L1-076:降价提醒机器人

题目描述 小 T 想买一个玩具很久了&#xff0c;但价格有些高&#xff0c;他打算等便宜些再买。但天天盯着购物网站很麻烦&#xff0c;请你帮小 T 写一个降价提醒机器人&#xff0c;当玩具的当前价格比他设定的价格便宜时发出提醒。 输入格式&#xff1a; 输入第一行是两个正整数…

数据隐私:技术和法律的双重挑战

当前&#xff0c;数据已成为企业和个人最宝贵的资产之一。然而&#xff0c;随着数据的广泛收集和共享&#xff0c;数据隐私问题也日益突出。保护个人信息的隐私不仅是法律规定的义务&#xff0c;也是维护社会公正、保护个人权益的必要措施。本文将从数据隐私的概念、重要性、面…

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 最近更新的速度和频率大不如以前&#xff0c;主要原因还是自己有些懈怠了。学习是一个持续努力的过程&#xff0c;一旦中断&#xff0c;再想保持以往的状态可能要…

《MySQL系列-InnoDB引擎01》MySQL体系结构和存储引擎

文章目录 第一章 MySQL体系结构和存储引擎1 数据库和实例2 MySQL配置文件3 MySQL数据库路径4 MySQL体系结构5 MySQL存储引擎5.1 InnoDB存储引擎5.2 MyISAM存储引擎5.3 NDB存储引擎5.4 Memory存储引擎5.5 Archive存储引擎5.6 Federated存储引擎 6 连接MySQL6.1 TCP/IP6.2 命名管…

MySQL数据库学习一

1 什么是数据库的事务&#xff1f; 1.1 事务的典型场景 在项目里面&#xff0c;什么地方会开启事务&#xff0c;或者配置了事务&#xff1f;无论是在方法上加注解&#xff0c;还 是配置切面。 <tx:advice id"txAdvice" transaction-manager"transactionMa…

数据结构式新年贺词

冒泡排序&#xff0c;选择排序&#xff0c;插入排序&#xff0c;快速排序&#xff0c;堆排序&#xff0c;归并排序&#xff0c;希尔排序&#xff0c;桶排序&#xff0c;基数排序新年帮您排忧解难。 有向图&#xff0c;无向图&#xff0c;有环图&#xff0c;无环图&#xff0c;…