博文

关于取整的几个函数(2012-02-01 23:43:00)

摘要:1.floor()      double floor ( double x );        float floor ( float x ); long double floor ( long double x );2.ceil()      double ceil ( double x );   float ceil ( float x ); long double ceil ( long double x ); 3.modf()      double modf ( double x, double * intpart );      long double modf ( long double x, long double * intpart );        float modf ( float x, float * intpart ); ......

阅读全文(1015) | 评论:0

scanf()函数的原理(2012-02-01 23:09:00)

摘要:scanf()函数的原理想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组。当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。现在假设你的缓冲区里有:abcd\n1234\n (其中\n是回车符)执行:scanf("%s",name);的时候,由于scanf是读数据直到看见空白符(空白符:指空格符、制表符、回车符)就停止的输入函数。所以执行后,把abcd存到了name中。缓冲区于是变成了 : \n1234\n接下来的执行就有问题了,如果遇到了:scanf("%d",&number);怎么办?因为遇到了回车符,它并不是一个数字,所以scanf还有一个特性,就是忽略先导的空白符。不管是有几百个回车也好,几万个空格也罢,只要它们连续地出现在缓冲区的开头,就统统忽略他们。然后再读有意义的字符。于是1234被读入number。回到刚刚,当缓冲区还是:\n1234\n的时候,如果遇到了:scanf("%c",&sex);应该怎么办呢?你说,那好办呀,不是说了忽略前导空白符吗?跳过回车读'1'呀!想法是好的,可这只针对你的程序这一种情况。如果我编写的程序就是统计用户输入了多少个回车呢?所以对scanf来讲跳过前导空白符有个例外,当参数是%c的时候,就把缓冲区的第一个字符返回回去,不管是什么。这样的设计就有个问题,scanf对不同的参数表现出来的特性不一样。得承认,这是个缺陷,但不是说这样不好。这样的设计至少把发现所有字符的机会交给了用户,设计者这样想:如果程序员使用了scanf("%c",..),那他就有必要知道这函数能把回车符读出来,至于程序员对回车符感不感兴趣,那就看他了,不感兴趣的话,程序员也一定知道该怎么处理。回到你的程序里。当执行scanf("%s",name)的时候,要求你从键盘输入,于是你输入了"abc",然后“回车”。缓冲区里自然而然地是:abc\nscanf把abc拿走了,留下了\n,缓冲区里现在就剩下\n于是,下一个scanf ("%c",&sex); 想当然地读取了\n- 关于scanf忽略前导空白符这一点,可以这样验证:写个程序,用scanf()读数据,只要不是%c就行。然后输入的时候,随便输入回车、空格、制表符,然后“回车”确认。会发现程序依然提示等待你输入。......

阅读全文(9035) | 评论:0

scanf 妙招(2012-02-01 23:05:00)

摘要: 摘自 http://blog.csdn.net/zsjsgyy/article/details/4052830
另外可以参考 http://blog.csdn.net/programerOfchina/article/details/5479201
scanf 妙招      scanf原型:参见《C语言大全》和K&C
# include <stdio.h>;
int scanf( const char *format, ... );
函数 scanf() 是从标准输入流 stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。
在 C99 中,format 用 restrict 修饰。format 指向的控制串由以下三类字符组成:
       ● 格式说明符
       ● 空白符
       ● 非空白符
     
     转换字符(就是%后跟的部分)              
       a   读浮点值(仅适用于 C99)         &nb......

阅读全文(1458) | 评论:0

堆和栈的区别(2012-02-01 00:34:00)

摘要:堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序 
这是一个前辈写的,非常详细 
//main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 

int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 ......

阅读全文(2619) | 评论:3

控制字符串输入的方法汇总(2012-02-01 00:30:00)

摘要: #1 while(1)
{
        if((c=getchar) == '\n')
             break;
         ...
} #2 while( (c=getchar()) != '\n' )
Attention: c=getchar()要用( )括起(大概是因为 != 优先级高于 =) Thinking:      char c;     while((c=getchar())!='\n')
          printf("%c",c);
    return 0;这段代码是输入结束之后再输出,是否是因为堆栈之类的原因? #3 char *sPtr; gets(sPtr);
  ......

阅读全文(1076) | 评论:0

字符串转化为数字(2012-02-01 00:23:00)

摘要:6.1.2  字符串转化为数字 面试例题3:使用库函数将字符串转换为数字。 考点:C库函数中字符串转换为数字的使用。 出现频率:★★★★ 解析 与上节数字转换为字符串类似,C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。以下列举了各函数的方法及其说明。 atof():将字符串转换为双精度浮点型值。 atoi():将字符串转换为整型值。 atol():将字符串转换为长整型值。 strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。 strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。 strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。 以下程序演示如何使用atoi ()函数和atof ()函数。
1 # include <stdio.h>
2 # include <stdlib.h>
3
4 int main ()
5 {
6 int num_int;
7 double num_double;
8 char st......

阅读全文(1187) | 评论:0

C表达式的值(2012-02-01 00:18:00)

摘要:首先他们都是逻辑运算。如果在数学方面不是运用在逻辑方面的话,c>b>a他就相当于一个常量,也就是一个已知数,也就是C最大,B其次,A最小,如果运用在逻辑判断的话,因为他们的优先级相同,先判断出C是否大于B,得出的结果为逻辑是和否,也就是1和0,然后再用1和0去与A比较大小,同样得出1或者0。但此时的ABC三个数字都必须是个已知数,不然它只能是个命题,不能判断真假。而在C语言中,无论它是变量还是常量都可以做出判断,如果是常量的ABC做比较,判断的是他们的ASIC值的大小,优先级相同都是从左至右判断,返回结果也是逻辑1或0.如果是变量做比较也是相同的道理,只不过他们比较的是变量的值。 a<b?a:c<d?c:d从右往左先看c<d?c:d 问你c是不是小于d,如果是则c不变,如果不是则c=b,简单来说就是取cd中较小的一个,那么就是3接着a<b?a:3,同理,如果a小于b,那么等于a,否则等于3 大家看看下边程序会输出什么东东
PS: 注意括号的作用
#include <stdio.h>
void main()
{
int a, b;
printf( "%d...%d...%d\n ", (a=1), (b=(a=2)), (b=(a=2)+(a=3)) );
} 返回值是函数的概念,这样一个表达式是没有返回值的,表达式的值被称作value of expression,这个表达式最后的结果是a的值,也就是一个右值。

题外话,对于计算机来说,它的目的其实并不是把10赋予a,把10赋予a只是人类的逻辑概念,计算机的目的,只是计算这个表达式而已,把10赋予a只是这个计算过程的副作用。 应该是有返回值的,因为这个应该就是运算符重载吧,我是说理解上来说! ......

阅读全文(1416) | 评论:0

无符号整型(2012-02-01 00:15:00)

摘要:注意, %d其实是等价于%i, 这里的i其实是指int。所以,%u的存在就有意义了。在这里也强调了在C中输入输出的类型选择十分重要,这也是C相对于C++的特点。

其实从本质上来讲,%d和%u是决定编译器如何解析内存。 由于unsigned int和int的存储方式不同——前者第一高位也用来存储数值,而后者第一高位用来存储符号,故解析的方法不同,结果也自然就不同了。那么,很好奇在C++中是由什么机制来解决的呢? ......

阅读全文(1246) | 评论:0

C语言中强制类型转换总结(2012-02-01 00:12:00)

摘要:
  1.自动类型转换 ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待, 取值范围总是0~255)。
● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
double ←── float 高

long

unsigned

int ←── char,short 低
● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。
● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。 2.赋值中的类型转换 当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:
(1) 浮点型与整型 
● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。......

阅读全文(1107) | 评论:0

cyuyan  一个不错的C语言社区(2012-02-01 00:09:00)

摘要:国外好的程序社区有不少,国内专注于C语言的不多,
http://www.cyuyan.com.cn/
cyuyan是个不错的地方,在上面浏览了一会,确实学到了点东西。 这里有一个帖子是几种排序方法的代码展示:  http://bbs.cyuyan.com.cn/thread-3402-1-1.html ......

阅读全文(1832) | 评论:0