论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> 应试技巧 >> IT正文
经典的C程序案例
 作者:佚名     2007-3-14 15:59:22        来源:不详  浏览次数:

  1.绘制余弦曲线
   在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线
  *问题分析与算法设计
   如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。
   关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个“*”。
   为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就 应为62-m。程序中利用反余弦函数acos计算坐标(x,y)的对应关系。
   使用这种方法编出的程序短小精炼,体现了一定的技巧。
  *程序说明与注释
  #include
  #include
  void main()
  {
   double y;
   int x,m;
   for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/
   {
   m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/
   for(x=1;x   printf("*"); /*控制打印左侧的 * 号*/
   for(;x<62-m;x++)printf(" ");
   printf("*\n"); /*控制打印同一行中对称的右侧*号*/
   }
  }
  
  2.绘制余弦曲线和直线
   在屏幕上显示0~360度的cos(x)曲线与直线f(x)=45*(y-1)+31的迭加图形。其中cos(x)图形用“*”表示,f(x)用“+”表示,在两个图形相交的点上则用f(x)图形的符号。
  *问题分析与算法设计
   本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判断图形的交点,再分别控制打印两个不同的图形。
  *程序注释与说明
  #include
  #include
  void main()
  {
   double y;
   int x,m,n,yy;
   for(yy=0;yy<=20;yy++) /*对于第一个y坐标进行计算并在一行中打印图形*/
   {
   y=0.1*yy; /*y:屏幕行方向坐标*/
   m=acos(1-y)*10; /*m: cos(x)曲线上y点对应的屏幕列坐标*/
   n=45*(y-1)+31; /*n: 直线上y点对应的列坐标*/
   for(x=0;x<=62;x++) /*x: 屏幕列方向坐标*/
   if(x==m&&x==n) printf("+"); /*直线与cos(x)相交时打印“+”*/
   else if(x==n) printf("+"); /*打印不相交时的直线图形*/
   else if(x==m||x==62-m) printf("*"); /*打印不相交时的cos(x)图形*/
   else printf(" "); /*其它情况打印空格*/
   printf("\n");
   }
  }
  
  3.绘制圆
   在屏幕上用“*”画一个空心的圆
  *问题分析与算法设计
   打印圆可利用图形的左右对称性。根据圆的方程:
   R*R=X*X+Y*Y
   可以算出圆上每一点行和列的对应关系。
  *程序说明与注释
  #include
  #include
  void main()
  {
   double y;
   int x,m;
   for(y=10;y>=-10;y--)
   {
   m=2.5*sqrt(100-y*y); /*计算行y对应的列坐标m,2.5是屏幕纵横比调节系数因为屏幕的
   行距大于列距,不进行调节显示出来的将是椭圆*/
   for(x=1;x<30-m;x++) printf(" "); /*图形左侧空白控制*/
   printf("*"); /*圆的左侧*/
   for(;x<30+m;x++) printf(" "); /*图形的空心部分控制*/
   printf("*\n"); /*圆的右侧*/
   }
  }
  
  4.歌星大奖赛
   在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
  *问题分析与算法实现
   这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。
  *程序说明与注释
  #include
  void main()
  {
   int integer,i,max,min,sum;
   max=-32768; /*先假设当前的最大值max为C语言整型数的最小值*/
   min=32767; /*先假设当前的最小值min为C语言整型数的最大值*/
   sum=0; /*将求累加和变量的初值置为0*/
   for(i=1;i<=10;i++)
   {
   printf("Input number %d=",i);
   scanf("%d",&integer); /*输入评委的评分*/
   sum+=integer; /*计算总分*/
   if(integer>max)max=integer; /*通过比较筛选出其中的最高分*/
   if(integer   }
   printf("Canceled max score:%d\nCanceled min score:%d\n",max,min);
   printf("Average score:%d\n",(sum-max-min)/8); /*输出结果*/
  }
  *运行结果
   Input number1=90
   Input number2=91
   Input number3=93
   Input number4=94
   Input number5=90
   Input number6=99
   Input number7=97
   Input number8=92
   Input number9=91
   Input number10=95
   Canceled max score:99
   Canceled min score:90
   Average score:92
  *思考题
   题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接返平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
  求最大数
   问555555的约数中最大的三位数是多少?
  *问题分析与算法设计
   根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。因此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。本题只要求取约数中最大的三位数,则其取值范围可限制在100到999之间。
  *程序说明与注释
  #include
  void main()
  {
   long i;
   int j;
   printf("Please input number:");
   scanf("%ld",&i);
   for(j=999;j>=100;j--)
   if(i%j==0)
   {
   printf("The max factor with 3 digits in %ld is:%d,\n",i,j);
   break;
   }
  }
  *运行结果
   输入:555555
   输出:The max factor with 3 digits in 555555 is:777
  6.高次方数的尾数
   求13的13次方的最后三位数
  *问题分析与算法设计
   解本题最直接的方法是:将13累乘13次方截取最后三位即可。
   但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。
   研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。
  *程序说明与注释
  #include
  void main()
  {
   int i,x,y,last=1; /*变量last保存求X的Y次方过程中的部分乘积的后三位*/
   printf("Input X and Y(X**Y):");
   scanf("%d**%d",&x,&y);
   for(i=1;i<=y;i++) /*X自乘Y次*/
   last=last*x%1000; /*将last乘X后对1000取模,即求积的后三位*/
   printf("The last 3 digits of %d**%d is:%d\n",x,y,last%1000); /*打印结果*/
  }
  *运行结果
   Input X and Y(X**Y):13**13
   The last 3 digits of 13**13 is:253
   Input X and Y(X**Y):13**20
   The last 3 digits of 13**20 is:801
  
  8.借书方案知多少
   小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
  *问题分析与算法设计
   本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
  *程序说明与注释
  void main()
  {
   int a,b,c,count=0;
   printf("There are diffrent methods for XM to distribute books to 3 readers:\n");
   for(a=1;a<=5;a++) /*穷举第一个人借5本书中的1本的全部情况*/
   for(b=1;b<=5;b++) /*穷举第二个人借5本书中的一本的全部情况*/
   for
责任编辑:lss
  相关新闻
JSF经典视图技术-Facelets 实例解析
链表的C语言实现系列辅导:单链表的实现
一名网管的CCIE考证亲历记
链表的C语言实现系列辅导:动态内存分配
Exchange Server 的CDO对象集合二
Exchange Server 的CDO对象集合一
Exchange Server 的CDO对象集合三
链表的C语言实现系列辅导:单链表的查找运算
经典Java开发工具介绍(5):WebGain Studio 4 with V
编程经典技术:Spring的巧妙之处
链表的C语言实现系列辅导:单链表的查找运算
链表的C语言实现系列辅导:动态内存分配
链表的C语言实现系列辅导:单链表的实现
一名网管的CCIE考证亲历记
JSF经典视图技术-Facelets 实例解析
编程经典技术:Spring的巧妙之处
经典Java开发工具介绍(5):WebGain Studio 4 with V
程序人生:终身受用的4个经典故事
【程序人生】一个程序员的经典自白
java 2 十大经典书籍
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号