疯狂地C
几乎发疯了,今天起码连续做了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
这个东西的计算可以说是可以“八仙过海,各显神通”但我不是神仙,人家显神通我就被他人糊弄的乱七八糟。在书本的帮助下首先改装一下完成了第一个成品:
#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;ifor(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;iif(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语言一个,“孩子们”都需要我关心啊!