发 帖  
原厂入驻New
实战多通道高速精密测温仪的全系列设计教程,以实际项目为依托,提升工程师核心竞争力!→点击立即抢购←

[经验] 朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

2013-7-31 08:47:54  183045 C语言 C语言 C语言 C语言 C语言
分享
341
本帖最后由 zzq宁静致远 于 2014-2-27 19:42 编辑

    再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助。

2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格。“朱兆祺STM32手记”(http://bbs.elecfans.com/jishu_385613_1_1.html)一帖中我就多次强调过编程的模块化,要考虑到可移植性和别人的可阅读性。我在某公司实习的时候,拿到一个程序,我当时就想吐槽,我想除了这个程序的当时写作者能够看懂之外,其他人有谁还能看懂,程序构架、可移植性性就更是一塌糊涂。结果我全部推到重写。因此明志电子科技工作室从承接第一个项目做开始,我便和搭档说,我们必须制定我们工作室的编程规范和编程风格,这样就算给谁,换成谁,拿到项目都能马上接下去做。
    朱兆祺在这个帖子将会不断更新,明志电子工作室的项目经验也将在电子发烧友论坛不断贴出,我希望能用我们仅有的力量,将我们的经验毫不保留传授给大家。我只希望在未来某一天,有那么几个人会竖着大拇指说:明志电子科技工作室的经验受益匪浅就够了。我相信,在深圳,明志电子科技工作室的影响力会日益增长,因为我们已经规划好了未来脚步。
    C语言是一门技术,但更是一门艺术。写一个C语言代码不难,写一个高水平、漂亮的代码很难。朱兆祺将在此帖不断为大家攻破C语言。

<--朱兆祺于2013年10月18日

-->朱兆祺更新于2014年2月21日:
    深圳市馒头科技有限公司于2014年2月注册成立,当初命名为馒头科技,不管是吴坚鸿所说亲切还是谢贤斌所说草根。馒头科技永远以用户满意为我们的追求,馒头科技不追求锦上添花,但是我们很愿意为每一位客户雪中送炭。因为锦上添花每一个人都会做,但是雪中送炭却不是每一个人愿意去做。
    馒头科技往后将为每一位读者送上更为精美的学习资料。敬请期待。



第一节  C语言编程中的几个基本概念
http://bbs.elecfans.com/jishu_354666_1_1.html

第二节  数据存储与变量
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088253&fromuid=222350

第三节  数学算法解决C语言问题
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088283&fromuid=222350

第四节  关键字、运算符与语句
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088352&fromuid=222350

第五节    C语言中的细节
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088375&fromuid=222350

第六节  数组与指针
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088417&fromuid=222350

第七节  结构体与联合体
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088582&fromuid=222350

第八节  内存分配与内存释放
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088596&fromuid=222350

第九节   笔试中的几个常考题
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088606&fromuid=222350

第十节  数据结构之冒泡排序、选择排序
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2092632&fromuid=222350

第十一节   机试题之数据编码
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2096393&fromuid=222350

第十二节  机试题之十进制1~N的所有整数中出现“1”的个数
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2097513&fromuid=222350

第十三节  机试题之  遍历单链表一次,找出链表中间元素
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2103563&fromuid=222350

第十四节  机试题之全排序
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2105648&fromuid=222350


第十五节 机试题之大整数运算
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2109737&fromuid=222350


第十六节  机试题之大整数减法与乘法
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2115675&fromuid=222350

第十七节  算法之二分查找
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2128027&fromuid=222350

第十八节  数据结构之单向链表(颠覆你手中数据结构的三观)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2139670&fromuid=222350

第十九节  数据结构之双向链表(接着颠覆你手中的数据结构三观)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2156978&fromuid=222350

第二十节 数据结构之栈
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2193337&fromuid=222350


C语言技术公开课第一讲——编译环境给C语言带来的困扰,网络课程讲义
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2230571&fromuid=222350

第二十一节  通过加减法高效的求出两个无符号整数的商和余数
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2252461&fromuid=222350

第二十二节  表达式计算器(1)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2280837&fromuid=222350

第二十三节  表达式计算器(2)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2325485&fromuid=222350

第二十四节  表达式计算器(3)
http://bbs.elecfans.com/forum.ph ... 4547&fromuid=222350

第二十五节  表达式计算器(4)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2395966&fromuid=222350

C语言技术公开课第三讲  const问题
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2434706&fromuid=222350

第二十六节  序列差最小
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2466868&fromuid=222350

第二十七节  sizeof与strlen的深入
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2676569&fromuid=222350

第二十八节  C与C++中的const

第二十九节 do、while
第三十节 变量的生命周期

第一节  C语言编程中的几个基本概念
1.1      include< >与#include" "


1.   #include< >和#include" "有什么区别?
这个题目考查大家的基础能力,#include< >用来包含开发环境提供的库,
#include" "用来包含.c/.cpp文件所在目录下的头文件。注意:有些开发环境可以在当前目录下面自动收索(包含子目录),有些开发环境需要指定明确的文件路径名。
1.2      switch()
1.   switch(c) 语句中 c 可以是 int, long, char, float, unsigned int 类型?
其实这个题目很基础,c应该是整型或者可以隐式转换为整型的数据,很明显不能是实型(float、double)。所以这个命题是错误的。
1.3      const
1.   const有什么用途?
虽然const很常用,但是我相信有很多人仍然答不上来。
(1) 欲阻止一个变量被改变,可以使用const 关键字。在定义该 const 变量时,通常需要对它进行初 始化,因为以后就没有机会再去改变它了;
(2) 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
(3) 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4) 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
(5) 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
1.4      #IFndef/#define/#endif
1.   头文件中的 #ifndef/#define/#endif 干什么用?
其实#ifndef、#define、#endif这些在u-boot、linux内核文件中经常见到,在这么大型的程序中大量使用,可见它的作用不可小觑。
这些条件预编译多用于对代码的编译控制,增加代码的可裁剪性,通过宏定义可以轻松的对代码进行裁剪。
#ifndef/#define/#endif最主要的作用是防止头文件被重复定义。
1.5      全局变量和局部变量
times New Roman">1.         全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈。 其实,由于计算机没有通用数据寄存器,则函数的参数、局部变量和返回值只能保存在堆栈中。提示:局部变量太大可能导致栈溢出,所以建议把较大数组放在main函数外,防止产生栈溢出。
思考:如程序清单1. 1所示。会出现怎样的情况?
程序清单1. 1  大数组放在main函数中导致堆栈溢出
int main(int argc, char *argv[])
{
    int iArray[1024 * 1024];
    return 0;
}






评分

参与人数 3威望 +7 +7 积分 +10 收起 理由
eminjie + 2 + 2
A670521546 + 5 + 5 很精彩,期待您更多的分享
冰葑世纪 + 5 + 5 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

zzq宁静致远 2013-9-14 20:43:48
彭麟 发表于 2013-9-12 12:42
楼主,能发一份给我吗?万分感谢啊     
谢谢啊

有问题可以盖楼提出,每天叫我发的人太多,敬请谅解
回复

举报

zzq宁静致远 2013-9-14 20:44:50
zjdzjw195210 发表于 2013-9-9 19:24
经典理论学习,谢谢了!!!

这是很多学校老师不可能讲到的C语言知识,但是这些恰恰是C语言的难点和精华所在
回复

举报

zzq宁静致远 2013-9-14 20:46:16
永远 发表于 2013-9-9 20:05
很好的教程,没有长时间的尝试,根本不可能知道那么多细节问题。。

虽然不能说十年磨一剑,但是这把剑也磨了四年。知识贵在坚持和积累
回复

举报

zzq宁静致远 2013-9-14 20:50:10
四有青年 发表于 2013-9-8 15:42
1.3结构体在联合体中的声明一节中有一处笔误
结构体(l联合体)的成员是共用一块内存,也就是说N.i和N.Bi ...

谢谢。
结构体的成员是共用一块内存,也就是说N.i和N.Bity是在同一个地址空间中。
应该是:
联合体的成员是共用一块内存,也就是说N.i和N.Bity是在同一个地址空间中。


回复

举报

zzq宁静致远 2013-9-14 20:51:19
牛明强 发表于 2013-9-2 13:56
正在学习C语言中,多谢楼主的辛勤指导。对我很有用。

有用即可。敬请期待后续联合实际项目带给你不一样的C语言。
回复

举报

zzq宁静致远 2013-9-14 20:52:59
andyqin 发表于 2013-9-6 10:12
我在学习C语言,很想找到一个好方法 有人能推荐一下吗

把你电脑的F5(编译器debug快捷键)按坏,排除人为损坏
回复

举报

zzq宁静致远 2013-9-14 20:54:12
姚晓东电子 发表于 2013-9-7 18:46
说实话,这些资料我找了好长时间了,谢谢楼主

说实话,这把剑我也磨了四年。

回复

举报

小马哥123 2013-9-15 13:00:29
{:1:}{:1:}
回复

举报

电气10000 2013-9-15 16:44:58
很好。收藏啦。
回复

举报

fb362203 2013-9-15 21:54:06
希望整成一个压缩包啥的,这样方便下载啊
回复

举报

zzq宁静致远 2013-9-16 07:38:34
第二十一节  通过加减法高效的求出两个无符号整数的商和余数  

    假设处理器不能实现除法运算,通过加减法高效地求出两个无符号整数的商和余数。 事实上,在微处理器上,所有的四则运算都会转化为加法,但是除法运算会消耗掉微处理器大量的时间,因此我们设计一个算法,只通过加减法求出两个无符号整数的商和余数。这个题目广州致远电子有限公司曾经用来作为招聘软件工程师的机试题目。说起周立功,首先确实得感谢他,从大一暑假开始就给我提供夏令营机会在广州致远电子有限公司实习,将软件功底一次次提升,去年7月份开始更和致远签下合同,开始正式实习之路。但是11月份,由于个人想法,依然离开了广州致远。扯远了,拉回来。
算法一:用被除数(iDividend)循环去减除数(iDivisor),直到被除数减去除数的差(记录为iRemainder)小于除数为止。做减法的次数(记录为iCompany)即为商,iRemainder即为余数。但是当被除数比除数大很多时(iDividend=10000 iDivisor=3),相减的次数达3333次,所以此方法非常低效。
算法二:使用递归算法实现。除数(iDivisor) =除数(iDivisor)*2。因此,商(iCompany)= (iCompany)*2。如果余数大于除数,则商(iCompany)= (iCompany)+1,余数(iRemainder)= 余数(iRemainder)- 除数(iDivisor)。假设被除数(iDividend) =100除数(iDivisor)=3,则递归算法求商和余数过程。
很显然,算法一效率太低,不可取,因此选择算法二。
    采用算法二,就涉及到返回值的传递,方法有四种:
作为返回值的商和余数,如何传回给主函数?这是一个很有讲究的问题,方法很多,可以是用过指针传回,可以通过全局变量,可以通过结构体,可以使指针函数等。
方法一:全局变量,一个程序中出现全局变量是很难让人接受的,这里使用全局变量返回时不可取的。
2.1  程序流程图
方法二:结构体,结构体确实可以保存很多变量,并且传回来也是没有问题的。但是结构体所占内存较大,不提倡使用。
方法三:指针,在递归函数中,使用指针变量将值返回。
方法四:指针函数,在递归函数中将商和余数的值返回。
对比上面四种方法,从程序健壮性、可移植性、安全性等诸多方面考虑采取方法三或方法四。

递归函数的声明,采用指针变量返回商和余数。
/*******************************************************************************
** 函数名称:pass_to_return
** 函数功能:递归算法
** 入口参数:unsigned int pDividend  ,  unsigned int pDivisor
**           unsigned int *iCompany , unsigned int *iRemainder
** 出口参数:
*******************************************************************************/
extern unsigned int
pass_to_return( unsigned int iDividend , unsigned int iDivisor,
             unsigned int *iCompany , unsigned int *iRemainder) ;


递归函数的详细设计,采用指针变量返回商和余数。
/*******************************************************************************
** 函数名称:pass_to_return
** 函数功能:递归算法
** 入口参数:unsigned int pDividend  ,  unsigned int pDivisor
**           unsigned int *iCompany , unsigned int *iRemainder
** 出口参数:
*******************************************************************************/
unsigned int pass_to_return( unsigned int iDividend , unsigned int iDivisor,
                             unsigned int *iCompany , unsigned int *iRemainder)
{
         
         /*
         *  如果被除数(iDividend)小于除数(iDivisor)
         *  则商(iCompany)0,余数(iRemainder)为被除数(iDividend)
         */
         if( (iDividend) < (iDivisor) ){
                  
                   *iCompany    = 0 ;
                   *iRemainder  = iDividend ;
                  
         }  
         
         /*
         *  如果被除数(iDividend)等于除数(iDivisor)
         *  则商(iCompany)1,余数(iRemainder)0
         */
         else if( (iDividend) == (iDivisor) ){
                  
                   *iCompany    = 1 ;
                   *iRemainder  = 0 ;
                  
         } else{
                  
                   /*
             *  如果被除数(iDividend)大于除数(iDivisor)
             *  进行递归调用
             */
            
                   /*
                   * 返回递归函数
                   */      
    pass_to_return( iDividend , (iDivisor+iDivisor) ,
                        iCompany , iRemainder ) ;
                                          
             /*
                   *   = 2*
                   */
                   *iCompany +=  *iCompany  ;
            
             /*
                   *  如果余数 (*iRemainder) 大于 除数(iDivisor)
                   */
             if( (*iRemainder) >= iDivisor ){
               
               /*
                            *  则商=+1
                            */
               *iCompany += 1 ;
               /*
                            *  余数=余数-除数
                            */
               *iRemainder = *iRemainder - iDivisor ;
               
    }
         
         }
         
         return 0 ;
         
}

回复

举报

fanliansuo 2013-9-16 15:03:09
好东东,收藏了
回复

举报

fanliansuo 2013-9-16 15:04:50
顶一下,
回复

举报

fanliansuo 2013-9-16 15:09:08
谢谢分享,顶一下
回复

举报

berlinhuang 2013-9-16 17:17:51
你好啊!能不能发份给我啊?779266942@qq.com
回复

举报

yunyangsihai 2013-9-16 18:56:52
写的不错 顶楼主
回复

举报

shujie418 2013-9-17 11:18:43
谢谢分享,支持下
回复

举报

infox 2013-9-17 13:02:58
有没有网盘下载呢?
回复

举报

fsq74521 2013-9-17 14:05:30
深圳车友高科电子公司是一家专业收购各工厂库存电子料的公司。我们以努力处事、以诚信待人,有着专业的技术和丰富的经验,能迅速为客户消

化库存、减少仓储、回笼资金。15919444475
  我们交易灵活方便,可在香港提货,现金支付,价格合理,尽量满足客户的要求。收购范围包括
  A、大量收购厂家库存和积压电子料,各种手机IC,字库、 CPU、电池。
  B、各种家电、通讯、网络、电源IC、集成块,各种工业模块等,发光管、接收头、开关、电位器、咪头、晶振。
  C、二、三极管、大小功率管、场效应管、可控硅、三端稳压、整流桥、光耦、继电器、变压器,钽电容、电感、磁珠、电解电容。
  D、内存蕊片、存储器、K9K、K9F、K4Shy等、单面机、PIC、12F、16F、18F、24C系列,电脑配件、硬盘、内存条、BGA(南北桥)、蕊片、显

卡。
  E、mp3、mp4、数码相机等各种配件,蕊片、收音模块、主控IC、字库、显存、CPU、排线、电池、各类摄像头等成品
  F. 收购三极管,可控硅,达林顿,光电元器件,高频微波管,闪光管,肖特基,光电耦合,电话机IC,振荡器,保险管,变容二极管,检测IC

,放电管,接收头,传感器,CPU风扇,继电器,贴片发光二极管,,自恢复保险丝,咪头,温度开关,温度保险,红外线组件,高频管,发射接收

,光电开关,变容管,场效应管,收购整流桥,模块,

  电话 15919444475  qq 912682923
回复

举报

leolwc 2013-9-17 15:32:53
第一次没有看到直播,少了很多互动的界面,和可惜,下次直播和期待
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表