当前位置: 代码迷 >> C语言 >> 几个简单C问题.
  详细解决方案

几个简单C问题.

热度:119   发布时间:2006-02-13 09:19:00.0
以下是引用cdmalcl在2006-2-12 11:30:00的发言:

4 return是把Z指返回到main中去 但如果没有return n等于7
你可以在printf ("x=%d,y=%d,n=%d",x,y,n);后面加一个getch();就知道拉



不信就自己运行一下


----------------解决方案--------------------------------------------------------
对于第一个和第二个问题可以通过数学的泰勒级数展开(有的书也称台劳公式)
exp(x)=1+x+x^2/2!+x^3/3!+……+x^n/n!+……
ln(1+x)=x-x^2/2!+x^3/3!-x^4/4!+x^5/5!+……+(-1)^(n-1)x^n/n!……
上面的!表示阶乘运算
当然n为自然数,并且n取越大,越接近真实值,但n越大,计算量也越大,因为每一次都要算阶乘。
而C语言中的log(x)就是数学中的ln(x),它是以自然对数e(e=2.718281828)为底的对数。
数学中的以10为底的对数lg(x),在C语言表达式为log10(x).
它们之间有一个换底公式。
具体的我也记不太清楚,好像是下面的表达式:
loga(x)=logb(n)/logb(a)。
----------------解决方案--------------------------------------------------------
对于第三个问题,我也只是有点点印象:
就是它们共有一个内存块,内存块的大小取决于共用体中最大的那个变量类型的空间。
比如
一个整形和一个浮点型还有一个字符型共用一个共同体a,那么a的大小就以最大的那个浮点来算。
----------------解决方案--------------------------------------------------------
对于第一题和第二题你在设计的时候可以根据精度来控制n的取值。
比如:
你算exp(2.3),你算到n阶乘时,exp(2.3)的值为temp,你再算一下n+1阶乘时,exp(2.3)的值为new.当fabs(new-tmep)的值小于那个精度(比如你要小数点后面5位)那么你就可以用if (fabs(new-temp)<0.00001)来退出循环

共用体的大小你可以看一下下面的程序
#include <stdio.h>
#include <conio.h>
main()
{
union{int a;float b;char c;}M;
system("cls");
printf("sizeof\tint\tfloat\tchar\tunion\n");
printf("\t%d\t%d\t%d\t%d\n",sizeof(int),sizeof(float),sizeof(char),sizeof(M));
getch();
return 0;
}
----------------解决方案--------------------------------------------------------
对于第四个问题,我记得以前书上是讲,它返回一个不确定的值。
我刚才试过了,如果将上面的return(z)去掉,主程序中显示是7,
但我在s函数后面加了一句z=1+1;再去掉return(z),主程序中显示的值不是2,而是1824

so I do not know why!!
----------------解决方案--------------------------------------------------------
对于第五题,我想楼主您运行一下下面的程序,你就会明白。
main()
{
union{short a;char ch;}M;
M.a=100;
M.ch='A';
system("cls");
printf("%d,%d,%c \n",sizeof(M),M.a,M.ch);
M.ch='A';
M.a=100;
printf("%d,%d,%c \n",sizeof(M),M.a,M.ch);
getch();
}
就是将
M.a=100;
M.ch='A';
变成
M.ch='A';
M.a=100;
你就会明白的。

----------------解决方案--------------------------------------------------------
对于第六题
要明确的是一个int是2个字节,一个char是1个字节。sql_1结构体中有两个char,也就是2个字节,所以number这个共用体是占2个字节的。
由于sql_1是由2个char组成,所以这两个char就与int共同占有一个内存块。也就是说int的前1个字节(前8位)与结构体sql_1的second对应。int的后1个字节(后8位)与结构体sql_1的first对应。
当进行number.i=0x4445赋值时,i的前8位是0x44H(对应于char型也就是D),也就是说sql_1.second='D'.
i的后8位是0x45H(对应于char型也就是E),也就是说sql_1.first='E'.
当进行
number.sql_1.first='c';
number.sql_1.sencond='d';赋值时,
first='c'相当于0x63H,也就是i的后8位是0x63H;
second='d'相当于0x64H,也就是i的前8位是0x64H;
最后i的值为0x6463H.

上面只是我的个人看法,不知对不??

----------------解决方案--------------------------------------------------------
  相关解决方案