枫林在线论坛精华区>>程序设计
[53229] 主题: 想学C的进来看一看(之二)[转贴]
作者:  (顾左右而言他)
标题: 想学C的进来看一看(之二)[转贴][转载]
来自: 218.79.*.*
发贴时间: 2003年04月29日 23:08:43
长度: 7786字
函数(1)

  C程序是由一组或是变量或是函数的外部对象组成的。 函数是一个自
我包含的
完成一定相关功能的执行代码段。我们可以把函数看成一个"黑盒子
", 你只要将数
据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不
知道的。
外部程序所知道的仅限于输入给函数什么以及函数输出什么。函数提供了
编制程序
的手段, 使之容易读、写、理解、排除错误、修改和维护。
    C程序中函数的数目实际上是不限的, 如果说有什么限制的话, 那就是
, 一个C
程序中必须至少有一个函数, 而且其中必须有一个并且仅有一个以main为
名, 这个
函数称为主函数, 整个程序从这个主函数开始执行。
      C 语言程序鼓励和提倡人们把一个大问题划分成一个个子问题, 
对应于解决一
个子问题编制一个函数, 因此, C 语言程序一般是由大量的小函数而不是
由少量大
函数构成的, 即所谓"小函数构成大程序"。这样的好处是让各
部分相互充分独立,
并且任务单一。因而这些充分独立的小模块也可以作为一种固定规格的小
"构件",
用来构成新的大程序。
      C语言的一个主要特点是可以建立库函数。Turbo C2.0提供的运行
程序库有400
多个函数, 每个函数都完成一定的功能, 可由用户随意调用。这些函数总
的分为输
入输出函数、数学函数、字符串和内存函数、与BIOS和DOS有关的函数、 
字符屏幕
和图形功能函数、过程控制函数、目录函数等。对这些库函数应熟悉其功
能, 只有
这样才可省去很多不必要的工作。
      本教程后半部分专门介绍Turbo C2.0的库函数, 并对每个函数都
给出例程, 读
者可以将自已需要的部分以块的方式定义, 然后将此块写入文件, 这样就
可以在进
入Turbo C2.0集成开发环境后, 直接调用此程序, 连接, 运行, 观察结果
, 以加深
对该函数的理解。
      用户编制Turbo C语言源程序, 就是利用Turbo C的库函数。可以
把所有使用的
库函数放在一个庞大的主函数里, 也可以按不同功能设计成一个个用户函
数而被其
它函数调用。Turbo C2.0建议用户使用后者, 当用户编制了一些较常用的
函数时,
只要将其存在函数库里, 在以后的编程中可被方便的调用而不需要再去编
译它们。
连接时将会自动从相应的库中装配成所需程序。   

1. 函数的说明与定义
    Turbo C2.0中所有函数与变量一样在使用之前必须说明。所谓说明是
指说明函
数是什么类型的函数, 一般库函数的说明都包含在相应的头文件<*.h&
gt;中,  例如标
准输入输出函数包含在stdio.h中, 非标准输入输出函数包含在io.h中,  
以后在使
用库函数时必须先知道该函数包含在什么样的头文件中, 在程序的开头用
#include
<*.h>或#include"*.h"说明。只有这样程序在编译, 连
接时Turbo C 才知道它是提
供的库函数, 否则, 将认为是用户自己编写的函数而不能装配。 

    1.1 函数说明 

    1. 经典方式
         其形式为:  函数类型   函数名();
    2. ANSI 规定方式
         其形式为:  函数类型  函数名(数据类型  形式参数,  数据类
型  形式
                    参数, ......);
    其中: 函数类型是该函数返回值的数据类型, 可以是以前介绍的整型
(int),
长整型(long), 字符型(char), 单浮点型(float), 双浮点型(double)以及
无值型
(void), 也可以是指针, 包括结构指针。无值型表示函数没有返回值。
    函数名为Turbo C2.0的标识符, 小括号中的内容为该函数的形式参数
说明。可
以只有数据类型而没有形式参数, 也可以两者都有。对于经典的函数说明
没有参数
信息。如:
     int putlll(int x,int y,int z,int color,char *p)/*说明一个整
型函数*/
     char *name(void);               /*说明一个字符串指什函数*/

     void student(int n, char *str); /*说明一个不返回值的函数*/

     float calculate();              /*说明一个浮点型函数*/
    注意: 如果一个函数没有说明就被调用, 编译程序并不认为出错, 而
将此函数
默认为整型(int)函数。因此当一个函数返回其它类型, 又没有事先说明,
  编译时
将会出错。 

    1.2 函数定义
 
    函数定义就是确定该函数完成什么功能以及怎么运行, 相当于其它语
言的一个
子程序。Turbo C2.0对函数的定义采用ANSI规定的方式。即:
       函数类型  函数名(数据类型形式参数; 数据类型 形式参数...)

      {
          函数体;
       }
    其中函数类型和形式参数的数据类型为Turbo C2.0的基本数据类型。
函数体为
Turbo C2.0提供的库函数和语句以及其它用户自定义函数调用语句的组合
, 并包括
在一对花括号"{"和"}"中。
    需要指出的是一个程序必须有一个主函数, 其它用户定义的子函数可
以是任意
多个, 这些函数的位置也没有什么限制, 可以在main()函数前,  也可以在
其后。
Turbo C2.0将所有函数都被认为是全局性的。而且是外部的, 即可以被另
一个文件
中的任何一个函数调用。 

2 函数的调用 

    2.1  函数的简单调用
    Turbo C2.0调用函数时直接使用函数名和实参的方法, 也就是将要赋
给被调用
函数的参量, 按该函数说明的参数形式传递过去, 然后进入子函数运行, 
运行结束
后再按子函数规定的数据类型返回一个值给调用函数。使用Turbo C2.0的
库函数就
是函数简单调用的方法。举例说明如下:
    例1:
     #include<stdio.h>
     int maxmum(int x, int y, int z);   /*说明一个用户自定义函数
*/
     int main()
     {
          int i, j, k;
          printf("i, j, k=?\n");
          scanf("%4d%4d%4d", &i, &j, &k);

          maxmum(i, j, k);
          getch();
          return 0;
     }
 
     maxmum(int x, int y, int z)
     {
          int max;
          max=x>y?x:y;
          max=max>z?max:z;
          printf("The maxmum value of the 3 data is %d\n&qu
ot;, max);
     } 

.2 函数参数传递
 
    一、调用函数向被调用函数以形式参数传递
    用户编写的函数一般在对其说明和定义时就规定了形式参数类型, 因
此调用这
些函数时参量必须与子函数中形式参数的数据类型、顺序和数量完全相同
, 否则在
调用中将会出错, 得到意想不到的结果。
    注意:
    当数组作为形式参数向被调用函数传递时, 只传递数组的地址, 而不
是将整个
数组元素都复制到函数中去, 即用数组名作为实参调用子函数, 调用时指
向该数组
第一个元素的指针就被传递给子函数。因为在Turbo C2.0中, 没有下标的
数组名就
是一个指向该数组第一个元素的指针。当然数组变量的类型在两个函数中
必须相同。
    用下述方法传递数组形参。
    例2:
     #include<stdio.h>
     void disp(int *n);
     int main()
     {
          int m, i;
          for(i=0; i<10; i++)
            m=i;
          disp(m);       /*按指针方式传递数组*/
          getch();
          return 0;
     }
     void disp(int *n)
     {
          int j;
          for(j=0; j<10; j++)
            printf("%3d", *(n++));
          printf("\n");
     }
    另外, 当传递数组的某个元素时, 数组元素作为实参, 此时按使用其
它简单变
量的方法使用数组元素。例2按传递数组元素的方法传递时变为:
     #include<stdio.h>
     void disp(int n);
     int main()
     {
          int m, i;
          for(i=0; i<10; i++){
            m=i;
            disp(m);  /*逐个传递数组元素*/
          }
          getch();
          return 0;
     }
     void disp(int n)
     {
          printf("%3d\t");
     }
这时一次只传递了数组的一个元素。 
2 函数的调用    


    2.2 函数参数传递 

二、被调用函数向调用函数返回值 

    一般使用return语句由被调用函数向调用函数返回值, 该语句有下列
用途:
    1. 它能立即从所在的函数中退出, 返回到调用它的程序中去。
    2. 返回一个值给调用它的函数。
    有两种方法可以终止子函数运行并返回到调用它的函数中: 一是执行
到函数的
最后一条语句后返回; 一是执行到语句return时返回。前者当子函数执行
完后仅返
回给调用函数一个0。若要返回一个值, 就必须用return语句。只需在ret
urn 语句
中指定返回的值即可。例1返回最大值时变为:
     例3:
     #include<stdio.h>
     int maxmum(int x, int y, int z);   /*说明一个用户自定义函数
*/
     int main()
     {
          int i, j, k, max;
          printf("i, j, k=?\n");
          scanf("%4d%4d%4d", &i, &j, &k);

          max=maxmum(i, j, k);     /*调用子函数, 并将返回值赋给m
ax*/
          printf("The maxmum value is %d\n", max);
          getch();
          return 0;
     }
 
     maxmum(int x, int y, int z)
     {
          int max;
          max=x>y?x:y;        /*求最大值*/
          max=max>z?max:z;
          return(max);        /*返回最大值*/
     }
    return语句可以向调用函数返回值, 但这种方法只能返回一个参数, 
在许多情
况下要返回多个参数, 这是用return语句就不能满足要求。Turob C2.0提
供了另一
种参数传递的方法, 就是调用函数向被调用函数传递的形式参数不是传递
变量本身,
而是传递变量的地址, 当子函数中向相应的地址写入不同的数值之后, 也
就改变了
调用函数中相应变量的值, 从而达到了返回多个变量的目的。 
 
~~~~~~~~~~~~~~~~~~~~
※作者已于 2003-04-29 23:09:42 修改本文※

~~~~~~~~~~~~~~~~~~~~

========== * * * * * ==========
作者:  (顾左右而言他)
标题: RE:
来自: 218.79.*.*
发贴时间: 2003年04月29日 23:10:14
长度: 5677字
2.2 函数参数传递 

二、被调用函数向调用函数返回值 

    下面以两个例子来解释一下。
     例4:
     #include<stdio.h>
     void subfun(int *m, int *n);  /*说明子函数*/
     int main()
     {
          int i, j;
          printf("i, j=?\n");
          scanf("%d, %d", &i, &j); /*从键盘输入
2个整数*/
          printf("In main before calling\n"/*输出此2数
及其乘积*/
                 "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j
);
          subfun(&i, &j);          /*以传送地址的方式调用
子函数*/
          printf("In main after calling\n"/*调用子函数
后输出变量值*/
                 "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j
);
          getch();
          return 0;
     }
     void subfun(int *m, int *n)
     {
          *m=*m+2;
          *j=*i-*j;
          printf("In subfun after calling\n" /*子函数中
输出变量值*/
                 "i=%-4d j=%-4d i*j=%-4d\n", *i, *j, *
i**j);
      } 

    上例中, *i**j表示指针i和j所指的两个整型数*i和*j之乘积。 

   另外, return语句也可以返回一个指针, 举例如下。
    下例中先等待输入一字符串, 再等待输入要查找的字符, 然后调用ma
tch() 函
数在字符串中查找该字符。若有相同字符, 则返回一个指向该字符串中这
一位置的
指针, 如果没有找到, 则返回一个空(NULL)指针。
    例5:
     #include<stdio.h>
     char *match(char c, char *s);
     int main()
     {
          char s, c, *str;
          str=malloc(40);          /*为字符串指什分配内存空间*/

          printf("Please input character string:");
          gets(s);                 /*键盘输入字符串*/
          printf("Please input one character:");
          c=getche();              /*键盘输入字符*/
          str=match(c, s);         /*调用子函数*/
          putchar('\n');
          puts(str);               /*输出子函数返回的指针所指的字
符串*/
          getch();
          return 0;
     }
     char *match(char c, char *s)
     {
          int i=0;
          while(c!=s&&s!='\n')/*找字符串中指定的字符*/
               i++;
          return(&s);           /*返回所找字符的地址*/
     } 

2.2 函数参数传递 

三、用全程变量实现参数互传
    以上两种办法可以在调用函数和被调用函数间传递参数, 但使用不太
方便。如
果将所要传递的参数定义为全程变量, 可使变量在整个程序中对所有函数
都可见。
这样相当于在调用函数和被调用函数之间实现了参数的传递和返回。这也
是实际中
经常使用的方法, 但定义全程变量势必长久地占用了内存。因此, 全程变
量的数目
受到限制, 特别对于较大的数组更是如此。当然对于绝大多数程序内存都
是够用的。
    例6:
     #incluide<stdio.h>
     void disp(void);
     int m;          /*定义全程变量*/
     int main()
     {
          int i;
          printf("In main before calling\n");
          for(i=0; i<10; i++){
            m=i;
            printf("%3d", m);   /*输出调用子函数前数组
的值*/
          }
          disp();                  /*调用子函数*/
          printf("\nIn main after calling\n");
          for(i=0; i<10; i++)
            printf("%3d", m);   /*输出调用子函数后数组
的值*/
          getch();
          return 0;
     }
     void disp(void)
     {
          int j;
          printf("In subfunc after calling\n");/*子函数
中输出数组的值*/
          for (j=0; i<10; j++){
               m=m*10;
               printf("%3d", m);
          }

2.3 函数的递归调用
    Turbo C2.0允许函数自己调用自己, 即函数的递归调用, 递归调用可
以使程序
简洁、代码紧凑, 但要牺牲内存空间作处理时的堆栈。
    如要求一个n!(n的阶乘)的值可用下面递归调用:
    例8:
      #include<stdio.h>
      unsigned ling mul(int n);
      int main()
     {
          int m;
          puts("Calculate n! n=?\n");
          scanf("%d", &m);         /*键盘输入数据*
/
          printf("%d!=%ld\n", m, mul(m));/*调用子程序计
算并输出*/
          getch();
          retun 0;
      }
     unsigned long mul(int n)
     {
          unsigned long p;
          if(n>1)
               p=n*mul(n-1);       /*递归调用计算n!*/
          else
               p=1L;
          return(p);               /*返回结果*/
     }
运行结果:
          calculate n!  n=?
输入5时结果为:
          5!=120 
3. 函数作用范围
 
    Turbo C2.0中每个函数都是独立的代码块, 函数代码归该函数所有, 
除了对函
数的调用以外, 其它任何函数中的任何语句都不能访问它。例如使用跳转
语句goto
就不能从一个函数跳进其它函数内部。除非使用全程变量, 否则一个函数
内部定义
的程序代码和数据, 不会与另一个函数内的程序代码和数据相互影响。
    Turbo C2.0中所有函数的作用域都处于同一嵌套程度, 即不能在一个
函数内再
说明或定义另一个函数。
    Turbo C2.0中一个函数对其它子函数的调用是全程的, 即是函数在不
同的文件
中, 也不必附加任何说明语句而被另一函数调用, 也就是说一个函数对于
整个程序
都是可见的。 

    4. 函数的变量作用域
    在Turbo C2.0中, 变是可以在各个层次的子程序中加以说明, 也就是
说, 在任
何函数中, 变量说明有只允许在一个函数体的开头处说明, 而且允许变量
的说明(
包括初始化)跟在一个复合语句的左花括号的后面, 直到配对的右花括号为
止。它
的作用域仅在这对花括号内, 当程序执行到出花括号时, 它将不复存在。
当然, 内
层中的变量即使与外层中的变量名字相同, 它们之间也是没有关系的。
    例9.
     #include<stdio.h>
     int i=10;
     int main()
     {
          int i=1;
          printf("%d\t, i);
          {
               int i=2;
               pritnf("%d\t", i);
               {
                    extern i;
                    i+=1;
                    printf("%d\t", i);
               }
               printf("%d\t", ++i);
          }
          printf("%d\n", ++i);
          return 0;
     }
 运行结果为
     1    2    11   3    2
 从程序运行的结果不难看出程序中各变量之间的关系, 以及各个变量的作
用域。

========== * * * * * ==========
作者:  (顾左右而言他)
标题: RE:
来自: 218.79.*.*
发贴时间: 2003年04月29日 23:12:08
长度: 15482字
函数篇(a)

   函数名: abort 

功 能: 异常终止一个进程 
用 法: void abort(void); 
程序例: 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 

printf("Calling abort()\n"); 
abort(); 
return 0; /* This is never reached */ 


函数名: abs 
功 能: 求整数的绝对值 
用 法: int abs(int i); 
程序例: 
#include <stdio.h> 
#include <math.h> 

int main(void) 

int number = -1234; 

printf("number: %d absolute value: %d\n", number, abs(
number)); 
return 0; 


函数名: absread, abswirte 
功 能: 绝对磁盘扇区读、写数据 
用 法: int absread(int drive, int nsects, int sectno, void *buff
er); 
int abswrite(int drive, int nsects, in tsectno, void *buffer); 

程序例: 
/* absread example */ 

#include <stdio.h> 
#include <conio.h> 
#include <process.h> 
#include <dos.h> 

int main(void) 

int i, strt, ch_out, sector; 
char buf; 

printf("Insert a diskette into drive A and press any key\n&
quot;); 
getch(); 
sector = 0; 
if (absread(0, 1, sector, &buf) != 0) 

perror("Disk problem"); 
exit(1); 

printf("Read OK\n"); 
strt = 3; 
for (i=0; i<80; i++) 

ch_out = buf; 
putchar(ch_out); 

printf("\n"); 
return(0); 


函数名: access 
功 能: 确定文件的访问权限 
用 法: int access(const char *filename, int amode); 
程序例: 
#include <stdio.h> 
#include <io.h> 

int file_exists(char *filename); 

int main(void) 

printf("Does NOTEXIST.FIL exist: %s\n", 
file_exists("NOTEXISTS.FIL") ? "YES" : "
;NO"); 
return 0; 


int file_exists(char *filename) 

return (access(filename, 0) == 0); 


函数名: acos 
功 能: 反余弦函数 
用 法: double acos(double x); 
程序例: 
#include <stdio.h> 
#include <math.h> 

int main(void) 

double result; 
double x = 0.5; 

result = acos(x); 
printf("The arc cosine of %lf is %lf\n", x, result); 

return 0; 


函数名: allocmem 
功 能: 分配DOS存储段 
用 法: int allocmem(unsigned size, unsigned *seg); 
程序例: 
#include <dos.h> 
#include <alloc.h> 
#include <stdio.h> 

int main(void) 

unsigned int size, segp; 
int stat; 

size = 64; /* (64 x 16) = 1024 bytes */ 
stat = allocmem(size, &segp); 
if (stat == -1) 
printf("Allocated memory at segment: %x\n", segp); 
else 
printf("Failed: maximum number of paragraphs available is %
u\n", 
stat); 

return 0; 


函数名: arc 
功 能: 画一弧线 
用 法: void far arc(int x, int y, int stangle, int endangle, int
 radius); 
程序例: 
#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int midx, midy; 
int stangle = 45, endangle = 135; 
int radius = 100; 

/* initialize graphics and local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); /* an error occurred */ 
if (errorcode != grOk) 

printf("Graphics error: %s\n", grapherrormsg(errorcode
)); 
printf("Press any key to halt:"); 
getch(); 

exit(1); /* terminate with an error code */ 


midx = getmaxx() / 2; 
midy = getmaxy() / 2; 
setcolor(getmaxcolor()); 

/* draw arc */ 
arc(midx, midy, stangle, endangle, radius); 

/* clean up */ 
getch(); 
closegraph(); 
return 0; 


函数名: asctime 
功 能: 转换日期和时间为ASCII码 
用 法: char *asctime(const struct tm *tblock); 
程序例: 
#include <stdio.h> 
#include <string.h> 
#include <time.h> 

int main(void) 

struct tm t; 
char str; 

/* sample loading of tm structure */ 

t.tm_sec = 1; /* Seconds */ 
t.tm_min = 30; /* Minutes */ 
t.tm_hour = 9; /* Hour */ 
t.tm_mday = 22; /* Day of the Month */ 
t.tm_mon = 11; /* Month */ 
t.tm_year = 56; /* Year - does not include century */ 
t.tm_wday = 4; /* Day of the week */ 
t.tm_yday = 0; /* Does not show in asctime */ 
t.tm_isdst = 0; /* Is Daylight SavTime; does not show in asctime
 */ 

/* converts structure to null terminated 
string */ 

strcpy(str, asctime(&t)); 
printf("%s\n", str); 

return 0; 


函数名: asin 
功 能: 反正弦函数 
用 法: double asin(double x); 
程序例: 
#include <stdio.h> 
#include <math.h> 

int main(void) 

double result; 
double x = 0.5; 

result = asin(x); 
printf("The arc sin of %lf is %lf\n", x, result); 
return(0); 


函数名: assert 
功 能: 测试一个条件并可能使程序终止 
用 法: void assert(int test); 
程序例: 
#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 

struct ITEM { 
int key; 
int value; 
}; 

/* add item to list, make sure list is not null */ 
void additem(struct ITEM *itemptr) { 
assert(itemptr != NULL); 
/* add item to list */ 


int main(void) 

additem(NULL); 
return 0; 


函数名: atan 
功 能: 反正切函数 
用 法: double atan(double x); 
程序例: 
#include <stdio.h> 
#include <math.h> 

int main(void) 

double result; 
double x = 0.5; 

result = atan(x); 
printf("The arc tangent of %lf is %lf\n", x, result); 

return(0); 


函数名: atan2 
功 能: 计算Y/X的反正切值 
用 法: double atan2(double y, double x); 
程序例: 
#include <stdio.h> 
#include <math.h> 

int main(void) 

double result; 
double x = 90.0, y = 45.0; 

result = atan2(y, x); 
printf("The arc tangent ratio of %lf is %lf\n", (y / x
), result); 
return 0; 


函数名: atexit 
功 能: 注册终止函数 
用 法: int atexit(atexit_t func); 
程序例: 
#include <stdio.h> 
#include <stdlib.h> 

void exit_fn1(void) 

printf("Exit function #1 called\n"); 


void exit_fn2(void) 

printf("Exit function #2 called\n"); 


int main(void) 

/* post exit function #1 */ 
atexit(exit_fn1); 
/* post exit function #2 */ 
atexit(exit_fn2); 
return 0; 


函数名: atof 
功 能: 把字符串转换成浮点数 
用 法: double atof(const char *nptr); 
程序例: 
#include <stdlib.h> 
#include <stdio.h> 

int main(void) 

float f; 
char *str = "12345.67"; 

f = atof(str); 
printf("string = %s float = %f\n", str, f); 
return 0; 


函数名: atoi 
功 能: 把字符串转换成长整型数 
用 法: int atoi(const char *nptr); 
程序例: 
#include <stdlib.h> 
#include <stdio.h> 

int main(void) 

int n; 
char *str = "12345.67"; 

n = atoi(str); 
printf("string = %s integer = %d\n", str, n); 
return 0; 


函数名: atol 
功 能: 把字符串转换成长整型数 
用 法: long atol(const char *nptr); 
程序例: 

#include <stdlib.h> 
#include <stdio.h> 

int main(void) 

long l; 
char *str = "98765432"; 

l = atol(lstr); 
printf("string = %s integer = %ld\n", str, l); 
return(0); 


函数篇(b)

   函数名: bar
功 能: 画一个二维条形图 
用 法: void far bar(int left, int top, int right, int bottom); 

程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int midx, midy, i; 

/* initialize graphics and local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); 
if (errorcode != grOk) /* an error occurred */ 

printf("Graphics error: %s\n", grapherrormsg(errorcode
)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); /* terminate with an error code */ 


midx = getmaxx() / 2; 
midy = getmaxy() / 2; 

/* loop through the fill patterns */ 
for (i=SOLID_FILL; i<USER_FILL; i++) 

/* set the fill style */ 
setfillstyle(i, getmaxcolor()); 

/* draw the bar */ 
bar(midx-50, midy-50, midx+50, 
midy+50); 

getch(); 


/* clean up */ 
closegraph(); 
return 0; 


函数名: bar3d 
功 能: 画一个三维条形图 
用 法: void far bar3d(int left, int top, int right, int bottom, 

int depth, int topflag); 
程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int midx, midy, i; 

/* initialize graphics, local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); 
if (errorcode != grOk) /* an error occurred */ 

printf("Graphics error: %s\n", grapherrormsg(errorcode
)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); /* terminate with error code */ 


midx = getmaxx() / 2; 
midy = getmaxy() / 2; 

/* loop through the fill patterns */ 
for (i=EMPTY_FILL; i<USER_FILL; i++) 

/* set the fill style */ 
setfillstyle(i, getmaxcolor()); 

/* draw the 3-d bar */ 
bar3d(midx-50, midy-50, midx+50, midy+50, 10, 1); 

getch(); 


/* clean up */ 
closegraph(); 
return 0; 


函数名: bdos 
功 能: DOS系统调用 
用 法: int bdos(int dosfun, unsigned dosdx, unsigned dosal); 
程序例: 

#include <stdio.h> 
#include <dos.h> 

/* Get current drive as 'A', 'B', ... */ 
char current_drive(void) 

char curdrive; 

/* Get current disk as 0, 1, ... */ 
curdrive = bdos(0x19, 0, 0); 
return('A' + curdrive); 


int main(void) 

printf("The current drive is %c:\n", current_drive());
 
return 0; 


函数名: bdosptr 
功 能: DOS系统调用 
用 法: int bdosptr(int dosfun, void *argument, unsigned dosal); 

程序例: 

#include <string.h> 
#include <stdio.h> 
#include <dir.h> 
#include <dos.h> 
#include <errno.h> 
#include <stdlib.h> 

#define BUFLEN 80 

int main(void) 

char buffer; 
int test; 

printf("Enter full pathname of a directory\n"); 
gets(buffer); 

test = bdosptr(0x3B,buffer,0); 
if(test) 

printf("DOS error message: %d\n", errno); 
/* See errno.h for error listings */ 
exit (1); 


getcwd(buffer, BUFLEN); 
printf("The current directory is: %s\n", buffer); 

return 0; 


函数名: bioscom 
功 能: 串行I/O通信 
用 法: int bioscom(int cmd, char abyte, int port); 
程序例: 

#include <bios.h> 
#include <conio.h> 

#define COM1 0 
#define DATA_READY 0x100 
#define TRUE 1 
#define FALSE 0 

#define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00) 

int main(void) 

int in, out, status, DONE = FALSE; 

bioscom(0, SETTINGS, COM1); 
cprintf("... BIOSCOM  to exit ...\n"); 
while (!DONE) 

status = bioscom(3, 0, COM1); 
if (status & DATA_READY) 
if ((out = bioscom(2, 0, COM1) & 0x7F) != 0) 
putch(out); 
if (kbhit()) 

if ((in = getch()) == '\x1B') 
DONE = TRUE; 
bioscom(1, in, COM1); 


return 0; 


函数名: biosdisk 
功 能: 软硬盘I/O 
用 法: int biosdisk(int cmd, int drive, int head, int track, int
 sector 
int nsects, void *buffer); 
程序例: 

#include <bios.h> 
#include <stdio.h> 

int main(void) 

int result; 
char buffer; 

printf("Testing to see if drive a: is ready\n"); 
result = biosdisk(4,0,0,0,0,1,buffer); 
result &= 0x02; 
(result) ? (printf("Drive A: Ready\n")) : 
(printf("Drive A: Not Ready\n")); 

return 0; 


函数名: biosequip 
功 能: 检查设备 
用 法: int biosequip(void); 
程序例: 

#include <bios.h> 
#include <stdio.h> 

int main(void) 

int result; 
char buffer; 

printf("Testing to see if drive a: is ready\n"); 
result = biosdisk(4,0,0,0,0,1,buffer); 
result &= 0x02; 
(result) ? (printf("Drive A: Ready\n")) : 
(printf("Drive A: Not Ready\n")); 

return 0; 


函数名: bioskey 
功 能: 直接使用BIOS服务的键盘接口 
用 法: int bioskey(int cmd); 
程序例: 

#include <stdio.h> 
#include <bios.h> 
#include <ctype.h> 

#define RIGHT 0x01 
#define LEFT 0x02 
#define CTRL 0x04 
#define ALT 0x08 

int main(void) 

int key, modifiers; 

/* function 1 returns 0 until a key is pressed */ 
while (bioskey(1) == 0); 

/* function 0 returns the key that is waiting */ 
key = bioskey(0); 

/* use function 2 to determine if shift keys were used */ 
modifiers = bioskey(2); 
if (modifiers) 

printf(""); 

/* print out the character read */ 
if (isalnum(key & 0xFF)) 
printf("'%c'\n", key); 
else 
printf("%#02x\n", key); 
return 0; 


函数名: biosmemory 
功 能: 返回存储块大小 
用 法:int biosmemory(void); 
程序例: 

#include <stdio.h> 
#include <bios.h> 

int main(void) 

int memory_size; 

memory_size = biosmemory(); /* returns value up to 640K */ 
printf("RAM size = %dK\n",memory_size); 
return 0; 


函数名: biosprint 
功 能: 直接使用BIOS服务的打印机I/O 
用 法: int biosprint(int cmd, int byte, int port); 
程序例: 

#include <stdio.h> 
#include <conio.h> 
#include <bios.h> 

int main(void) 

#define STATUS 2 /* printer status command */ 
#define PORTNUM 0 /* port number for LPT1 */ 

int status, abyte=0; 

printf("Please turn off your printer. Press any key to cont
inue\n"); 
getch(); 
status = biosprint(STATUS, abyte, PORTNUM); 
if (status & 0x01) 
printf("Device time out.\n"); 
if (status & 0x08) 
printf("I/O error.\n"); 

if (status & 0x10) 
printf("Selected.\n"); 
if (status & 0x20) 
printf("Out of paper.\n"); 

if (status & 0x40) 
printf("Acknowledge.\n"); 
if (status & 0x80) 
printf("Not busy.\n"); 

return 0; 


函数名: biostime 
功 能: 读取或设置BIOS时间 
用 法: long biostime(int cmd, long newtime); 
程序例: 

#include <stdio.h> 
#include <bios.h> 
#include <time.h> 
#include <conio.h> 

int main(void) 

long bios_time; 

clrscr(); 
cprintf("The number of clock ticks since midnight is:\r\n&q
uot;); 
cprintf("The number of seconds since midnight is:\r\n"
); 
cprintf("The number of minutes since midnight is:\r\n"
); 
cprintf("The number of hours since midnight is:\r\n");
 
cprintf("\r\nPress any key to quit:"); 
while(!kbhit()) 

bios_time = biostime(0, 0L); 

gotoxy(50, 1); 
cprintf("%lu", bios_time); 

gotoxy(50, 2); 
cprintf("%.4f", bios_time / CLK_TCK); 

gotoxy(50, 3); 
cprintf("%.4f", bios_time / CLK_TCK / 60); 

gotoxy(50, 4); 
cprintf("%.4f", bios_time / CLK_TCK / 3600); 

return 0; 


函数名: brk 
功 能: 改变数据段空间分配 
用 法: int brk(void *endds); 
程序例: 

#include <stdio.h> 
#include <alloc.h> 

int main(void) 

char *ptr; 

printf("Changing allocation with brk()\n"); 
ptr = malloc(1); 
printf("Before brk() call: %lu bytes free\n", coreleft
()); 
brk(ptr+1000); 
printf(" After brk() call: %lu bytes free\n", coreleft
()); 
return 0; 


函数名: bsearch
功 能: 二分法搜索 
用 法: void *bsearch(const void *key, const void *base, size_t *
nelem, 
size_t width, int(*fcmp)(const void *, const *)); 
程序例: 

#include <stdlib.h> 
#include <stdio.h> 

#define NELEMS(arr) (sizeof(arr) / sizeof(arr)) 

int numarray = {123, 145, 512, 627, 800, 933}; 

int numeric (const int *p1, const int *p2) 

return(*p1 - *p2); 


int lookup(int key) 

int *itemptr; 

/* The cast of (int(*)(const void *,const void*)) 
is needed to avoid a type mismatch error at 
compile time */ 
itemptr = bsearch (&key, numarray, NELEMS(numarray), 
sizeof(int), (int(*)(const void *,const void *))numeric); 
return (itemptr != NULL); 


int main(void) 

if (lookup(512)) 
printf("512 is in the table.\n"); 
else 
printf("512 isn't in the table.\n"); 

return 0; 


========== * * * * * ==========
作者:  (顾左右而言他)
标题: RE:
来自: 218.79.*.*
发贴时间: 2003年04月29日 23:12:59
长度: 7176字
函数篇(c)

函数名: cabs 
功 能: 计算复数的绝对值 
用 法: double cabs(struct complex z); 
程序例: 

#include <stdio.h> 
#include <math.h> 

int main(void) 

struct complex z; 
double val; 

z.x = 2.0; 
z.y = 1.0; 
val = cabs(z); 

printf("The absolute value of %.2lfi %.2lfj is %.2lf",
 z.x, z.y, val); 
return 0; 


函数名: calloc 
功 能: 分配主存储器 
用 法: void *calloc(size_t nelem, size_t elsize); 
程序例: 

#include <stdio.h> 
#include <alloc.h> 

int main(void) 

char *str = NULL; 

/* allocate memory for string */ 
str = calloc(10, sizeof(char)); 

/* copy "Hello" into string */ 
strcpy(str, "Hello"); 

/* display string */ 
printf("String is %s\n", str); 

/* free memory */ 
free(str); 

return 0; 


函数名: ceil 
功 能: 向上舍入 
用 法: double ceil(double x); 
程序例: 

#include <math.h> 
#include <stdio.h> 

int main(void) 

double number = 123.54; 
double down, up; 

down = floor(number); 
up = ceil(number); 

printf("original number %5.2lf\n", number); 
printf("number rounded down %5.2lf\n", down); 
printf("number rounded up %5.2lf\n", up); 

return 0; 


函数名: cgets 
功 能: 从控制台读字符串 
用 法: char *cgets(char *str); 
程序例: 

#include <stdio.h> 
#include <conio.h> 

int main(void) 

char buffer; 
char *p; 

/* There's space for 80 characters plus the NULL terminator */ 

buffer = 81; 

printf("Input some chars:"); 
p = cgets(buffer); 
printf("\ncgets read %d characters: \"%s\"\n"
;, buffer, p); 
printf("The returned pointer is %p, buffer is at %p\n"
, p, &buffer); 

/* Leave room for 5 characters plus the NULL terminator */ 
buffer = 6; 

printf("Input some chars:"); 
p = cgets(buffer); 
printf("\ncgets read %d characters: \"%s\"\n"
;, buffer, p); 
printf("The returned pointer is %p, buffer is at %p\n"
, p, &buffer); 
return 0; 


函数名: chdir 
功 能: 改变工作目录 
用 法: int chdir(const char *path); 
程序例: 

#include <stdio.h> 
#include <stdlib.h> 
#include <dir.h> 

char old_dir; 
char new_dir; 

int main(void) 

if (getcurdir(0, old_dir)) 

perror("getcurdir()"); 
exit(1); 

printf("Current directory is: \\%s\n", old_dir); 

if (chdir("\\")) 

perror("chdir()"); 
exit(1); 


if (getcurdir(0, new_dir)) 

perror("getcurdir()"); 
exit(1); 

printf("Current directory is now: \\%s\n", new_dir); 


printf("\nChanging back to orignal directory: \\%s\n",
 old_dir); 
if (chdir(old_dir)) 

perror("chdir()"); 
exit(1); 


return 0; 


函数名: _chmod, chmod 
功 能: 改变文件的访问方式 
用 法: int chmod(const char *filename, int permiss); 
程序例: 

#include <sys\stat.h> 
#include <stdio.h> 
#include <io.h> 

void make_read_only(char *filename); 

int main(void) 

make_read_only("NOTEXIST.FIL"); 
make_read_only("MYFILE.FIL"); 
return 0; 


void make_read_only(char *filename) 

int stat; 

stat = chmod(filename, S_IREAD); 
if (stat) 
printf("Couldn't make %s read-only\n", filename); 
else 
printf("Made %s read-only\n", filename); 


函数名: chsize 
功 能: 改变文件大小 
用 法: int chsize(int handle, long size); 
程序例: 

#include <string.h> 
#include <fcntl.h> 
#include <io.h> 

int main(void) 

int handle; 
char buf = "0123456789"; 

/* create text file containing 10 bytes */ 
handle = open("DUMMY.FIL", O_CREAT); 
write(handle, buf, strlen(buf)); 

/* truncate the file to 5 bytes in size */ 
chsize(handle, 5); 

/* close the file */ 
close(handle); 
return 0; 


函数名: circle 
功 能: 在给定半径以(x, y)为圆心画圆 
用 法: void far circle(int x, int y, int radius); 
程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int midx, midy; 
int radius = 100; 

/* initialize graphics and local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); 
if (errorcode != grOk) /* an error occurred */ 

printf("Graphics error: %s\n", grapherrormsg(errorcode
)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); /* terminate with an error code */ 


midx = getmaxx() / 2; 
midy = getmaxy() / 2; 
setcolor(getmaxcolor()); 

/* draw the circle */ 
circle(midx, midy, radius); 

/* clean up */ 
getch(); 
closegraph(); 
return 0; 


函数篇(d)

 函数名: delay 
功 能: 将程序的执行暂停一段时间(毫秒) 
用 法: void delay(unsigned milliseconds); 
程序例: 
/* Emits a 440-Hz tone for 500 milliseconds */ 
#include <dos.h> 

int main(void) 

sound(440); 
delay(500); 
nosound(); 

return 0; 


函数名: delline 
功 能: 在文本窗口中删去一行 
用 法: void delline(void); 
程序例: 

#include <conio.h> 

int main(void) 

clrscr(); 
cprintf("The function DELLINE deletes \ 
the line containing the\r\n"); 
cprintf("cursor and moves all lines \ 
below it one line up.\r\n"); 
cprintf("DELLINE operates within the \ 
currently active text\r\n"); 
cprintf("window. Press any key to \ 
continue . . ."); 
gotoxy(1,2); /* Move the cursor to the 
second line and first column */ 
getch(); 

delline(); 
getch(); 

return 0; 


函数名: detectgraph 
功 能: 通过检测硬件确定图形驱动程序和模式 
用 法: void far detectgraph(int far *graphdriver, int far *graph
mode); 
程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

/* names of the various cards supported */ 
char *dname = { "requests detection", 
"a CGA", 
"an MCGA", 
"an EGA", 
"a 64K EGA", 
"a monochrome EGA", 
"an IBM 8514", 
"a Hercules monochrome", 
"an AT&T 6300 PC", 
"a VGA", 
"an IBM 3270 PC" 
}; 

int main(void) 

/* returns detected hardware info. */ 
int gdriver, gmode, errorcode; 

/* detect graphics hardware available */ 
detectgraph(&gdriver, &gmode); 

/* read result of detectgraph call */ 
errorcode = graphresult(); 
if (errorcode != grOk) /* an error 
occurred */ 

printf("Graphics error: %s\n", \ 
grapherrormsg(errorcode)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); /* terminate with an error 
code */ 


/* display the information detected */ 
clrscr(); 
printf("You have %s video display \ 
card.\n", dname); 
printf("Press any key to halt:"); 
getch(); 
return 0; 


函数名: difftime 
功 能: 计算两个时刻之间的时间差 
用 法: double difftime(time_t time2, time_t time1); 
程序例: 

#include <time.h> 
#include <stdio.h> 
#include <dos.h> 
#include <conio.h> 

int main(void) 

time_t first, second; 

clrscr(); 
first = time(NULL); /* Gets system 
time */ 
delay(2000); /* Waits 2 secs */ 
second = time(NULL); /* Gets system time 
again */ 

printf("The difference is: %f \ 
seconds\n",difftime(second,first)); 
getch(); 

return 0; 


========== * * * * * ==========
作者:  (顾左右而言他)
标题: RE:
来自: 218.79.*.*
发贴时间: 2003年04月29日 23:14:07
长度: 10504字
函数名: dup 
功 能: 复制一个文件句柄 
用 法: int dup(int handle); 
程序例: 

#include <string.h> 
#include <stdio.h> 
#include <conio.h> 
#include <io.h> 

void flush(FILE *stream); 

int main(void) 

FILE *fp; 
char msg = "This is a test"; 

/* create a file */ 
fp = fopen("DUMMY.FIL", "w"); 

/* write some data to the file */ 
fwrite(msg, strlen(msg), 1, fp); 

clrscr(); 
printf("Press any key to flush \ 
DUMMY.FIL:"); 
getch(); 

/* flush the data to DUMMY.FIL without 
closing it */ 
flush(fp); 

printf("\nFile was flushed, Press any \ 
key to quit:"); 
getch(); 
return 0; 


void flush(FILE *stream) 

int duphandle; 

/* flush TC's internal buffer */ 
fflush(stream); 

/* make a duplicate file handle */ 
duphandle = dup(fileno(stream)); 

/* close the duplicate handle to flush the 
DOS buffer */ 
close(duphandle); 


函数名: dup2 
功 能: 复制文件句柄 
用 法: int dup2(int oldhandle, int newhandle); 
程序例: 

#include <sys\stat.h> 
#include <string.h> 
#include <fcntl.h> 
#include <io.h> 

int main(void) 

#define STDOUT 1 

int nul, oldstdout; 
char msg = "This is a test"; 

/* create a file */ 
nul = open("DUMMY.FIL", O_CREAT | O_RDWR, 
S_IREAD | S_IWRITE); 

/* create a duplicate handle for standard 
output */ 
oldstdout = dup(STDOUT); 
/* 
redirect standard output to DUMMY.FIL 
by duplicating the file handle onto the 
file handle for standard output. 
*/ 
dup2(nul, STDOUT); 

/* close the handle for DUMMY.FIL */ 
close(nul); 

/* will be redirected into DUMMY.FIL */ 
write(STDOUT, msg, strlen(msg)); 

/* restore original standard output 
handle */ 
dup2(oldstdout, STDOUT); 

/* close duplicate handle for STDOUT */ 
close(oldstdout); 

return 0; 


函数篇(e)

 函数名: ecvt 
功 能: 把一个浮点数转换为字符串 
用 法: char ecvt(double value, int ndigit, int *decpt, int *sign
); 
程序例: 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

char *string; 
double value; 
int dec, sign; 
int ndig = 10; 

clrscr(); 
value = 9.876; 
string = ecvt(value, ndig, &dec, &sign); 
printf("string = %s dec = %d \ 
sign = %d\n", string, dec, sign); 

value = -123.45; 
ndig= 15; 
string = ecvt(value,ndig,&dec,&sign); 
printf("string = %s dec = %d sign = %d\n", 
string, dec, sign); 

value = 0.6789e5; /* scientific 
notation */ 
ndig = 5; 
string = ecvt(value,ndig,&dec,&sign); 
printf("string = %s dec = %d\ 
sign = %d\n", string, dec, sign); 

return 0; 


函数名: ellipse 
功 能: 画一椭圆 
用 法: void far ellipse(int x, int y, int stangle, int endangle,
 
int xradius, int yradius); 
程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int midx, midy; 
int stangle = 0, endangle = 360; 
int xradius = 100, yradius = 50; 

/* initialize graphics, local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); 
if (errorcode != grOk) 
/* an error occurred */ 

printf("Graphics error: %s\n", 
grapherrormsg(errorcode)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); 
/* terminate with an error code */ 


midx = getmaxx() / 2; 
midy = getmaxy() / 2; 
setcolor(getmaxcolor()); 

/* draw ellipse */ 
ellipse(midx, midy, stangle, endangle, 
xradius, yradius); 

/* clean up */ 
getch(); 
closegraph(); 
return 0; 


函数名: enable 
功 能: 开放硬件中断 
用 法: void enable(void); 
程序例: 

/* ** NOTE: 
This is an interrupt service routine. You can NOT compile this p
rogram 
with Test Stack Overflow turned on and get an executable file wh
ich will 
operate correctly. 
*/ 

#include <stdio.h> 
#include <dos.h> 
#include <conio.h> 

/* The clock tick interrupt */ 
#define INTR 0X1C 

void interrupt ( *oldhandler)(void); 

int count=0; 

void interrupt handler(void) 

/* 
disable interrupts during the handling of the interrupt 
*/ 
disable(); 
/* increase the global counter */ 
count++; 
/* 
re enable interrupts at the end of the handler 
*/ 
enable(); 
/* call the old routine */ 
oldhandler(); 


int main(void) 

/* save the old interrupt vector */ 
oldhandler = getvect(INTR); 

/* install the new interrupt handler */ 
setvect(INTR, handler); 

/* loop until the counter exceeds 20 */ 
while (count < 20) 
printf("count is %d\n",count); 

/* reset the old interrupt handler */ 
setvect(INTR, oldhandler); 

return 0; 


函数名: eof 
功 能: 检测文件结束 
用 法: int eof(int *handle); 
程序例: 

#include <sys\stat.h> 
#include <string.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <io.h> 

int main(void) 

int handle; 
char msg = "This is a test"; 
char ch; 

/* create a file */ 
handle = open("DUMMY.FIL", 
O_CREAT | O_RDWR, 
S_IREAD | S_IWRITE); 

/* write some data to the file */ 
write(handle, msg, strlen(msg)); 

/* seek to the beginning of the file */ 
lseek(handle, 0L, SEEK_SET); 

/* 
reads chars from the file until hit EOF 
*/ 
do 

read(handle, &ch, 1); 
printf("%c", ch); 
} while (!eof(handle)); 

close(handle); 
return 0; 


函数名: exec... 
功 能: 装入并运行其它程序的函数 
用 法: int execl(char *pathname, char *arg0, arg1, ..., argn, NU
LL); 
int execle(char *pathname, char *arg0, arg1, ..., argn, NULL, 
char *envp); 
int execlp(char *pathname, char *arg0, arg1, .., NULL); 
int execple(char *pathname, char *arg0, arg1, ..., NULL, 
char *envp); 
int execv(char *pathname, char *argv); 
int execve(char *pathname, char *argv, char *envp); 
int execvp(char *pathname, char *argv); 
int execvpe(char *pathname, char *argv, char *envp); 
程序例: 

/* execv example */ 
#include <process.h> 
#include <stdio.h> 
#include <errno.h> 

void main(int argc, char *argv) 

int i; 

printf("Command line arguments:\n"); 
for (i=0; i<argc; i++) 
printf(" : %s\n", i, argv); 

printf("About to exec child with arg1 arg2 ...\n"); 
execv("CHILD.EXE", argv); 

perror("exec error"); 

exit(1); 


函数名: exit 
功 能: 终止程序 
用 法: void exit(int status); 
程序例: 

#include <stdlib.h> 
#include <conio.h> 
#include <stdio.h> 

int main(void) 

int status; 

printf("Enter either 1 or 2\n"); 
status = getch(); 
/* Sets DOS errorlevel */ 
exit(status - '0'); 

/* Note: this line is never reached */ 
return 0; 


函数名: exp 
功 能: 指数函数 
用 法: double exp(double x); 
程序例: 

#include <stdio.h> 
#include <math.h> 

int main(void) 

double result; 
double x = 4.0; 

result = exp(x); 
printf("'e' raised to the power \ 
of %lf (e ^ %lf) = %lf\n", 
x, x, result); 

return 0; 
}  
函数名: fabs 
功 能: 返回浮点数的绝对值 
用 法: double fabs(double x); 
程序例: 

#include <stdio.h> 
#include <math.h> 

int main(void) 

float number = -1234.0; 

printf("number: %f absolute value: %f\n", 
number, fabs(number)); 
return 0; 


函数名: farcalloc 
功 能: 从远堆栈中申请空间 
用 法: void far *farcalloc(unsigned long units, unsigned ling un
itsz); 
程序例: 
#include <stdio.h> 
#include <alloc.h> 
#include <string.h> 
#include <dos.h> 

int main(void) 

char far *fptr; 
char *str = "Hello"; 

/* allocate memory for the far pointer */ 
fptr = farcalloc(10, sizeof(char)); 

/* copy "Hello" into allocated memory */ 
/* 
Note: movedata is used because you 
might be in a small data model, in 
which case a normal string copy routine 
can not be used since it assumes the 
pointer size is near. 
*/ 
movedata(FP_SEG(str), FP_OFF(str), 
FP_SEG(fptr), FP_OFF(fptr), 
strlen(str)); 

/* display string (note the F modifier) */ 
printf("Far string is: %Fs\n", fptr); 

/* free the memory */ 
farfree(fptr); 

return 0; 



函数名: farcoreleft 
功 能: 返回远堆中未作用存储区大小 
用 法: long farcoreleft(void); 
程序例: 

#include <stdio.h> 
#include <alloc.h> 

int main(void) 

printf("The difference between the\ 
highest allocated block in the\ 
far\n"); 
printf("heap and the top of the far heap\ 
is: %lu bytes\n", farcoreleft()); 

return 0; 



函数名: farfree 
功 能: 从远堆中释放一块 
用 法: void farfree(void); 
程序例: 

#include <stdio.h> 
#include <alloc.h> 
#include <string.h> 
#include <dos.h> 

int main(void) 

char far *fptr; 
char *str = "Hello"; 

/* allocate memory for the far pointer */ 
fptr = farcalloc(10, sizeof(char)); 

/* copy "Hello" into allocated memory */ 
/* 
Note: movedata is used because you might be in a small data mode
l, 
in which case a normal string copy routine can't be used since i

assumes the pointer size is near. 
*/ 
movedata(FP_SEG(str), FP_OFF(str), 
FP_SEG(fptr), FP_OFF(fptr), 
strlen(str)); 

/* display string (note the F modifier) */ 
printf("Far string is: %Fs\n", fptr); 

/* free the memory */ 
farfree(fptr); 

return 0; 



函数名: farmalloc 
功 能: 从远堆中分配存储块 
用 法: void far *farmalloc(unsigned long size); 
程序例: 

#include <stdio.h> 
#include <alloc.h> 
#include <string.h> 
#include <dos.h> 

int main(void) 

char far *fptr; 
char *str = "Hello"; 

/* allocate memory for the far pointer */ 
fptr = farmalloc(10); 

/* copy "Hello" into allocated memory */ 
/* 
Note: movedata is used because we might 
be in a small data model, in which case 
a normal string copy routine can not be 
used since it assumes the pointer size 
is near. 
*/ 
movedata(FP_SEG(str), FP_OFF(str), 
FP_SEG(fptr), FP_OFF(fptr), 
strlen(str)); 

/* display string (note the F modifier) */ 
printf("Far string is: %Fs\n", fptr); 

/* free the memory */ 
farfree(fptr); 

return 0; 



函数名: farrealloc 
功 能: 调整远堆中的分配块 
用 法: void far *farrealloc(void far *block, unsigned long newsi
ze); 
程序例: 

#include <stdio.h> 
#include <alloc.h> 

int main(void) 

char far *fptr; 

fptr = farmalloc(10); 
printf("First address: %Fp\n", fptr); 
fptr = farrealloc(fptr,20); 
printf("New address : %Fp\n", fptr); 
farfree(fptr); 
return 0; 


========== * * * * * ==========
作者:  (顾左右而言他)
标题: RE:
来自: 218.79.*.*
发贴时间: 2003年04月29日 23:14:50
长度: 11768字
函数篇(f)

函数名: fclose 
功 能: 关闭一个流 
用 法: int fclose(FILE *stream); 
程序例: 

#include <string.h> 
#include <stdio.h> 

int main(void) 

FILE *fp; 
char buf = "0123456789"; 

/* create a file containing 10 bytes */ 
fp = fopen("DUMMY.FIL", "w"); 
fwrite(&buf, strlen(buf), 1, fp); 

/* close the file */ 
fclose(fp); 
return 0; 



函数名: fcloseall 
功 能: 关闭打开流 
用 法: int fcloseall(void); 
程序例: 

#include <stdio.h> 

int main(void) 

int streams_closed; 

/* open two streams */ 
fopen("DUMMY.ONE", "w"); 
fopen("DUMMY.TWO", "w"); 

/* close the open streams */ 
streams_closed = fcloseall(); 

if (streams_closed == EOF) 
/* issue an error message */ 
perror("Error"); 
else 
/* print result of fcloseall() function */ 
printf("%d streams were closed.\n", streams_closed); 


return 0; 



函数名: fcvt 
功 能: 把一个浮点数转换为字符串 
用 法: char *fcvt(double value, int ndigit, int *decpt, int *sig
n); 
程序例: 

#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

char *string; 
double value; 
int dec, sign; 
int ndig = 10; 

clrscr(); 
value = 9.876; 
string = ecvt(value, ndig, &dec, &sign); 
printf("string = %s dec = %d \ 
sign = %d\n", string, dec, sign); 

value = -123.45; 
ndig= 15; 
string = ecvt(value,ndig,&dec,&sign); 
printf("string = %s dec = %d sign = %d\n", 
string, dec, sign); 


value = 0.6789e5; /* scientific 
notation */ 
ndig = 5; 
string = ecvt(value,ndig,&dec,&sign); 
printf("string = %s dec = %d\ 
sign = %d\n", string, dec, sign); 

return 0; 



函数名: fdopen 
功 能: 把流与一个文件句柄相接 
用 法: FILE *fdopen(int handle, char *type); 
程序例: 

#include <sys\stat.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <io.h> 

int main(void) 

int handle; 
FILE *stream; 

/* open a file */ 
handle = open("DUMMY.FIL", O_CREAT, 
S_IREAD | S_IWRITE); 

/* now turn the handle into a stream */ 
stream = fdopen(handle, "w"); 

if (stream == NULL) 
printf("fdopen failed\n"); 
else 

fprintf(stream, "Hello world\n"); 
fclose(stream); 

return 0; 


函数篇(f)

函数名: feof 
功 能: 检测流上的文件结束符 
用 法: int feof(FILE *stream); 
程序例: 

#include <stdio.h> 

int main(void) 

FILE *stream; 

/* open a file for reading */ 
stream = fopen("DUMMY.FIL", "r"); 

/* read a character from the file */ 
fgetc(stream); 

/* check for EOF */ 
if (feof(stream)) 
printf("We have reached end-of-file\n"); 

/* close the file */ 
fclose(stream); 
return 0; 



函数名: ferror 
功 能: 检测流上的错误 
用 法: int ferror(FILE *stream); 
程序例: 

#include <stdio.h> 

int main(void) 

FILE *stream; 

/* open a file for writing */ 
stream = fopen("DUMMY.FIL", "w"); 

/* force an error condition by attempting to read */ 
(void) getc(stream); 

if (ferror(stream)) /* test for an error on the stream */ 

/* display an error message */ 
printf("Error reading from DUMMY.FIL\n"); 

/* reset the error and EOF indicators */ 
clearerr(stream); 


fclose(stream); 
return 0; 



函数名: fflush 
功 能: 清除一个流 
用 法: int fflush(FILE *stream); 
程序例: 

#include <string.h> 
#include <stdio.h> 
#include <conio.h> 
#include <io.h> 

void flush(FILE *stream); 

int main(void) 

FILE *stream; 
char msg = "This is a test"; 

/* create a file */ 
stream = fopen("DUMMY.FIL", "w"); 

/* write some data to the file */ 
fwrite(msg, strlen(msg), 1, stream); 

clrscr(); 
printf("Press any key to flush\ 
DUMMY.FIL:"); 
getch(); 

/* flush the data to DUMMY.FIL without\ 
closing it */ 
flush(stream); 

printf("\nFile was flushed, Press any key\ 
to quit:"); 
getch(); 
return 0; 


void flush(FILE *stream) 

int duphandle; 

/* flush the stream's internal buffer */ 
fflush(stream); 

/* make a duplicate file handle */ 
duphandle = dup(fileno(stream)); 

/* close the duplicate handle to flush\ 
the DOS buffer */ 
close(duphandle); 



函数名: fgetc 
功 能: 从流中读取字符 
用 法: int fgetc(FILE *stream); 
程序例: 

#include <string.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

FILE *stream; 
char string = "This is a test"; 
char ch; 

/* open a file for update */ 
stream = fopen("DUMMY.FIL", "w+"); 

/* write a string into the file */ 
fwrite(string, strlen(string), 1, stream); 

/* seek to the beginning of the file */ 
fseek(stream, 0, SEEK_SET); 

do 

/* read a char from the file */ 
ch = fgetc(stream); 

/* display the character */ 
putch(ch); 
} while (ch != EOF); 

fclose(stream); 
return 0; 



函数名: fgetchar 
功 能: 从流中读取字符 
用 法: int fgetchar(void); 
程序例: 

#include <stdio.h> 

int main(void) 

char ch; 

/* prompt the user for input */ 
printf("Enter a character followed by \ 
<Enter>: "); 

/* read the character from stdin */ 
ch = fgetchar(); 

/* display what was read */ 
printf("The character read is: '%c'\n", 
ch); 
return 0; 



函数名: fgetpos 
功 能: 取得当前文件的句柄 
用 法: int fgetpos(FILE *stream); 
程序例: 

#include <string.h> 
#include <stdio.h> 

int main(void) 

FILE *stream; 
char string = "This is a test"; 
fpos_t filepos; 

/* open a file for update */ 
stream = fopen("DUMMY.FIL", "w+"); 

/* write a string into the file */ 
fwrite(string, strlen(string), 1, stream); 

/* report the file pointer position */ 
fgetpos(stream, &filepos); 
printf("The file pointer is at byte\ 
%ld\n", filepos); 

fclose(stream); 
return 0; 



函数名: fgets 
功 能: 从流中读取一字符串 
用 法: char *fgets(char *string, int n, FILE *stream); 
程序例: 

#include <string.h> 
#include <stdio.h> 

int main(void) 

FILE *stream; 
char string = "This is a test"; 
char msg; 

/* open a file for update */ 
stream = fopen("DUMMY.FIL", "w+"); 

/* write a string into the file */ 
fwrite(string, strlen(string), 1, stream); 

/* seek to the start of the file */ 
fseek(stream, 0, SEEK_SET); 

/* read a string from the file */ 
fgets(msg, strlen(string)+1, stream); 

/* display the string */ 
printf("%s", msg); 

fclose(stream); 
return 0; 



函数名: filelength 
功 能: 取文件长度字节数 
用 法: long filelength(int handle); 
程序例: 

#include <string.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <io.h> 

int main(void) 

int handle; 
char buf = "0123456789"; 

/* create a file containing 10 bytes */ 
handle = open("DUMMY.FIL", O_CREAT); 
write(handle, buf, strlen(buf)); 

/* display the size of the file */ 
printf("file length in bytes: %ld\n", 
filelength(handle)); 

/* close the file */ 
close(handle); 
return 0; 


函数篇(f)

函数名: fillellipse 
功 能: 画出并填充一椭圆 
用 法: void far fillellipse(int x, int y, int xradius, int yradi
us); 
程序例: 

#include <graphics.h> 
#include <conio.h> 

int main(void) 

int gdriver = DETECT, gmode; 
int xcenter, ycenter, i; 

initgraph(&gdriver,&gmode,""); 
xcenter = getmaxx() / 2; 
ycenter = getmaxy() / 2; 

for (i=0; i<13; i++) 

setfillstyle(i,WHITE); 
fillellipse(xcenter,ycenter,100,50); 
getch(); 


closegraph(); 
return 0; 



函数名: fillpoly 
功 能: 画并填充一个多边形 
用 法: void far fillpoly(int numpoints, int far *polypoints); 
程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int i, maxx, maxy; 

/* our polygon array */ 
int poly; 

/* initialize graphics, local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); 
if (errorcode != grOk) 
/* an error occurred */ 

printf("Graphics error: %s\n", 
grapherrormsg(errorcode)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); 
/* terminate with an error code */ 


maxx = getmaxx(); 
maxy = getmaxy(); 

poly = 20; /* 1st vertext */ 
poly = maxy / 2; 

poly = maxx - 20; /* 2nd */ 
poly = 20; 

poly = maxx - 50; /* 3rd */ 
poly = maxy - 20; 

/* 
4th vertex. fillpoly automatically 
closes the polygon. 
*/ 
poly = maxx / 2; 
poly = maxy / 2; 

/* loop through the fill patterns */ 
for (i=EMPTY_FILL; i<USER_FILL; i++) 

/* set fill pattern */ 
setfillstyle(i, getmaxcolor()); 

/* draw a filled polygon */ 
fillpoly(4, poly); 

getch(); 


/* clean up */ 
closegraph(); 
return 0; 



函数名: findfirst, findnext 
功 能: 搜索磁盘目录; 取得下一个匹配的findfirst模式的文件 
用 法: int findfirst(char *pathname, struct ffblk *ffblk, int at
trib); 
int findnext(struct ffblk *ffblk); 
程序例: 

/* findnext example */ 

#include <stdio.h> 
#include <dir.h> 

int main(void) 

struct ffblk ffblk; 
int done; 
printf("Directory listing of *.*\n"); 
done = findfirst("*.*",&ffblk,0); 
while (!done) 

printf(" %s\n", ffblk.ff_name); 
done = findnext(&ffblk); 


return 0; 



函数名: floodfill 
功 能: 填充一个有界区域 
用 法: void far floodfill(int x, int y, int border); 
程序例: 

#include <graphics.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

int main(void) 

/* request auto detection */ 
int gdriver = DETECT, gmode, errorcode; 
int maxx, maxy; 

/* initialize graphics, local variables */ 
initgraph(&gdriver, &gmode, ""); 

/* read result of initialization */ 
errorcode = graphresult(); 
if (errorcode != grOk) 
/* an error occurred */ 

printf("Graphics error: %s\n", 
grapherrormsg(errorcode)); 
printf("Press any key to halt:"); 
getch(); 
exit(1); 
/* terminate with an error code */ 


maxx = getmaxx(); 
maxy = getmaxy(); 

/* select drawing color */ 
setcolor(getmaxcolor()); 

/* select fill color */ 
setfillstyle(SOLID_FILL, getmaxcolor()); 

/* draw a border around the screen */ 
rectangle(0, 0, maxx, maxy); 

/* draw some circles */ 
circle(maxx / 3, maxy /2, 50); 
circle(maxx / 2, 20, 100); 
circle(maxx-20, maxy-50, 75); 
circle(20, maxy-20, 25); 

/* wait for a key */ 
getch(); 

/* fill in bounded region */ 
floodfill(2, 2, getmaxcolor()); 

/* clean up */ 
getch(); 
closegraph(); 
return 0; 



函数名: floor 
功 能: 向下舍入 
用 法: double floor(double x); 
程序例: 

#include <stdio.h> 
#include <math.h> 

int main(void) 

double number = 123.54; 
double down, up; 

down = floor(number); 
up = ceil(number); 

printf("original number %10.2lf\n", 
number); 
printf("number rounded down %10.2lf\n", 
down); 
printf("number rounded up %10.2lf\n", 
up); 

return 0; 



函数名: flushall 
功 能: 清除所有缓冲区 
用 法: int flushall(void); 
程序例: 

#include <stdio.h> 

int main(void) 

FILE *stream; 

/* create a file */ 
stream = fopen("DUMMY.FIL", "w"); 

/* flush all open streams */ 
printf("%d streams were flushed.\n", 
flushall()); 

/* close the file */ 
fclose(stream); 
return 0; 



函数名: fmod 
功 能: 计算x对y的模, 即x/y的余数 
用 法: double fmod(double x, double y); 
程序例: 

#include <stdio.h> 
#include <math.h> 

int main(void) 

double x = 5.0, y = 2.0; 
double result; 

result = fmod(x,y); 
printf("The remainder of (%lf / %lf) is \ 
%lf\n", x, y, result); 
return 0; 


========== * * * * * ==========
返回