2022-2023-1 20221414《计算机基础和程序设计》第八周学习总结
作业信息
班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP
作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08
作业目标:面向对象,面向过程,顶点,指针,编译器定义,翻译过程,继承,多态
作业正文:2022-2023-1 20221414《计算机基础和程序设计》第八周学习总结
教材总结
- 功能设计是按照产品定位的初步要求,在对用户需求及现有产品进行功能调查分析的基础上,对所定位产品应具备的目标功能系统进行概念性构建的创造活动。
- 面向对象程序设计其本质是以尽可能模拟人类的思维方式来建立模型体现出来的抽象,思维过程和面向对象的方法,以对象为核心。其过程简单地说就是先抽象出对象,然后用对象执行方法的方式解决问题。具体方法有:
1、先根据需求找出对象
2、抽象每一个对象为类
3、找出各对象之间的关系,使用组合、继承、分类、扩展等描述这些关系
4、找出每个对象实体要做的事,写对象方法
5、找出每个类在不需要有对象实体的情况下要做的事,写类方法 - 三个特性:1、封装性;2、继承性;3、多态性。
- 四个名词解释:
1.汇编是三种方式中最接近“翻译”的本来意味的,因为汇编过程就是把汇编指令一对一地翻译成01机器码的过程。而采用这种处理方式的语言只有一类:汇编语言。
2.解释过程,就是对于源文件中的每一条指令,都依次翻译成目标指令,并且执行的过程.需要解释器,由此运行较慢,但也获得了无平台限制的优点。
3.编译过程,与解释挺像,区别就在于编译是将所有的源代码指令一次性成翻目标代码并执行,并且不需要解释器的参与,所以运行比较快,但有平台依赖性。编译好的程序只能在当前平台运行。
4.执行:机器理解并运行其所得的机器代码 - c语言:指针是c语言的精华,也是难度的体现,我还没有学得很懂。这里分享一篇有关文章:让你不再害怕指针——C指针详解
错题
The properties of an abstract data type are tightly related to the implementation of that data type.
我的翻译:一个抽象数据结构的属性与他的实现方式紧密相关。
实际上是分离的。
正确答案:错误
你的作答:正确
代码问题
一,数组存储字符串和scanf_s第三个参数的意义
从这个程序说起(程序目的是输入abcdefg,再把它倒置输出成gfedcba。原题要求递归,但当时我没看到。现在只探讨这一程序报错缘由)
#include<stdio.h>
int main()
{
int i;
char N[7];
printf("input your string:\n");
for (i = 0; i < 7; i++)
{
scanf_s("%s",&N[i],7);
}
for (i = 6; i >= 0; i--)
{
printf("%c", N[i]);
}
return 0;
}
1.0x00007FFE36F62079 (ucrtbased.dll)处(位于 ConsoleApplication10.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000002AA5D00000 时发生访问冲突。
scanf_s在输入数组时需要加入数组长度,即参数“7”。
引用
2.Run-Time Check Failure #2 - Stack around the variable 'N' was corrupted.
意思是:定义的数组N附近的内存被破坏了。可能原因有:堆栈溢出、内存访问越界。这里应该是数组访问越界。这里有两个问题,一个是数组存储字符串(当我把"%s"改为"%c"时就没有问题了,所以这是字符串的问题。),还有一个是scanf_s第三个参数(下面统称三参)的意义。
第一个问题在第十章(10.2)中有讲解。在数组存储字符串时切记少敲一位字符,因为数组最后一位要放结束符。因此,这个存储字符串的数组的长度至少是8(7 + 1)。
然而,做出修改后程序仍然如此报错。经反复实验,数组长度>=三参+6才行。由此我们需要了解这一现象的原因。
先来了解scanf_s函数。scanf_s用法
scanf_s函数特别针对输入字符串的情况。scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符(留一个给'\0')。现在我有两个疑问,一,我每次输入的都是字符串,那么长度8无法存储7个字符串而是把他们当成了一个字符串,为什么?二,三参增加的意义和数组长度随之增加的意义是什么?
通过隔开输入字符串,我发现它每次都是按照一个字符串来存储的,只是几个字符串不隔开输入时'\0'会被替换,刚好变成一个字符串。
而我理解的三参的含义是scanf_s函数向数组申请的缓存区大小,这个缓存区不能超过数组本身内存。在本代码中输入函数最终会到达N【6】,当数组长度为8是刚好只有2个长度(N【6】,N【7】)可以给scanf_s函数当缓存区,故三参最多为二,之后以此类推。
ps:在实验中我发现三参为一时输出空白,测试得其数组内存储的全是'\0',验证了上述部分说法。也验,三参为三时可以同时输入三个长度的字符串,所以根本没必要搞个循环来把一个字符串拆成一个个来输入,倒是可以用于多个最好同大小的字符串的存储。所以代码做如下修改:(就本题而言,直接把"%s"改为"%c"就好了,但这里就是要储存一个字符串)
#include<stdio.h>
int main()
{
int i=0;
char N[8];
printf("input your string:\n");
scanf_s("%s", &N[i],8);
for (i = 7; i >= 0; i--)
{
printf("%c", N[i]);
}
return 0;
}
二,float类型%d输出
看以下代码
#include<stdio.h>
int main()
{
int a, n;
float b,x=0;
b = 0.01;
a = 100000 * 30;
for (n = 1; n <= 30; n++)
{
x = x + b;
b = b * 2;
}
printf("Millionaire gives the stranger: %8ld Yuan\nThe stranger gives millionaire: %8ld Yuan\n", x, a);
return 0;
}
我们要的答案是x=10737418,但答案总是多了个24,可逻辑并没有问题,经调试在出循环时x=10737418.0也没有问题。所以就只有输出问题了。
在把x强制类型转换为int后答案没有了问题,也就是说问题出在一个float变量输出为%8ld格式上。
经查,有相似情况:当float a=7.5f 时printf("%d",a)输出为0的情况:%d只输出低32位的数据,并将这些32位二进制以十进制数输出,编译器首先将7.5从float类型转换为double类型,7.5在内存中的存放方式是0x40f00000,转换成double类型在内存中的数据就是这个0x401e000000000000,这个内存数据可以很明显看出低32位全是0,而%d则只能截取到低32位,所以这个以%d输出7.5的数值当然是0了。如大家不相信可以用%lld 输出看看,这个%lld就很读到低64位数据,读出的结果就是0x401e000000000000,在屏幕上看到一个很大的十进制数。
另外,在查找过程中我也学习了一点vs调试知识,以下是入门文章:vs调试查看中间变量和Debug调试—Visual Studio 2022。
三,其他
1.“do…while 是先执行一次循环体,然后再判别表达式”。当表达式为“真”时,返回重新执行循环体,如此反复,直到表达式为“假”为止,此时循环结束。
2.在C语言中有两种注释方式:一种是以/开始、以/结束的块注释(block comment);另一种是以//开始、以换行符结束的单行注释(line comment)。
3.调用堆栈溢出可能是错误的运算导致,比如0/0.
进度
未统计