[在线人数:33456]
您现在的位置:
[藏品编号:2320499] 藏传佛教开光唐卡《黄财神》 高131厘米 当前价:
出价次数:1 起拍价:100 元
加价幅度:10元
品相:全品
是否包退:承诺货物包退
买家承担运费:快递:20元 上传日期:2011-06-01
销售状态:
藏品年代:现代
所在地:青海西宁市
收藏次数:1次
浏览次数:
本网担保交易***:021-52736257
被骗案件中,90%以上是由于私下交易造成的
卖家档案
用户名:
联系卖家:
古币: 古币等级:
卖家信誉值:
卖家好评率:
实名认证:
藏品尺寸/规格:上轴长66厘米、下轴长81.5厘米、高131厘米
今天没有石头卖了,断货了,上传几幅藏传佛教唐卡,占个摊位。材质锦缎布,本产品材料是根据手绘唐卡材料印制效果和工艺都与手绘基本一致。不退色.不会任何因气候条件损坏,具有供奉和收藏价值。 黄财神,藏名藏拉色波,是密教之护法神祗,诸财神之首。黄财神是藏传佛教各大教派普遍供养的五姓财神之一,因其身相***,故称为黄财神。
黄财神主司财富,能使一切众生脱离一切贫困、灾难,增长一切善法、财富,富饶自在。
其功德:能增长富德、寿命、智慧、物质及精神上之受用。
相传黄财神过去是位菩萨,早已修证五道十地。昔日释迦牟尼佛在中印度摩陀国之灵鹫山(又译鹫峰山)讲说大般若经义时,诸方魔鬼神怪前来阻碍,令山崩倒塌,此时黄财神奋勇现身庇护,使得众多闻法比丘安然无恙。后来释迦牟尼如来嘱黄财神皈依佛法,助益一切贫苦众生,走佛教之路,遂成为大护法神
身色金黄,头戴花冠,头顶有发髻,嘴角有两撇胡须,下部又有一周短胡须。全身不著甲胄,上身袒露,下身着裙。左手抱一只大猫鼬(老鼠的一种),鼬嘴里含着宝珠,象征财宝。他两腿弯曲,坐在莲花座上。左脚踏一只白色海螺,象征他能入海取宝。藏地民间对他十分崇拜,有如汉地财神(赵公明)等一样的地位和影响。
藏族是我国一个具有悠久历史的民族。藏族人民创造的光辉灿烂的民族文化,是中华民族文化遗产的重要组成部分,唐卡又是藏族文化中著名的一种宗教艺术。
西藏唐卡是用彩缎装裱而成的卷轴画,具有鲜明的民族特点、浓郁的宗教色彩和独特的艺术风格,历来被藏族人民视为珍宝。
唐卡的形式与游牧部族的生活经历有关。藏民在辽阔而荒凉的高地上逐水草而居,裹成一卷的唐卡即保护了唐卡的画面不受到损坏又成为最方便随身携带的庙宇。毕竟,唐卡比塑像更轻,也不同于壁画,无论走到哪里,只要把唐卡系挂在帐篷里,哪怕是一根树枝上,就能成为一种象征,让人们祈祷、礼拜、观想。
唐卡是在松赞干布时期兴起的一种新颖的绘画艺术,即用彩缎装裱后悬挂供奉的宗教卷轴画,具有鲜明的民族特点,有着浓郁的宗教色彩和独特的艺术风格,历来被藏族人民视为珍宝。唐卡的品种和质地多种多样,多数是在布面上或纸面上绘制而成的。另外,也有刺绣,织绵,缂丝和贴花等织物唐卡,有的还在五彩缤纷的花纹上,将珠玉宝石用金丝缀于其间,珠联璧合。唐卡的题材内容涉及藏族的历史、政治、文化和社会生活等诸多领域,堪称藏民族的百科全书。唐卡艺术是西藏文化的一朵奇葩,千余年来影响深远。传世唐卡大都是藏传佛教和茉教作品,现已成为海内外文物收藏的新热点。
具体看图, 只拍不买凑热闹的兄弟姐妹们请高抬贵手放过辛苦上传的我,我先给您们三鞠躬!祝您古币财富与日俱增!200古币也是人民币。只拍不买现在求您绕道行,拍中以后请不要求我关闭交易、拍中后讨价还价不付款一律举报!如果您收到货后不喜欢或者看着不顺眼欢迎您退货,不顺眼的感受我能理解,就好比娶了一个又丑又凶的老婆,支持给丈母娘退货,把财礼退回。本奇石包退!欢迎退货!无条件包退! 最近石头收购不好收,资源稀少,收购价格高,已经半个月没有上传拍卖了,1元起拍经常被赔钱捡漏,资金紧缺,早餐的吃窝窝头喝自来水,中午喝稀饭,晚饭都吃不上了,小弟最近快邮费都付不起了,收到货的老师们请及时收货确认,叫价叫高点,让小弟晚饭吃碗大米饭。 从即日起,发货全部发“圆通”快递,超区自提,快递实在不到给我发站内短信发邮政普通邮寄,普通邮寄邮费快递费的7折。往返邮费由买家支付,由于石头压秤,拍得多方邮费只能累加,多拍一件优惠5元,(拍中2件优惠5元;拍中3件优惠10元;拍中4件优惠15元;拍中5件优惠20元......)多拍多优惠,希望大家支持理解。 要快递员当面开包验货,如有损坏当场拒收退货,好找快递赔付。如果拿回家打开看损坏了就算已保价快递是不会赔的,拍几张损坏的照片发到网上给***,我相信是发货途中损坏的,都是老朋友,给你退货是我的损失,赔了夫人又折兵,不给你退货是你的损失,伤感情啊!您选择退货肯定有我的不足之处,请多指教。如果您收到货对我们的服务不满意请给本店最差评,如果您对本店有建议及意见请向我反映,不好的地方多指教,您的建议是黎明的曙光,借您光让我看到太阳升起的地方;你的意见是黑夜里的一盏明灯,照耀着我的前程;你是家用电器手电筒,让我看到了遥远的未来。“中华古玩网”架起你我友谊的桥梁,笑声中,我在“中华古玩网”开心抛石引玉,你在“中华古玩网”偷笑着捡漏。你在微笑着欣赏着藏品,我在傻笑着数钱。感谢“中华古玩网”把青藏高原奇石化石销往全国各地,让更多的人了解2.6亿年前曾经是大海的青藏高原,神奇向往的最后一片雪域净土。为了活跃拍卖区,所有奇石化石全特价起拍,基本都是赔钱拍卖,机会不要错过。
卖家最新上传的竞拍藏品
当前价:
当前价:
当前价:
当前价:
当前价:
当前价:
汇款方式(
中华古玩网指定汇款账户
帐号:zjmeme@163.com
开户名:梅群
开户行:中国工商银行上海市番禺路支行
帐号:622208 1001 000764344
开户名:梅群
开户行:中国招商银行上海市延安支行
帐号:6225 8821 0808 2006
开户名:梅群
开户行:中国建设银行上海市卢湾支行
帐号:6227 0012 1794 0077 235
开户名:梅群
开户行:中国农业银行上海市分行第二营业部
帐号:622848 0030399676110
开户名:梅群
开户行:中国邮政储蓄银行上海市安顺路储蓄所
帐号:6221882900025092552
开户名:梅群
交易流程
9.警惕!!!被骗案件中,90%以上是由于私下交易造成的,请委托中华古玩网担保交易! | | | | | | | | | | | |
服务***:021-52736257 52724491 52723604 E-mail:webmaster@gucn.com Copyright 2006-2008
gucn.com
版权所有 页面执行时间:0秒
2011-7-31 18:38:51牛年让你的股票牛起来
( Mon, 15 Jun 2009 11:20:29 +0800 )
Description:
当你被套牢的时候,只有两种选择:
1.割肉
2.持有
而在你选择持有后,想要避免损失过大或反败为胜的话,就需要学会补仓,你一旦掌握的了补仓的技巧,就会化腐朽为神奇。
下面,本栏就具体分析一下补仓的技巧:
1.大盘处于下跌通道中或中继反弹时都不能补仓,因为,股指进一步下跌时会拖累决大多数个股一起走下坡路,只有极少数逆市走强的个股可以例外。补仓的最佳时机是在指数位于相对低位或刚刚向上反转时。这时上涨的潜力巨大,下跌的可能最小,补仓较为安全。
2.弱势股不补。特别是那些大盘涨它不涨,大盘跌它跟着跌的无庄股。因为,补仓的目的是希望用后来补仓的股的盈利弥补前面被套股的损失,既然这样大可不必限制自己一定要补原来被套的品种。补仓要补就补强势股,不能补弱势股。
3.千万不能分段补仓、逐级补仓。首先,普通投资者的资金有限,无法经受得起多次摊平操作。其次,补仓是对前一次错误买入行为的弥补,它本身就不应该再成为第二次错误的交易。所谓逐级补仓是在为不谨慎的买入行为做辩护,多次补仓,越买越套的结果必将使自己陷入无法自拔的境地。
( Mon, 15 Jun 2009 11:19:45 +0800 )
Description:
通过外盘、内盘数量的大小和比例,投资者通常可能发现主动性的买盘多还是主动性的抛盘多,并在很多时候可以发现庄家动向,是一个较有效的短线指标。
但投资者在使用外盘和内盘时,要注意结合股价在低位、中位和高位的成交情况以及该股的总成交量情况。因为外盘、内盘的数量并不是在所有时间都有效,在许多时候外盘大,股价并不一定上涨;内盘大,股价也并不一定下跌。
庄家可以利用外盘、内盘的数量来进行欺骗。在大量的实践中,我们发现如下情况:
1、股价经过了较长时间的数浪下跌,股价处于较低价位,成交量极度萎缩。此后,成交量温和放量,当日外盘数量增加,大于内盘数量,股价将可能上涨,此种情况较可靠。
2、在股价经过了较长时间的数浪上涨,股价处于较高价位,成交量巨大,并不能再继续增加,当日内盘数量放大,大于外盘数量,股价将可能继续下跌。
3、在股价阴跌过程中,时常会发现外盘大、内盘小,此种情况并不表明股价一定会上涨。因为有些时候庄家用几笔抛单将股价打至较低位置,然后在卖1、卖2挂卖单,并自己买自己的卖单,造成股价暂时横盘或小幅上升。此时的外盘将明显大于内盘,使投资者认为庄家在吃货,而纷纷买入,结果次日股价继续下跌。
4、在股价上涨过程中,时常会发现内盘大、外盘小,此种情况并不表示股价一定会下跌。因为有些时候庄家用几笔买单将股价拉至一个相对的高位,然后在股价小跌后,在买1、买2挂买单,一些者认为股价会下跌,纷纷以叫买价卖出股票,但庄家分步挂单,将抛单通通接走。这种先拉高后低位挂买单的手法,常会显示内盘大、外盘小,达到欺骗投资者的目的,待接足筹码后迅速继续推高股价。
5、股价已上涨了较大的涨幅,如某日外盘大量增加,但股价却不涨,投资者要警惕庄家制造假象,准备出货。
6、当股价已下跌了较大的幅度,如某日内盘大量增加,但股价却不跌,投资者要警惕庄家制造假象,假打压真吃货。
庄家利用叫买叫卖常用的欺骗手法还有:
1、在股价已被打压到较低价位,在卖1、卖2、卖3、卖4、卖5挂有巨量抛单,使投资者认为抛压很大,因此在买1的价位提前卖出股票,实际庄家在暗中吸货,待筹码接足后,突然撤掉巨量抛单,股价大幅上涨。
2、在股价上升至较高位置,在买1、买2、买3、买4、买5挂有巨量买单,使投资者认为行情还要继续发展,纷纷以卖1价格买入股票,实际庄家在悄悄出货,待筹码出得差不多时,突然撤掉巨量买单,并开始全线抛空,股价迅速下跌。
( Sun, 19 Apr 2009 16:36:48 +0800 )
Description:
炒股票其实就是考验人的思维,你的思维正确了,就会在 股市中赚钱。
股市中为什么多数人亏损?这是因为他们进入股 市就受到了不正确的教育,产生了错误的思维方式,这种错误 的思维让广大中,小散户年年亏钱,年年成为套牢族。
现在先为大家洗洗脑,让你抛弃原有的错误思维 方式,重新以新的思维方式进入股市,赢得最大的收益。
错误心态之一:炒股票就是高抛低吸,不追已涨的很多的股票,转买底步股。
***股票的第一步就是选股,可股怎么选呢?你可能会说:低吸高抛,买底部股。但这个底到底在那里呢?记得有一个刚入市不久的朋友发现有一只股票从10元跌到6元,他认为这只股票已经跌了将近一半,是底部了,便大胆买入,一个月后这只股票又跌了4元多钱,这位朋友想:这回应该是底部了,又筹集资金进行补仓,没想到还没出一个月,这只股票又跌去一元多,于是他心里就没底了,害怕这只股票继续跌下 去,在三元附近忍痛割肉出局。
这其实就是许多散户朋友"炒底运动"的真实写照。底部很少是你所能想象到的价位,试想如果多数人能够看到这个底部,那么庄家到哪去收集便宜的筹码呢?
因此记住,千万别去买便宜的东西,市场上是没便宜可占的,如果有那你也的付出点代价,最典型的就是时间。
日常闲谈中,我常听到一些朋友被套长达二到三年时间,甚至长, 我要说你是来炒股赚钱的,不是来想长线投资的。进入股市,就要想着赚钱,想着最大限度的提高资金效率。那么你会说,低吸我拿不准,高抛终归没错吧?从字意上是正确的,但在实际*作中,有几个散户朋友能够享受作轿的乐 趣,真正抛了高出?
错误心态之二:买股票一定要买有量的股票。
一个股票其实只有两个阶段是明显放量的,一是在庄家的进货阶段,二是在出货阶段,进货阶段庄家其实非常隐蔽的,他可能在破位下行中放量进货,这是一般人最不容易把握的阶段,试想如果人人都发现庄家在吸货,那么这个庄家怎么可能收集到便宜的筹码,更别谈炒作了。既然进货阶段不好把握,那么买入出货阶段有量的股票不就是自投罗网吗?
错误心态之三:专炒消息股,即炒股消息的重要性大于选 股的重要性。 有些股民朋友专门收集.打听什么所谓的内幕消息,然后根 据所谓的内幕消息进行*作。这里我们说的不是不重视消息的价值,但我们绝大多数人得到的消息是不全面的和错误的,因为董事会成员或*盘手有密切联系的人毕竟是少数。
而庄家炒 作一只股票,不仅仅是受一个消息或一个因素影响,他是受多 种因素支配的。因此我们说炒股票重要的是看其势,不是消 息,更不是基本面。
一..选股原则
原则之一:不炒下降途中的底部股(因为不知何时是底,何价是底),只选择升势确立的股票,在升势确立的股票中,发现走势最强,升势最长的股票。我们对中国股市近5年来的个股走势进行了统计,得出了如下结论:如果某只股票在某天创了新高或进期新高,那么再未来60天的时间里在创新高的可能性达70%以上;与之相反,如果某只顾票在某天里创了新低或近期新低,那么他在未来60天的时间里再创新低的可能性也高达60%以上。以上结论请你牢牢记住,7:3的赢面,为什么不选择30日均线昂头向上的股票而选择底部股和走下降通道的股票呢?底部或走下降通道中的股票只会让你赔钱或输掉时间。
原则之二:选择延45度角向上运行的股票,而成交量逐步递减的股票。沿45度角向上的股票走势最稳,走势最长。这正象我们建设技术人员把楼梯建成45度或接近45度的形状,因为这是最稳定的形状,所以我们把具备这样特征的股票称之为"楼梯股"。如果你一旦发现"楼梯股"中走势越接近45度角,而同时成交 量却是逐步减少的某个股,那么你十有八九是发现庄家在楼道上的影子了。
原则之三:选择买入连续涨停的各股连续涨停的股票,大多出现在大势相好之时,介入这类股票 是最刺激的了。 沪深股市自实施涨幅限制以来,我们对涨停后的各股走势追踪研究了数年,得到了满意的结果。
通过对近两年来出现过涨停的股票追踪统计,研究分析得出以下结论: 1)涨停短期走势
(1)涨停股次日走势
通过对出现过涨停的股票进行分析,涨停次日最高点平均涨幅为5.92%,按次日收盘价计算平均收益为2.86%,因此,如果短线介入涨停股后,次日平均收益也大大高于目前二级市场的收益率,即使按平均收益率推算,年收益率也至少在65% 以上。
(2)涨停股次日走势与其股价高低之间的关系
涨停股次日走势与其股价高低有着密切关系,可以发现,7元以下涨停股的次日收盘平均涨幅在4%以上,远远高于2.86%的平均收率,因此,介入低价涨停股的投资收益会更高。我们还发现,介入20元以上的高价涨停股收益率也相对较高。
(3)涨停股次日走势与其流通盘大小之间的关系
在涨停各股中,流通股本在3000-8000万股间的股票次日走势较好,其平均涨幅远高与平均值。也许是中盘股放量涨停,可能较大级别的主力介入,而不同与小盘股(仅为势力大户所为)和超大盘股(盘子太重,继续拉升有一定难度)的缘 故。因此,介入3000-8000万股盘子的涨停股,收益率较高。
2)涨停股的中期走势分析
各股涨停后的中期走势共有四种:涨停后单边上行;涨停后单边下跌;涨停后先小幅上扬后下跌;涨停后先小幅下跌后上扬。研究涨停股中期走势的目的在于:假如介入涨停股后未及时卖出,中线持有的话,收益率有多大。我们发现,单边上行和先小幅下跌后上扬走势所占比例高达65%,既涨停股中期走势以上行的概率较大,涨停股的走势明显好于其他股。当然对于涨停股的中线持股,还宜参照大盘的走势及各股的基本面。
二..买股之道
1)如何买入"楼梯股"? 一只股票爬楼梯的阶段往往是庄家在缓慢建仓的初期,这样导致估价逐步走高,就形成了初步的楼梯形态,一旦庄家建仓完毕,接下来就是洗清仍在此股票里的散户。庄家在拉抬之前,洗盘有两个目的:其一是为了减轻在股价到高位之时散户的抛盘压力,其二是增加平均持股成本,目的也是为了减轻抛盘。
庄家洗盘一般有两种形式:一是凶狠放量砸盘;对于这种洗盘,你只需要在钱龙即时盘面(或其他分析软件)上看外盘数量和内盘数量就行了,如果发现外盘数量大于内盘数量(即成交的红单数量相加大于绿单的数量),就能证明庄家在洗盘而非出货。这样你只需在出现的第二阴线处介入就行了或者是阴线出现后在第二天开盘价以下介入。二是阴跌洗盘,这种阴跌洗盘一般是庄家控制住自己手中的筹码,放任股价自流。由于没有庄家进货而股价又涨了多日,所以在散户多杀多的情况下,股价就出现了阴跌的走势。这种股票的介入点一般 是当股价连续两至三天阴跌,成交量比前段明显萎缩既是买点,若出现了四至五天阴线后才萎缩,就不要买入了。
2)如何买入涨停股 (1)选股对象:通过上面分析,我们认为可以介入涨停股应以短线*作为主,而且应选择低价(7元以下)或高价(20元以上)的股票(说明:低价和高价视当时大盘,股价具体情况而定),流通盘在3000-8000万股之间的个股作为首选对象。如遇流通盘一亿左右股价的涨停股,次日应及时出货。
(2)介入时间:通过论证,个股涨停时间离开盘越早则次日走势越佳,如果某只股票在收盘前涨停,其次日走势均不理想。况且,大部分个股涨停后在盘中总是有一次打开涨停板的机会,最佳介入时间应为再次封涨停的瞬间。
买涨停股需要注意以下几点:
(1)在极强的市场中,尤其是每日都有5只左右股票涨听的情况下,要大胆追涨停板。极弱的市场切不可追涨停板,机率相对偏小一些。
(2)追涨停板--选有题材的新股,上市数日小幅整理,某一日忽然跳空高开并涨停的;其次是选股价长期在底部盘整,未大幅上涨涨停的;三选强势股上行一段时间后强势整理结束而涨停的。
(3)一定要涨停,未达到涨停时(差一分也不行)不要追,一旦发现主力有三位数以上的量向涨停板打进立即追进,动作要快.狠。
(4)要坚持这种*作风格,不可见异思迁,以免当市场无涨停时手痒介入其它股被套而失去出击的机会。
(5)盘中及时搜索涨幅排行榜,对接近涨停的股票翻看其现价格.前期走势及流通盘大小,以确定是否可以作为介入对象。当涨幅达9%以上时应做好买进准备,以防主力大单封涨停而买不到。
(6)追进的股票当日所放出的成交量不可太大,一般为前一日的1-2倍为宜,可在当日开盘半小时之后简单算出。
(7)整个板块启动,要追先涨停的即领头羊,在大牛市或极强市场中更是如此,要追就追第一个涨停的
三)卖出之道
抛出一只股票一定要记住要抛在它涨时,千万不要看见它跌时再想到去抛它,一般来说一只股票连拉三根中阳线后就是考虑短线抛出去的时候了。 1)"楼梯股"的卖点 "楼梯股"的上升高度,一般是它第一次震仓后前期走势长度的一倍,也就是说震仓点正好是楼梯上升角度的中点处。同时需要密切注意成交量的变化,一旦出现连续(至少三个交易日以上)放量的情况,就要注意随时做好出局准备。
2)涨停股的卖出时机
(1)会看均线者,则当5日均线走平或转弯则可立即抛出股票,或者MACD指标中红柱缩短或走平时则予以立即抛出。
(2)不看技术指标,如果第二天30分钟左右又涨停的则大胆持有。如果不涨停,则上升一段时间后,股价平台调整数日时则予以立即抛出,也可第二天冲高抛出。
(3)追进后的股票如果三日不涨,则予以抛出,以免延误战机或深度套牢。
(4)一段行情低迷时期无涨停股,一旦强烈反弹或反转要追第一个涨停的,后市该股极可能就是领头羊,即使反弹也较其它个股力度大很多。
四)建议
建议你今后只炒这两种类型的股票就行了,按照以上操作风格进行操作获利一定很高。
第一就是在弱市中发现"楼梯股",收藏起来做中线,一旦大势稳定,它就会向上爬。
第二就是在大势好时,买涨停股,跟着庄家赚涨停,做短线。如果你对于涨停股感到吃不透或拿不准,那么空仓时间多一些,坚持等待抓7元以下股涨停的个股,一般都有50%至100%以上的涨幅,一年中只要抓住3只就够了。
另外希望你中短线结合炒股,中线持股时间为2--5个月,短线持股时间为3--7天,中 短线的资金比例最好为6:4(即中线股占有资金60%,短线股占有资金40%)。
炒股其实就是这么简单。以上方法虽然简单但它神奇的囊括了股票的能、价、量、时四大要素,蕴涵了无限的道理,而且吃的都是主升浪。
炒股有奇招 - 东方财富网 原文
( Sun, 19 Apr 2009 16:33:51 +0800 )
Description:
有一个人经常出差,经常买不到对号入坐的车票。可是无论长途短途,无论车上多挤,他总能找到座位。
他的办法其实很简单,就是耐心地一节车厢一节车厢找过去。这个办法听上去似乎并不高明,但却很管用。每次,他都做好了从第一节车厢走到最后一节车厢的准备,可是每次他都用不着走到最后就会发现空位。他说,这是因为像他这样锲而不舍找座位的乘客实在不多。经常是在他落座的车厢里尚余若干座位,而在其他车厢的过道和车厢接头处,居然人满为患。
他说,大多数乘客轻易就被一两节车厢拥挤的表面现象迷惑了,不大细想在数十次停靠之中,从火车十几个车门上上下下的流动中蕴藏着不少提供座位的机遇;即使想到了,他们也没有那一份寻找的耐心。眼前一方小小立足之地很容易让大多数人
,为了一两个座位背负着行囊挤来挤去有些人也觉得不值。他们还担心万一找不到座位,回头连个好好站着的地方也没有了。与生活中一些安于现状不思进取害怕
的人,永远只能滞留在没有
的起点上一样,这些不愿主动找座位的乘客大多只能在上车时最初的落脚之处一直站到下车。
、富有远见、勤于实践,会让你握有一张
之旅永远的坐票。
( Thu, 19 Mar 2009 13:45:12 +0800 )
Description:
1.__________,为伊消得人憔悴 同学答:宽衣解带终不悔(正解为“衣带渐宽终不悔”,偶承认这个是思想有问题) 2.问渠哪得清如许,__________ 同学答:心中自有清泉在(正解为“唯有源头活水来”,咱还是和水粘了点边~~~) 3.何当共剪西窗烛,__________ 同学答:夫妻对坐到天明 (语文老师阅卷时笑晕。后在课堂时说此事,又晕!正解为“却话巴山夜雨时”) 4.蚍蜉撼大树,__________ 同学答:一动也不动 (正解为“可笑不自量”。一动也不动,赫赫,很符合事实阿) 5.君子***之美,__________ 同学答:小人夺人所爱 (直接晕死) 6.穷则独善其身,__________ 同学答:富则妻妾成群 (正解:达则兼济天下) 7.__________,天下谁人不识君 同学答:只要貌似萨达姆 (汗!!) 8.身有彩凤双飞翼,__________ 同学答:拔毛凤凰不如鸡 还有个同学答:夫妻双双把家还(正解为“心有灵犀一点通”) 9.东边日出西边雨,______同学答:床头打架床尾合 还有个同学答:上错花轿嫁对郎 10.__________,糟糠之妻不下堂 同学答:结发之夫不上床 (语文老师暴怒!) 11.但愿人长久,__________ 同学答:一颗永流传 (当时狂笑,现在觉得挺经典的。正解为“千里共婵娟”) 12.西塞山前白鹭飞,__________ 同学答:东村河边爬乌龟 (对的挺工整的) 13.我劝天公重抖擞,__________ 同学答:天公对我吼三吼 (正解为“不拘一格降人才”,龚自珍) 14.天生我才必有用,________同学答:关键时刻显神通 又有同学答:老鼠儿子会打洞 (整办公室的语文老师集体毫无形象的狂笑) 15.天若有情天亦老,__________ 同学答:人不风流枉少年! (正解为“月若无恨月长圆” 李贺《金铜仙人辞汉歌》 ) 16.洛阳亲友如相问,__________ 同学答:请你不要告诉他 (正解为“一片冰心在玉壶”) 17.期末考试出对联, 上联是英雄宝刀未老 该初三同学对下联为:老娘丰韵尤存 18.良药苦口利于病,__________ 同学答:不吃才是大傻瓜 人生自古谁无死,__________ 同学答:只是死的有先后 19.床前明月光,__________ 同学答:李白睡的香 20.管中窥豹,__________ 同学答:吓我一跳 (哈哈哈!正解为“可见一斑”) 21.__________,飞入寻常百姓家 同学答:康佳彩霸电视机 22.葡萄美酒夜光杯,__________ 同学答:金钱美人一大堆 23.__________,路上行人欲断魂 初一学生的杰作:半夜三更鬼敲门 24.还有次考陶渊明的“吾不能为五斗米折腰”,同学填的是“给我六斗就可以”… 25.想当年,金戈铁马,__________ 同学答:看今朝,死缠烂打 (正解为“气吞万里如虎”) 26.五年级的一次考试就考到了“三个臭皮匠,__________” 同学答:臭味都一样 (把监考和外面的校长笑翻了) 27.两情若是长久时,__________ 同学答:该是两人成婚时 28.沉舟侧畔千帆过,_________ 同学答:孔雀开屏花样多 29.书到用时方恨少,__________ 同学答:钱到月底不够花 30.天若有情天亦老,__________同学答:人若有情死得早 (正解为“月若无恨月长圆”) 31.人生自古谁无死,__________ 同学答:有谁大便不带纸 (没有语言了...) 32.有次考李清照的如梦令,“知否?知否?___________” 同学答:SORRY I,DON'T KNOW... (正解为“应是绿肥红瘦”) 33.有次考鲁迅先生某句:“___________,我以我血溅轩辕” 同学答:他以他刀插我身。 34.语文考试,填空里有一首革命诗:“为人进出的门紧锁着,________________,一个声音高喊着:_____________我渴望自由,但人的身躯怎能从狗洞子里爬出…” 同学答:为狗爬出的洞也锁着 / 他妈的,都锁着! 35.千山万水总是情,___________ 同学答:多给一份行不行 (批卷老师对了一句:情是情,分是分,多给一份都不行) 36.高一的时候,一次月考,上句“仰天大笑出门去,(正解)我辈岂是蓬蒿人”。 班上有人写:一不小心扭到腰。 还有一句,上句:“清水出芙蓉,(正解)天然去雕饰”。有人写,淤泥出莲藕;还有人更绝,写:乱世出英雄 37. 问君能有几多愁,__________同学答:恰似一壶二锅头 (老师批“你又喝多了……”)
( Mon, 23 Feb 2009 13:33:08 +0800 )
Description:
第一轮暴涨暴跌:100点——1429点——400点。以1990年12月19日为基期,中国股市从100点起步;1992年5月26日,上证指数就狂飙至1429点,这是中国股市第一个大牛市的“顶峰”。在一年半的时间中,上证指数暴涨1329%。随后股市便是迅猛而恐慌地回跌,暴跌5个月后,1992年11月16日,上证指数回落至400点下方,几乎打回原形。
第二轮暴涨暴跌:400点——1536点——333点。上证指数从1992年底的400点低谷启航,开始了它的第二轮“大起大落”。这一次暴涨来得更为猛烈,从400点附近极速地窜至1993年2月15日1536.82点收盘(上证指数第一次站上1500点之上),仅用了3个月的时间,上证指数上涨了1100点,涨幅达284%。股指在1500点上方站稳了4天之后,便调头持续下跌。这一次下跌基本上没遇上任何阻力,但下跌时间较上一轮要长,持续阴跌达17个月之久。1994年7月29日,上证指数跌至这一轮行情的最低点333.92点收盘。
第三轮暴涨暴跌:333点——1053点——512点。由于三大政策救市,1994年8月1日,新一轮行情再次启动,这一轮大牛行情来得更加猛烈而短暂,仅用一个多月时间,上证指数就猛窜至1994年9月13日的最高点1053点,涨幅为215%。随后便展开了一轮更加漫长的熊市。直至1996年1月19日,上证指数跌至512.80点的最低点。这一轮下跌总计耗时16个月。
第四轮暴涨暴跌:512点——1510点——1047点。1996年初,这一波大牛市悄无声息地在常规年报披露中发起。上证指数从1996年1月19日的500点上方启动。1997年5月12日达1510点。不到半年时间,大盘暴涨1000点,上证指数上涨接近300%。自1997年下半年股市开始了长达两年的“调整”,1999年5月17日跌至1047点。
第五轮暴涨暴跌:1047点——1756点——1361点。1999年“519”行情井喷,在短短的一个半月时间,股指上涨将近70%,1999年6月30日上证指数上攻至1756点。它第一次将历史的“箱顶”(1500点)狠狠地踩在了股民的脚下。随后股市大幅回调。2000年1月4日,上证指数直抵1361点。
第六轮暴涨暴跌:1361点——2245点——1000点。由于继续受欧美股市大幅攀升的刺激,中国股市最后奋力一搏,终于冲上了本轮行情的“至高点”。2001年6月14日,上证指数冲向2245点的历史最高峰。自此,正式宣告我国本轮大牛市的真正终结。
2001年10月22日,上证指数快速跌至1515点这一敏感点位。1500点究竟是中国股市的“箱底”,还是“箱顶”?历史似乎跟我们股民开了一个大玩笑。原来1500点仍是中国股市的“箱顶”,曾经的“箱底”只是一个美丽的误会。不是吗?就在中国股市在1500点的上方稍作停留后,她依然还是回到了她熟悉的1500点的历史“箱顶”下方,这样的指数点位似乎让人感觉更真实、更安全、更踏实可靠。
2002年1月29日,上证指数跌至1339.2点;2004年9月13日,上证指数跌至1259.43点;2005年6月6日,上证指数跌破1000点,最低为998.23点。与2001年6月14日的2245点相比,总计跌去1247点,这与此前专家预言“推倒重来”的1000点预测是十分巧合的。这便是一种技术性的报复,更是上一轮疯狂的大牛市自制的“苦果”。
第七轮暴涨暴跌:1000点——3300点——1500点?2005年6月,上证综指破1000点,2006年1月从1200点启动,截止2007年4月6日收于3300点之上,过去的历史高点已被远抛脑后,一年多时间大盘累计涨幅超过了230%。这一轮行情的上涨应该算是历史上最为猛烈的。50倍的市盈率还能伴随这一波行情走多远?我们将拭目以待。当然,这一轮大的行情结束后,将回调至何处,我们仍将拭目以待。
( Wed, 18 Feb 2009 01:13:07 +0800 )
Description:
字符数组
用来存放字符量的数组称为字符数组。 字符数组类型说明的形式与前面介绍的数值数组相同。例如: char c[10]; 由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组,例如: char c[5][10];即为二维字符数组。 字符数组也允许在类型说明时作初始化赋值。例如: static char c[10]={`c`,` `,`p`,`r`,o`,g`,r`,`a`,`m`};赋值后各元素的值为: 数组C c[0]c[1]c[2]c[3]c[4]c [5]c[6]c[7]c[8]c[9]其中c[9]未赋值,由系统自动赋予0值。 当对全体元素赋初值时也可以省去长度说明。例如: static char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};这时C数组的长度自动定为9。
int i,j;
char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};
for(i=0;i=1;i++)
for(j=0;j=4;j++)
printf("%c",a[i][j]);
printf("\n");
本例的二维字符数组由于在初始化时全部元素都赋以初值, 因此一维下标的长度可以不加以说明。字符串在C语言中没有专门的字符串变量, 通常用一个字符数组来存放一个字符串。在2.1.4节介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时, 也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。 有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。例如
static char c[]={'c', ' ','p','r','o','g','r','a','m'}; 可写为:
static char c[]={"C program"}; 或去掉{}写为:
sratic char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为: C program\0`\0'是由C编译系统自动加上的。由于采用了`\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。在采用字符串方式后,字符数组的输入输出将变得简单方便。 除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串, 而不必使用循环语句逐个地输入输出每个字符。
void main()
static char c[]="BASIC\ndBASE";
printf("%s\n",c);
注意在本例的printf函数中,使用的格式字符串为“%s”, 表示输出的是一个字符串。而在输出表列中给出数组名则可。 不能写为: printf("%s",c[]);
void main()
char st[15];
printf("i ut string:\n");
scanf("%s",st);
printf("%s\n",st);
本例中由于定义数组长度为15, 因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。 应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如运行例4.8,当输入的字符串中含有空格时,运行情况为: i ut string:this is a book this 从输出结果可以看出空格以后的字符都未能输出。 为了避免这种情况, 可多设几个字符数组分段存放含空格的串。程序可改写如下:
void main()
char st1[6],st2[6],st3[6],st4[6];
printf("i ut string:\n");
scanf("%s%s%s%s",st1,st2,st3,st4);
printf("%s %s %s %s\n",st1,st2,st3,st4);
本程序分别设了四个数组, 输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如 &am a,&am 等。但在例4.8中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。 整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],在内存可表示如图4.2。设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&am 。如写作scanf("%s",&am c);则是错误的。 在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。
字符串常用函数
C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数, 在使用前应包含头文件"stdio.h" ; 使用其它字符串函数则应包含头文件"string.h"。 下面介绍几个最常用的字符串函数。
1.字符串输出函数 puts 格式: puts (字符数组名) 功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串
#include"stdio.h"
static char c[]="BASIC\ndBASE";
puts(c);
从程序中可以看出puts函数中可以使用转义字符, 因此输出结果成为两行。puts函数完全可以由printf函数取代。 当需要按一定格式输出时,通常使用printf函数。
2.字符串输入函数gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。
#include"stdio.h"
char st[15];
printf("i ut string:\n");
gets(st);
puts(st);
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志, 而只以回车作为输入结束。这是与scanf函数不同的。
3.字符串连接函数strcat 格式: strcat (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。
#include"string.h"
static char st1[30]="My name is ";
int st2[10];
printf("i ut your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。 要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串
4.字符串拷贝函数strcpy 格式: strcpy (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
#include"string.h"
static char st1[15],st2[]="C Language";
strcpy(st1,st2);
puts(st1) rintf("\n");
本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。
5.字符串比较函数strcmp 格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串2〉字符串2,返回值〉0;
字符串1〈字符串2,返回值〈0。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
#include"string.h"
{ int k;
static char st1[15],st2[]="C Language";
printf("i ut a string:\n");
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf("st1=st2\n");
if(k0) printf("st1> t2\n");
if(k0) printf("st1< t2\n");
本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1> t2”。
6.测字符串长度函数strlen 格式: strlen(字符数组名) 功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。
#include"string.h"
{ int k;
static char st[]="C language";
k=strlen(st);
printf("The lenth of the string is %d\n",k);
程序举例
把一个整数按大小顺序插入已排好序的数组中。 为了把一个数按大小插入已排好序的数组中, 应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的, 则可把欲插入的数与数组中各数逐个比较, 当找到第一个比插入数小的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素i即可。如果被插入数比所有的元素值都小则插入最后位置。
int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};
for(i=0;i10;i++)
{ p=i;q=a[i];
for(j=i+1;j10;j++)
if(qa[j]) {p=j;q=a[j];}
if(p!=i)
s=a[i];
a[i]=a[p];
a[p]= }
printf("%d ",a[i]);
printf("\ni ut number:\n");
scanf("%d",&am );
for(i=0;i10;i++)
if( gt;a[i])
{for(s=9 gt;=i --) a[s+1]=a[s];
break;}
a[i]= for(i=0;i=10;i++)
printf("%d ",a[i]);
printf("\n");
本程序首先对数组a中的10个数从大到小排序并输出排序结果。然后输入要插入的整数n。再用一个for语句把n和数组元素逐个比较,如果发现有 gt;a[i]时,则由一个内循环把i以下各元素值顺次后移一个单元。后移应从后向前进行(从a[9]开始到a[i]为止)。 后移结束跳出外循环。插入点为i,把n赋予a[i]即可。 如所有的元素均大于被插入数,则并未进行过后移工作。此时i=10,结果是把n赋于a[10]。最后一个循环输出插入数后的数组各元素值。程序运行时,输入数47。从结果中可以看出47已插入到54和 28之间。
在二维数组a中选出各行最大的元素组成一个一维数组b。 a=3 16 87 65 4 32 11 108 10 25 12 37b=(87 108 37) 本题的编程思路是,在数组A的每一行中寻找最大的元素,找到之后把该值赋予数组B相应的元素即可。程序如下:
static int a[][4]={3,16,87,65,4,32,11,108,10,25,12,27};
int b[3],i,j,l;
for(i=0;i=2;i++)
{ l=a[i][0];
for(j=1;j=3;j++)
if(a[i][j]l) l=a[i][j];
b[i]=l;}
printf("\narray a:\n");
for(i=0;i=2;i++)
{ for(j=0;j=3;j++)
printf("%5d",a[i][j]);
printf("\n");}
printf("\narray b:\n");
for(i=0;i=2;i++)
printf("%5d",b[i]);
printf("\n");
程序中第一个for语句中又嵌套了一个for语句组成了双重循环。外循环控制逐行处理,并把每行的第0列元素赋予l。进入内循环后,把l与后面各列元素比较,并把比l大者赋予l。内循环结束时l 即为该行最大的元素,然后把l值赋予b[i]。等外循环全部完成时,数组b中已装入了a各行中的最大值。后面的两个 for语句分别输出数组a和数组b。
输入五个国家的名称按字母顺序排列输出。
本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。 因此本题又可以按五个一维数组处理, 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序, 输出结果即可。
编程如下:
void main()
char st[20],cs[5][20];
int i,j, printf("i ut country's name:\n");
for(i=0;i5;i++)
gets(cs[i]);
printf("\n");
for(i=0;i5;i++)
{ p=i trcpy(st,cs[i]);
for(j=i+1;j5;j++)
if(strcmp(cs[j],st)0) {p=j trcpy(st,cs[j]);}
if(p!=i)
strcpy(st,cs[i]);
strcpy(cs[i],cs[p]);
strcpy(cs[p],st);
puts(cs[i]);}printf("\n");
本程序的第一个for语句中,用gets函数输入五个国家名字符串。上面说过C语言允许把一个二维数组按多个一维数组处理, 本程序说明cs[5][20]为二维字符数组,可分为五个一维数组cs[0],cs[1],cs[2],cs[3],cs[4]。因此在gets函数中使用cs[i]是合法的。 在第二个for语句中又嵌套了一个for语句组成双重循环。 这个双重循环完成按字母顺序排序的工作。在外层循环中把字符数组cs[i]中的国名字符串拷贝到数组st中,并把下标i赋予P。 进入内层循环后,把st与cs[i]以后的各字符串作比较,若有比st小者则把该字符串拷贝到st中,并把其下标赋予p。内循环完成后如p不等于 i 说明有比cs[i]更小的字符串出现,因此交换cs[i]和st的内容。 至此已确定了数组cs的第i号元素的排序值。然后输出该字符串。在外循环全部完成之后即完成全部排序和输出
本章小结
1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。
2.数组可以是一维的,二维的或多维的。
3.数组类型说明由类型说明符、数组名、数组长度 (数组元素个数)三部分组成。数组元素又称为下标变量。 数组的类型是指下标变量取值的类型。
4.对数组的赋值可以用数组初始化赋值, 输入函数动态赋值和赋值语句赋值三种方法实现。 对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。
( Wed, 18 Feb 2009 01:12:07 +0800 )
Description:
数 组
数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以***为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。数组类型说明 在C语言中使用数组必须先进行类型说明。 数组说明的一般形
式为: 类型说明符 数组名 [常量表达式],……; 其中,类型说明符是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符。 方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
例如:
int a[10]; 说明整型数组a,有10个元素。
float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。
char ch[20]; 说明字符数组ch,有20个元素。
对于数组类型说明应注意以下几点:
1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2.数组名的书写规则应符合标识符的书写规定。
3.数组名不能与其它变量名相同,例如:
void main()
float a[10];
是错误的。
4.方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。
5.不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如:
#define FD 5
void main()
int a[3+2],b[7+FD];
是合法的。但是下述说明方式是错误的。
void main()
int n=5;
int a[n];
6.允许在同一个类型说明中,说明多个数组和多个变量。
例如: int a,b,c,d,k1[10],k2[20];
数组元素的表示方法
数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。 下标表示了元素在数组中的顺序号。数组元素的一般形式为: 数组名[下标] 其中的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a[5],a[i+j],a[i++]都是合法的数组元素。 数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量, 而不能一次引用整个数组。 例如,输出有10 个元素的数组必须使用循环语句逐个输出各下标变量:
for(i=0; i10; i++) printf("%d",a[i]); 而不能用一个语句输出整个数组,下面的写法是错误的: printf("%d",a);
void main()
int i,a[10];
for(i=0;i10;i++)
a[i++]=2*i+1;
for(i=9;i=0;i--)
printf("%d",a[i]);
printf("\n%d %d\n",a[5.2],a[5.8]);
本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作, C语言允许用表达式表示下标。 程序中最后一个printf语句输出了两次a[5]的值, 可以看出当下标不为整数时将自动取整。数组的赋值给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。数组初始化赋值数组初始化赋值是指在数组说明时给数组元素赋予初值。 数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
初始化赋值的一般形式为: static 类型说明符 数组名[常量表达式]={值,值……值}; 其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储,外部存储的概念在第五章中介绍)。在{ }中的各数据值即为各元素的初值, 各值之间用逗号间隔。例如: static int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0;a[1]=1...a[9]=9;
C语言对数组的初始赋值还有以下几点规定:
1.可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如: static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
2.只能给元素逐个赋值,不能给数组整体赋值。 例如给十个元素全部赋1值,只能写为: static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为: static int a[10]=1;
3.如不给可初始化的数组赋初值,则全部元素均为0值。
4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如: static int a[5]={1,2,3,4,5};可写为: static int a[]={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋值。 这时可用循环语句配合scanf函数逐个对数组元素赋值。
void main()
int i,max,a[10];
printf("i ut 10 numbers:\n");
for(i=0;i10;i++)
scanf("%d",&am a[i]);
max=a[0];
for(i=1;i10;i++)
if(a[i]max) max=a[i];
printf("maxmum=%d\n",max);
本例程序中第一个for语句逐个输入10个数到数组a中。 然后把a[0]送入max中。在第二个for语句中,从a[1]到a[9]逐个与max中的内容比较,若比max的值大,则把该下标变量送入max中,因此max总是在已比较过的下标变量中为最大者。比较结束,输出max的值。
void main()
int i,j,p,q,s,a[10];
printf("\n i ut 10 numbers:\n");
for(i=0;i10;i++)
scanf("%d",&am a[i]);
for(i=0;i10;i++){
p=i;q=a[i];
for(j=i+1;j10;j++)
if(qa[j]) { p=j;q=a[j]; }
if(i!=p)
{s=a[i];
a[i]=a[p];
a[p]= }
printf("%d",a[i]);
本例程序中用了两个并列的for循环语句,在第二个for 语句中又嵌套了一个循环语句。第一个for语句用于输入10个元素的初值。第二个for语句用于排序。本程序的排序采用逐个比较的方法进行。在i次循环时,把第一个元素的下标i赋于p,而把该下标变量值a[i]赋于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a[i]作比较,有比a[i]大者则将其下标送p,元素值送q。 一次循环结束后,p即为最大元素的下标,q则为该元素值。若此时i≠p,说明p,q值均已不是进入小循环之前所赋之值,则交换a[i]和a[p]之值。 此时a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1以后各个元素排序。
二维数组
前面介绍的数组只有一个下标,称为一维数组, 其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的, 因此C语言允许构造多维数组。多维数组元素有多个下标, 以标识它在数组中的位置,所以也称为多下标变量。 本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组类型说明二维数组类型说明的一般形式是:
类型说明符 数组名[常量表达式1][常量表达式2]…;
其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:
int a[3][4]; 说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有
3×4个,即: a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
二维数组在概念上是二维的,即是说其下标在两个方向上变化, 下标变量在数组中的位置也处于一个平面之中, 而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按一维线性排列的。 如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。 在图4.1中,按行顺次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为
int类型,该类型占两个字节的内存空间,所以每个元素均占有两个 字节(图中每一格为一字节)。
二维数组元素的表示方法
二维数组的元素也称为双下标变量,其表示的形式为: 数组名[下标][下标] 其中下标应为整型常量或整型表达式。例如: a[3][4] 表示a数组三行四列的元素。下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。 数组说明的方括号中给出的是某一维的长度,即可取下标的最大值; 而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量, 后者可以是常量,变量或表达式。
一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
课程 成绩姓名 Math C DBASE
张 80 75 92
王 61 65 71
李 59 63 70
赵 85 87 90
周 76 77 85
可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量l为全组各科总平均成绩。编程如下:
void main()
int i,j,s=0,l,v[3],a[5][3];
printf("i ut score\n");
for(i=0;i3;i++){
for(j=0;j5;j++)
{ scanf("%d",&am a[j][i]);
s=s+a[j][i];}
v[i]=s/5;
l=(v[0]+v[1]+v[2])/3;
printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]);
printf("total:%d\n",l);
程序中首先用了一个双重循环。 在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来, 退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。
二维数组的初始化
二维数组初始化也是在类型说明时给各下标变量赋以初值。 二维数组可按行分段赋值,也可按行连续赋值。 例如对数组a[5][3]:
1.按行分段赋值可写为static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };
2.按行连续赋值可写为static int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 };
这两种赋初值的结果是完全相同的
void main()
int i,j,s=0,l,v[3];
static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},
{85,87,90},{76,77,85} };
for(i=0;i3;i++)
{ for(j=0;j5;j++)
s=s+a[j][i];
v[i]=s/5;
l=(v[0]+v[1]+v[2])/3;
printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]);
printf("total:%d\n",l);
对于二维数组初始化赋值还有以下说明:
1.可以只对部分元素赋初值,未赋初值的元素自动取0值。
例如: static int a[3][3]={{1},{2},{3}}; 是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为: 1 0 02 0 03 0 0
static int a [3][3]={{0,1},{0,0,2},{3}}; 赋值后的元素值为 0 1 00 0 23 0 0
2.如对全部元素赋初值,则第一维的长度可以不给出。
例如: static int a[3][3]={1,2,3,4,5,6,7,8,9}; 可以写为:static int a[][3]={1,2,3,4,5,6,7,8,9};
数组是一种构造类型的数据。 二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组, 就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以***为多个一维数组。 C语言允许这种***有二维数组a[3][4],可***为三个一维数组,其数组名分别为a[0],a[1],a[2]。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
( Wed, 18 Feb 2009 00:51:07 +0800 )
Description:
if语句
用if语句可以构成分支结构。它根据给定的条件进行判断, 以决定执行某个分支程序段。C语言的if语句有三种基本形式。
1.第一种形式为基本形式
if(表达式) 语句;
其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图
void main(){
int a,b,max;
printf("\n i ut two numbers: ");
scanf("%d%d",&am a,&am );
if (max< ) max= printf("max=%d",max);
输入两个整数,输出其中的大数。
scanf("%d%d",&am a,&am );
if (max< ) max= printf("max=%d",max);
本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。
2.第二种形式为if-else形式
if(表达式)
语句1;
语句2;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。
void main(){
int a, printf("i ut two numbers: ");
scanf("%d%d",&am a,&am );
if(a> )
printf("max=%d\n",a);
printf("max=%d\n",b);
输入两个整数,输出其中的大数。改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。
3.第三种形式为if-else-if形式
前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
else if(表达式m)
语句m;
语句n;
其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n 。 然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。
#include"stdio.h"
void main(){
char c;
printf("i ut a character: ");
c=getchar();
if(c32)
printf("This is a control character\n");
else if(c='0'&am am c='9')
printf("This is a digit\n");
else if(c='A'&am am c='Z')
printf("This is a capital letter\n");
else if(c='a'&am am c='z')
printf("This is a small letter\n");
printf("This is an other character\n");
本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。
4.在使用if语句中还应注意以下问题
(1) 在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如: if(a=5) 语句;if(b) 语句; 都是允许的。只要表达式的值为非0,即为“真”。如在if(a=5)…;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如,有程序段: if(a=b)
printf("%d",a);
printf("a=0"); 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
(2) 在if语句中,条件判断表达式必须用括号括起来, 在语句之后必须加分号。
(3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{} 括起来组成一个复合语句。但要注意的是在}之后不能再加分号。
例如:
if(a> ){
if语句的嵌套
当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。其一般形式可表示如下:
if(表达式)
if语句;
或者为
if(表达式)
if语句;
if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:
if(表达式1)
if(表达式2)
语句1;
语句2;
其中的else究竟是与哪一个if配对呢?
应该理解为: 还是应理解为:
if(表达式1) if(表达式1)
if(表达式2) if(表达式2)
语句1; 语句1;
else else
语句2; 语句2;
为了避免这种二义性,C语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。
比较两个数的大小关系。
void main(){
int a, printf("please i ut A,B: ");
scanf("%d%d",&am a,&am );
if(a!=b)
if(a> ) printf("AB\n");
else printf("AB\n");
else printf("A=B\n");
本例中用了if语句的嵌套结构。 采用嵌套结构实质上是为了进行多分支选择,例3.16实际上有三种选择即AB、AB或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此, 在一般情况下较少使用if语句的嵌套结构。 以使程序更便于阅读理解。
void main(){
int a, printf("please i ut A,B: ");
scanf("%d%d",&am a,&am );
if(a==b) printf("A=B\n");
else if(a> ) printf("AB\n");
else printf("AB\n");
条件运算符和条件表达式
如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。
条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:
表达式1? 表达式2: 表达式3
其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。
例如条件语句:
if(a> ) max=a;
else max= 可用条件表达式写为 max=(a> )?a: 执行该语句的语义是:如a> 为真,则把a赋予max,否则把b 赋予max。
使用条件表达式时,还应注意以下几点:
1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a> )?a:b可以去掉括号而写为 max=a> ?a:b
2. 条件运算符?和:是一对运算符,不能分开单独使用。
3. 条件运算符的结合方向是自右至左。
例如:
a> ?a:cd?c:d应理解为
a> ?a:(cd?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条
件表达式。
void main(){
int a,b,max;
printf("\n i ut two numbers: ");
scanf("%d%d",&am a,&am );
printf("max=%d",a> ?a:b);
用条件表达式对上例重新编程,输出两个数中的大数。
switch语句
C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:
switch(表达式){
case常量表达式1: 语句1;
case常量表达式2: 语句2;
case常量表达式n: 语句 default : 语句n+1;
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
void main(){
printf("i ut integer number: ");
scanf("%d",&am a);
switch (a){
case 1:printf("Monday\n");
case 2:printf("Tuesday\n");
case 3:printf("Wednesday\n");
case 4:printf("Thursday\n");
case 5:printf("Friday\n");
case 6:printf("Saturday\n");
case 7:printf("Sunday\n");
default:printf("error\n");
本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况, C语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。
void main(){
printf("i ut integer number: ");
scanf("%d",&am a);
switch (a){
case 1:printf("Monday\n") reak;
case 2:printf("Tuesday\n"); break;
case 3:printf("Wednesday\n") reak;
case 4:printf("Thursday\n") reak;
case 5:printf("Friday\n") reak;
case 6:printf("Saturday\n") reak;
case 7:printf("Sunday\n") reak;
default:printf("error\n");
在使用switch语句时还应注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。
2.在case后,允许有多个语句,可以不用{}括起来。
3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4.default子句可以省略不用。程序举例
输入三个整数,输出最大数和最小数。
void main(){
int a,b,c,max,mi printf("i ut three numbers: ");
scanf("%d%d%d",&am a,&am ,&am c);
if(a> )
{max=a;min= }
{max= min=a;}
if(maxc)
if(mi gt;c)
printf("max=%d\nmin=%d",max,min);
本程序中,首先比较输入的a,b的大小,并把大数装入max, 小数装入min中,然后再与c比较,若max小于c,则把c赋予max;如果c小于min,则把c赋予min。因此max内总是最大数,而min内总是最小数。最后输出max和min的值即可。 计算器程序。用户输入运算数和四则运算符, 输出计算结果。
void main(){
float a,b, char c;
printf("i ut expre ion: a+(-,*,/)b \n");
scanf("%f%c%f",&am a,&am c,&am );
switch(c){
case '+': printf("%f\n",a+b) reak;
case '-': printf("%f\n",a-b) reak;
case '*': printf("%f\n",a*b) reak;
case '/': printf("%f\n",a/b) reak;
default: printf("i ut error\n");
本例可用于四则运算求值。switch语句用于判断运算符, 然后输出运算值。当输入运算符不是+,-,*,/时给出错误提示。
循环结构程序
循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C语言提供了多种循环语句,可以组成各种不同形式的循环结构。
while语句
while语句的一般形式为: while(表达式)语句; 其中表达式是循环条件,语句为循环体。
while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用图3—4表示。 统计从键盘输入一行字符的个数。
#include < tdio.h
void main(){
int n=0;
printf("i ut a string:\n");
while(getchar()!='\n') n++;
printf("%d",n);
本例程序中的循环条件为getchar()!='\n',其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。
使用while语句应注意以下几点:
1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。
void main(){
int a=0, printf("\n i ut n: ");
scanf("%d",&am );
while (n--)
printf("%d ",a++*2);
本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于(a*2;a++)
2.循环体如包括有一个以上的语句,则必须用{}括起来, 组成复合语句。
3.应注意循环条件的选择以避免死循环。
void main(){
int a,n=0;
while(a=5)
printf("%d ",n++);
本例中while语句的循环条件为赋值表达式a=5, 因此该表达式的值永远为真,而循环体中又没有其它中止循环的手段, 因此该循环将无休止地进行下去,形成死循环。4.允许while语句的循环体又是while语句,从而形成双重循环。
do-while语句
do-while语句的一般形式为:
语句;
while(表达式);
其中语句是循环体,表达式是循环条件。
do-while语句的语义是:
先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。
do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。
while语句和do-while语句一般都可以相互改写。
void main(){
int a=0, printf("\n i ut n: ");
scanf("%d",&am );
do printf("%d ",a++*2);
while (--n);
在本例中,循环条件改为--n,否则将多执行一次循环。这是由于先执行后判断而造成的。
对于do-while语句还应注意以下几点:
1.在if语句,while语句中, 表达式后面都不能加分号, 而在 do-while语句的表达式后面则必须加分号。
2.do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。
3.在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。
4.do-while和while语句相互替换时,要注意修改循环控制条件。
for语句
for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为:
for(表达式1;表达式2;表达3)
语句;
表达式1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。
表达式2 通常是循环条件,一般为关系表达式或逻辑表达式。
表达式3 通常可用来修改循环变量的值,一般是赋值语句。
这三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。
一般形式中的“语句”即为循环体语句。for语句的语义是:
1.首先计算表达式1的值。
2.再计算表达式2的值,若值为真(非0)则执行循环体一次, 否则跳出循环。
3.然后再计算表达式3的值,转回第2步重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式,3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for 语句的执行过程如图所示。
void main(){
int n,s=0;
for(n=1 lt;=100 ++)
s=s+ printf("s=%d\n",s);
用for语句计算s=1+2+3+...+99+100
int n,s=0;
for(n=1 lt;=100 ++)
s=s+ printf("s=%d\n",s);
本例for语句中的表达式3为n++,实际上也是一种赋值语句,相当于n=n+1,以改变循环变量的值。
void main(){
int a=0, printf("\n i ut n: ");
scanf("%d",&am );
for( gt;0;a++,n--)
printf("%d ",a*2);
用for语句修改例题。从0开始,输出n个连续的偶数。
int a=0, printf("\n i ut n: ");
scanf("%d",&am );
for( gt;0;a++,n--)
printf("%d ",a*2);
本例的for语句中,表达式1已省去,循环变量的初值在for语句之前由scanf语句取得,表达式3是一个逗号表达式,由a++,n-- 两个表达式组成。每循环一次a自增1,n自减1。a的变化使输出的偶数递增,n的变化控制循次数。
在使用for语句中要注意以下几点
1.for语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式;表达式)省去了表达式1。for(表达式;;表达式)省去了表达式2。
for(表达式;表达式;)省去了表达式3。for(;;)省去了全部表达式。
2.在循环变量已赋初值时,可省去表达式1,如例3.27即属于这种情形。如省去表达式2或表达式3则将造成无限循环, 这时应在循环体内设法结束循环。例题即属于此情况。
void main(){
int a=0, printf("\n i ut n: ");
scanf("%d",&am );
for( gt;0;)
{ a++ --;
printf("%d ",a*2);
本例中省略了表达式1和表达式3,由循环体内的n--语句进行循环变量n的递减,以控制循环次数。
void main(){
int a=0, printf("\n i ut n: ");
scanf("%d",&am );
for( ){
a++ --;
printf("%d ",a*2);
if(n==0)break;
本例中for语句的表达式全部省去。由循环体中的语句实现循环变量的递减和循环条件的判断。当n值为0时,由break语句中止循环,转去执行for以后的程序。在此情况下,for语句已等效于while( 1)语句。如在循环体中没有相应的控制手段,则造成死循环。
3.循环体可以是空语句。
#include"stdio.h"
void main(){
int n=0;
printf("i ut a string:\n");
for(;getchar()!='\n' ++);
printf("%d",n);
本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf 语句当成循环体来执行。反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误,要十分注意。
4.for语句也可与while,do-while语句相互嵌套,构成多重循环。以下形成都合法的嵌套。
(1)for(){…
while()
{…}
…
}
…
for()
{…}
…
}while();
(3)while(){
…
for()
{…}
…
}
(4)for(){
…
for(){
…
}
}
void main(){
int i,j,k;
for(i=1;i=3;i++)
{ for(j=1;j=3-i+5;j++)
printf(" ");
for(k=1;k=2*i-1+5;k++)
if(k=5) printf(" ");
else printf("*");
printf("\n");
转移语句
程序中的语句通常总是按顺序方向, 或按语句功能所定义的方向执行的。如果需要改变程序的正常流向, 可以使用本小节介绍的转移语句。在C语言中提供了4种转移语句:
goto,break, continue和return。
其中的return语句只能出现在被调函数中, 用于返回主调函数,我们将在函数一章中具体介绍。 本小节介绍前三种转移语句。
1.goto语句
goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的
前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。
如: label: i++;
loop: while(x7);
C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
统计从键盘输入一行字符的个数。
#include"stdio.h"
void main(){
int n=0;
printf("i ut a string\n");
loop: if(getchar()!='\n')
goto loo }
printf("%d",n);
本例用if语句和goto语句构成循环结构。当输入字符不为'\n'时即执行n++进行计数,然后转移至if语句循环执行。直至输入字符为'\n'才停止循环。
break语句
break语句只能用在switch 语句或循环语句中, 其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为: break; 上面例题中分别在switch语句和for语句中使用了break 语句作为跳转。使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。
continue语句
continue语句只能用在循环体中,其一般格式是:
continue;
其语义是:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。
void main(){
int for(n=7 lt;=100 ++)
if (n%7!=0)
continue;
printf("%d ",n);
输出100以内能被7整除的数。
int for(n=7 lt;=100 ++)
if (n%7!=0)
continue;
printf("%d ",n);
本例中,对7~100的每一个数进行测试,如该数不能被7整除,即模运算不为0,则由continus语句转去下一次循环。只有模运算为0时,才能执行后面的printf语句,输出能被7整除的数。
#include"stdio.h"
void main(){
char a, printf("i ut a string:\n");
b=getchar();
while((a=getchar())!='\n'){
if(a==b){
printf("same character\n");
检查输入的一行中有无相邻两字符相同。
char a, printf("i ut a string:\n");
b=getchar();
while((a=getchar())!='\n'){
if(a==b){
printf("same character\n");
本例程序中,把第一个读入的字符送入b。然后进入循环,把下一字符读入a,比较a,b是否相等,若相等则输出提示串并中止循环,若不相等则把a中的字符赋予b,输入下一次循环。
输出100以内的素数。素数是只能被1 和本身整除的数。可用穷举法来判断一个数是否是素数。
void main(){
int n,i;
for(n=2 lt;=100 ++){
for(i=2;i< i++)
if(n%i==0) break;
if(i=n) printf("\t%d",n);
} int n,i;
for(n=2 lt;=100 ++){
for(i=2;i< i++)
if(n%i==0) break;
if(i=n) printf("\t%d",n);
本例程序中,第一层循环表示对1~100这100个数逐个判断是否是素数,共循环100次,在第二层循环中则对数n用2~n-1逐个去除,若某次除尽则跳出该层循环,说明不是素数。 如果在所有的数都是未除尽的情况下结束循环,则为素数,此时有i=n, 故可经此判断后输出素数。然后转入下一次大循环。实际上,2以上的所有偶数均不是素数,因此可以使循环变量的步长值改为2,即每次增加2,此外只需对数n用2~n去除就可判断该数是否素数。这样将大大减少循环次数,减少程序运行时间。
#include"math.h"
void main(){
int n,i,k;
for(n=2 lt;=100 +=2){
k=sqrt(n);
for(i=2;ik;i++)
if(n%i==0) break;
if(i=k) printf("\t%2d",n);
1.从程序执行的流程来看, 程序可分为三种最基本的结构: 顺序结构,分支结构以及循环结构
2.程序中执行部分最基本的单位是语句。C语言的语句可分为五类:
(1)表达式语句 任何表达式末尾加上分号即可构成表达式语句, 常用的表达式语句为赋值语句。
(2)函数调用语句 由函数调用加上分号即组成函数调用语句。
(3)控制语句 用于控制程序流程,由专门的语句定义符及所需的表达式组成。主要有条件判断执行语句,循环执行语句,转向语句等。
(4)复合语句 由{}把多个语句括起来组成一个语句。 复合语句被认为是单条语句,它可出现在所有允许出现语句的地方,如循环体等。
(5)空语句 仅由分号组成,无实际功能。
3.C语言中没有提供专门的输入输出语句, 所有的输入输出都是由调用标准库函数中的输入输出函数来实现的。
scanf和getchar函数是输入函数,接收来自键盘的输入数据。
scanf是格式输入函数, 可按指定的格式输入任意类型数据。
getchar函数是字符输入函数, 只能接收单个字符。
printf和putchar函数是输出函数,向显示器屏幕输出数据。
printf是格式输出函数,可按指定的格式显示任意类型的数据。
putchar是字符显示函数,只能显示单个字符。
4.关系表达式和逻辑表达式是两种重要的表达式, 主要用于条件执行的判断和循环执行的判断。
5.C语言提供了多种形式的条件语句以构成分支结构。
(1)if语句主要用于单向选择。
(2)if-else语句主要用于双向选择。
(3)if-else-if语和switch语句用于多向选择。
这几种形式的条件语句一般来说是可以互相替代的。
6.C语言提供了三种循环语句。
(1)for语句主要用于给定循环变量初值, 步长增量以及循环次数的循环结构。
(2)循环次数及控制条件要在循环过程中才能确定的循环可用 while或do-while语句。
(3)三种循环语句可以相互嵌套组成多重循环。循环之间可以并列但不能交叉。
(4)可用转移语句把流程转出循环体外,但不能从外面转向循环体内。
(5)在循环程序中应避免出现死循环,即应保证循环变量的值在运行过程中可以得到修改,并使循环条件逐步变为假,从而结束循环。
7.C语言语句小结
名 称 一 般 形 式
简单语句 表达式语句表达式;
空语句;
复合语句 { 语句 }
条件语句 if(表达式)语句;
if(表达式)语句1; else语句2;
if(表达式1)语句1; else if(表达式2) 语句2…else语句 开关语句 switch(表达式){ case常量表达式: 语句…default: 语句; }
循环语句 while语句
while(表达式)语句;
for语句 for(表达式1; 表达式2; 表达式3)语句;
break语句 break;
goto语句 goto;
continue语句 continue; return 语句 return(表达式);
( Wed, 18 Feb 2009 00:47:07 +0800 )
Description:
C语言程序设计
本课介绍C语言程序设计的基本方法和基本的程序语句。
从程序流程的角度来看,程序可以分为
三种基本结构, 即顺序结构、分支结构、循环结构
。 这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。 本章介绍这些基本语句及其应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础。
C程序的语句
C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。
C语句可分为以下五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
1.表达式语句
表达式语句由表达式加上分号“;”组成。其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。例如: x=y+z; 赋值语句y+z; 加法运算语句,但计算结果不能保留,无实际意义i++; 自增1语句,i值增1
2.函数调用语句
由函数名、实际参数加上分号“;”组成。其一般形式为: 函数名(实际参数表); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。(在第五章函数中再详细介绍)例如printf("C Program");调用库函数,输出字符串。
3.控制语句
控制语句用于控制程序的流程, 以实现程序的各种结构方式。
它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:
(1) 条件判断语句
if语句,switch语句
(2) 循环执行语句
do while语句,while语句,for语句
(3) 转向语句
break语句,goto语句,continue语句,return语句
4.复合语句
把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如
printf(“%d%d”,x,a);
是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
5.空语句
只有分号“;”组成的语句称为空语句。 空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。例如 while(getchar()!='\n'); 本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
赋值语句
赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为: 变量=表达式; 赋值语句的功能和特点都与赋值表达式相同。 它是程序中使用最多的语句之一。 在赋值语句的使用中需要注意以下几点:
1.由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式 变量=(变量=表达式); 是成立的,从而形成嵌套的情形。其展开之后的一般形式为: 变量=变量=…=表达式;
例如:
a=b=c=d=e=5;
按照赋值运算符的右接合性,因此实际上等效于:
a= 2.注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。
3.在变量说明中,不允许连续给多个变量赋初值。 如下述说明是错误的: int a=b=c=5 必须写为 int a=5,b=5,c=5; 而赋值语句允许连续赋值
4.注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
下述语句是合法的: if((x=y+5)0) z=x; 语句的功能是,若表达式x=y+5大于0则z=x。下述语句是非法的: if((x=y+5;)0) z=x; 因为=y+5;是语句,不能出现在表达式中。
数据输出语句
本小节介绍的是向标准输出设备显示器输出数据的语句。在C语言中,所有的数据输入/输出都是由库函数完成的。 因此都是函数语句。本小节先介绍printf函数和putchar函数。printf函数printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式, 把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。
一、printf函数调用的一般形式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.***件。printf函数调用的一般形式为: printf(“格式控制字符串”,输出表列)其中格式控制字符串用于指定输出格式。 格式控制串