程序员考试笔记二:C语言数据类型(连载中)

企业动态
程序员考试笔记连载:C语言数据类型

 因为前天老师摸到我们的底的关系,所以今天要补一补前面的基础部份。他先是列出一个数据类型的表,如下:
 

  上面这个表,基本类型是我们平常用得最多的,包括整型、字符型、实型(浮点型),就从这里最常用的数据类型说起吧。
  说起C语言的数据内容就要说说计算机里存放的数据是究竟怎么一回事,大家应该都知道计算机只可以处理二进制的数吧,因为是硬件的关系(二态器件),这些只能有两种表示的状态,所以运用到计算机里就显得特别有用了。从现在开始我们要知道计算机处理的所有数据都是二进制数,那么他究竟是怎么运算的呢?老师先给一些十进制数转换为二进制数的几道题我们做,这些小儿科当然是没问题啦,很简单的就做了出来。老师当然知道我们是会做的了,但是其实是想我们在做这些题目的时候找出更简单的转换方法。例:
10111012 =
9310 很简单的就可以计算出来了,我的方法就是传统的计算方法。它们都有自己的位权,第一位就是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);
}#p#

这个是考试里的:
void fun(float *sn, int n)
{
  float s=0.0,w,f=-1.0;
  
int i=0;
  
for(i=0;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);
}

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

【专题链接】

  1. 程序员考试笔记一:C语言字符比较函数填空题(连载中)
责任编辑:丁小雨 来源: 菊花论坛
相关推荐

2009-01-19 19:18:44

程序员考试笔记

2009-01-10 23:38:16

程序员考试笔记

2009-01-16 19:49:49

程序员考试数组指针

2009-01-08 21:21:45

程序员笔记

2009-01-08 21:25:51

程序员笔记

2009-01-07 21:03:53

程序员循环语句

2009-01-07 21:00:05

2012-03-06 09:22:46

程序员

2010-01-14 18:07:30

C++语言

2013-11-28 11:29:39

2013-01-17 10:18:02

程序员

2010-01-14 13:24:49

CC++语言

2011-05-24 17:20:57

程序员

2012-11-08 09:49:30

C++Java程序员

2013-12-13 13:38:32

C程序员

2013-04-28 11:03:41

编程语言程序员私有云

2011-08-04 15:14:39

Objective-C 数据类型

2010-01-20 09:54:27

C++数据类型

2013-05-10 15:27:07

R语言

2016-03-25 11:57:23

Java程序员C++
点赞
收藏

51CTO技术栈公众号