2005-12
23

疯狂地C

By xrspook @ 20:12:07 归类于: 烂日记

几乎发疯了,今天起码连续做了5个小时的C语言,把自己最讨厌的数组和函数都似乎不知不觉地冲过了,也不知道自己是怎么熬过来的。很多很多的函数嵌套从开始的害怕到现在的有点顺手,自己脑袋里除了C还是C,我知道我再这样做下去一定会发疯的,因为期末的考试肯定没有那么刁钻,而二级的考试应该也没有那么“阴险”。

今天令我载最多跟斗的是格式问题,到底是int还是用unsigned甚至是long unsigned经常令我经过一番磨难以后才恍然大悟。谁会想到要用到平时似乎不怎么可能接触到的大值啊!于是突然觉得那个才10块钱的“科学”计算器真的好厉害,起码它能简单地输入输出10的N次方,而我们可怜的C则要为那个结果该用什么输出而烦恼。很简单的输入,14,如果来个5次方那么long unsigned也无能为力,叫人怎么做????我是无能为力了,哎!

以下的是比较好彩的,题目是求1到20的2、3、4、5次方,程序很简单,但用什么格式输出就意味着你程序的成功和失败,经过n++次失败以后我突然恍然大悟,原来自己没有把调用函数的格式搞好,于是就失败了。看看程序看看截图,真的好有成功感!这用计算器搞简直就是轻而易举的小菜,但用C来自己搞,就注定着我这个粗心的人要碰壁好多好多次。我依然是和平常一样,思路清晰但粗心不少。

long unsigned square(long unsigned x)
{
  long unsigned y;
  y=x*x;
  return(y);
}
long unsigned cube(long unsigned x)
{
  long unsigned y;
  y=x*x*x;
  return(y);
}
long unsigned quartic(long unsigned x)
{
  long unsigned y;
  y=square(x)*square(x);
  return(y);
}
long unsigned quintic(long unsigned x)
{
  long unsigned y;
  y=square(x)*cube(x);
  return(y);
}
main()

  long unsigned i;
  clrscr();
  printf("\n  A TABLE OF POWERS\n");
  printf("  No.\tSquare\tCube\tQuartic\tQuintic\n");
  for(i=1;i<21;i++)
    printf("  %lu\t%lu\t%lu\t%lu\t%lu\n",i,square(i),cube(i),quartic(i),quintic(i));
  getch();}

但如果要计算n!就没有那么好彩了。要计算阶乘的思路很清晰,但要算阶乘就不是你想想就能实现的问题。算阶乘的方法很简单:

main()

{  int i;
  float x,t=1;
  clrscr();
  printf("Input a number: ");
  scanf("%f",&x);
  {for(i=1;i<=x;i++)
    t*=i;
  printf("\n  %g!=%g",x,t);
  getch();}

就搞定了,但要知道x和t就决定了你的乘到底能去多远。用long unsigned(最长的无符号整型),那么阶乘最多能算到12!,而用float就能算到34!因为long unsigned的范围在0到429467295(2的32次方减一),而float则-3.4e-38到3.4e38之间,12的阶乘是479001600,13的阶乘是6227020800,long unsigned最远就只能是12!了。而34的阶乘是2.952328e38,但35的阶是1.0333148e40,于是float就无能为力了。更厉害的是doulbe范围在-1.7e-308到1.7e308,但我在书上怎么也找不到它的输入和输出方式。最厉害的是long double,但以%什么输入?我到现在也是一头冒水,long double的范围是-1.2e-4932到1.2e4932。所以,用float就是我力所能及的范围了。

计算:其实就是计算阶乘,别以为计算这个比计算阶乘要简单,因为是先算阶乘后相除,所以阶乘的值保不住就无法计算这个,痛苦啊!!!!

float f(float n)
{
  float t=1;
  int i;
  for(i=1;i<=n;i++)
    t*=i;
  return(t);
}
main()
{
  float n,m,C;
  clrscr();
  printf("Input n,m (n>m&&n<35): ");
  scanf("%f%f",&n,&m);
  if(m>n||n>35) printf("Wrong Input!!!");
  else
  {
    C=f(n)/f(n-m)/f(m);
    printf("n=%g, m=%g, C=%g",n,m,C);
  }
  getch();
}

最令人痛心和兴奋的就是素数的计算:设计一个判别素数。如果是素数,返回值1;如果不是素数,则返回值0。在主函数中调用这个判别函数,输出100以内的所有素数。还有输出格式限制:
 No. Value
 1    2
 2       3
 3       5
 4       7
 5      11
这个东西的计算可以说是可以“八仙过海,各显神通”但我不是神仙,人家显神通我就被他人糊弄的乱七八糟。在书本的帮助下首先改装一下完成了第一个成品:
http://static.flickr.com/36/77467040_a9e266502d_o.gif

#include
find(int a[]);
main()
{
  int a[101];
  clrscr();
  find(a);
  getch();
}
find(int a[])
{
  int i,j,k=1;
  printf("No\tValue\n");
  for(i=2;i<=100;i++)
    a[i]=i;
  a[1]=0;
  for(i=2;i  for(j=i+1;j<=100;j++)
  {
    if(a[i]!=0&&a[j]!=0)
      if(a[j]%a[i]==0)
 a[j]=0;
  }
  for(i=1;i<100;i++)
    if(a[i]!=0)
    {
      printf("%2d\t%2d\n",k,a[i]);
      k++;
    }
}

是用数组完成的,想想都会发疯。该在主函数决定什么,然后传入find函数真的令我几乎发疯。因为书本的题目是整个过程在主函数完成的。在完成上面的改装后不久,我终于有了灵感重修自己本来一点不像样的程序:

int m;
find(int n)
{
  int i,ext;
  for(i=2;i    if(n%i==0) {ext=0; break;}
    else ext=1;
  if(ext==1) m=n;
}
main()
{
  int n,j=1,i;
  clrscr();
  printf("No.\tValue\n");
  for(n=2;n<100;n++)
  {
    find(n);
    if(m!=0)
    {
      printf("%2d\t%2d\n",j,m);
      j++;
      m=0;
    }
  }
  getch();
}

真的好兴奋,当我运行成功的时候,我简直似乎发疯地狂跳狂叫!!!!用了比书本简单好多的语句就完成了,好欣慰,真的好欣慰!!!我的程序只有12.2KB,而书本改装的要28.3KB,发费了大概2个小时做这个题目,应该说我白痴还是说我努力!?只有在家里,只有在没有人的时候我才能如此专心,有了internet我就会有了依赖,我还是要和紫龙那样,在脱掉圣衣的时候才可以把潜能的小宇宙发挥到及至。

不过这样的日子真的好难熬,毕竟我要照顾的不是C语言一个,“孩子们”都需要我关心啊!

1 条评论

  1. kevin

    啊,一点也看不懂,头大:@@
    xrspook 对 kevin 的回复: 2005-12-30 13:33:42
    :p

Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress