2005-12
24

程序渐进

By xrspook @ 22:16:06 归类于: 烂日记

C不是一天就能攻陷的,要经过不懈加不懈的努力,甚至要来个for(i=0;;i++)无限循环来达成。于是今天我就从1:00AM不知不觉努力到4:00AM,在Turbo C的世界里我的右下脚没有时间,我的桌面也从来没有钟,于是努力就在不知不觉中进行着。

今天凌晨,当我正要睡觉的时候来了道如此的题目:
某班有5个学生(含学号sno,姓名name),三门课(English, C, Math)。分别编写4个函数实现一下要求:
1. 求各门课的平均分。
2.找出有两门以上课程不及格的学生,并输入其学号、姓名和不及格课程的成绩。(我觉得这句话有歧义,到底是只3门课都不及格的人呢还是指那些在English,C和Math有2门或以上不及格的人呢?莫名其妙。于是我就在完工之后写多了个函数来满足编者两个不清不楚的要求)
3.找出三门课平均成绩85到90分的学生,并输出其学号和姓名。
4.找出每门课的最高分所对应的学生学号、姓名和分数。
5.主函数输入5个学生的成绩,然后调用上述函数输出结果。

这个题目看上去很庞大,但不难,于是我就先写了主函数,然后用/**/把没有用到的函数先注释起来,一个一个函数去攻陷。里面用到的知识都很全面,但我都会。要筛选就是要有条件,把符合条件的找出来,要算平均分其实就是要先算总分,一切都思路清晰,这里运用得最多的就是循环语句,所以如果循环语句你不过关你就不用活了。这是这个单元的一个函数编程应用题,它的难度系数是5,我是第一次没有碰什么大钉子就搞定5的题目。

char a[5][5]={"No.1","No.2","No.3","No.4","No.5"};
char b[5][5]={"stua","stub","stuc","stud","stue"};
int i;
ave(int score[])
{
  int sum=0;
  for(i=0;i<5;i++)
    sum+=score[i];
  return(sum/5);
}
f2a(int c[],int d[],int e[])
{
  printf("\n\n /*Three Courses in Red*/");
  for(i=0;i<5;i++)
    if(c[i]<60&&d[i]<60&&e[i]<60)
      printf("\n %s %s English:%d, C program:%d, Math:%d",a[i],b[i],c[i],d[i],e[i]);
}
f2b(int c[],int d[],int e[])
{
  printf("\n\n /*At Least Two Courses in Red*/");
  for(i=0;i<5;i++)
  {
    if(c[i]<60&&d[i]<60&&e[i]>=60) printf("\n %s %s English:%d, C program:%d",a[i],b[i],c[i],d[i]);
    else if(c[i]<60&&d[i]>=60&&e[i]<60) printf("\n %s %s English:%d, Math:%d",a[i],b[i],c[i],e[i]);
    else if(c[i]>=60&&d[i]<60&&e[i]<60) printf("\n %s %s C program:%d, Math:%d",a[i],b[i],d[i],e[i]);
    else if(c[i]<60&&d[i]<60&&e[i]<60)
      printf("\n %s %s English:%d, C program:%d, Math:%d",a[i],b[i],c[i],d[i],e[i]);
   }
}
f3(int c[],int d[],int e[])
{
  int ave[5];
  printf("\n\n /*The Average Score of 3 Courses is between 85 to 90*/");
  for(i=0;i<5;i++)
  {
    ave[i]=(c[i]+d[i]+e[i])/3;
    if(ave[i]>=85&&ave[i]<=90)
      printf("\n %s %s",a[i],b[i]);
  }
}
max(int score[])
{
  int m;
  m=score[0];
  for(i=1;i<5;i++)
    if(m  for(i=0;i<5;i++)
    if(score[i]==m) printf(" %s %s %3d\t",a[i],b[i],score[i]);
}
main()
{
  int c[5],d[5],e[5];
  clrscr();
  for(i=0;i<5;i++)
    scanf("%d%d%d",&c[i],&d[i],&e[i]);
  printf("\n");
  for(i=0;i<5;i++)
    printf(" %s %s %3d %3d %3d\n",a[i],b[i],c[i],d[i],e[i]);
  printf("\n\n /*Average*/\n English:%d\tC program:%d\tMath:%d",ave(c),ave(d),ave(e));
  f2a(c,d,e);
  f2b(c,d,e);
  f3(c,d,e);
  printf("\n\n /*The Highest Score of Each Course*/");
  printf("\n English:\t");
    max(c);
  printf("\n C program:\t");
    max(d);
  printf("\n Math:\t\t");
    max(e);
  getch();
}

程序好长,但不难。开始的时候我没有想到把i、a[][](储存学号的二维数组)和b[][](储存姓名的二维数组)设计为全局变量,但在后面的运作之中,每个函数都要用到循环,都要用到i与其个个函数都设计不如来个全局变量方便,因为i只用于循环语句,所以每次都会给它个初始值,所以自己觉得定义这个全局变量是我的一个十分明智的选择。当然a[][]和b[][]的定义也使我方便好多,它们的方便之处就随着i的增多而增多,因为是i带动它们变化的。

我不是什么天才,太难的程序我不单不会写,也看不懂,但我会循序渐进,程序就需要我一点一点地啃。路是一步一步走的,程序是一点一点渐进的。

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语言一个,“孩子们”都需要我关心啊!

2005-12
22

步履不同

By xrspook @ 23:54:11 归类于: 烂日记

好久好久没有注视生活的细节,但今天因为塞车,因为坐在公车上无事可干于是就开始了注视行人的步履。

有个好奇怪的现象:几乎所有男的走路伸脚的时候大腿和小腿是成一直线的;但女的就不一样,她们大多大腿和小腿成的不是一条直线,而是成个很像平角的钝角,而穿高跟鞋的女人由尤为特别,因为她们的钝角显然要比其他人要小而那些似乎有关节病的老人也是钝角比较小,就是说他们似乎都有个共同的特点,关节好像活动不开似的。这说不上是什么重大发现去让我突然学会了从小事中探索思考。大概是因为今天早上一起来就在想C语言,想问题想上瘾了:)

造成如此现象的原因是什么呢?为什么几乎所有男的都伸得那么直,而女的则不是。难道是人体工程学的问题?但为什么从来没有人提出过如此的疑问?还有一点就是大概有30%的女的腿也是伸得很直的。说不上在脚向前跨步的时候伸直了和不伸直有什么好不好。但我一直以为人走路的时候大腿和小腿是成一直线的,因为所有的动画片都似乎把这个当作一个必然现象,而模特走台步就更不用说了。造成今天这个现象的原因到底是什么呢?最直接而又最客观,最一切由实际出发的一个原因是因为冬天而女性又仿佛相比男性怕冷,于是多穿了裤子,造成关节活动不太方便。而有个很明显的例子就是当你摔跤,膝盖受伤的时候你也不喜欢老是活动它,如果坐着起来走动肯定是不方便的,因为显而易见坐着的时候膝盖的皮肤要撑开,而站着的时候皮肤则要折叠,这“开和关”显然会造成疼痛,谁喜欢活动,于是我们就通常采取个适中的方式——半开放式,坐着的时候腿不弯曲成90度,而站着或走路的时候不伸直成180度。这就是普通人“免痛”的方式,我觉得这个解释用在那些有关节毛病的老年人身上尤其明显。他们有的关节增生,关节活动不方便,于是就很容易采取我上面所说的那种方式减轻痛苦。

对于那些穿高跟鞋的女性为什么差不多90%腿都没有伸平,我就不怎么感说为什么了,因为自己从来没有真的穿过高跟鞋(小时候曾经偷偷穿妈的高跟鞋,结果肯定是被臭骂一顿,于是以后就敢了,而到现在为止,自己对高跟鞋没有半点兴趣。)。但有个很明显的“原因”我是发现了。顾名思义“高跟鞋”,显然鞋子是前面低后面高,如果是腿伸直了人很自然就脚跟着地(除非你是踢正步那样压平脚尖),那个一点点的高脚跟着地很容易发生偏移转动,然后一不小心——哎呀,脚扭了。所以那些穿高跟鞋的女士通常是走小步,跨步的时候通常要脚尖和脚跟和地相平,这显然可以减少很多“哎呀”的机会。我到现在还是不明,为什么那么不方便,她们为什么还穿?漂亮吗?我怎么不觉得,漂不漂亮我不知道,但一定很不方便。

男性穿的都是平底鞋,所以就没有了这个问题了。但有一点还是值得注意的,他们的腿都伸得好直,但很多人是把腿摔出去,就是小腿是由于惯性自动摆动到最高点和大腿垂直的,而女性走路通常都很收敛,不会那么“放”。而女性脚在空中停留然后落地的时间显然比男生要短,这就意味着男性的脚理论上要比女性的提得高。这各有个优劣点,优点是男性走路的时候通常不会拖步,就是走路的时候鞋底明显和地面有发生动摩擦的声音,而女性走路则有大概10%有拖步的习惯。但男生这个提步高也有个缺点,一些男性提步太高了,脚的滞空时间太长在加上“外八字”脚了于是就造成了“大老官出场”——廿下廿下(广州话,大概是形容有点横行霸道)的效果,显然这样子十分不雅。

100样米养100样人,我们肯定不能规定所有人都以同一个方式走路,因为我们来自不同的地区由不同的人抚养大,受到不同的教育,而不是受过十分严格的统一化军事训练。如果人人都走相同的步子的话,我今天就没有什么好观察了。生活能见的真的很多,用黑色的眼睛探索世界!!!

2005-12
21

Where Am I?

By xrspook @ 22:02:14 归类于: 烂日记

觉得自己十分心不在焉,简直不知道自己在干什么。我是个学生么?怎么不怎么上课?或是上课的时候老是蔑视老师在说废话,无论那个老师是谁,无论是只比我大几年或者长得好难顶,或者说的话都绞成了一团,,无论怎样不顺眼,那也是我的老师,我还是要上他/她的课,听他/她说的所谓“废话”,即使那个老师我真的很很很讨厌我们都必须接受,因为那就是我的老师。

今天也不知道自己到底干了什么。可以说从早上到现在没做什么正经事,最正经的就是做了几道C语言的编程题,对着那些东西自己就好像是个白痴那样,好像什么都不大懂,真的好郁闷。到处碰鼻子,循环语句还那个马马虎虎,一到那个数组发觉自己跟没有上过课一样,从输入到把要的东西输出一路都是恐怖的旅程。每一步都似乎要前思后想,真的好累人啊!但老师上课的时候的确说了不多,特别是那个数组之中经典的冒泡法,如果是在这次的期考出的话那个出题的老师肯定要受到万人的唾骂。因为对我们这些非专业,只是公共课学习的small potato来说,能看得明白已经是万幸,而且老师上课的时候也不知道该怎么说,只是说太难的了,我们知道有这么个经典的东西就好了,但C语言的二级考试会放过我吗?那可是等级考试啊!可以说我们这个学期的C语言的老师很懒惰,因为相比其他的C语言的老师她肯定说少了,很多,但同时,她也好现实,她也十分清楚我们大多数人学习这门课的唯一目的——合格,所以她说的深度不多,但现实的东西就有好多,比如上课的时候三番四次提醒某人不要抄笔记,还有一开学就把历年来所有的试题给我们研究研究。她骂人的方式好直接,从来不给你任何的余地,因为学C语言的人要追求最简洁的方式,她不喜欢兜圈子,而且她也不喜欢人家罗嗦,特别当她说完以后你还问她同一个问题,她会发疯似的狂怒的。在这两方面,我觉得我和她是同一类人,我从来都不知道该如何婉转表达我的意思。但有一点,她老是上课的时候恐吓我说要点我的名字,因为我在她上课的时候,特别是讲某些题目的时候忍不住要和旁边的同学解释。我完全不觉得我的做法有任何的问题,但每次当我解释到一半的时候她就开始恐吓说“那位同学,我真的不想点你的名字,因为我不喜欢点女生的名字,以前如果女生犯错,我一定会怪在男生头上的,但这次……”说了一大堆,都是恐吓的话,其实我根本就不怕,因为她压根儿就不知道我是谁。她也是第一个上课嫌我说话阻碍她的老师,因为在其他老师眼中我一直是个好听话的孩子,但在她眼中我却成了老爱说话的坏孩子,我也说不上是为什么。但我说的话完全不是因为我要打断她,反而我在为她得一半一半的东西做解释,就是因为我太认真上课了,我才会不由自主地说那些题目,如果我真的讨厌她,讨厌这一科目的话,我应该上课睡觉,那样子不知道对她来说是不是很好呢?她是希望教一个活跃的小子还是要一条睡虫呢?可能她宁愿选择后者吧,这就是我和她截然不同的地方。如果我是她,我一定选前者,即使那些人活跃到几乎好像要在我的课上捣乱那样,只要他们谈论的是正经的,是有关这一科的,没所谓。无论黑猫白猫,能捉到老鼠的就是好猫。如果我的学生在课上像在捣乱那样热烈讨论那些题目,我也是时候重新斟酌斟酌我的教学方法和研究研究自己的语言表达了,而不是用那些恐吓语句来让整个课室安静听我说。我可以很暴力,但不到情非得意的时候我是不会运用的。

也不知道自己到底在干什么,评论评论这自己今天不知道干了什么却跑到了评论C语言的老师,真够怪的。

Where is my boday, and where is my heart????????

2005-12
20

“20”的生日

By xrspook @ 15:30:01 归类于: 烂日记

题目用了一语相关,首先今天是12-20——澳门回归的日子,其次,今年是我20岁的生日!今天早上一打开QQ,就发现了很应境的窗口:


仿佛是有意告诉我今天不平常似的。所以顺便今天我就换了新的圣诞模板了,一起庆祝嘛。

最早的祝贺短信是昨天今天凌晨0:04收到的,而宿舍为我准备的蛋糕昨天晚上已经吃了,因为怕今天晚上会吃得太饱撑不下(今晚我们要到Pizza Hut)开刷。她们3个吃药的吃药,喝凉茶的喝凉茶,都做好了防护措施,而我,什么也没做。不过我已经准备好这次以后重几斤了:)中午收到班的礼物,是张卡片和块蛋糕!又是蛋糕,所以我说我会发胖嘛。

今天起来,最早收到的是妈的短信,连续2年,早上起来都是她最早。其实我觉得自己20年前出生的那天,最高兴最伤心的就是我的父母。高兴是以为我出生了,他们有了健康的下一代,而伤心的是这就意味着接下来的20多年他们就会有好重好重的负担。所以,我觉得今天最应该被称赞祝贺的不是我,而是他们,那些养育我20年的人,他们的绊脚石终于开始变轻了,快要成为动力来源了。

其实觉得在学校比在家里过生日气氛要好很多,人多,都是年轻人,甚至为怎么庆祝而发愁,而在家里,除了爸妈就是4堵墙,除了平时吃的还是平时吃的。但其实生日也没有什么特别啦,我的生日年年都有,其实也好幸福好平常,如果像JEA那样2-29生日那才叫痛苦。其实说真的,即使是生日我从来都不奢望会有什么生日礼物,因为好多好多年都是和平时的365或者.364天过得一样,上课还是上课,该被批评还是被批评。

我为什么要这个时候写blog? 以为我怕今天晚上没有时间,不知道去多晚才回来,刚碰巧今天的英语课不用上于是就干脆现在搞定了。今天我简直不知道该写些什么,近些日子我的感觉都好迟钝。

20岁了,小孩子的时候盼望自己长大成人,但当自己真的成了大人的时候又想回到从前。其实准确地计算,20年前的现在我还不是个人,我是在傍晚6点多出生的,恰逢那天也是个挺冷的天气。听妈说我的预产期本应在1986年,但我却提早出来了,说是要赶着冬至和元旦。嘿!我这小孩还真会算甜头:)

20了,我也该成熟了……

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