程序员考试补课笔记-第二天

发表于:2007-05-26来源:作者:点击数: 标签:
因为前天老师摸到我们的底的关系,所以今天要补一补前面的基础部份。他先是列出一个数据类型的表,如下: | 整型 | 字符型 | 基本类型 | 单精度型 | | 实型(浮点型) | | 枚举类型 | 双精度型 | 数据类型 | 数组类型 | 构造类型 结构体类型 (结构) | | 共
因为前天老师摸到我们的底的关系,所以今天要补一补前面的基础部份。他先是列出一个数据类型的表,如下:
           | 整型
           | 字符型
     | 基本类型<         | 单精度型
     |      | 实型(浮点型)<
     |      | 枚举类型    | 双精度型
     |
数据类型<      | 数组类型
     | 构造类型< 结构体类型 (结构)
     |     | 共用体类型 (联合)
     | 指针类型
     | 空类型


  上面这个表,基本类型是我们平常用得最多的,包括整型、字符型、实型(浮点型),就从这里最常用的数据类型说起吧。
  说起C语言的数据内容就要说说计算机里存放的数据是究竟怎么一回事,大家应该都知道计算机只可以处理二进制的数吧,因为是硬件的关系(二态器件),这些只能有两种表示的状态,所以运用到计算机里就显得特别有用了。从现在开始我们要知道计算机处理的所有数据都是二进制数,那么他究竟是怎么运算的呢?老师先给一些十进制数转换为二进制数的几道题我们做,这些小儿科当然是没问题啦,很简单的就做了出来。老师当然知道我们是会做的了,但是其实是想我们在做这些题目的时候找出更简单的转换方法。例:
10111012 =(93)10 很简单的就可以计算出来了,我的方法就是传统的计算方法。它们都有自己的位权,第一位就是20,第二位是21,跟着的都如些类推,将有1的地方乘上该位的数跟着相加起来就等于93了。这里说说其实二进制的次方特别好算,就像我们的内存一样阶梯上去的,1-2-4-8-16-32-64-128-256-512-1024……你知道这规律吗,如果知道是不是计算起来特别别好办呢!
  不过老师在这里提出了一个更好的方法,起码比一个一个加上去也快多了。就是将那个要转换的数变为全都是1111111,你知道这个数是多少吗?其实就是有一技巧在里面,把它看成10000000 减 1吧!那么是不是很快就知道10000000是多少呢,没错就是128嘛,再减1就是127了,在些基础上试着将原来的那个二进制数位为零的那两个数求出来,第一个零在第二位,所以是2,第二个零在第六位,所以是32,将其加起来被127减去就可以得出93了,是不是很简单方便呢(学到东西快交学费啊,哈哈~!)。你知道计算机里二进制有什么几种运算吗?我在这里告诉你,其实就只有这么的一种,就是加法运算(你不要告诉我你连二进制的加法也不会运算,其实就是蓬二制一嘛)。为什么这样说呢?其实二进制也有减法运算和乘除,但是计算机里有一种叫补码的方法,可以将减法运算变为加法运算,至于怎么实现教师也没有再深入讲下去了(在些补充,乘法也是利用移位来实现转为加法的)。
  现在转入到C语言的整型数据里,C语言的整型数据是2字节的,就是16位,最多可以存储65536,他的范围是 -32768 到 32767 。C语言里分有符号类型和无符号类型,如果是没有符号的整数类型的范围就是0 到 65535 了。关于字符型数据,如果严格来说C语言里根本没有字符这种类型,因为他所存储的是它的ASCII码。直接可以用来和其它的数据类型运算,比如:
main()
{
  char s='A';
  int i=2;
  s=s+i;
  printf("%d",s); /*这里可以直接输出其ASCII码*/
  printf("%c",s); /*这里的结果因为上面的语句改变了字符s的字符,输出的是'C'*/
}
  那么更不要说字符串了,所以字符串在C语言里也只是用数组来表示,和其它的高级语言不同,有其的字符串类型,而且还是字符和字符串结合在同一种类型里。现在该说一下实型数据了,字型类型通常用在有小数位的一些数据。就像这题一样:
S=1/1+1/3-1/5+1/7……1/2n-1


这个程序是我写的:
main()
{
  int n,i,s;
  int r=1;
  printf("please input: ");
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    s=s+r/(2*i-1);
    r=-1*r;
  }
  printf("%d",s);
}


这个是考试里的:
void fun(float *sn, int n)
{
  float s=0.0,w,f=-1.0;
  int i=0;
  for(i=0;i<n;i++)
  {
    f=___*f; /*这里填 -1 */
    w=f / (2*i+1);
    s+=w;
  }
  ____=s; /*这里填 *sn */
}


  考试里的两个空我都做对了,可是自己写的那个程序就有大问题了,就是答案用了整型数据,从答可知答案应该是小数啊,真的一时的糊涂就可以至命啊!我们几乎所有人都是错了这点,当然也要另类的错法,就是用回来以前QB的一些运算符,^ 这个是QB里的次方运算符,这可真的闹出笑话了。之后是要我们编一个主函数来调用这个函数。


我是我做的
main()
{
  float s;
  int n;
  printf("please input:");
  scanf("%d",&n);
  fun(&s,n);
  printf("%f",s);
}


  这是这么几条简单的语句,不过就难道了几乎所有人(除了我)。你知道他们的答案吗?让我给大家展示出来吧


main()
{
  float *ss;
  int n;
  printf("Please input:");
  scanf("%d",&n);
  fun(*ss,n); /*这里出了问题*/
  printf("%f",*ss);
}


  他可以还没有了解到C语言里的函数参数的问题吧,既没有定义一个可以存放结果的变量,参数方面也用错了,如果真的要用指针也得要指针指向一个存储单元才行吧。而且还不是传了地址,他而是试图传一个指针指向单元进函数里,这是绝对错误的。因为该调用的函数是地址,好了,下面给他的程序更正一下。如下:


main()
{
  float *ss,s; /*这里多定义一个单精度的变量*/
  int n;
  ss=&s;
  printf("Please input:");
  scanf("%d",&n);
  fun(*ss,n); /*这里出了问题*
  printf("%f",*ss);
}


  好了,就这样这条程序就完全正确了,不过要是为了节省空间就用我写的那条吧,因为不要多开消一个指针变量。今天写得特别的长,也特别的嗅,望大家见谅了。

原文转自:http://www.ltesting.net