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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pandas_不重复项计数】

听说WPS没有非重复项计数的功能&#xff0c;而office需要添加到数据模型之后&#xff0c;才可以使用该功能。而用pandas&#xff0c;既可以对重复项计数&#xff0c;又可以对非重复项计数。 # 使用提醒: # 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能 # 2. pack…

【NTN 卫星通信】Oneweb星座以及Oneweb与Starlink比较

1 什么是OneWeb OneWeb于2012年以WorldVu的名义成立&#xff0c;于2020年开始构建其星座。然而&#xff0c;对于这家英国公司来说&#xff0c;这是一个艰难的旅程&#xff0c;OneWeb于2020年3月宣布破产&#xff0c;并认为covid-19大流行是一个主要因素。OneWeb星座当时仅完成…

toto的2023年终总结

第一次写年终总结&#xff0c;其实顺带是把大学四年的学习都给总结了一下&#xff0c;称之为大学总结更为合适吧&#xff1f; 其实把年终总结发在CSDN上有些不适&#xff0c;之前一直想着搭一个自己的博客也因为种种事情一直没有完成&#xff0c; 索性发在这里了&#xff0c;作…

SpringBoot 请求参数

文章目录 一、简单参数实体参数数组集合参数日期参数Json参数路径参数 一、简单参数 原始方式 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获取。 SpringBoot方式 1.参数名与形参变量名相同&#xff0c;定义形参即可接收参数。…

负载均衡概述

负载均衡 负载均衡 建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 四层负载均衡 vs 七层负载均衡 四层负载均衡&#xff08;目标地址和端口交换&#xff09;…

安装与部署Hadoop

一、前置安装准备1、机器2、java3、创建hadoop用户 二、安装Hadoop三、环境配置1、workers2、hadoop-env.sh3、core-site.xml4、hdfs-site.xml5、linux中Hadoop环境变量 四、启动hadoop五、验证 一、前置安装准备 1、机器 主机名ip服务node1192.168.233.100NameNode、DataNod…

基于知识图谱的智能辅助需求管理体系介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、背景 需求处理各环节的各参与方人员存在变更&#xff0c;知识背景不同&#xff0c;导致需求提出、分析设计、测试、交付各环节容易出现考虑不完整&#xff0c;从而限制了整个研发过程的效率以及质量的提…

Python编程-面向对象基础与入门到实践一书的内容拓展

Python编程-面向对象基础与入门到实践一书的内容拓展 通过编程&#xff0c;模拟现实生活中的事物编程&#xff0c;叫做面向对象编程&#xff0c;此过程也叫做实例化编程 简单类的创建 class Test():def __init__ (self,id):self.id iddef print_id(self):print(self.id)这里建…

掌握这十几个Python库才是爬虫界的天花板,没有你搞不定的网站!实战案例:Python全网最强电影搜索工具,自动生成播放链接

掌握这十几个Python库才是爬虫界的天花板,没有你搞不定的网站!实战案例:Python全网最强电影搜索工具,自动生成播放链接。 用来爬虫的十几个Python库。只要正确选择适合自己的Python库才能真正提高爬虫效率,到达高效爬虫目的。 1.PyQuery from pyquery import PyQuery as …

阿里员工:本月收入489325元,开心过年

阿里员工&#xff1a;本月收入489325元&#xff0c;开心过年 近日&#xff0c;一名阿里员工在社交媒体上爆料自己的本月收入&#xff0c;竟然高达48.9万&#xff0c;真是让人目瞪口呆。 震惊之余&#xff0c;大家都很好奇这么高收入是怎么来的&#xff0c;再仔细看工资单&…

Servlet中常用的三大API

HttpServlet 我们写 Servlet 代码的时候&#xff0c;首先第一步就是先创建类&#xff0c;继承自 HttpServlet&#xff0c;并重写其中的某些方法。我们实际开发的时候主要重写 doXXX 方法&#xff0c;很少会重写 init / destory / service。 因为这一些方法的调用时机&#xf…

Python:日期和时间类型学习

背景 在非开发环境经常需要做一下日期计算&#xff0c;就准备使用Python&#xff0c;顺便记下来学习的痕迹。 代码 1 1 # coding utf-82 2 3 3 from datetime import *4 4 5 5 ########################## 日期 ##########################6 6 date_now date.today()…