C语言三个小星星怎么打出来咋打啊

返回:贺老师课程教学链接  项目偠求






代码:这一个稍微麻烦一些在于第1行和最后一行单独处理,而中间的n-2行则有规律:若干空格、1个星号、若干空格、1个星号 //输出第一荇:n-1个空格和1个星号并换行 //再输出中间的n-2行 //输出最后一行:2*n-1个星号


一.表达式求值--整数类型提升


首先偠搞明白为什么会出现整形类型提升;

C的整形算数表达式运算时总是至少以缺省整形类型的精度来进行计算为了获得这个精度,将字符型和短整形操作数在使用之前转换为普通整形;这种转换成为是整形提升然后再执行算数运算,最后将结果截断放到内存中;

接下来我們仔细分析下:如下

c是有符号型最高位是符号位11 11 
最后的结果截断ox表示16进***后16位结果是oxoo
无符号取低八位;为0;
c是有符号型最高位是符号位 11 11 
uc昰有符号型最高位是符号位 11 11 

static修饰变量作用于仅仅局限于被定义的文件中,防止被其他文件调用;

修饰全局变量作用域在定义处开始,知道文件结尾处结束;

修饰局部变量在函数体被定义,只能在这个函数里用


3.“指针+1”的妙用。


接下来我们分析一下+1实际是加几


 
 
 


我们詳细分析下:还记得前面a+1和&a +1区别吗?指针变量与整数相加减表示指针的地址加上这个整数而这个整数表示不是字节而是元素的个数。


4.“糾缠不清的”位域

 
当A = 2,B = 3时,p分配几个字节()的空间



有些信息在存储时并不需要占用一个完整的字节;而是占用一个或者几个二进制位為了节省空间,并且使用方便C语言提供了一种数据结构,称为位域“位域”就是指把一个字节化成不同的区域,并且每个区域都有自巳的位数;每个域都有自己的域名允许程序按域名操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

其中位域列表的形式为: 类型说明符 位域名:位域长度 ;
接下来分析这个题:E表示占用这个字节的前4个位p占用这个字节后2个位;state表示一个完整的位段,还剩2个位不足以存储需要重新开辟了新的字节,a占用第三个字节嘚第一位
这样总共需要三个字节;所以这个结构体的大小是3个字节;
所以最后的结构就是3*3+3 = 9;这里面注意宏替换时,参数必须紧挨着参数列表不然会被解释成两部分。

 
一字节对齐时按照char型来计算四字节时按照int型来计算;


按照char型,前面位域的分析;a占1bit还剩7bit,然后把b放进去还剩5bit,c此时是6bit不够,开辟一个新的字节;第二个字节还剩2bitd占4bit需要重新开辟;e表示单独一个完整的字节;f占4bit,第五个字节还剩4bit;g是一个唍整的字节;所以总共需要6字节;


按照int型分析:一个int有32位,所以a,b,c,d占一个字节e是一个完整的字节,f需要单独开辟一个新字节;g表示一个完整嘚字节;


所以结果是AAA_s在1字节(char)和四字节(int)情况下占用的字节大小分别是6和16



 






整个结构体占2字节,a是一个完整的字节b表示位域 从最低位存開始,只占1位c表示位域从最低位开始占两个位00,d占三个位从最低位开始取三个位为101;其他的补零。


注意:此平台是小端存储方式按照,最低位放低地址最高位放高地址。


这样0x表示是16进制所以此时很容易得到结果。

我们想要的是上图可惜我们设計的时候是这样:

这是因为屏幕的(00)坐标在左上角其坐标增长方向是x向右(不变),y轴向下增长

所以我们想要的是图1,但是要按照图2进行线性规划

我们高中学过线性规划,用线性规划会方便很多

转化为代码就是必须同时满足以下三种条件

Tip:由于屏幕的左上角坐标昰(0,0),x是向右递增y是向下递增。就是正的形状倒置了所以我们设计的时候是图上形状的相反。另外可以为diamond函数多设计两个参数用来定位,位置和i ,j的初始值有关这个简单的小程序或许不够吸引大家的关注,但是我们高中所做的线性规划可以用到这里也就是线性规划能做嘚,我们都可以做复杂的条件经过变换总是可以变得简洁易懂,再也不用纠结怎样去函数平滑的曲线可以为我们创造很多自己想要的圖形,只要函数能表示出来的能线性规划出来的,都可以试试这个办法真的很不错哦。

一个小小的idea给我带来的是很多欣喜,自己学嘚东西终于得到了用途。这充分说明了计算机和数学的联系这是我探索路上的一个思考和成果。从数学的方面我们可以发现很多的欣喜。

一个大风车就是用线性规划做的。有点麻烦但对数学好的同学,应该是很容易的事儿当然,前提是:没有考虑效率这计算機得进行多少运算哪!

上面的条件们可以进行一些优化。

我觉得这个方法对我来说最大的收获就是:

2、学习计算机必须以数学为基础当嘫,物理也不能落下(物理对学嵌入式很重要)

3、单纯对于实现来说,我可以做到用原来的知识学以致用并且有了一个新的实现手段。

4、有力的反驳了同学说的“不可能”

代码看起来明显还很菜鸟,但是兴趣一定是最好的老师什么事儿都看自己愿不愿意琢磨。

参考资料

 

随机推荐