自学C语言不明白请教下C语言9*9小数乘法估算解决问题表问题

24小时热评
热点排行榜C语言九九乘法表-CSDN论坛-真格学网-IT技术综合网站
C语言九九乘法表-CSDN论坛
来源: &责任编辑:小易 &时间: 1:03:49
c语言九九乘法表问:#include&stdio.h&voidmain(){inti=0,j=0;while(scan...答:#includemain(){inti,j;printf("\t\t完整版9*9乘法口诀表格\n");for(i=1;i如何用C语言编程序:九九乘法表答:C语言输出九九乘法表,主要运用for循环进行控制输出。需要注意的是:在何时需要加空格,何时需要换行。#includevoidmain(){inti=1,j=1;for(i=1;iC语言编程九九乘法表问:1x1=11x2=22x2=41x3=32x3=63x3=91x4=42x4=83x4=124x4=161x5=5...答:#includevoidmain(){inti,j,k;printf("\n\n九九乘法表:\n\n\n");for(i=1;iC语言九九乘法表-CSDN论坛(图1)C语言九九乘法表-CSDN论坛(图2)C语言九九乘法表-CSDN论坛(图3)C语言九九乘法表-CSDN论坛(图4)C语言九九乘法表-CSDN论坛(图5)C语言九九乘法表-CSDN论坛(图6)本网有用户碰到这样的问题:C语言九九乘法表-CSDN论坛,具体问题如下:
本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:请问怎样用C语言程序编写九九乘法表问:怎样用C语言程序编写九九乘法表,会的请帮忙一下,谢谢咯答:main(){inti,j;for(i=1;i。防恶意抓取,请查看原文,,真格学网提供内容。解决方案1:用c语言编程实现右上角九九乘法表答:#includeintmain(){inti=1,j=1;for(i=1;i。防恶意抓取,请查看原文,,真格学网提供内容。
严格对照一下标准答案
C语言输出九九乘法表问:输出结果为:1*1=12*1=22*2=43*1=33*2=63*3=9Thisisthe9*9ta...答:#includemain(){inti,j;for(i=1;i。防恶意抓取,请查看原文,,真格学网提供内容。解决方案2:c语言for循环输入九九乘法表问:我已经弄出来了,是可以执行的,不过想问一下为什么下面这样可以,main...答:c=a*b;printf("%d*%d=%d",a,b,c);这两句话加个花括号。防恶意抓取,请查看原文,,真格学网提供内容。
空格有要求吗&&&&&&&&&&&&。
C语言九九乘法表源代码的理解。问:我是会写出来的,但我只是限于记忆,却不理解它。谁给我说明下?答:#includevoidmain(){inti,j,k;printf("\n\n九九乘法表:\n\n\。防恶意抓取,请查看原文,,真格学网提供内容。解决方案3:九九乘法表右上三角,c语言答:#includevoidmain(){inti,j;printf("左下角:\n");for(i=1;i。防恶意抓取,请查看原文,,真格学网提供内容。
仅供参考:c语言问题九九乘法表#include&&&ahref=&qu。防恶意抓取,请查看原文,,真格学网提供内容。#include&&stdio.h&关于C语言九九乘法表的一个问题。你的程序运行结果正确,语法没有问题,不过许多东西我看来很多余,而且九九表一般是三...9*4=36&9*5=45&9*6=54&9*7=6。防恶意抓取,请查看原文,,真格学网提供内容。
#include&&string.h&c语言九九乘法表!你说的很对,,,每一行后面都有空格#include&stdio.h&voidmain(){inti=0,j=0;while(scanf(&%d&quo。防恶意抓取,请查看原文,,真格学网提供内容。
int&main()&{用c语言编写九九乘法口诀#include&&stdio.h&int&main(void){&&int&i,j;&for(i=1;。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&int&a,b;C语言九九乘法表怎么编写#include&stdio.h&intmain(){inti,k,d;for(i=1;i&=9;i++){for(k=1;k&=9;k++){d=i*。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&char&s[73],t[10];c语言编写九九乘法表(横纵标题框我不会)\n&)&;//打印第二行for(i&=&1;&i&&=&32;&i++)。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&for&(a=9;a&0;a--)&{C语言输出99乘法表3*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&s[0]=0;C语言输出九九乘法表{for(j=1;j&=i;j++)//输出数i的i个乘法项{printf(&%d*%d=%d&,i,j,i*j);}if(i==3)printf(&qu。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&for&(b=a;b&10;b++)&{用C语言编写九九乘法表#include&stdio.h&voidmain(){inti,j;for(i=1;i&10;i++){for(j=1;j&=i;j++)printf(。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&sprintf(t,"&%dx%d=%d",a,b,a*b);C语言输出九九乘法表根据数学规则,遍历两个乘数,并逐行输出算式即可。#include&&stdio.h&int&main(){&&&&int&i,j;&&&&for(i。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&if&(a==2&&&&b==5)&strcat(s,"&");。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&strcat(s,t);问题分析第一,不使用任何扫描仪这一条件,间接告诉我们,需要处理的对象一定是纸质资料。如果是电子资料,那关于扫描仪这个前提条件就是废话。第二,这份纸质资料不会是那种文字不太多的广告招贴,应该全是文字。文。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&if&(a==1&&&&b&=4)&strcat(s,"&");我们都知道,这样一个常识:如果你要掏空某个人的口袋,必先控制他的脑袋,否则任何人也无法完成买卖。因为你想卖,我打死不想买,难道还有谁吃了熊心豹子胆,敢拿刀架在我的脖子上或者是钱包上?营销即买卖,买卖即洗脑。如何优雅的完成买卖,关键一招就在于营销洗脑术:你只要影响并说服对方按照你的思维模式来思考,那么他就会自然而然做出你想要的行为。所以,销售员一定要100%站在客户的角度来思考,才能进入营销洗脑术的。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&}那么疼痛来源于哪里呢?生活,在生活中,我们不正确的走路,不正确跑步,爬楼梯,包括蹲下来系鞋带,那么这些您如果都做错的话,它会慢慢导致您的膝关节疼痛,接下来,我就给你讲解一下您生活的蹲,是对还是错的,首。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&printf("%60s\n",s);好,这是一个好问题。但讲真啊,一个国产品牌起一个外国名字,这并没有什么错。呐~我试着站在一个厂商的立场,去讲讲它们在给自己牌子起名字的时候,都会想些什么吧:)中国品牌为什么会起外国名呢?@边边:之前汪。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&}正品的还可以。不管怎样,尽量选择304材质的水壶,市面上很多假冒劣质,用杂不秀钢材质作水壶以次充好,加热时会产生重金属污染,长期使用对人体有害。有些电路还不带过热保护,一旦失控起火灾就大事了,不要贪图。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&return&0;很多业主在装修房子的时候,想要请专业的设计师进行设计,但是不愿意将所有的材料都让装饰公司全包,这是为了避免不良的装饰公司坑钱。越来越多的人选择半包的方式来进行装修。下面来以90平米为例子说说装修半包大。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&9x9=81新手收藏白酒要选择一些年份久,产量少,品质佳的白酒,这样才具有收藏价值。现在的白酒企业很多都有封藏酒,专门为收藏而定制的,例如洋河每年都会举办封藏大典,每年推出一款封藏酒,销量很好,具有很高的收藏价值。。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&8x8=64&8x9=72你好,IT之家为你解答。我们将介绍如何在Windows10中禁用OneDrive的集成,在执行过这篇回答中的操作之后,Win10中的OneDrive将被隐藏,你无需卸载OneDrive。从Windows8开始,OneDrive便与系统捆绑在一起,这是由微软构建的一体化解决方案,目的是让用户的每一台使用Microsoft账户登录的设备里面的文件都保持同步。此前,这项服务被称作SkyDrive,后来改名为OneDrive。OneDrive的同步功能依赖于Microsoft账户,要使用OneDrive,那你必须拥有一个Microsoft账户,除了OneDrive,Microsoft账户还允许你登陆到。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7x7=49&7x8=56&7x9=63不知道大家有没有这样一种烦恼,手里保存的图片、视频、音乐等文件想要COPY到电脑上,要么利用QQ的无线传输功能,要么就用数据线。然而这两种方式我个人并不觉得有多便利,QQ的无线传输一次只能传输20个文件,遇到文件量大的时候就很麻烦,有时候会发生传输失败的情况;利用数据线传输这个方式对于苹果手机用户来说不是很友好。最近我发现了一款非常实用的APP《SendAnywhere》。SendAnywhere是个免费的跨平台传输软件,使用过程中完全不受平台和文件大少的限制,同时也无需注册和登录即可使用。SendAnywhere所支持的平台基本上来说还是非常全面的:移动端:有Android,iOS,Wind。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6x6=36&6x7=42&6x8=48&6x9=54现在大部分的观点是跑分不等于用户体验,跑分和用户体验我觉得是用户体验最重要,用户体验是直接反应用户对手机的感受,如果你处理器很强跑分很好但是系统很渣,你就会觉得手机很烂,举个例子当年的魅族MX4p,处理器强吧,配置高吧,可是他确实是一款失败的手机因为手机体验不好,发热和耗电严重。但是在魅族的系统更新到flyme5的时候魅族mx4p的发热和功耗得到解决,用户反响非常好。所以跑分和配置不等于用户体验。还有跑分低也不一定用户体验差,像是去年的oppo虽然是高价低配但是用户的反馈大部分都是不错的,而且去年oppo手机的销量在国内都能排前几。这还是要归功于oppo良好的用户体验。。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&&&&&&&&&&&&&&5x5=25&5x6=30&5x7=35&5x8=40&5x9=45这个问题很有趣,孔子出生的时候是春秋末期,他年老编写春秋的时候正值晋国准备分裂,以三家分晋为标志春秋结束,战国开始。孔子活着的时候是无法想象周朝最后陨落的。中国历史上一共有两次这种事件。第一次就是三家分晋,他告诉人们大夫可以把诸侯拿开自己玩。并且以此为界限,战国初期数十个效果只用了不到百年就被划分为七个大国。第二次是曹丕称帝,这告诉人们即使是皇帝也是可以随便换的。以后的历史上,王侯将相宁有种乎不再是主流,群雄逐鹿才是真性情。孔子和秦国统一没有任何关系。孔子的主张是恢复礼法,何为礼法,就是你的作为要符合自己的身份。你是诸侯,就去做诸侯的事,你是大夫,就去做大夫的事。诸侯做了大夫的事,是失礼,大夫。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&&&&&&&4x4=16&4x5=20&4x6=24&4x7=28&4x8=32&4x9=36首先从楼主的叙述中,我觉得这个人可能精神上会有些不正常,因为精神正常者他会回避大众且有羞耻心。建议报警解决这个事件。如果谈性骚扰者的心理状态不外乎以下几点:(1)补偿型性骚扰:大多数性骚扰者属于这类男人,由于长期性匮乏或性饥渴导致的一时冲动势必使他对女性做出非礼的冒犯举动。此种人的骚扰行径多是出于不同程度的亏损心理,骚扰的目的与其说是想占有女人不如说是想占便宜。(2)游戏型性骚扰:多是有过性经验的。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&&&&&&&3x3=9&3x4=12&3x5=15&3x6=18&3x7=21&3x8=24&3x9=27  开宠物店成为了养宠人士最喜爱的一种店铺,开宠物店不仅能满足自己的喜爱,也能够进行创业,这让很多的样宠人都去投资宠物店这个行业。那么开个宠物店大概需要多少钱呢?小面圣宠宠物小编为大家去分析一下。  开宠物店需要资金投入的有几个地方:店铺的租金是一个大的投资,一般情况下宠物店的租金高低跟店面的位置,面积有关,在一些人流量多的地段找一间店面通常会比人流量少的地方的店铺租金要高。例如:像在重庆这样的一。防恶意抓取,请查看原文,,真格学网提供内容。
//&&&&&&&2x2=4&2x3=6&2x4=8&&2x5=10&2x6=12&2x7=14&2x8=16&2x9=18一个新生命的孕育,妈妈很伟大!当然这也意味着少不了艰辛和痛苦,奇妙的是幸福会融入每一个瞬间,感受这来自生命的神奇。初次怀孕的妈妈,你可能会经历身体的不适和无措,比起其他说的让你注意身体,小心胎儿,菌菌更想说一句,准备好当妈妈的心态更重要。从现在开始,你已经是一个伟大的妈妈啦。这期间有苦有泪,但是这些都会成为盔甲,让你温柔,你要为你骄傲,为你的宝宝骄傲。你要记得,只有你舒服了,开心了宝宝才会舒服开心。防恶意抓取,请查看原文,,真格学网提供内容。
//&1x1=1&1x2=2&1x3=3&1x4=4&&1x5=5&&1x6=6&&1x7=7&&1x8=8&&1x9=9每座城市总会有一些让人难以忘怀的味道,隐藏在幽深的巷子里或者不知名的街道。在洛阳,有很多美食非常集中的地方,像十字街是大家熟知的,今天要说的这条街,这里的美食也不少,它就是――西工小街。西工小街在百货楼后面,创建于1957年的百货楼,带有着那个热血时代的独特味道。作为洛阳市的老牌中心商圈,这里有着说不完的故事和吃不完的美食!而如今的西工小街俨然成为洛阳的一道风景,夜夜不缺,风雨无阻。作为一名吃货,。防恶意抓取,请查看原文,,真格学网提供内容。
解决方案4:只能说有钱就是任性,这也象征着武汉人对小龙虾深沉的爱啊。。宵夜的流行爆款三五年就更新换代,唯独小龙虾,在消夜领域十几年来占据着统治地位。在湖北一带,每到晚上人们都有消夜的习惯。宵夜的流行爆款三五年就更。防恶意抓取,请查看原文,,真格学网提供内容。
#include&stdio.h&做法简单,材料简单。味道绝对不简单,爱吃糯米面的可以来一份。现做现吃直接下锅煎!揉圆拍扁直接下锅煎!熟了装盘直接吃掉!也可以一次做很多,放冰箱冷冻保存,吃的时候直接凉油小火煎熟现做的口感一样。但是,请。防恶意抓取,请查看原文,,真格学网提供内容。
int&main()事实上我认为不会有因为过度饥饿而导致吞食自己尾巴的蛇。这也并不是合理的情况而且更重要的是确实无法解决任何问题。另外,从那些自食其尾的蛇的照片中我们往往能发现,那些蛇其实根本就并不瘦,有过蛇类饲养经验的。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&int&a,&b;既然题主是女孩子,那小主就按照颜值来推荐了。小主会为你推荐凯迪拉克ATS-L,因为小主觉得凯迪拉克的钻石切割设计应该挺招女孩子喜欢的,在加上凯迪拉克ATS-L在进口版本凯迪拉克ATS基础上,凯迪拉克A。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&for&(a&=&1;&a&&=&9;&a++)近几年日韩欧美品牌美妆大行当道,可是今时不同往日,我们中国制造在国际上也逐渐占有一席之地,享有很高的声誉,这之中当然也包括一些物美价廉的美妆产品。总是看到安利日韩欧美有何优点看厌烦了吧,今天就来安利一。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&{  宠物行业是现在很热门的行业,也是最适合投资的项目,不仅仅是因为现在宠物行业的发展快,而是宠物这个行业真的有很好的发展前景,而且宠物店加盟容易操作,让很多的宠物爱好者看到了好的发展空间,他投资少回报。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&for&(b&=&1;&b&&=&a;&b++)细支烟虽然是市场的新贵,但是,提到细支烟,许多人都会认为,这款卷烟的主要消费群体限定于女性。其实,市场调查显示,细支烟的消费群体80%以上是男性,女性只占很小部分,虽然这与女性烟民相对较少有关系,但也侧面说明,男性烟民对细支烟并不排斥。特别是,一些高端品牌也纷纷推出细支烟,如“南京(细支九五)”,“苏烟(沉香)”、利群(休闲云端)、云烟(大重九细支)、黄金叶(天叶细支)等都达到了每条千元档,这可不。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&{感谢邀请,喜欢我们头条号的朋友(头条号:虔城家居)的朋友可以关注我们,也请给我们点赞或者留言,那我就简单说一说吧,谢谢。日本卫生间设计一直被人们津津乐道,到底比国内的装修好在哪里?如果你说“卫生间小啊。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&printf("%d&*&%d&=&%d",&b,&a,&a*b);告诉你们一个可以搞死平台的方法就是滴滴出行不是里面有个代叫功能吗,就是人和手机在A点,下单在B点小区或离自己远1公里开外的地方,(防止司机直接找到本人就行),下单后接司机电话可以明确告知是帮人叫的挂电话后才叫人下来等车。(不管被帮助的是谁,老人,小孩,残疾人,喝醉酒什么的,那怕没这个人都可以,)司机到达后无限等待被帮助的人,一般按照滴滴流程等待超时可以无责取消,问题就在这里,这个无责取消,乘客可以。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&printf("\t");在高速上总会遇到一些突发状况,导致出现急速刹车和狂打方向盘,这是一件极其危险的事情。就好像在高速路上正常行驶的时候,突然发现前面有一块石头,一般来说遇到这样的情况,很多司机根本就来不及反应,于是机会本。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&}那么疼痛来源于哪里呢?生活,在生活中,我们不正确的走路,不正确跑步,爬楼梯,包括蹲下来系鞋带,那么这些您如果都做错的话,它会慢慢导致您的膝关节疼痛,接下来,我就给你讲解一下您生活的蹲,是对还是错的,首。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&printf("\n");刚毕业出社会的我,身上也没多少钱,无奈房价还那么高,我也只能和另一个人一起租个两室一厅的房子,公用卫生间、厨房和客厅。我们住的是公司宿舍,所以上下班时间是一样的,这就免去了一些不必要的打扰。他不怎么爱。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&}正品的还可以。不管怎样,尽量选择304材质的水壶,市面上很多假冒劣质,用杂不秀钢材质作水壶以次充好,加热时会产生重金属污染,长期使用对人体有害。有些电路还不带过热保护,一旦失控起火灾就大事了,不要贪图。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&return&0;很多业主在装修房子的时候,想要请专业的设计师进行设计,但是不愿意将所有的材料都让装饰公司全包,这是为了避免不良的装饰公司坑钱。越来越多的人选择半包的方式来进行装修。下面来以90平米为例子说说装修半包大。防恶意抓取,请查看原文,,真格学网提供内容。
不需要加判断,另外交换输出printf中,a,&b的输出顺序;
#include&stdio.h&做法简单,材料简单。味道绝对不简单,爱吃糯米面的可以来一份。现做现吃直接下锅煎!揉圆拍扁直接下锅煎!熟了装盘直接吃掉!也可以一次做很多,放冰箱冷冻保存,吃的时候直接凉油小火煎熟现做的口感一样。但是,请。防恶意抓取,请查看原文,,真格学网提供内容。
int&main()事实上我认为不会有因为过度饥饿而导致吞食自己尾巴的蛇。这也并不是合理的情况而且更重要的是确实无法解决任何问题。另外,从那些自食其尾的蛇的照片中我们往往能发现,那些蛇其实根本就并不瘦,有过蛇类饲养经验的。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&int&a,&b;既然题主是女孩子,那小主就按照颜值来推荐了。小主会为你推荐凯迪拉克ATS-L,因为小主觉得凯迪拉克的钻石切割设计应该挺招女孩子喜欢的,在加上凯迪拉克ATS-L在进口版本凯迪拉克ATS基础上,凯迪拉克A。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&for&(a&=&1;&a&&=&9;&a++)近几年日韩欧美品牌美妆大行当道,可是今时不同往日,我们中国制造在国际上也逐渐占有一席之地,享有很高的声誉,这之中当然也包括一些物美价廉的美妆产品。总是看到安利日韩欧美有何优点看厌烦了吧,今天就来安利一。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&{  宠物行业是现在很热门的行业,也是最适合投资的项目,不仅仅是因为现在宠物行业的发展快,而是宠物这个行业真的有很好的发展前景,而且宠物店加盟容易操作,让很多的宠物爱好者看到了好的发展空间,他投资少回报。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&for&(b&=&1;&b&&=&a;&b++)细支烟虽然是市场的新贵,但是,提到细支烟,许多人都会认为,这款卷烟的主要消费群体限定于女性。其实,市场调查显示,细支烟的消费群体80%以上是男性,女性只占很小部分,虽然这与女性烟民相对较少有关系,但也侧面说明,男性烟民对细支烟并不排斥。特别是,一些高端品牌也纷纷推出细支烟,如“南京(细支九五)”,“苏烟(沉香)”、利群(休闲云端)、云烟(大重九细支)、黄金叶(天叶细支)等都达到了每条千元档,这可不。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&{感谢邀请,喜欢我们头条号的朋友(头条号:虔城家居)的朋友可以关注我们,也请给我们点赞或者留言,那我就简单说一说吧,谢谢。日本卫生间设计一直被人们津津乐道,到底比国内的装修好在哪里?如果你说“卫生间小啊。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&printf("%d&*&%d&=&%d",&a,&b,&a*b);
&&&&&&&&&&&&printf("\t");在高速上总会遇到一些突发状况,导致出现急速刹车和狂打方向盘,这是一件极其危险的事情。就好像在高速路上正常行驶的时候,突然发现前面有一块石头,一般来说遇到这样的情况,很多司机根本就来不及反应,于是机会本。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&}那么疼痛来源于哪里呢?生活,在生活中,我们不正确的走路,不正确跑步,爬楼梯,包括蹲下来系鞋带,那么这些您如果都做错的话,它会慢慢导致您的膝关节疼痛,接下来,我就给你讲解一下您生活的蹲,是对还是错的,首。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&&&&&printf("\n");刚毕业出社会的我,身上也没多少钱,无奈房价还那么高,我也只能和另一个人一起租个两室一厅的房子,公用卫生间、厨房和客厅。我们住的是公司宿舍,所以上下班时间是一样的,这就免去了一些不必要的打扰。他不怎么爱。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&}正品的还可以。不管怎样,尽量选择304材质的水壶,市面上很多假冒劣质,用杂不秀钢材质作水壶以次充好,加热时会产生重金属污染,长期使用对人体有害。有些电路还不带过热保护,一旦失控起火灾就大事了,不要贪图。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&return&0;很多业主在装修房子的时候,想要请专业的设计师进行设计,但是不愿意将所有的材料都让装饰公司全包,这是为了避免不良的装饰公司坑钱。越来越多的人选择半包的方式来进行装修。下面来以90平米为例子说说装修半包大。防恶意抓取,请查看原文,,真格学网提供内容。
int&main(void)
&&&&int&i,&j;
&&&&for&(i&=&1;&i&&=&9;&i++)&{
&&&&&&&&for&(j&=&1;&j&&=&i;&j++)&{
&&&&&&&&&&&&printf("%d&*&%d&=&%d",&j,&i,&i&*&j);
&&&&&&&&&&&&putchar('\t');
&&&&&&&&}那么疼痛来源于哪里呢?生活,在生活中,我们不正确的走路,不正确跑步,爬楼梯,包括蹲下来系鞋带,那么这些您如果都做错的话,它会慢慢导致您的膝关节疼痛,接下来,我就给你讲解一下您生活的蹲,是对还是错的,首。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&&&&&printf("\n");
&&&&}正品的还可以。不管怎样,尽量选择304材质的水壶,市面上很多假冒劣质,用杂不秀钢材质作水壶以次充好,加热时会产生重金属污染,长期使用对人体有害。有些电路还不带过热保护,一旦失控起火灾就大事了,不要贪图。防恶意抓取,请查看原文,,真格学网提供内容。
&&&&return&0;很多业主在装修房子的时候,想要请专业的设计师进行设计,但是不愿意将所有的材料都让装饰公司全包,这是为了避免不良的装饰公司坑钱。越来越多的人选择半包的方式来进行装修。下面来以90平米为例子说说装修半包大。防恶意抓取,请查看原文,,真格学网提供内容。
用c语言输出九九乘法表问:用这个做,今天4点前一定要出来答:#includeintmain(){inti,j;for(i=1;i请问怎样用C语言程序编写九九乘法表问:怎样用C语言程序编写九九乘法表,会的请帮忙一下,谢谢咯答:main(){inti,j;for(i=1;i用c语言编程实现右上角九九乘法表答:#includeintmain(){inti=1,j=1;for(i=1;i
本文相关:酷勤网 C 程序员的那点事!
浏览次数:次
作者:ohwww
准备明年考高程,所以就到网上找了点资料(发现这方面的东西比较少,&&:(&),看了一下这个东西,觉得不错,很多都是些基本的东西,特转来与大家分享,特别是也想考高程的朋友,也希望有这方面经验的朋友给予帮助.&&&&&这些东西好像是原作者为了考程序员而参加相关的C语言培训时做的听课笔记.好像还没有写完,如果想知道最新的情况请到下面附的网址去看.感谢原作者!程序员考试补课笔记huoniaolinx&&&第一天  今天是第一天补课,终于有又机会可以听到林老师的课了,我觉得他比老潭说得还要好呢,虽然我没有听过老潭的课,不过我相信绝大部份在校的人学C语言都是用老潭的《C程序设计》吧。这本书的好处是有很多的,最主要的一点就是可以用生动的例子来说明一些概念,不过还是一点不好的地方,就是本书全都只是围绕着基础来说,没有一些可以让同学深入研究的课题。就我知道机械工业译的一本《C语言设计教程》,这本书有大量的实例练习,而且是围绕着生活的。学习和乐趣合在一齐,我在看这本书时都有好几个特别吸引我的兴趣课题呢!书就介绍到这里吧,还是说回今天补课的情况。&  今天因为第一天吧,老师还不太清楚我们的底究竟到那里。是因为我们之前都是全自学的,所以现在要摸一摸底吧。一开始,他直接引入了上界程序员考试的下午的第一道题,是一道编程填空题。如下:code]int&strcmp(&char&*s,&char&*t){  while(*s&&&&*t&&&&_______)  {&s++;t++;  }  return&________;}  这是模仿C语言字符函数库里的字符比较函数,当时我第一时间就想到了一种方法,第一空因为大家都没有问题吧,*s和*t这两个都保持为逻辑真就行,表明这个存储单元是用字符的,大家都知道C语言里没有字符串这种变量的,只有字符数组,'\0'这个符号就是用来表明这个字符数组到了结尾了,这里又有一个新的概念要说说的了,就是C语言逻辑里非零的都为真,那么'\0'这个符号就是为零。所以填这个空就应该没有什么太大的难度了,跟着就是还要有一个条件退出循环,因为是比较大小,只要保持一样都继续,所以条件也很显示的可以写出来*s&==&*t。至于第二题当时我的思维就销定在条件运算符里,因为返回的值是有三种可以性的,大于返回正数,等于就返回零,小于就返回负数。知道了这三种可能就可以用条件运算符填了,我当时的答案是这样的&*s&==&*t?&0:&*s&;*t&?&1&:&-1&,这是不是很长呢,其实我的答案我也不知道是否对,但是真正的答案是&*s&-&*&t&.知道答案为什么是这样吗?当时我也一时给答案吓住啦,因为当时我真想到是用它们本身的比较就可以得出结果(运用ACSII码),*s&-&*t&如果s指针所指向的单元如果是大于当然就是正数啦,跟着其它的原理一样,这里不再详细说明。  除了引用这道答给我们说了很多的基础知识外,还更详细地给我们介绍了指针,唉!为什么老师说的总是这么的清晰明白,如果当初可以老师教的话就可以走少很多弯路了。算了,说这些话都是没有用的,只有现在能学好就行了。大家都指针的基础还有些吧,这里重要的提一提老师今天反复强调的一个概念,就是指针就是指向地址的一个变量.今天就到这里吧。&第二天  因为前天老师摸到我们的底的关系,所以今天要补一补前面的基础部份。他先是列出一个数据类型的表,如下:           |&整型           |&字符型     |&基本类型&&|       &|&单精度型     |&     |&实型(浮点型)&&|     |&     |&&&&&&&&&&&&&&&|&双精度型&&&&&&&&&&|&&&&&&&&&&&|&枚举类型&  &     |&&&&&&&&&&|数据类型&&|     &|&数组类型     |&构造类型&&|&结构体类型&(结构)     |&    &&|&共用体类型&(联合)     |&指针类型     |&空类型  上面这个表,基本类型是我们平常用得最多的,包括整型、字符型、实型(浮点型),就从这里最常用的数据类型说起吧。  说起C语言的数据内容就要说说计算机里存放的数据是究竟怎么一回事,大家应该都知道计算机只可以处理二进制的数吧,因为是硬件的关系(二态器件),&这些只能有两种表示的状态,所以运用到计算机里就显得特别有用了。从现在开始我们要知道计算机处理的所有数据都是二进制数,那么他究竟是怎么运算的呢?&老师先给一些十进制数转换为二进制数的几道题我们做,这些小儿科当然是没问题啦,很简单的就做了出来。老师当然知道我们是会做的了,但是其实是想我们在做这些题目的时候找出更简单的转换方法。例:1011101&=(93)10&很简单的就可以计算出来了,&我的方法就是传统的计算方法。它们都有自己的位权,第一位就是20,第二位是21,&跟着的都如些类推,将有1的地方乘上该位的数跟着相加起来就等于93了。这里说说其实二进制的次方特别好算,就像我们的内存一样阶梯上去的,1-2-4-8-16-32-64-128-256-512-1024……你知道这规律吗,如果知道是不是计算起来特别别好办呢!  不过老师在这里提出了一个更好的方法,起码比一个一个加上去也快多了。就是将那个要转换的数变为全都是1111111,你知道这个数是多少吗?其实就是有一技巧在里面,把它看成&减&1吧!那么是不是很快就知道是多少呢,没错就是128嘛,再减1就是127了,在些基础上试着将原来的那个二进制数位为零的那两个数求出来,&第一个零在第二位,所以是2,第二个零在第六位,所以是32,将其加起来被127减去就可以得出93了,是不是很简单方便呢(学到东西快交学费啊,哈哈~)。你知道计算机里二进制有几种运算吗?我在这里告诉你,其实就只有这么的一种,就是加法运算(你不要告诉我你连二进制的加法也不会运算,其实就是逢二进一嘛).为什么这样说呢?其实二进制也有减法运算和乘除,但是计算机里有一种叫补码的方法,可以将减法运算变为加法运算,至于怎么实现教师也没有再深入讲下去了(在些补充,乘法也是利用移位来实现转为加法的)。  现在转入到C语言的整型数据里,C语言的整型数据是2字节的,就是16位,最多可以存储65536,他的范围是&-32768&到&32767&。C语言里分有符号类型和无符号类型,&如果是没有符号的整数类型的范围就是0&到&65535&了。关于字符型数据,如果严格来说C语言里根本没有字符这种类型,因为他所存储的是它的ASCII码。直接可以用来和其它的数据类型运算,比如:main(){  char&s='A';  int&i=2;  s=s+i;  printf("%d",s);&/*这里可以直接输出其ASCII码*/  printf("%c",s);&/*这里的结果因为上面的语句改变了字符s的字符,输出的是'C'*/}  那么更不要说字符串了,所以字符串在C语言里也只是用数组来表示,和其它的高级语言不同,有其的字符串类型,而且还是字符和字符串结合在同一种类型里。现在该说一下实型数据了,实数类型通常用在有小数位的一些数据。就像这题一样:S=1/1+1/3-1/5+1/7……1/2n-1这个程序是我写的:main(){  int&n,i,s;  int&r=1;  printf("please&input:&");  scanf("%d",&n);  for(i=1;i&=n;i++)  {    s=s+r/(2*i-1);    r=-1*r;  }  printf("%d",s);}这个是考试里的:void&fun(float&*sn,&int&n){  float&s=0.0,w,f=-1.0;  int&i=0;  for(i=0;i&n;i++)  {    f=___*f;&/*这里填&-1&*/    w=f&/&(2*i+1);    s+=w;  }  ____=s;&/*这里填&*sn&*/}  考试里的两个空我都做对了,可是自己写的那个程序就有大问题了,就是答案用了整型数据,从答可知答案应该是小数啊,真的一时的糊涂就可以致命啊!我们几乎所有人都是错了这点,当然也要另类的错法,就是用回来以前QB的一些运算符,^&这个是QB里的次方运算符,这可真的闹出笑话了。之后是要我们编一个主函数来调用这个函数。这是我做的main(){  float&s;  int&n;  printf("please&input:");  scanf("%d",&n);  fun(&s,n);  printf("%f",s);}  这是这么几条简单的语句,不过就难倒了几乎所有人(除了我)。你知道他们的答案吗?让我给大家展示出来吧main(){  float&*  int&n;  printf("Please&input:");  scanf("%d",&n);  fun(*ss,n);&/*这里出了问题*/  printf("%f",*ss);}  他可能还没有了解到C语言里的函数参数的问题吧,既没有定义一个可以存放结果的变量,参数方面也用错了,如果真的要用指针也得要指针指向一个存储单元才行吧。而且还不是传了地址,他反而是试图传一个指针指向单元进函数里,这是绝对错误的。因为该调用的函数是地址,好了,下面给他的程序更正一下。如下:main(){  float&*ss,s;&/*这里多定义一个单精度的变量*/  int&n;  ss=&  printf("Please&input:");  scanf("%d",&n);  fun(*ss,n);&/*这里出了问题,应该是fun(ss,n)&*/  printf("%f",*ss);}  好了,就这样这条程序就完全正确了,不过要是为了节省空间就用我写的那条吧,因为不要多开消一个指针变量。今天写得特别的长,也特别的嗅,望大家见谅了。第三天很快的就到了第三天了,接下来的学习任务应该越来越重了。至于今天讲了些什么,现在想起来也觉得没有什么似的,可能因为我之前已经把这今天所讲的内容搞懂搞透的原因吧。不过也得把今天的写下来,也没有什么特别原因的,想有个回忆吧。今天所讲的都是围绕着数组,我们在C语言里定义数组和其它高级语言定义的不同,这里示出C语言和其它语言的。C语言&     Foxbaseint&a[10][10];&dim&a(10,10)是不是符号也不同了,我们以前用惯的都是小括号,但是现在突然来的是中括号真的是有些不习惯呢。但是谁叫我们是学&C&语言呢,不习惯都要得习惯了。还记得以前定数组根本就是不用理会它的地址,只知道用就行了,就算用错了会编译出错。可是C语言可不是呢,一但你定义了一个数组之后,你就得好好的管住它,因为数组出了边界是绝对不会通知你的。数组的定义和调用方法也是很多,真是灵活多变,这里不再重复书上里的东西了。现在就定义一个数组来看看:int&a[10];&如这个表所示,数组定义之后有相对地址,而且数组名a就是存放这些地址的首地址。现在我们多定义一个整型指针变量,&int&*p;&,让它指向数组a,&p=a;&我们试着让指针运算递增一个p++;&我们看到的结果是p指向了新的地址2003,原来的地址是2001,为什么递增一个就移向了2003,而不是2002呢?不是2002才是正确的吗?其实这里就说明了我们定义指针变量为什么要整型了,是因为所有的指针运算都是看自己本身是什么类型的指针才作出什么样的运算的。就是现在是整型类型,整型数据存储是需要2字节的,所以针指运算也是按这个方式来进行,结果很显然就是往下移2了。其实这里说这么多,老潭那本书里基本上都有详细说明介绍,所以我一开始说只要自己有看过书的,应该也很容易明白了(反而上面可能被我说模糊了)。好了,接下来我们做一些题目吧,这是今天老师给我们出的题,其实也是2001年程序员下午考试里出现过的题目。所以请大家自己也动手做做,多思考,看看谁的方法比较好。&在n行n列矩阵中,每行都有最大数,本程序求这几个最大数中的最小一个。#include&&stdio.h&;#define&N&100int&a[N][N];void&main(){  int&row,col,max,min,n;  /*输入合法的n和n*n个整数的代码,&注,这里略了一部份到后面练习自己做回*/  for(row=0;row&n;row++)  {    for(max=a[row][0],col=1;col&n;col++)    if&(& )&max=a[row][col];&/*max&a[row][col]*/    if&( &)&min=&&&&&&&&&/**/    else&if&( &)&min=  }  printf("最大数中的最小数为:%d\n",min);} 这题可真有些难度,它的难就难在第二个空那里,相信第一个空绝大部分都会做,&可是第二个空呢,真的下不笔了。当时看程序的最后继续两个空后面的语句为什么一样的呢,可真的没有想通,只是要死钻牛解尖,老是想着一定是用数组的,第一个循环里是行,跟着就是列了,可是还是想不到答案,因为我的思路已经大错特错了。最后老师还是说出答案,也说这题真的是比较难。第二空其实是填row==0,为什么这样填呢,是因为这个矩阵里一开始要有一个BASE数做底,所以row==0只出现一次,很自然的就成了第一个比较的基数,跟着这个if语句里的就是比较这几个最大数中的最小一个数了,第二个空填了出来当然答案也就随之可以出来了max&min。看来我现在的功力去考中程还是白费心机吧,因为这只是第一大题啊,有很多难的题都在后几题。那么既然现在知道自己的弱点就应该去好好克服改正它,好了,这只是第一道练习题,跟着下面还有将略了的那部份编出来。我所写的如下,因为考虑到整数类型界限的问题,我所编的所着重这里。 printf("输入二维数组的维数&n:"); scanf("%d",&n); for(row=0;row&n;row++) for(col=0;col&n;col++) {
printf("please&a[%d][%d]",row,col);
scanf("%d",&a[row][col]);
}while(a[row][col]&-32767&&&&a[row][col]&;32767&); }接下的是第二题了,题目如下:求n*n的对角线和这题因为全由自己写,所以各种写法都有。在下面先写我的最基础简单的方法吧。#include&&stdio.h&;#define&n&5main(){  int&a[n][n];  int&row,&  int&sum=0;  /*&输入略&*/  for(row=col=0;row&n;row++,col++)    sum+=a[row][col];  for(row=0,col=n-1;row&n;row++,col--)    sum+=a[row][col];  if&(&n%2&!=0)    sum-=&a[n/2][n/2];  printf("%d",max);}这是最基本的方法了,两个循环跟着判断是否偶数来减去中间重复出现的一个数,这样就求得结果了下面我写一个我同学编的还比较简单,而且方法独到的(反正所有人都没有想过这种方法,除了他)。这里主要写一写他的方法。int&sum=0,j;for&(&j=0;&j&n;&j++&)  sum+=a[j][j]+a[j][n-1-j];if&(&n%2&!=0&)sum-=a[n/2][n/2];够简单吧,一次循环就可以了,他的思路是这样的,比方有一个如下的矩阵每次都两个两个刚好相对立,所以可以一次就扫描完了。好了,我写的有些累了,因为今天没有什么精神,最后老师还补充了另一个更简单的,方法其实就是一种只是运用了条件运算符sum+=a[j][j]+(&(j&==&(n-1-j)&?&0:&a[j][n-1-j];C语言真的想有多简洁有多简洁.第四天&真的不知道为什么,我所有WORD的日期都变了,可是是WORD的宏病毒吧。但是为什么感染上的呢?这下可真奇怪了,我没有用过宏啊。算了,现在没有时间去理会它了,我要抓紧时间写完这篇补习日记。今天的课程里终于到了重点了,就是算法,因为才刚开始,先从容易的排序算法开始说,抄了一道题目让我们做,如下:已有一个已排序的数组,今输入一个数,要求按原来的排序规律将它插入数组中。看到了这个题目我觉得自己比较有把握,很快的就写了出来,可是谁知道我的程序有一个至命的地方,刚给老师看的时候还得意洋洋,可是看完指出我的错来时真的不好受,既然都错了,就把我所做的那个答案写下来吧,也好让大家比较比较。#define&n&8main(){  int&a[n];  int&i,j,t,s;  for(i=1;i&=7;i++)    a[i-1]=i*10;  for&(&i=0;i&&&7;i--)    if&(&a[&i&]&&&a[&i+1&]&)&    {&s=a[&i&]&;&a[&i&]&=&a[&i+1]&;&a[&i+1]&=&s;&}    for(i=0;i&7;i++)      printf("%d,a[&i&]);}  看上去真的对的,没有错误,可能如果不细心都走眼的了。老师就是有这种本领可以看出来,让我慢慢道来我的错误吧,其实就是错在那一个最后没有赋值的元素,因为没有初始传值,随机生成的数可能很大,也可能很少,不过如果刚好小于插入的数话,那么就不再是正确的排序了。好了,说了我的错让我们看一个正确的程序吧#define&N&8main(){  int&a[N]={20,30,40,50,60,70,80};  int&n,i;  for(i=N-1;i&;=0;i--)  {    if(n&a)&a[i+1]=a;    else&&  }  a[i+1]=n;}&这里就是一个比较好的排序算法了,在讲这些排序的时候老师画了一个图,如第四天图一这个图可以方便的表示出当时的排序情况,排起序来更清晰了。不过更重要的一点就是不排让人只单独看源程序那样头晕,根本不知道这是怎么一回事。因为我也是,自己编这个程序的时候跟着看完,看得模??所以我推荐大家也学一学这种方法。  说到排序,我们又教我们一种新的排序方法,就是冒泡排序法了。记得以前我学QB里也学过,不过今天听着老师说,自己动着手画图来看,真的变得清晰多了。说冒泡排序法其实也可以叫左下沉排序法,因为是按程序的两个循环来决定,如果是按从底到顶当然就是冒泡啦,相反从顶到底就是下沉了。显下两个程序:int&n=6,i,j;for&(&i=n-1;&i&&;&0;&i--)  for(j=0;&j&&&i;&j++)    if(a[j]&;a[j+1]&{&交换&};以上的是冒泡法&int&n=6,i,j;for&(&i=0;&i&&&n;&i++)  for(j=n-1;&j&&;&i;&j--)    if(a[j]&a[j-1]&{&交换&};这就是下沉了。我们今天基本上全都在练习这个排序了,快到放学了,可是老师还是把握好时间,真的一点都不浪费啊,而且还拖了半个钟头堂。唉~,有时候我觉得他人好,好时候真的不好。可是怎么说呢,他至终都是我们的老师。那么他拖了我们半个钟就是为了说完C语言里条件语句,不过说真的还是学到了一些东西。C语言里条件语句也有好几种形式,用条件运算符&?&:&,基本的if语句,还有就是switch语句,至于最灵活都是答件运算符&?&:&,&而且还是C语言里唯一的三目运算符了。为什么这么灵活,因为他的参数是表达式,C语言最灵活也就是表达式了,那么它能不灵活吗!这里给出一个源程序:int&a=5,b=10,c=8;if(a&;b)if(a&;c)printf("a");else&if(b&;c)printf("b");else&printf("c");这么一条源程序是否让你看得不舒服呢,这就是C语言的另一个特点啊,你知道这条程序的答案吗?不过其实也不难,程序也很短嘛,就让我说出答案好了,答案不就是输出b嘛,道理很简单一看就出了,谁?谁?谁在这里搞乱,答案会是输出b&吗,笨!所以写你功夫还不到家嘛,下面让整理一下程序int&a=5,b=10,c=8;if(a&;b)if(a&;c)&  printf("a");else&  if(b&;c)printf("b");else&printf("c");这样看清楚了吗?答案就是什么都没有,因为一开始第一个if语句就不成立了,那里有答案出呢!这里也看出一个情况,所以我们要陪养好代码的格式,如果有良好的编码风格就有好的程序。还有我今日又明白了一样,想看看下面的if语句:if&ifelse&else&if&if&else&ifelse&else&ififelse我原还以为这两个是不同的呢,在QB里的印象是两个不if语句呢。可是今天就给我弄明白了,大家也应该知道吧,可能就是我笨了。在C语言里swtich也和别的高级语言不同,你们有发现吗?现在看看第四天图二吧在这个图里清楚的说明了这个语句与其的不同之处,而且条件是用常量的,所以老师说给我们听他自己也不怎么喜欢用这个swtich语句。如果用懂了这个条件运算符?&:&还真的挺方便的,这个也是可以无限嵌套的,这里不多说了,让自己慢慢体会研究。第五天今天是离散学礼的最后一天了,我的成绩嘛,当然也不会高得去那里了,还很有可能第一呢(倒数啊)。都怪自己不好,不过也不能全怪。因为学校本来的电脑课程也不少了,可就是全部都在教图形方面呢,什么PS&、CW都要我们编程班的去学,真有点不爽。好了,也不说太多自己学校的羞事了。那么下面我们就开始来学习今天的知识吧,很多朋友都是我整天在打字,可我自己觉得打一篇这些也不是浪费很多时间,而且收益的更多(早上听完,晚上复习)。故语有云"温故知新",我觉得这句特别有道理的,因为通常我在看书里也看不到老师在课堂里向我们提出的问题?昧撕昧?我还是赶紧说说今天的学习吧。昨天老师布置的我们一道答,我昨天都给忙了做,而是今天突然想起才冲冲的赶着做,是这样的一道题:&给一个不多于5位的正整数,要求:1,这个数有几位2,打印每一位的数,3逆序打印,比如321&输出&123。好在这答也不难,用了一会儿时间就做完了。main(){  int&n;&int&  int&i=0,a[5];  printf("请输入不大于5位的正整数");  scanf("%d",&num);  do&  {    do&=num&%&10;    num&/=10;    i++;  }while(num!=0);&  n=i;  printf("LEN%d",n);  for(i=n-1;i&;=0;i--)    printf("%d",a[&i&]);  for(i=0;i&n;i++)    printf("%d",a[&i&]);&}做这题时我也用到了昨天老师教的画图方法作了验算,不过还是要上机求正否,这样一来可以锻练一下编写程序。我们大家都各有各的方法,有些是很长(用Switch语句呢),我也不知道他怎么想的了,不过不同人有不同思想是正确的,编程这玩意没有完全统一的答案的。那么你们想想你们有什么方法做呢,好吧,就给五分钟你们做做吧。……好了,时间到了,下面我再说说我的另一位同学做的方法吧,他是用字符数组的,也很简单方便可以实现。你们做的怎么了?如果有好的方法也可以大家交流啊,因为我写这些都是为了大家(也为了自己)。大家应该都看得明白我的程序吧,因为我的思想就是这么单纯。&老师说完了昨天的作业后就开始说今天要讲的课程了。今天的主题是循环语句,其实C语言里也只是这么几条循环语句吗?相比QB来说真的可以算是见大场面了,因为QB里单是循环语句已经有七八种之种,至于有那些我也记不太清了。那么下面讲讲C语言的好了。C语言的循环语句一共有三种,先说说比较简单的前两种吧!While&(&条件&)&{&语句;}&和 do&{&语句;}               while&(&条件&);这里我想重复一下老师给我们说的一个笑话,就是有一个小女孩问妈妈拿糖的小故事。有一个很乖的小女孩总是先问妈妈可不可以吃糖,如果得么批准了就拿一粒来吃?墒怯幸淮嗡?就很拿着一粒吃着了,跟着才问妈妈我可不可吃糖啊,如果可以当然就是继续可以吃了,否则就不准了,不过已经有一粒在口了。这个刚好可以比喻这两个循环语句,第一个循环语句是先当条件真才可以继续下去,否则退出。而第二个呢,就是直运行里面的程序先,跟着才到条件里看是否可以再继续运行多一次?昧苏饬礁霰冉霞虻サ木涂纯C语言里特有的一个for循环语句,这个循环比较特别,如第五天图一它的结构也比较特别,而且里面三个表达式是非常灵活的。这里随便给出一个程序让大家看看:&int&i=0;for(;&if(i++&;10)&printf("%d",i);这说这里i是多少呢?这里就关系到这个运算符了++递增运算符,可以有两种方式,一种是i++就像上面的那样,至于另一种就是++i,这里的答案是前者等于12,而后者就等于11。这里全是因为++递增的两个方式所至,那么我们要好好掌握一下这个,你自己试试动手上机编一下。另一个程序好让看出这个递增运算符的:int&i=0;if&(i++)&printf("a";&/*&如果这里为真的就输出a&*/else&printf("b";&/*否则就是输出b&*/自己试试看,是不是很明显可以知道这个递增符的原理呢,这里说一下吧,其实i++这个呢就是先那i比较后才运算++的,所以很自然就是0那么结果当然就是输出b了,则那个++i就是先把i加1才比较,那么真就输出a了,好了,那么++递增和-&-递减都是同一性质的。不过要注意的是这两个递增递减运算符都是要变量才行的,不可以和常量运算。好了,说完了循环语句当然就是要懂得去运用在编程里了啊!所以老师马上出了一道题让我们想想,不过相信有些人都是研究过的了,就是"魔方阵",可是老师说虽然这个魔方阵虽然有直接的算法可以运算出来,但是要让我们思考用循环做这题,利用计算机的能力来完成,但看到要排列这么多的数,循环也更不要说要很多了,所以我根本没法想下去了(开始头晕起来)。最后还是没有一个能做出,只好听老师说了,不过老师也没有完全说完,只是给了我们一个结构,如第五天图二让我们自己有兴趣就去完成它吧,我对数学这东西最没有FEEL的了。好了,接着继续第二题,也是一个排列组合的问题,你们手头上应该都有老潭的《C程序语言第二版》了,那么请大家翻翻书到第121页,6.15题,这题就是排列组合的题目了。这其实也是有一个规律可以找到的,不过不是我们找到的而是老师给我们说,今天这堂课真的有太多的难题了,至少对于我来说。下面我也没有什么好插嘴的了,只好示出老师的方法吧,如第五天图三程序也在下。char&xyz[]=['X','Y',"Z'};int&i,j,k;for(i=0;i&3;i++)  for(j=0;j&3;j++)    if(j==i0&    for(k=0;k&3;k++)      if(k==i&||&k==j)&      printf("A-%c\n",xyz);      prihtf("B-%c\n",xyz[j]);      prihtf("C-%c\n",xyz[k]);让大家自己看明白了?昧?今天我的头也特别的晕,肩膀也特别的酸。不过我还是要努力的!&第六天&&&&日&今天的整个课程只有这么的一道题,但是学到的东西确很多。下面给出这条题目:&字符数字转为整数数值(字符可以任意:比如"342A")遇到其它否数字取前数。&&我所写的程序如下,自认为写得不错:&&#define&N&10;&&int&catio(const&char&*str)&/*const&的作用是常数,所以这里的地址不会返回到实参里*/&&{&&  int&num[N];&&  int&i=0;j=1,n=0;&&  for(;*str++;i++)&&  {&&    if(*str&48&||&*str&;57)&&    &/*判断是否数字数值*/&&    num=*str-48;&&  }&&  for(i-=1;i&;=0;i--)&&  {&&    n+=num*j;&&    j*=10;  }&&return&n;&&}&你们说是不是比较简单呢?现在看不出等看完以下的另一个程序先断定吧。如下:&&long&catio(char&c[]);&&{&&  int&n,d;&&  char&*q,*p;&&  long&e=1,s=0;&&  for(q=p=c,n=0;*p!='\0'&&&&*p&;='0'&&&&*p&='9';p++,n++,e*=10);&&  while(n&;0)&&  {&&  d=*q++;&&  switch(d)&&  {&&  case&48:&d=0;&/*太长了,略*/&&     :&&     :&&  case&57:&d=9;&  }&&  s+=d*(e/=10);&&  n--;&&}&&return&(s);&&}&&现在比较来看看,不过虽然这条程序是比我那个复杂,但是也有他的思路和可取之处。像在那个for循环了,一条命令带过很方便也很简洁。其实我们可以继续改造这个程序,我们跟着老师的思路一步一步的把它进化,现在看看如下:&&long&catio(char&c[]);&&{&&  int&n,d;&&  char&*q,*p;&  long&e=1,s=0;&&  for(q=p=c,n=0;*p&&&&*p&;='0'&&&&*p&='9';p++,n++,e*=10);&&  while(n&;0)&&  {&&&   &d=*q++-'0';&    s+=d*(e/=10);&&    n--;&&  }&&  return&(s);&这样是不是更简化了,那么还可以再简化下去吗?前面的我们是可以做出来啊,当是老师说还可以更简单,我们都只好怀着期待的心情去听了。他一步一步的说出来,第一就是在s+d*(e/10)这里可以变为另一种形式,s=s*10+d,如果按照这样又可以去掉一个多余的变量了,变量e就没有了。接下来的更不可意议了,我不知道怎么说,看看程序先吧。&long&catio(char&*c);&&{&  long&s=0;&&  for(;*p&&&&*c&;='0'&&&&*c&='9';s=s*10+*c++-'0');&&  return&(s);&&}&&大家看到了吗?原来这么长的程序可以一再简化到这个地步,这就是C语言的灵活了(我好像已经说了好几遍了,真的没有办法,不得不赞叹)。&&今天就是这么一题,可真的有意外惊喜呢!好了,现在不写了,还有十道练习题等着我去做呢,大家也要努力喔!&&第七天&日&&今天终于都讲到C语言比较后的范围了,"函数"说是C语言的一切真的没错(可能有吧,我不知道)?。很多书上都说着函数是C语言根本,就是说函数是构成C语言的?看以下这个程序:&main()&&{&&  printf("Hello&World";&&}&&  main()就是C语言里最特殊的一个函数,是构成整个程序的关键。在C编译器里首先就是要找出这个主函数才开始执行编译,好了,说了一些书上原来的东西。现在我们就来看看C语言里的函数究竟是怎么的,如果我们从基础的说起也没有什么意思。那么我们就从函数的另一个特点说起,"递归函数"相信很多人都知道这个吧,看过老潭的教程应该都知道他经典的第一个递归程序吧:&int&abc(int&n)&&{&&  int&s;&&  if(n&&;1)&s=&n*abc(n-1);&&  else&s=1;&&  return&(s);&&}&&从这个源程序很容易就看出有一个同自己名字的函数在里面,所以以后我们看到一个函数里面调用自己就是递归函数了。而且我们看一个递归函数就主要就是看它是否一个返回的条件,就好像一条又黑又深的山洞,我们前去探险如果往到底就一定要回头,就算是更深的也要返回啊!所以我们判定一个递归函数是否成立也常常是看它的返回条件。至于上面的那个源程序我也不想多说了,应该大家也看得明白。&&这里就看看另一个利用递归函数做的题目吧,就是诺汉塔(老潭的书上也是有)。#include&&stdio.h&;&&void&move(char&x,char&y)&&{&&  printf("%c--&;%c\n",x,y);&&}&&void&hanoi&(int&n,char&one&,char&two,char&three)&&{&&  if(n==1)&move&(one&,three);&&  else&&  {&&    hanoi&(n-1,one,three,two);&&    move(one,three);&&    hanoi(n-1,two,one,three);&&  }&&}&&main()&&{&&  int&m;&&  printf("input&the&number&of&diskes:";&&  scanf("%d",&m);&&  printf("the&step&to&moving&%3d&diskes:\n",m);&&  hanoi(m,'A','B','C');&&}&&/*运行情况如下:&input&the&number&of&diskes:3&回车&&the&step&to&moving&3&diskes:&&A--&;C&&A--&;B&&C--&;B&&A--&;C&&B--&;A&&B--&;C&&A--&;C&&书上说hanoi(n-1,one,three,two);是把"one"上的n-1个往"two"上移,接着move(one,three);然后是hanoi(n-1,two,one,three)即把"two"上的n-1个往"three"上移;&&|h(2,1,3,2)|h(1,1,2,3)=&;move(1,3)&&-----1------&&|     &|&move(1,2)&&-----2------&&|    & |h(1,3,1,2)=&;move(3,2)&&-----3------&&|move(1,3)&&-----4------&&|&h(3,1,2,3)&|&|h(1,2,3,1)=&;move(2,1)&&-----5------&|       h(2,2,1,3)|move(2,3)&&-----6-------&|      &|h(1,1,2,3)=&;move(1,3)&&-----7------&|&*/  注意以上是网上一个网友写的,并不是我写的。诺汉塔最不同的就是它多次调用自己,所以看起来也比较复杂一点。当时我在看这条程序的时候也是看了老半天也看不懂,最好我在网上看到一位朋友说他自己是真的拿了一些碟子自己试着移来看看,后来我也自己试着看,效果真的挺好(我当然没有笨那这么大的碟子啦,用我的光盘写上大、中、小),大家不访也试试看。加上看了上面这个图我也比较清晰了,我要感谢那位网友才行,你们说是吗?这个程序一定要自己慢慢去理解它,祝大家早日理解它吧。递归函数部份我因为不太懂也不能说些什么了,现在来看看函数的另一个内容吧,就是函数的参数调用。我这里先给出一个程序先吧:int&abc(int&a,int&b){  a=a=b;&return(&a+b&);}main(){  int&xy[]={3,5};  int&s;  s=abc(xy[0],xy[1]);}  这里的将xy[0]和xy[1]分别传入形参里,这里要说的一点就是和其它高级语言不同的,C语言的函数调用都是单向传递的。限实参传了给形参之后并不会返回到传进来的实参的,所以我们务必记住这点。又如下面一题:int&abc(int&a[]){  int&i,j;&  /*&排序&*/}main(){  int&x[5]={3,5,1,2,4}  abc(x);/*&输出&*/}  这条源程序可为什么会改变实参的数值呢?老潭的书里说的很明白,说是因为这是地址传递,但是我们老师不太认同这点,他说这个也应该是值传递,只不过这个值是比较特殊的一个值,是地址,所以传到形参时可以通过调用这个地址指向的元素而已。如果按老潭的这样说以下这条程序都叫地址传递啦?int&abc(int&*p){&  *p=10;}main(){  int&a=20,*w;  w=&  abc(w);&/*abc(&a)*/  printf("%d",a);}  指针P也只是一个值而已,这个值是地址。如果说这是地址传递,那不是应该w的地址传给形参吗?剩下来的大家自己想想吧。(这里也不能够说谁对谁错)&  接下来说说变量的存储类别,其实这个知识点也挺容易理解的,不过可能给C语言太多的这样的关系弄的糊涂了。C语言里有变量的类型,变量的存储类别,变量的全局性还是局部性,是静态的还是动态的呢。一切都是C语言变量的东西,我们这回也该好好的结束了它。(我们大家一齐看书吧)  很对不起大家,因为今天我的眼有点问题(可能看电脑看太久了)。所以不要再继续和大家进一步讲讲存储类别,这里有一条源程序大家看看吧,我不行了,我要好好休息一下才行了。int&abc(int&a){int&i,j;scanf("%d%d",&i,&j);if(i&;j){int&k=1,i=2,j=3;pirntf("%d\n",i*3);printf("%d\n",j*10);}printf("%d",k);}&第八天&日&今天回到学佼也没有讲课,因为老师忙着一些其它事,听说好像是多媒体比赛的吧,要今天上交了。那我们只好回到课室里自己看书了,不过在这段时间里我们都没有看什么书,只是大家聊了起来。我也插了嘴吹了几句,可是很快就没有心情了,唉!只好睡一睡吧。当我休息了一会发现老师都已经回来了,而且说让我们今天上机房。今天是第一次上机房,不过如果不是什么事我也不愿上机房,因为我觉得听老师讲课还好。我们上到机房,老师给了一条程序我们,喔!这不是前两天说要搞的那个诺汉塔吗!而且是结合了图形表示的。我们都兴奋起来了,开始研究着这条程序。我开始执行这个诺塔了,他给的参数不是很多,只是十个盘子而已,你知道我按了多长时间吗?我一直按着来看也看了快一个5分钟才看完啊,这个问题果然是复杂.看着这些图画演示让我更加清晰的明白了诺汉塔的原理,这里我不敢自私,我把源程序也COPY回家了,以下就是了:#include&&conio.h&;#include&&string.h&;char&dd[10][20],space[20];int&a[11],b[11],c[11];&init(){  int&i,j;  for(i=0;i&20-1;i++)&space='&';  space='\0';  for(i=0;i&10;i++)  { &for(j=0;j&20-1;j++)dd[j]='&';    dd[j]='\0';    for(j=9-i;j&=9+i;j++)dd[j]='a'+i;  }for(i=0;i&10;i++)&a=i,b=-1,c=-1;a[10]=2,b[10]=25,c[10]=50;for(i=0;i&10;i++){&  &gotoxy(a[10],10+i);  cprintf("%s",dd);}}move(int&*s,int&*d){&int&i,j;  for(i=0;s==-1&&i&10;i++);  gotoxy(s[10],10+i);  cprintf("%s",space);  for(j=0;d[j]==-1&&j&10;j++);  j--;  gotoxy(d[10],10+j);  cprintf("%s",dd[s]);  d[j]=s;s=-1;  getche();}void&hanoi(int&n,int&*s,int&*w,int&*d){& int&i;  if(n==1)move(s,d);  else  {&    hanoi(n-1,s,d,w);    move(s,d);    hanoi(n-1,w,s,d);  }}main(){ clrscr(); init(); getche(); hanoi(10,a,b,c); getche();}  最后除了看了这条程序,老师还给我们试着用TC调试程序了。你知道我以前调试程序是怎样的吗?我就是直接ALT+F9看看有没有出错,如果有就修改,没有则成功了.&可是真天我真正认识到TC里调试程序的真正方法,其实TC里有一大推的调试工具,这是我以前一直没有用过的,只知道有一个就是一步一步执行,跟着其它就一无所知了。其实TC里可以把一些变量的值跟踪显示出来,这是调试程序的重要手段,以前不知道这个功能都是用笔写在纸上的,现在可以很方便准确的看出来了。下面的几张图片是我自己切出来的,大家看看就知道知道了(可能大家原来就知道,是我菜摆了)。今天的课程也算学到东西了吧,我该回去好好利用这个功能来调试程序了。第九天今天终于到了C语言的核心部份了,指针一直都是被学习C语言公认为最难的一个大重点了,如果假如我们不学C语言的指针的话,那我们可以说根本没有学过C语言了。不过话说回来,在我刚开始接触C的时候前面的基本语法倒是很快的过了,可是学到指针结合到数组里就傻了眼,因为我根本看不明为么可以有这么多的数组调用方式(结合指针)。其实我下面的三言两语也很难说的明白指针这家伙的,请大家在上机里多多调试看看,待增加了经验后再回头看看指针这章,相信也能全摸透了。因为我也是这样过来的,我还特别看了很多运用指针方面的源程序。现在我们就从相对于二维数组来说比较简单的一维数组开始吧,先看看如何定义一个指向一维数组的指针吧。&int&a[5]={1,2,3,4,5};int&*p;p=a;&/*这里a因为是数组的变量名,它的值是这个数组的首地址*/跟着我们可以通过指针来改变数组的值p++;*p=6;&/*那么数组的第二个元素就等于6了*/这里的意思就是让指针向下移一个,这样一来指向了数组的第二个元素。我们再细一点看看它的地址,通过这个指针,即当前指向的元素的地址。那么地址又是怎么运行的呢?p++这个命令就是让地址往下移的了,如果按照数组a&的类型来看,数组a是一个整数的类型,占的空间是两字节,而p++就只加1,顶多都是到第一个元素的后一半里,哪里可以指到第二个元素呢?其实这里就关系到定义指针时的类型,我们这里定义的也是整型类型,"对啊,这里定义整型是对的啊,因为它要指向整形数据嘛,那么当然就是一定要定义这种类型啦",其实这并不是真正的答案,而且也不必一定要定义为跟指向的数据一样类型,我们完全可以定义指针的类型为其它的。就比如定义为float吧,不过这里执行p++就直接跳过了一个数组元素,那么现在我们来看看究竟是怎么一回事。其实我们定义的指针类型就是用来结合指针,进行一定规则的运算方式。这里很明显可以看出如果是定义int&类型的就可以到第二个元素,说明了p++不是简单的地址加一,而是先结合这个是什么类型才进行运算的,加一次就等于地址移了2位了。float道理一样移4位,所以得到的结合是移到第三个元素。再往下看看:a=a+1;这里我们进行地址移位赋值,不过这条命令是错误的,C语言里数组名是一个地址常量,所以不以试图改变它的值。接下来简单地说一说二维数组,因为我们今天的任务就是首先搞清一维数组先。现在我们先来定义一个二维数组int&a[2][4];&这里我不再重复书里讲的东西,我讲一下老师给我们的那种思想。我们这样来看一个二维数组,就是一维数组的元素又为是一维数组,这样嵌套。当然其它的多维数维都是这样一直嵌套下去的了。我们先看看这个图如图第九天图一这样就很容易说明了为什么a[0]&和&&a[0]为什么是一样都是代表着地址,其实都只是首地址,这里从文字很难可以说通,但是从意义上就可以理解。我们把二维数组的整列都充当为一个一维数组,不把它看作二维,这样得出如下:a[1][1];充当一维&M为名M[1];&/*调用第二个元素*/我们试着把所有都这样看作,定义这样的一个一维数组int&a0[4],a1[4],a2[4];这样一来,我们就知道a0、a1、a2都是首地址了。好了,可能也越说越模糊了,如果看不明白还是按照自己原来的思想去考虑数组吧,这是因为每个人都有自己的的想法和理解。&第十天&&日&今天接着上天的二维数组,我们看看指向二维数组的指针是怎么的。在讲之前我想再重复一次,如果你自己理解好二维数组的就按你以往的去理解吧。不过多想想几种方法也是一件好事,那么下面就来讲讲了。&现在来看看昨天的那个二维数组图,第九天图一。我们定义一个指向二维数数的指针&int&a[3][4];&int&*p;&p=a;&其实这也指向一维数组的指针完全没有分别,二维数组因为是行优先的,一行下来就是列顺序了,我们可以这样来用指针指向列,如下:&p++;&我们这里就是指向了第0行的第1列了,那么我们怎么可以到第下一行呢,其实定义数组时内存就给数组分配好一连串的连续空间,我们直接可以将指针继续往下移,当移到了0行最后一列时,加移的话就到了第1行了。其实C语言里还有一种更方面的指向方法,看如下:&int&(*p)[4]&/*这里是定义一个数指针,而这个指针是指向有数组四个元素的指针*/&我们看看这种定义的方式,*p为什么一定要括号括住呢,因为[]这个运算符比*优先,如果不加括号的话就变成了定义另一个指针值,至于是什么指针在最面就会讲到了,现在先来看看这种指针。&p=a;&p++;&这样会得到什么的结果呢?就是直接往下移一行了,这也是和前天说过的那个道理一样,是按照定义的类型结合来到运算的。我们知道了如何可以移行,那么该怎么移列呢?这个问题又更复杂一点了,试着把指针移到第1行第2列看看。我们先来看看这个表达式代表什么吧,a+1&这就是第一行的首地址吧,同理p+1也是指向第一行的首地址。至于列呢?先想想一维数组是怎么移到列的,就是首地址加上列序吧!那么我们就可以先表达出一维数组的首地址先,*(p+1)+2,看,这样是不是指向了第一行第二列了呢。我们不可以简单的理解(p+1)为行,从另一种意义上可以看成是列的首地址了(这里实在太难理解了,明还是有一点明,不过我还想用回自己一直对指针的理解好了,千万不要综合起来理解喔,这样就太错特错了)。&好了说回了二维数组成的现在来看看还有其它的什么指针,字符指针是比较简单的,不过也有它的一些特别之处。我们来看看以下的一些程序:&char&*p;&p="ABC";&/*这里说说,既然是字符串就是一定有结束符的,这是和字符数组不同的*/&这样的赋值是可以的,这里是将字符串ABC的首地址赋给指针p,下现再看看另一个程序:&char&a[4];&a="ABC";&这里有错吗?对于C语言来说是错了的了,因为字符数组a是一个常量,不能给赋值。其它的高级语言就可以直接赋值给它就回事了,那么我们想把ABC赋给字符数组该怎么呢,这里有几种方法,一种就是一个一个字符赋值,一种就是利用指针,不过这里还是用回C语言函数库里的复制字符串函数完成strcpy();大家应该都对这个函数不默生吧,那好,现在就给五分钟做做练习,编制一个类于strcpy()的函数。…………时间真的过得快,我把我做的写出来吧。&mycpy(char&*s1,char&*s2)&{&for(;*s1++=*s2++;&}&好了,就这么短短二行就完成了复制功能,这只有C语言才能做到的。&现在再来看看以下两个程序吧&char&*p,*q;&char&*p,*q,*r;&p="ABC";&r="ABC";&q="ABC";&p=r;&*q='D';&q=r;&printf("%s",%s",p,q);&*q='D';&printf("%s,%s",p,q);&这里的答案是什么呢?自己先想想吧。&好了,应该都想完了吧,现在就给出正确的答案,第一条程序是输出ABC,DBC,而第二条程序就是输出DBC,DBC。这里为什么呢?其实是因为第一个程序都是指向了同一个地址,那当然就是值一样啦。&现在就剩下函数指针了,其实我们平常也不怎么多人,但是老师还是给我们讲了一下,也提出了一个特别的地方,是今天我们才发现的,程序如下:&int&b=0;&int&a[2]={10,20};&int&*ab(int&*p)&{&p++;&return&(p);&}&main()&{&b=*ab(a);&/*这里我们试着将调用的函数返回的地址再加*号,看看可不可以指到那个值,至于结果怎么样,我们也没有试过,我在写这篇日记时也没有上过机试,大家有兴趣也试试吧,这个问题我们是怎么引出来的呢,其实我们一开始定义了一个指向函数的指针,就比如(*cd)()吧,我们提出了如果没有了括号会怎么样,因为本来(*cd)()就是指向一个返回指针值的函数,那么我们为了试验所以另编一个返回地址的函数来试试*/&printf("%d",b);&}&好了,今天就将指针讲完了,不过指针的运用就还有很多在后面呢,就我知道的就有结构体和共用体还可以用到指针,跟着就是其它的一个综合运用链表、堆栈、队列等等的。我想我就是这方面还一点经验都没有吧,之前看了一下数据结构也没有太大的兴趣看下去了,因为我看到一大堆的指针都已经头晕了。不过近几天拿回来看看又好像明了些什么似的,反正就觉得不太头晕了吧。&第十一天&日&今天讲到结构体,在讲之前先把前天布置的几道针指的练习题先讲了。那些题目都是老潭书里的指针那章,大家自己慢慢做做喔,用来掌握指针很重要喔,学编程就是要多实践。今天我上网里看到了一篇很好的文章,我帖下来:&发信人:&ycs830&(老山羊),&信区:&C&标&题:&Re:&如果快速学会C语言&学会C语言很容易,它没几个语句,没几个函数。但用是另一回事。就象华山剑法难学,令狐师兄学了若干年,但还是谁也打不赢。独孤求败只有三&招,令狐师兄却熬了若干小时就学会,但他先看了各派剑法,融会贯通需要和高手来回打架。学C是一个过程,我现在看C和十年前观念很不一样。说到底,C只是一个工具,问题是你要干什么,怎么干。C玩好了就象独孤九剑学好了,你可以俯视其它剑法。但岳不群学独孤九剑就不见得有令狐冲的效果。学数学对逻辑思维能力是个锻炼。我的数学知识大部分还给了老师,但逻辑思维能力却对编程极有用。数分、高代、空解作为数学系的基础课,确实对我很有用。C语言是死的,算法是活的,就象独孤九剑本无招--在融天下剑法之后。大家觉得怎么样?自己慢慢思考吧。好了,现在该讲讲今天的课题了,结构体。我们先来了解一下什么叫结构体,其实结构体就像数据库里的记录,结构体里面的就相当于一条记录里的各个属性,我们在描述一样东西通常都是集在一起的一个整体,就好比像一个学生吧,学生有他相关的属性,比如姓名、年龄、性别、班级等等。我们编程里虽然可以定义多个变量来分别代表着这些属性,令可这样一个一个分开来何必不将他们集中在一个整体里呢,所以C语言里就考虑到这个有了结构体。我们看看如何定义一个结构体,如下:&struct&student{&char&name[10];char&int&::};&/*注意喔,这个分号是一定要的喔*/这里定义的是一个结构体student,但这绝对不是定义了一个可以调用的变量,这只是声明好有这么一个结构,我们要学定义一个结构的变量的话,就像定义其实类型一样:int&a,b;和struct&student&a,b;都是同一个道理,都只是定义一个变量,类型就是看前面的了。一样可以定义其它的类型,比如struct&student&*p;这也是正确的(结构体数组也是有的喔)。这种指针类型可是以后要讲到的链表里很重要的喔,那么先来看看这种结构体指针先吧。我们同样可以用指针的方法指向这个结构体的首地址:a.sex='m';这是最调用结构体里的元素运算符&.struct&student&*p;(*p).&sex='m';这里一样也是这样来表示,不过结构体有另一种很好的表示方式,用到了另一个运符号-&;。p-&;sex='m';我们来这样理解这个表达式,p是地址,-&;这个是指向这个结构体里的,p-&;sex就是指向这个结构体里的元素了。时间过得很快,没有讲到多少就快放学了?昧?我也不多说了,今天就这样吧。第十二天&日&今天老师和我们讲了链表,和老潭书里一样大家都讲得很好,让人很容易就可以听进。所以这里我也不再重复了,大家自己慢慢看一下老潭书里的链表那节,绝对不会觉得难的,而且还举了一些生动的例子来到说明。下面我就从网上找来一些关于指针的文章,这个人绝对是高手,大家这回要好好研究一下咯。相信看完第一遍之后一定对指针有个大概,第二遍已经有印象在脑海里不停的回旋了,第三遍可以大功告成了。为初学者服务。这是我的帖子的宗旨。我也是个初学者(强调了无数遍了),我以我的理解把初学者觉得难懂的东西用浅显的语言写出来。由于小学时语文没学好,所以竭尽全力也未必能达到这个目的。尽力而为吧。指针是c和c++中的难点和重点。我只精通dos下的basic。c语言的其它各种特性,在basic中都有类似的东西。只有指针,是baisc所不具备的。指针是c的灵魂。我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来。我的目的是:1。通过写这些东西,把我脑袋中关于c的模糊的知识清晰化。2。给初学者们一点提示。3。赚几个经验值。(因为贴这些东西没有灌水之嫌啊)第一章。指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。先声明几个指针放着做例子:例一:(1)int&*(2)char&*(3)int&**(4)int&(*ptr)[3];(5)int&*(*ptr)[4];如果看不懂后几个例子的话,请参阅我前段时间贴出的文章&&如何理解c和c++的复杂类型声明&;&;。1。&指针的类型。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:&(1)int&*&//指针的类型是int&*(2)char&*&//指针的类型是char&*(3)int&**&//指针的类型是&int&**(4)int&(*ptr)[3];&//指针的类型是&int(*)[3](5)int&*(*ptr)[4];&//指针的类型是&int&*(*)[4]怎么样?找出指针的类型的方法是不是很简单?2。指针所指向的类型。当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:(1)int&*&//指针所指向的类型是int(2)char&*&//指针所指向的的类型是char(3)int&**&//指针所指向的的类型是&int&*(4)int&(*ptr)[3];&//指针所指向的的类型是&int()[3](5)int&*(*ptr)[4];&//指针所指向的的类型是&int&*()[4]在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。3。&指针的值,或者叫指针所指向的内存区或地址。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?4。&指针本身所占据的内存区。指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。第二章。指针的算术运算指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:例二:1。&char&a[20];2。&int&*ptr=a;......3。&ptr++;在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。我们可以用一个指针和一个循环来遍历一个数组,看例子:例三:int&array[20];int&*ptr=...//此处略去为整型数组赋值的代码。...for(i=0;i&20;i++){(*ptr)++;ptr++;}这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。再看例子:例四:1。&char&a[20];2。&int&*ptr=a;......3。&ptr+=5;在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。第三章。运算符&和*这里&是取地址运算符,*是...书上叫做"间接运算符"。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。例五:int&a=12;int&b;int&*p;int&**p=&//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。*p=24;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。ptr=&//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int**。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。*ptr=&//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。第四章。指针表达式。一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。下面是一些指针表达式的例子:例六:int&a,b;int&array[10];int&*pa=&//&a是一个指针表达式。int&**ptr=&//&pa也是一个指针表达式。*ptr=&//*ptr和&b都是指针表达式。pa=pa++;//这也是指针表达式。例七:char&*arr[20];char&**parr=//如果把arr看作指针的话,arr也是指针表达式char&*&str=*//*parr是指针表达式str=*(parr+1);//*(parr+1)是指针表达式str=*(parr+2);//*(parr+2)是指针表达式由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。第五章。数组和指针的关系如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文章&&如何理解c和c++的复杂类型声明&;&;。数组的数组名其实可以看作一个指针?聪吕?例八:int&array[10]={0,1,2,3,4,5,6,7,8,9},......value=array[0];//也可写成:value=*value=array[3];//也可写成:value=*(array+3);value=array[4];//也可写成:value=*(array+4);上例中,一般而言数组名array代表数组本身,类型是int&[10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int&*,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。例九:char&*str[3]={"Hello,this&is&a&sample!","Hi,good&morning.","Hello&world"};char&s[80];strcpy(s,str[0]);//也可写成strcpy(s,*str);strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char&*。*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this&is&a&sample!"的第一个字符的地址,即'H'的地址。str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char&*。*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good&morning."的第一个字符'H',等等。下面总结一下数组的数组名的问题。声明了一个数组TYPE&array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE&[n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。在不同的表达式中数组名array可以扮演不同的角色。在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。例十:int&array[10];int&(*ptr)[10];ptr=&上例中ptr是一个指针,它的类型是int&(*)[10],他指向的类型是int&[10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:int&(*ptr)[10];则在32位程序中,有:sizeof(int(*)[10])==4sizeof(int&[10])==40sizeof(ptr)==4实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。第六章。指针和结构类型的关系可以声明一个指向结构类型对象的指针。例十一:struct&MyStruct{int&a;int&b;int&c;}MyStruct&ss={20,30,40};//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。MyStruct&*ptr=&//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。int&*pstr=(int*)&//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。请问怎样通过指针ptr来访问ss的三个成员变量?答案:ptr-&;a;ptr-&;b;ptr-&;c;又请问怎样通过指针pstr来访问ss的三个成员变量?答案:*pstr;//访问了ss的成员a。*(pstr+1);//访问了ss的成员b。*(pstr+2)//访问了ss的成员c。呵呵,虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:例十二:int&array[3]={35,56,37};int&*pa=通过指针pa访问数组array的三个单元的方法是:*//访问了第0号单元*(pa+1);//访问了第1号单元*(pa+2);//访问了第2号单元从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。所有的C/C++编译器在排列数组的单元时,总是把各个数组单元}

我要回帖

更多关于 分数乘法解决问题分类 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信