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

发布时间 2023-12-24 18:26:56作者: 20231408徐钰涵

作业信息

这个作业属于哪个课程 <2023-2024-1-计算机基础与程序设计>
这个作业要求在哪里 <2023-2024-1计算机基础与程序设计第十三周作业>
这个作业的目标 <《C语言程序设计》第12章,上周测试题>
作业正文 https://www.cnblogs.com/jfxyh061028/p/17924320.html

教材学习内容总结

  • C语言数据结构里构造类型中的结构体(构造类型就是可以允许用户自定义数据类型的数据类型,用于解决基本数据类型在表示复杂数据对象时不够的问题
  • 结构体的定义(注意结构体模板的定义与结构体变量的定义,成员的引用,向函数传递结构体变量
  • 结构体数组,结构体指针。
  • 不常用的共用体,链表等。

教材学习中的问题和解决过程变量的数据类型和对齐方式来决定的。

在C语言中,结构体的对齐方式是按照最大成员变量长度进行对齐的。例如,如果结构体中有一个成员变量是int类型,那么该结构体的起始地址必须是4的倍数,因为int类型在大多数机器上占用4个字节。如果结构体中有一个成员变量是char类型,那么该结构体的起始地址可以是任意地址,因为char类型只占用1个字节。

此外,编译器还会在结构体成员变量之间添加填充字节,以满足对齐要求。例如,如果结构体中有一个成员变量是short类型,而结构体的起始地址不是2的倍数,那么编译器会在该成员变量前面添加1个字节的填充字节,以使其对齐到2的倍数。在计算机系统中,对齐(Alignment)是指数据在内存中存储时的起始位置,以及后续数据项存储的位置规则。对齐是由硬件架构和编译器规定的,它影响着数据的访问速度和存储空间的利用效率。

在许多计算机体系结构中,特定类型的数据需要按照特定的字节边界对齐,也就是说数据的存储地址必须是某个特定值的倍数。例如,一个int类型通常需要按4字节对齐,也就是说它的地址必须是4的倍数。如果数据没有按照要求对齐,可能会导致性能下降或者出现错误。

对齐的原因在于硬件访问内存的效率。在许多体系结构中,对齐的数据访问速度比不对齐的数据要快,因为对齐的数据可以更容易地被加载到寄存器中,而不需要多次内存访问。

编译器会根据目标体系结构的对齐要求,对数据进行适当的对齐处理,以确保数据存储在内存中时满足对齐要求。在一些编程语言中,程序员也可以通过特定的语法或者编译器指令来指定数据的对齐方式。

总之,结构体的内存布局是由成员变量的数据类型和对齐方式决定的。在实际编程中,我们可以使用sizeof运算符来获取结构体的大小,以便正确地分配内存空间。

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

  • 1:如果数据的输出格式与该数据被定义的格式不符,就会输出0。所以要保持一致。
  • 2:有些算法可以简化,如对于这个要求

小明养成了定闹钟的习惯,定闹钟时,设定好闹钟后,会显示闹钟时间距离现在还有多长时间。若闹钟时间小于当前时间,则指的是第2天的这个时间。你的任务是编写程序,计算闹钟时间距离现在还有多长时间。

我写的

#include <stdio.h>
int main()
{
    int a,b,c,d,e,f;
    scanf("%2d:%2d\n%2d:%2d",&a,&b,&c,&d);
    if(a<c)
    {
        e=((c*60+d)-(a*60+b))/60;
        f=((c*60+d)-(a*60+b))%60;
    }
    else if(a==c)
    {
        if(b<=d)
        {
            e=0;
            f=d-b;
        }
        else
        {
            e=23;
            f=60-(b-d);
        }
    }
    else
    {
        e=(((c+24)*60+d)-(a*60+b))/60;
        f=(((c+24)*60+d)-(a*60+b))%60;
    }
    printf("%.2d:%.2d\n",e,f);
    return 0;
}

比较麻烦,其实不用分这么多种情况。

#include <stdio.h>

int main() {
    int currentHour, currentMinute, alarmHour, alarmMinute;
    scanf("%d:%d", &currentHour, &currentMinute);
    scanf("%d:%d", &alarmHour, &alarmMinute);

    int currentTotalMinutes = currentHour * 60 + currentMinute;
    int alarmTotalMinutes = alarmHour * 60 + alarmMinute;

    if (alarmTotalMinutes <= currentTotalMinutes) {
        alarmTotalMinutes += 24 * 60; // 若闹钟时间小于当前时间,则指的是第2天的这个时间
    }

    int timeDifference = alarmTotalMinutes - currentTotalMinutes;
    int hours = timeDifference / 60;
    int minutes = timeDifference % 60;

    printf("%02d:%02d\n", hours, minutes);
    return 0;
}

只要一次比较就可以了。

基于AI的学习



学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时 优秀
第一周 2/3 20/20 合格
第二周 20/20 1/4 15/35 终于理解了一些概念,能看懂一些话了
第三周 20/40 1/5 20/55
第四周 50 /90 2/7 20/75
第五周 80/170 1/8 30/105 会编写一些简单程序了
第六周 30/200 2/10 30/135 编程水平提升了
第七周 30/230 1/11 25/160 编程得更熟,也知道了计算机方面更多粗浅的知识。
第八周 60/290 2/13 30/190 对于高级语言的一致性有了认识。
第九周 100/390 1/14 30/230
第十周 100/490 2/16 30/260
第十一周 150/640 2/18 30/290
第十二周 200/840 1/19 30/320
第十三章 200/1040 1/20 20/340