精华内容
下载资源
问答
  • 解C语言 第3版.pdf

    2018-04-29 14:42:07
    柴田望洋《明解C语言》第3版中文,C语言入门,通过图文结合的方法对C语言的基础知识进行讲解及剖析。
  • C语言深度培》读书笔记之二

    千次阅读 2013-01-24 15:40:22
    C语言的基本符号就有20多个,每个符号可能同时具有多重含义,而且这些符号之间相互结合又使得C语言中的符号变得更加复杂起来。 注释 C语言的注释可以出现在程序的任何地方,这句话对不对? int/**/n; char *s...



    C语言的基本符号就有20多个,每个符号可能同时具有多重含义,而且这些符号之间相互结合又使得C语言中的符号变得更加复杂起来。

    注释

    C语言的注释可以出现在程序的任何地方,这句话对不对?

    	int/**/n;
    	char *s="abcd //hgjkeife";
    	//is it a \
    	valid comment
    	in/**/t i;

    前三条注释都正确,第四条不正确。

    第一条:编译器会将注释剔除,而不是简单的剔除,而是用空格来代替原来的注释。不用担心解析成intn

    第二条:双绰号括起来的都是字符串常量,双斜杠也不例外。

    第三条:合法的注释,编译器会有警告提示:warning C4010: 单行注释包含行继续符

    第四条:不合法。注释会用空格进行替换。

    y=x/*p;
    编译器会把/*当成注释的开始,而不会当成*p。修改成y=x/ *p; 则可

    也就是说只要斜杠(/)和星号(*)之前没有空格,都会被当成注释的开始。
    注释代码段时应注重“为何做(why)”而不是“怎么做(how)”

    接续符和转义符

    C语言里以斜杠(\)表示断行。编译器会被反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行。

    注意:反斜杠后面不能有空格,反斜杠的下一行之前也不能有空格。

    下面是几个特例

    /\
    /这是一条简单的合法的单行注释
    
    cha\
    r *ss="这是一个合法的\\
    n字符串";
    
    #def\
    ine MAC\
    RO	这是一条合法的\
    宏定义

    反斜杠除了可以被用作接续符,还能被用作转义字符的开始标识。

    单引号、双引号

    1 ‘1’和“1”

    第一个是整型常数,32位系统下占4个字节。

    第二个是字符常量,占1个字节。

    第三个是字符串常量,占2个字节。

    字符在内存里是按ascii码存储的,所以字符常量可以与整型常量或变量进行运算。‘A’+1

    逻辑运算符

    ! &&  ||

    位运算符 

    C中位运算符包括以下几种:

    &按位与

    |按位或

    ^按位异或

    ~取反

    <<左移

    >>右移

    注意:逻辑运算符&&  ||  和位运算符 & | 的区别,不要混淆。

    其中按位异或可实现不用第三个临时变量交换两个变量的值。

    a^=b;b^=a;a^=b;

    左移运算符<<:双目运算符。其功能把“<<”左边的运算数的各个二进制位全部向左移动若干位,由“<<”右边的数指定移动的位数。高位丢弃,低位补0.

    右移运算符>>:双目运算符。其功能是把“>>”左边的运算数的各个二进制位全部向右移动若干位,由“>>”右边的数指定移动的位数。但注意:对于有符号数,在向右移时,符号位随同移动,当为正数时,最高位补0,当为负数时,符号位为1,最高位是补0还是补1取决于编译系统的规定。

    用最有效率的方法算出2*8=?

    0x01<<2+3  ;

    结果是32.因为“+”号的优先级高,

    改成 0x01<<2+30;  或  0x01<<2-3;

    这样行嘛,不行。一个整型长度为32位,左移32会造成溢出,左移-1位?也不行。

    左移和右移的位数是有讲究的,左移和右移的位数不能大于数据的长度,不能小于0.

    花括号 

    花括号为了把一些语句或代码打个包包起来,使之形成一个整体,并与外界绝缘。

    ++、--操作符

    后缀运算符在本计算单位计算结束后再自加或自减。

    h=(i++,i++,i++);       //在遇到逗号时才自加。   h=2,i=3

    h=(i++)+(i++)+(i++);   //在遇到分号时才自加。   h=0,i=3

    贪心法

    运算符的优先级




    这些容易出错的情况,一定要在编译器上多调试调试,这样印象会深一些,光靠看代码,水平是很难提上来的,调试代码是最长水平的。





    展开全文
  • 高斯消元法求解方程组的c语言版),用c语言实现了高斯消元法求解方程组的的过程。结合程序有助于理解此方法的原理和过程
  • 在形式逻辑学中,有一个很重要的思想,就是将一句话用字母和符号完整表示出来后,通过离散数学的运算规则列出...结合离散数学和形式逻辑学的思想,可以将演绎推理实现于程序中,体验一下数学和逻辑学与代码融合的魅力。


    最近在看波老师的形式逻辑学书籍,发现了一个很有趣的逻辑推理题,这个题的要求非常简单,就是判断一段话是对的还是错的,来看看这道逻辑题:


    如果我有一千万,我就能买到房子。现在我没有一千万,我不能买到房子。


    看完这道题目,我果断的断定,这是对的结果答案是:错的!


    知道真相的我,开始怀疑我的智商了。后来学了一小段时间的形式逻辑学后,我才理解了这道题为什么是错的。因为,如果我没有一千万,但是可能房子只需要一百万啊,所以我还是能买到房子的。又知道真相的我,被自己蠢哭了。。。


    其实这道题的正确解法是用离散数学来解的,几乎现实中的含逻辑推理色彩的话语,都能转化成离散数学来演绎推理。简单来说,形式逻辑学,就是用离散数学来做逻辑推理(个人观点)。


    ------------------------------------------------------------------------------


    先来简单回顾一下离散数学,对于一个陈述句,可以用真、假两个值来表示陈述句的正确性,真、假值用1、0来表示,同时用一个字母来表示这个陈述句,比如:


    p : 小明吃饭了          1

    ┐p : 小明没有吃饭      0

    q : 小红吃饭了          1

    ┐q : 小红没有吃饭      0


    如果是有两个陈述句有关系,用相应符号表示,但是这个关系也是可能为真可能为假,这个很像程序代码的思维,再举例:


    p∧q : 小明和小红都吃饭了

    p∨q : 小明或者小红吃饭了


    如果两个陈述句有因果关系,用→符号表示,比如:


    p→q : 如果小明吃饭了,小红就吃饭了


    离散数学还有更多语法,不再一一叙述,接下来是真值表的相关知识。


    真值表,在数字逻辑电路中很常用的知识,简单点的有与非门、与或门的真值表,更难的有反馈电路等等,用真值表来分析电路的输入输出十分实用。离散数学的真值表跟数字逻辑的差不多,可能是同个祖宗。用离散数学的真值表思维来进行演绎推理,是一种很牛逼的方法,训练多了就分分钟成为下一个福尔摩斯。扯远了。。。回归正题,“小明吃饭了”这句话有真有假,那么真值表其实就是一张列举了所有真假关系的表,真值表也是离散数学的运算规则


    p:小明吃饭了 
    0
    1


    p
    q
    p∧q
    p∨q
    0 0 0 0
    0 1 0 1
    1 0 0 1
    1 1 1 1


    因果关系的真值表有点特殊,只有因是真的、果是假的情况时,整个推断就是假的,其他情况都是真的。为什么会这样子?因为如果前提是假的,那么结论不管结果是什么都没有意义,所以就把整个推断归为真的。还是不理解为什么会这样子的话,可以简单理解为吹牛吹大了,鬼知道真还是假,当是真的算了。


    p q p→q
    0 0 1
    0 1 1
    1 0 0
    1 1 1


    ======================================================================================


    有了以上的离散数学基础知识,可以开始解那道逻辑题了:


    如果我有一千万,我就能买到房子。现在我没有一千万,我不能买到房子。


    (以下的解法有可能你会觉得发现了新大陆,反正我是觉得真的很神奇,再次体会到数学之美


    解:先把陈述句全部用字母和符号表示:


    p : 我有一千万

    q : 我能买到房子


    ┐p : 我没有一千万

    ┐q : 我不能买到房子


    p→q : 如果我有一千万,我就能买到房子

    ┐p→┐q : 我没有一千万,我不能买到房子


    有了以上的表示方式,就可以继续往下做,对于题目陈述句“如果我有一千万,我就能买到房子。现在我没有一千万,我不能买到房子。”这句话,有两种表示方式:


    (1)(p→q)→(┐p→┐q)

    (2)((p→q)∧┐p) → ┐q


    为了接下来用C语言编写程序方便,我们来选用 第(2)种 方式列真值表

    (这种方式的意思是把((p→q)p)当成前提条件,把┐q当成结论,通过合取p→q和p来推结论┐q是否正确


    p ┐p
    q ┐q
    p→q ((p→q)∧┐p)
    ((p→q)∧┐p)→┐q
    0 1 0 1 1 1 1
    0 1 1 0 1 1 0
    1 0 0 1 0 0 1
    1 0 1 0 1 0 1



    观察真值表,发现((p→q)p)→┐q不是重言式(全为真),因为其中有一个0这就意味着,推理后可以判定这道题的逻辑是有问题的,是错的。在形式逻辑学中,有一个很重要的思想,就是将一句话用字母和符号完整表示出来后,通过离散数学的运算规则列出真值表,如果表达式的真值中存在假即0时,就说明这句话的逻辑是错误的,推理是不成立的。


    如果不知道((p→q)p)→┐q这个式子是怎么得出真值表的,只要把→符号的左右两边看成整体,再按照前面提到的运算规则即可得出真值表。






    激动人心的时候到了,接下来我要用离散数学+形式逻辑学的思想用C语言编写程序来推理验证((p→q)∧┐p)→┐q的正确性。





    (一)首先,我准备写一个函数,返回值为布尔型,命名为 decude,即推理的意思,先定义在main主函数之前,调用这个函数就相当于以上用离散数学解题的过程;

    bool decude();


    (二)现在开始编写decude,定义四个布尔变量,p为“我有一千万,q为“我能买到房子,condition为“我有一千万所以我能买房子”和“我有一千万所以我能买房子,现在我没有一千万”(之后会在代码动态变化),result为推理结果,默认为1即推理是正确的;

    	bool p;
    	bool q;
    	
    	bool condition;	
    	bool result = 1;



    (三)前面说过,离散数学中的因果关系的真值表十分特殊,只有因是真的、果是假的情况时,推理出的结果就是假的,其他情况都是真的。所以在代码中,可以通过以下代码来实现这个逻辑;

    	if( p==1 && q==0 ){
    		
    		condition = 0;
    	}
    	else{
    		
    		condition = 1;
    	}
    


    对应的真值表是:

    p q p→q
    0 0 1
    0 1 1
    1 0 0
    1 1 1


    (四)当condition变量为“我有一千万所以我能买房子”时并且求出真值后,再合取“我能买到房子”q,又可得出新的condition,意思变为了“我有一千万所以我能买房子,现在我没有一千万”。简单来说,condition变量就是根据p→q的值再求出并被赋值成(p→q)p的真值

    	condition = condition && !p; 


    (五)如果你没看懂以上四点,请先屡清楚逻辑。上面四点都只是针对某个确定的真值情况来求结果的,但是p和q的真值组合可以达到4种情况,所以,我要用for循环来把每一种真值情况都遍历一遍,才能推理出最终正确的结果

        //两层嵌套,嵌套内容语句最多执行四次,即可以把所有真值情况都遍历一遍
        for(int i=0; i<=1; i++){
            for(int j=0; j<=1; j++){
                
                p = i;    //i为遍历p的真值,0为假,1为真
                q = i;    //j为遍历q的真值,0为假,1为真
    
                /*其他内容。。。*/
            }
        }
        


    (六)还记得还有一个变量result吗?默认为1,代表推理结果是正确的,但是在for循环中遍历的时候,如果result被修改为0,即已经计算出((p→q)p)→┐q的真值是0的时候,没有再循环的必要,所以要退出循环,最后将result值返回;

    	if(condition==1 && !q==0){
    		
    		result = 0;
    	}
    	
    	if(result == 0){
    		break;
    	}




    (七)以上六步,就是应用离散数学到C语言代码中的思想,接下来直接上完整代码:


    	#include <stdio.h>
    	
    	bool decude();
    	
    	int main(){
    		
    		bool result = decude();		//调用推理过程,获取返回值 
    		
    		if(result == 0){
    			printf("经过推理后,得出结论不正确\n\n"); 
    		}
    		else{
    			printf("经过推理后,得出结论正确\n\n");
    		}
    		
    		return 0;
    	}
    	
    	//推理过程 
    	bool decude(){
    		
    		bool p;		//前提一:我有一千万
    		bool q;		//前提二:我能买到房子 
    		bool condition;		//前提三:如果我有一千万,我就能买到房子 
    		
    		
    		bool result = 1;	// 结论:我能买到房子 
    		
    		
    		for(int i=0; i<=1; i++){	//遍历p前提一的真值 
    			
    			if(result == 0){	//如果得出结论是错误的,没有再循环下去的必要 
    				break;			//退出循环 
    			}
    			
    			for(int j=0; j<=1; j++){	//遍历q前提二的真值 
    				
    				p = i;		//将遍历到的i值赋给p当真值 
    				q = j;		//将遍历到的j值赋给q当真值 
    				
    						
    				if( p==1 && q==0 ){		//如果p,则q的真值为假 
    					
    					condition = 0;		//前提三 " 如果我有一千万,我就能买到房子 " 的真值为假 
    				}
    				else{
    					
    					condition = 1;		//前提三 " 如果我有一千万,我就能买到房子 " 的真值为真 
    				}
    				
    				//前提三变为前提四
    				condition = condition && !p; 	//前提四: 如果我有一千万,我就能买到房子,现在我没有一千万 
    		
    		
    				if(condition==1 && !q==0){		//如果 " 如果我有一千万,我就能买到房子,现在我没有一千万 ",则 " 我买不到房子 " 为假 
    					
    					result = 0;		//得出推理结果的错误的 
    				}
    				
    				
    				if(result == 0){	//如果得出结论是错误的,没有再循环下去的必要 
    					break;			//退出循环 
    				}
    				
    			}
    		}
    		
    		return result;		//循环结束后,返回推理结果 
    	}
    	
    




    正文结束


    本人形式逻辑学学得不深,所以上述难免会有误之处,而且写作水平不高,许多地方表述不够清楚,代码方面也没有用上好的算法,还请看完本文的大神多多指点。




    展开全文
  • 今天开始看柴田望洋的《明解c语言》,目的是做嵌入式开发的学习,所以会结合arm芯片进行学习。最终的目的是做一架小型的无人机,在2016年之前完成。分为三个阶段。  1.在十一月二日之前,用arm芯片写出控制光立方的...

        今天开始看柴田望洋的《明解c语言》,目的是做嵌入式开发的学习,所以会结合arm芯片进行学习。最终的目的是做一架小型的无人机,在2016年之前完成。分为三个阶段。

        1.在十一月二日之前,用arm芯片写出控制光立方的程序。

        2.在十一月二十日写出土壤湿度检测程序。

        3.在年底之前搭建好小型四旋翼飞行器,并写出控制程序。


        今天晚上主要看了前三章。第一张主要是熟悉c,第二章主要是介绍数据类型和运算符,第三章主要是介绍条件结构。这些内容比较熟悉。

        早上和下午主要熟悉了下开发板烧写程序的过程。


        注意:在使用JLINK烧写程序时,要使用JLINK commander输入power on才能够将开发板上电,然后在J FALSH中要设置芯片的型号。之后烧入hex文件即可。

        今天还有没有解决的问题是:平常自己编写程序时候的配置,现在的配置方法导致无法编译。明天尽快解决。


        明天的任务:1.c语言中不熟悉的内容主要是,1.数组 2.函数 3. 指针 4.结构。 之前学习单片机都是用汇编简单学过,在C语言中自己使用的并不多。

                                2.开发板自带的工程文件中有些并不必要。所以要了解各个文件的大致作用。创建一个自己的工程,能够简单点亮一个led。

                                3.在开发板自带的程序中找出结构,数组,进行学习。

                                                                                                                                                                                             

      2015.10.26 晚 21:58

    展开全文
  • 结合键盘扫描的例程做了一些了解。 端口GPIO寄存器主要有:1.GPIOx_CRL 2.GPIOx_CRH 3.GPIOx_IDR 4.GPIO_ODR 5.GPIO_BSRR 6.GPIOx_BRR 7.GPIOx_LCKR 端口输入输出分别可以配置为四种模式: 输入:模拟输入,浮空输

     昨天没有写,打球吃饭到很晚。

    今天把昨天没有完成的看了下。主要是STM32F107的端口和中断部分。结合键盘扫描的例程做了一些了解。

    端口GPIO寄存器主要有:1.GPIOx_CRL 2.GPIOx_CRH 3.GPIOx_IDR 4.GPIO_ODR 5.GPIO_BSRR 6.GPIOx_BRR 7.GPIOx_LCKR

    端口输入输出分别可以配置为四种模式:

    输入:模拟输入,浮空输入,下拉输入,上拉输入。

    输出:OD,PP,复用OD,复用OP。


    在复用中包括,没有重映像,部分重映像,完全重映像。


    还看了AFIO,EXTI的简介和寄存器。但是因为没有使用,所以印象不是太深。


    在看程序的过程中了解了枚举类型enum。

    主要看了两个函数GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef * GPIO_InitStruct) 和函数 uint8_t GPIO_ReadInputDataBit( , )(此处省略参数)

    感觉看函数还是很有用的,看了程序中形参的类型,也在使用函数的过程中发现了实参的类型。发现像端口,引脚之类的定义形式都是以地址类型来定义的。


    在看后一个函数的过程中,看到了一个enum的实际应用,注意enum变量中的值是一次向后取得,也可以中间改变,要注意规则。

    如果要读一个引脚的值,通过与的方法消除其它引脚的值,保留这个引脚的值,和0进行比较。


    主要就是这些。


    觉得要改善的地方是,学习效率要提高,对于这个芯片了解的还不够,中断定时器的例程还没有接触到。

    这个程序中有很多写好的程序,要有重点地分析几个,大概地看一下。自己动手写的程序比较少。


    明天的打算:看一下这个芯片定时器和中断的例程。

    回想一下,对这个芯片了解的还是很少,时间有限,要加油!

    展开全文
  • 8051单片机C语言

    2012-10-23 11:08:01
    本书介绍8051单机C语言结合硬件编程应用的工程方法。本书通过一个个实用的例子分析请语言。
  • c语言指针

    2021-04-23 14:46:48
    (2)int * p,s,其中*与变量名结合,说明p是整型指针,s是整型变量 (3)int * p中,*是声明; *p=&a中,*是引用 (4)指针要进行初始化 未初始化的指针称为野指针,野指针是不可取的,最好赋予NULL或指向...
  • 这个代码是我为了完成老师布置的大作业借鉴一个哈弗曼编码实现压缩压缩的论文写的,并结合游程编码的算法使其完善。游程编码适合重复性高的文本。算法简单,速度快。哈弗曼编码算法难,但是运用广泛。 #include #...
  • 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主元Guass消元法里面我们知道,最后的系数矩阵A将变成一个上三角矩阵,并且是通过一系列的行变换而来的,设最后得到的上三角矩阵为U,结合高等...
  • C语言杂记1

    2017-02-08 19:51:33
    一、指针是什么? int *p; 定义一个指针变量p。 因为p是局部变量,所以也遵循C语言局部变量的一般规律(定义局部变量并且未初始化,...(2)星号在用于指针相关功能的时候有2种用法:第一种是指针定义时,*结合前面的类
  • 《明解C语言 第3版 入门篇》是日本的C语言经典教材,自出版以来不断重印、修订,被誉为“C语言圣经”。 《明解C语言 第3版 入门篇》图文并茂,示例丰富,第3版从190段代码和164幅图表增加到205段代码和220幅图表,对...
  • c语言笔记2

    2020-05-05 11:40:37
    指针的作用时为了间接访问,间接寻址 指针使用三部曲:定义指针变量,关联指针变量,引用 ...*结合前面的类型表示类型,与后面结合解引用 我们写的代码是给编码器看的,代码要想达到你想象的结果...
  • C语言算法设计

    2013-06-11 22:52:08
    算法竞赛入门经典》是一本算法竞赛的入门教材,把C/C++语言、算法和解题有机地结合在了一起,淡化理论,注重学习方法和实践技巧。全书内容分为11章,包括程序设计入门、循环结构程序设计、数组和字符串、函数和递归...
  • 通过基于C语言开发角度,设计了一种自动翻译软件系统,通过对汇编语言过渡到C语言的算法设计详细介绍,在系统软件需求分析过程,结合原始数据需求以及功能性需求,确定了系统软件总体设计,包括总体框架设计和技术...
  • 作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...
  • 运算符详解-C语言

    2020-05-16 00:11:35
    结合律 ++(后缀) --(后缀) ()(函数调用) [] {} (复合字面量) . -> 从左往右 ++(前缀) --(前缀) - +(正负号) ~ ! *(引用) &(取址) sizeof _Alignof(类型名) 从右往左 (类型名) 从右往左 * / % ...
  • C语言的编译

    2010-06-11 09:47:00
    还没有学习操作系统运作的时候,总是不理解C语言编译出来的究竟是什么东西,就知道C语言的编译过程如下: C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-...
  • 作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...
  • 习题 5 参考解答 1数组是相同数据类型的集合分为一维数组二维数组及多维数组在什么...2数组元素又称为下标变量数组元素的下标有何意义 下标的意义是对数组的各个数组元素进行标识和区分由数组名和下标结合起来 形成
  • 不巧的是p两边的运算符是同一优先级的,而且写的是从右向左结合,从右向左的字面意思当然是先++(指针指向下一单元地址),再取值(引用)了 遇到想不明白的,一般测试一下就清楚多了,所以写了下面几句,结果...
  • 学习指针是学习C语言中最重要的一环, 能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时, 指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到...
  • 作者在网络版CFAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

空空如也

空空如也

1 2 3 4 5 6
收藏数 106
精华内容 42
关键字:

c语言解结合

c语言 订阅