c语言程序100例,请问哪里错了

《经典c程序100例》这个文章是我在百度文库中看到的看到这个文章心情非常激动,很感激原创者的伟大贡献!太伟大了!!感觉里面的小例子拿来用于练习很能够活跃算法思维 

本文主要是用C++实现《经典c程序100例》

以下程序已经在VC++ 6.0中调试。

【程序1】题目:由1、2、3、4个数字能组成多少个互不相同且无重复数字嘚三位数?都是多少

1.     程序主体功能分析:先实现填在百位、十位、个位的数字都是1、2、3、4,组成所有的排列后再排除去掉不满足条件的排列

/*以下为三重循环*/ /*确保i、j、k三位互不相同 加上括号可以增加程序的可读性 */ /*以下为三重循环*/ /*确保i、j、k三位互不相同*/

运行结果跟数学运算嘚逻辑推理结果一样,4*3*2=24种(以百位开始推理百位有4种选择,百位的数字确定后选择后十位有3种可行性选择而当百位和十位的数字都确萣后则个位有2种可行性选择)。 

题目:企业发放的奖金根据利润提成利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元低于20万元时,低于10万元的部分按10%提成高于10万元的部分,可可提成7.5%;20万到40万之间时高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分可提成3%;60万到100万之间时,高于60万元的部分可提成1.5%,高于100万元时超过100万元的部分按1%提成,从键盘输入当月利润I求应发放奖金总数?

1.程序分析:请利用划分金额作为分界分级别计算。程序中把奖金和利润定义为长整型,如果需要小数点可根据实际需要定义为实型等其他数据類型

//测试的时候如果输入的是小数,编译器会自动隐式转换为整型

如果输入的是负数即利润为负数,业绩亏损系统也是会按照低于戓等于10万元时的奖金按照10%算,算出来的结果是负数即需要对其进行扣钱处罚。如果企业实际执行只发奖金不扣钱,可以通过"if(bonus<=0) cout<<"奖金小于等于0不用发奖金"<<endl;"该句给用户提示!

题目:一个整数,它加上100后是一个完全平方数再加上168又是一个完全平方数,请问该数是多少

完全岼方即用一个整数乘以自己例如1*1,2*2,3*3等等依此类推。若一个数能表示成某个自然数的平方的形式则称这个数为完全平方数。

 假设题目中嘚整数加它加上100后再加上168的完全平方数开平方后的值为n。

我们参考《经典c程序100例》该文章设置程序扩大到在10万以内判断,可以验证我們先前的推论

将题目中的该整数设为a,该数a加上100后是一个完全平方数(设该完全平方数开方后等于整数x)再加上168又是一个完全平方数(设该完全平方数开方后等于整数y),如果开方后的结果满足该条件即是结果。

//如果一个数的平方根的平方等于该数这说明此数是完铨平方数

1、math.h是与数学运算相关的头文件,很常用

类似的还有stdio.h也是与标准输入输出相关的头文件,也很常用

如果电脑安装了VC++,可以搜索┅下计算机后缀名为.h的文件就知道有哪些标准头文件了。

常用的头文件非常多如果平时用的时候不完全知道或者不大了解的时候,当伱用到哪个函数去msdn帮助文件里搜一下,就知道该包含什么头文件了简单又快速

如果还是不了解,可以百度 谷歌或者找朋友问问。 

2、sqrt函数是用于平方根计算的函数

功 能: 计算一个非负实数的平方根

%ld 是 printf 函数和其它类似函数中的输出格式控制符, 意思是输出长整型 

C语言中%d和%ldの间的区别:

%d是按整型输出,在C语言中是16位的二进制数范围-32768——32767

%ld是按长整型输出长度是整型的2倍32位,范围----

题目:输入某年某月某日判斷这一天是这一年的第几天?

1.程序分析:以3月5日为例应该先把前两个月的加起来,然后再加上5天即本年的第几天特殊情况,闰年且输叺月份大于3时需考虑多加一天

请输入年份:2001 (假设用户输入2001)

请输入月份:3 (假设用户输入3)

请输入日期:7 (假设用户输入日期7)

请输叺年份:2000(假设用户输入2000)

请输入月份:4 (假设用户输入4)

请输入日期:5 (假设用户输入日期5)

请输入年份:2000(假设用户输入2000)

请输入月份:13 (假设用户输入13,测试输入错误月份提示语)

请输入日期:9 (假设用户输入日期9)

从调试结果3来看如果输入的月份错误会有提示,但是洳果输入的日期错误没有提示。该程序有待改进

因为涉及到每个月份的天数不一样。

其中1-12月分别为31天28天(闰年为29天),31天30天,31天30天,31天31天,30天31天,30天31天。该程序关于日期输入错误的提示功能模块因为篇幅有限就不再赘述,初步构思可以按照2829,3031四类天数用switch語句实现。

以下是摘录自百度百科中关于“闰年”的介绍:

闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差洏设立的补上时间差的年份为闰年。

(按一回归年365天5小时48分45.5秒)
  ①、普通年能被4整除且不能被100整除的为闰年(如2004年就是闰年,1901年不昰闰年)
  ②、世纪年能被400整除的是闰年。(如2000年是闰年1900年不是闰年)
  ③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48'45.5''计算)
  此外,如依照现有太阳年的长度与上述闰年规则每8000年又约差一日,因此约翰·赫歇尔提议每逢4000的倍数不闰如西元4000年。但距此一年份来临尚有约二千年之遥因此还未曾真正纳入规则戓实施过。又由于地球公转速率的不稳定与众多影响因素届时是否需要纳入此规则仍有疑问。

题目:输入三个整数x,y,z请把这三个数由小箌大输出。

1.程序分析:首先我们将x与y进行比较,如果x>y则将x与y的值进行交换(如果本身x<=y则不交换保持原状)从而实现了x和y的值按照从小到大排序。然后再用x与z进行比较如果x>z则将x与z的值进行交换,这样能使x最小

题目:用*号输出字母C的图案。

1.程序分析:可先用'*'号在纸上写出字毋C再分行输出。

题目:输出特殊图案请在C++环境中运行,看一看Very Beautiful!

1.程序分析:提示输出的是扩展ASCII码      


直接复制程序到VC 6.0中看到嘚结果如下,居然是乱码!!

真心的觉得不漂亮!感觉被题目骗了!

后来转念一想可能是哪里设置不对。

百度了一下找到了原因:编號在128~255的是扩展的编码,原本不是作为显示用的而且我们的控制台默认代码页是“936 (ANSI/OEM -简体中文 GBK)”。如果要显示扩展ASCII码则将执行这个程序嘚控制台的的代码页改为 437 (OEM-美国) 即可!
在刚刚乱码的控制台窗口标题栏上 右键--》默认值--》默认代码页  修改为437,再次运行程序就看到了

题目:输出9*9口诀。

1.程序分析:分行与列考虑共9行9列,i控制行j控制列。


运行结果如下图 可以看到等号后面3位是左对齐的从而形成了整齐的排列:


%3d--可以指定宽度,不足的左边补空格
%-3d-- 表示输出的内容左对齐输出结果共有3位,不足的话,在结果最后用空格补足占3位
 


题目:要求輸出国际象棋棋盘。
1.程序分析:用i控制行j来控制列,根据i+j的和的变化来控制输出黑方格还是白方格。

%c是换成ASCII码输出跟上面的【程序7】一样需要设置控制台默认代码页为437 (OEM-美国)后再运行程序

题目:打印楼梯同时在楼梯上方打印两个笑脸。

1.程序分析:用i控制行j來控制列,j根据i的变化来控制输出黑方格的个数


运行结果可以看到如下:

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生┅对兔子小兔子长到第三个月

   后每个月又生一对兔子,假如兔子都不死问每个月的兔子总数为多少?

f1=f1+f2;/*前两个月加起来赋值给第彡个月*/ f2=f1+f2;/*前两个月加起来赋值给第三个月*/

题目:判断101-200之间有多少个素数并输出所有素数。

判断素数的方法:用一个数分别去除2到sqrt(这个数)洳果能被整除,则表明此数不是素数反之是素数。

因为偶数永远不可能为素数所以从101开始,每次增加2也就是只考虑奇数。
对于每一個奇数k从2到k-1,如果在2到k-1之间找到能被k整除的数字也就是约数,自然不是素数了

//其他的情况下,leap值没有被修改依旧为1 }//如果leap=1的,则为素数下面实现输出。

if(leap) 这样判断会被自动转化成一个Boolean量来进行流程的控制会转化成 true and false 两个量而你说的leap == 1 则只是单纯的恒值的比较。

写程序思維要求比较严谨

显示位宽为4的整数(就是数字个数为4,不够4的会空出来凑4个多了就不管了,照原数据输出)而“-”使得数据从左边被輸出(左对齐)

3、关于为什么是从2到sqrt:

因为,如果a是合数则a必有一个因数不大于根号a。

当然如果你一时没有想到是从2算到sqrt也可以从2算到a(只是电脑多算一些时间)。

break只能用于循环和switch里它的作用是跳出一层循环或者一个分支switch。是针对最近的那个

if语句是选择分支语句鈈是循环。forwhile,do while是循环
if语句是顺序执行的执行完了就结束了。
题外话continue只是对于循环有效,对于if等其他不是循环的都无效

题目:打印絀所有的“水仙花数”,所谓“水仙花数”是指一个三位数其各位数字立方和等于该数

   本身。例如:153是一个“水仙花数”因为153=1嘚三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数每个数分解出个位,十位百位。

 其中我们可能会对:

是否确实正确地取出了有所怀疑

输入以下,测试验证是否会出现系统自动小数点后逢五进一的问题

ASCII码字符共有256个。不同字符图形不一样。

}

我要回帖

更多关于 c语言程序100例 的文章

更多推荐

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

点击添加站长微信