2024-2025-1 20241307《计算机基础与程序设计》第十三周学习总结

news/2024/12/21 15:31:50/文章来源:https://www.cnblogs.com/ZYF15246391068/p/18620804

作业信息

这个作业属于哪个课程 (2024-2025-1-计算机基础与程序设计)
这个作业要求在哪里 ([2024-2025-1计算机基础与程序设计第十三周作业]
这个作业的目标
作业正文 (2024-2025-1 学号20241307《计算机基础与程序设计》第十三周学习总结)

教材学习内容总结

C语言程序设计第十二章的详细总结:

  1. 结构体的定义和使用
    • 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,用于将多个相关的数据整合在一起,便于整体操作和管理。
    • 结构体的定义使用 struct 关键字,后跟结构体名称和大括号内的成员列表。例如,定义一个表示学生信息的结构体:
    struct Student {
    char name[20];
    int age;
    float score;
    };

这个结构体包含姓名、年龄和分数三个成员。
2. 结构体变量的初始化
• 结构体变量可以在创建时使用 {} 进行初始化,也可以在创建后使用 . 操作符指定成员变量的值。例如:
struct Student student = {"John Doe", 20, 89.5};

或者在创建后初始化:
struct Student student;
strcpy(student.name, "John Doe");
student.age = 20;
student.score = 89.5;


3. 结构体成员的引用
• 使用点运算符 . 访问结构体成员;在结构体嵌套时以级联方式访问数据。例如:
printf("%s\n", student.name);


4. 结构体数组
• 结构体数组的定义和使用,即如何存储和操作一组结构体类型的数据。例如:
struct Student students[10];

这定义了一个包含10个 Student 结构体类型元素的数组。
5. 指向结构体的指针
• 指向结构体的指针的定义,以及通过指针访问和操作结构体成员的方法。例如:
struct Student *ptr;
ptr = &student; // ptr现在指向student
printf("%s\n", ptr->name); // 使用 -> 操作符访问成员


6. 结构体的嵌套定义
• 一个结构体的成员可以是另一个结构体,这种特性使得可以构建更复杂的数据类型。例如:
struct Date {
int year;
int month;
int day;
};

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


7. 动态数据结构和动态链表
• 动态链表的构建和操作,是数据结构基础的重要组成部分。这通常涉及到链表的定义、插入、删除等操作。
8. 结构体与文件操作
• 结构体也可以用于文件操作,比如将结构体的数据保存到文件中,或者从文件中读取结构体的数据。这通常涉及到文件I/O函数,如 fopen、fprintf、fscanf 等。
9. 结构体的内存对齐
• 内存对齐的规则和原因,以及如何修改默认对齐数。结构体的大小不是结构体元素单纯相加就行的,因为现代计算机使用的都是32Bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。这就是内存对齐的由来。

教材学习中的问题和解决过程(先问 AI)

  • 问题1:理解结构体内存布局和内存对齐
    问题描述:初学者可能难以理解结构体在内存中的布局,尤其是内存对齐和填充的概念。
  • 问题1解决方案:
    • 学习内存对齐规则:不同的编译器和平台可能有不同的内存对齐规则,但通常编译器会按照特定的边界(如4字节或8字节)对齐结构体的成员。
    • 使用sizeof操作符:通过sizeof(struct_name)来查看结构体实际占用的内存大小,这有助于理解内存对齐的影响。
    • 使用编译器特定的属性:某些编译器允许你使用属性(如__attribute__((packed)))来控制或禁用内存对齐。
  • 问题2结构体与指针的复杂操作
    问题描述:在处理指向结构体的指针,尤其是二级指针时,可能会对如何正确地分配和释放内存感到困惑。
  • 问题2解决方案:
    • 理解指针和地址:确保你理解了指针和地址的概念,以及如何使用&取地址和*解引用。
    • 练习动态内存分配:通过编写代码练习malloc和free的使用,特别是对于结构体指针的分配和释放。
    • 编写清晰的代码:在分配和释放内存时,编写清晰的代码注释,以避免混淆和内存泄漏。
  • 问题3::结构体作为函数参数的传递
    问题描述:可能会对如何将结构体作为参数传递给函数,以及这与指针传递的区别感到困惑。
  • 问题3解决方案:
    • 理解值传递和引用传递:在C语言中,结构体作为参数传递给函数时,实际上是通过值传递的,这意味着函数接收的是结构体的副本。而传递指向结构体的指针则是引用传递,函数可以直接修改原始结构体。
    • 使用指针传递:如果需要在函数内部修改结构体的内容,应该传递指向结构体的指针。
    • 编写示例代码:通过编写和测试不同的函数调用方式,来加深对值传递和引用传递的理解。

基于AI的学习








代码调试中的问题和解决过程

  • 问题1:结构体成员指针未初始化
    问题描述:在定义结构体时,如果成员是指针类型而没有初始化,会导致未定义行为,因为指针可能指向任意内存区域。
    struct student {
    char *name;
    int score;
    } stu, *pstu;
    int main() {
    strcpy(stu.name, "Jimy"); // 错误:stu.name 未初始化
    stu.score = 99;
    return 0;
    }

  • 问题1解决方案:
    在使用指针成员之前,为其分配内存空间。
    struct student {
    char *name;
    int score;
    } stu, *pstu;
    int main() {
    stu.name = malloc(64 * sizeof(char)); // 分配内存
    strcpy(stu.name, "Jimy");
    stu.score = 99;
    free(stu.name); // 使用完毕后释放内存
    return 0;
    }

  • 问题2:没有为结构体指针分配足够的内存
    问题描述:为结构体指针分配内存时,如果分配的大小不正确,也会导致错误。
    int main() {
    pstu = (struct student)malloc(sizeof(struct student)); // 错误:应该分配 struct student 的大小
    strcpy(pstu->name, "Jimy");
    pstu->score = 99;
    free(pstu);
    return 0;

  • 问题2解决方案:
    确保分配的内存大小与结构体的大小相匹配。
    int main() {
    pstu = (struct student*)malloc(sizeof(struct student)); // 正确分配内存
    pstu->name = malloc(64 * sizeof(char)); // 分配内存给指针成员
    strcpy(pstu->name, "Jimy");
    pstu->score = 99;
    free(pstu->name); // 释放指针成员的内存
    free(pstu); // 释放结构体的内存
    return 0;
    }

  • 问题3: 结构体变量赋值问题(浅拷贝)
    问题描述:在将一个结构体变量赋值给另一个结构体变量时,如果结构体包含指针成员,会发生浅拷贝问题,即两个结构体变量共享同一块内存。
    struct Person2 {
    char* name;
    int age;
    };
    void test2() {
    struct Person2 p1;
    p1.age = 18;
    p1.name = (char)malloc(sizeof(char)64);
    strcpy(p1.name, "Tom");
    struct Person2 p2;
    p2.age = 20;
    p2.name = (char)malloc(sizeof(char)128);
    strcpy(p2.name, "Jerry");
    p1 = p2; // 错误:浅拷贝,p1 和 p2 共享同一块内存
    // 释放内存时会导致问题
    }

  • 问题3解决方案:
    手动进行深拷贝操作,确保每个指针成员都指向独立的内存区域。
    void test2() {
    struct Person2 p1;
    p1.age = 18;
    p1.name = (char)malloc(sizeof(char)64);
    strcpy(p1.name, "Tom");
    struct Person2 p2;
    p2.age = 20;
    p2.name = (char)malloc(sizeof(char)128);
    strcpy(p2.name, "Jerry");
    // 深拷贝
    p1.age = p2.age;
    p1.name = (char)malloc(sizeof(char)128); // 分配新的内存
    strcpy(p1.name, p2.name); // 复制内容
    // 释放内存时需要分别释放
    free(p2.name);
    }

其他(感悟、思考等,可选)

学习 C 语言程序设计第十二章后,我深感其对编程思维的深度拓展。这一章节中诸如文件操作等内容,让我意识到程序不再局限于内存数据的处理,而是能够与外部存储交互,极大地拓宽了程序的功能边界。它教会我如何严谨地组织数据的输入输出流,使程序更具实用性和扩展性。同时,对错误处理机制的深入理解,让我明白程序的健壮性至关重要。我认识到编程不仅是实现功能,更是构建一个稳定、高效、能应对各种情况的系统,每一行代码都肩负着保障整体稳定运行的重任。

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 4/4 18/38
第三周 500/1000 5/7 22/60
第四周 500/1300 6/9 30/90
第五周 1000/1400 7/9 60/90
第六周 1200/1500 8/9 70/90
第七周 1400/1600 9/10 80/100
第八周 1600/1700 10/11 100/100
第九周 1900/1900 11/11 110/110
第十周 2100/2100 12/12 130/130
第十一周 2600/2600 13/13 150/150
第十二周 2900/2900 14/14 170/170
第十三周 3500/3500 15/15 190/190

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

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

相关文章

移动端笔记应用,markdown应用选用

要求不能有广告。作为使用频率较高的软件,有广告就是恶心人。 支持markdown,包括且不限于代码块、标题、图片等格式。 支持同步,至少拥有WebDav云同步,或者本地导入导出。 全局搜索功能。以上功能必须免费,至少我不明白导入导出有什么好付费的。云同步这种付费理所当然。背…

一个.NET开源、易于使用的屏幕录制工具

前言 一款高效、易用的屏幕录制工具能够极大地提升我们的工作效率和用户体验,今天大姚给大家分享一个.NET开源、免费、易于使用的屏幕录制工具:Captura。 工具介绍 Captura是一款基于.NET开源、免费、易于使用的屏幕录制、截图工具,允许用户录制屏幕活动、捕获屏幕截图、录制…

CDN信息收集

引子:这篇是对架构信息收集中CDN部分的补充,由于Web应用先得注册域名才能使用CDN服务,而我国境内的域名注册需先要备案。又因为笔者目前并没有这方面的需求,因此本文仅简单介绍该如何识别CDN,以及一些常见的CDN绕过方式。免责声明:本文章仅用于交流学习,因文章内容而产生…

20结构伪类-borderz制图-网络字体-字体图标

一、结构伪类-:nth-child 在一些特殊的场景使用结构伪类还是非常方便的。 是真正有用的东西。 之前使用最主要的东西是nth-child() :nth-child(1)这个是选择父元素中的第一个子元素如果是下图这样就不能选中了。这里需要使用另外一个东西,叫做:nth-of-type()用这个东西可以选择…

【关节电机专栏】小米 CyberGear 电机和大然 PDA-04 CAN接口的区别

小米电机CAN接口:大然PDA-04 CAN接口:可见两家的CAN接口 CANL 和 CANH 是相反的。

BBU-Python期末考试复习题目总结

临近期末,抽个时间把BBU - python期末考试会考的题型(原题?)哈哈总结一下,放到我的个人bolg上供大家参考,祝考试高分通过————临近期末,抽个时间把BBU - python期末考试会考的题型(原题?)哈哈总结一下,python考试是比较简单的,题型分为选择题,判断题,填空题,程序…

老生常谈——分布式限流:部分Sentinal源码解读

基础知识HTTP CODE = 429 “请求过多”A. 限流的类型服务端客户端限流的标的IP用户...基本要求准确限制过量的请求。低延时。限流器不能拖慢HTTP响应时间。尽量占用较少的内存。这是一个分布式限流器,可以在多个服务器或者进程之间共享。需要处理异常。当用户的请求被拦截时,…

可扩展系统——基于SPI扩展

一、我们为什么讨论SPI? 为具有悠久历史的大型项目(屎山)添加新功能时,我们常常不太好评估变更的影响范围。因为原系统不具备良好的扩展性,导致修改整体发散,且不易单测。此时可以考虑使用接口来描述业务逻辑较为稳定的流程,并使用SPI机制来灵活的隔离加载实际的实现,来…

大模型--采样技术 TopK TopP 惩罚系数--37

目录1. 参考2. 概述重复惩罚(Repetition Penalty) 1. 参考 https://mp.weixin.qq.com/s/mBZA6PaMotJw7WeVdA359g 2. 概述 大型语言模型(LLMs)通过“根据上下文预测下一个 token 的概率分布”来生成文本。最简单的采样方法是贪心采样(Greedy Sampling),它在每一步选择概率…

关于分布式锁的的思考

关于分布式锁的的思考 结论先行: 对于分布式锁我们在考虑不同方案的时候需要先思考需要的效果是什么?为了效率(efficiency),协调各个客户端避免做重复的工作。即使锁偶尔失效了,只是可能把某些操作多做一遍而已,不会产生其它的不良后果。比如重复发送了一封同样的 email(…

2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。 你被施加了一种诅咒,吸

2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。 你被施加了一种诅咒,吸收来自第 i 位魔法师的能量后,你会立即被传送到第 (i + k) 位魔法师。在这个…