学习笔记3-C语言函数进制

来源:互联网 发布:java web开源项目源码 编辑:程序博客网 时间:2024/06/06 15:44

函数的概述

 

C语言程序是由函数组成的。函数是C程序的基本模块,通过函数模块的调用实现特定的功能。

函数的优点:提高程序的可读性,提高开发效率和提高代码的重用性。

 

1函数分类


1)从函数定义角度

库函数:由C系统提供,用户无须定义的,也不必在程序中作类型说明,只需要在程序前包含有该函数原型的头文件即可在程序中直接调用。

用户自定义函数:由用户按需要书写的函数,不仅在程序中定义函数本身,而且在主调函数模块必须对该被调用函数进行类型说明,然后才能使用。

2)从函数参数和返回值角度

有返回值函数:函数执行完成返回执行结果。

无返回值函数:函数执行完成不返回执行结果。

有参数函数:函数定义及函数说明时都有参数。参数称为形参。

无参数函数:函数定义及函数说明时没有参数。

3)各种库函数。

2 自定义函数书写

1)步骤: 函数声明 、函数定义 和 函数调用

2)函数基本格式

返回值类型 函数名称(函数参数){

              函数体;

}

a 无参无返回值函数

格式

void 函数名(){

        函数体;

}

没有返回值 返回值类型为void

 

b 有参无返回值函数

格式

void 函数名(形参列表){

       函数体;

}

c 无参有返回值函数

格式

返回值类型 函数名(){

       函数体;

}

函数体中有return 返回执行结果

 

d 有参有返回值函数

格式

返回值类型 函数名(形参列表){

       函数体;

}

 

函数体中有return 返回执行结果

 

3)注意

a 函数定义时函数名不能重复。

b 函数的返回值只有一个或没有。

c 主调函数会赋予形参函数的形参实际值(实参)。

d 形参是在定义函数时小括号内的参数

   实参是主调函数在调用函数时小括号内实际值。

  多个形参或者实参之间用逗号分隔。

e 形参只有在调用的时候才会分配内存空间。调用结束后,内存释放。形参只有在函数内有效

f 实参可以是常量、变量、表达式或者函数。在函数调用时实参必须是确定的值。

g 实参和形参在数量、类型和顺序上必须保持一致。

h 函数内修改形参,不会对实参产生影响。

 

3 函数的声明

调用函数之前必须对该函数进行声明。类似在使用变量之前对变量进行定义。

作用是告诉编译器这个函数已经存在以及该函数的返回值类型,以便主调函数处理返回值数据。

1) 声明格式

函数头部后加分号。

a有参有返回值函数

返回值类型 函数名(形参列表);   

其他类同。

 

2) 注意

a 函数默认返回值类型为int类型,如果返回值为int类型,函数可以不用声明。

b 如果被调函数在主调函数之前,函数不用声明。

4 函数调用

形式

函数名(实参列表);

 

       函数的使用实例

<span style="font-size:12px;">/*  main.c  输入两个数,打印(printf)这两个数的和、差、积、商、以及余数。 */ #include <stdio.h> int sum(int x , int y);int minus(int x , int y);int multiply(int x , int y);float divide(int x , int y);int mod(int x , int y);void calautate1(int x ,int y);void calautate2(int x ,int y);void calautate3(int x ,int y,int *sumResult,int *minusResult,int*mulResult,float *divideResult,int *modResult); int main(int argc, const char * argv[]) {       int a=0,b=0;          printf("计算两个数的加、减、乘、除和取余运算\n 请输入第一个整数\n");   scanf("%d",&a);    printf("请输入第二个整数\n");   scanf("%d",&b);       calautate1(a,b);       calautate2(a,b);           intsumResult,minusResult,mulResult,modResult;    float divideResult;    calautate3(a, b,&sumResult,&minusResult , &mulResult, ÷Result,&modResult);       printf("%d + %d =%d\n",a,b,sumResult);    printf("%d - %d =%d\n",a,b,minusResult);    printf("%d * %d =%d\n",a,b,mulResult);    printf("%d %% %d =%d\n",a,b,modResult);    printf("%d / %d =%.2f\n",a,b,divideResult);                return 0;}/** *  普通计算方法 * *  @param x *  @param y */void calautate1(int x ,int y){       printf("计算方法1\n");       printf("%d + %d =%d\n",x,y,sum(x, y));       printf("%d - %d =%d\n",x,y,minus(x, y));       printf("%d * %d =%d\n",x,y,multiply(x, y));       printf("%d %% %d =%d\n",x,y,mod(x, y));       printf("%d / %d =%.2f\n",x,y,divide(x, y));        }/** *  函数指针无返回值 * *  @param x *  @param y */void calautate2(int x ,int y){       printf("计算方法2\n");       int (*p)(int x , inty);            //声明 返回值为int类型,入参为 int类型x和int类型y的指针函数 p    p=sum;                              //将p指向sum函数首地址,作代替sum函数使用。    printf("%d + %d =%d\n",x,y,p(x,y));//调用p(x,y) 输出返回值       p=minus;                            //同上    printf("%d - %d =%d\n",x,y,p(x,y));       p=multiply;                         //同上    printf("%d * %d =%d\n",x,y,p(x,y));       p=mod;                              //同上    printf("%d %% %d =%d\n",x,y,p(x,y));       float(*p1)(int x ,int y);    p1=divide;                          //同上    printf("%d / %d =%.2f\n",x,y,p1(x,y));    }/** *  将需要返回的值以地址的方式传递到函数中,保存多个返回值。 * *  @param x *  @param y *  @param sumResult    int型指针,指向加法计算结果 *  @param minusResult  int型指针,指向减法计算结果 *  @param mulResult    int型指针,指向乘法计算结果 *  @param divideResult float型指针,指向除法计算结果 *  @param modResult    int型指针,指向取余计算结果 */void calautate3(int x ,int y,int *sumResult,int *minusResult,int*mulResult,float *divideResult,int *modResult){       printf("计算方法3\n");       *sumResult =sum(x,y);        //加法操作,将结果赋值给地址sumResult指向的值    *minusResult=minus(x,y);     //同上    *mulResult=multiply(x,y);    //同上    *divideResult=divide(x,y);   //同上    *modResult=mod(x, y);         //同上}/** *  计算两个数的和 * *  @param x *  @param y * *  @return 返回 x+y 的结果 */int sum(int x , int y){       return x + y;} /** *  计算两个数的差 * *  @param x *  @param y * *  @return 返回 x-y 的结果 */int minus(int x , int y){       return x - y;}/** *  计算两个数的乘积 * *  @param x *  @param y * *  @return 返回 x*y 的结果 */int multiply(int x , int y){       return x * y;}/** *  计算两个数的商 * *  @param x *  @param y * *  @return 返回 x / y 的结果,除数为0的时候返回 0 */float divide(int x , int y){       return  y==0 ? 0:(float)x/y;}/** *  计算两个数的取余结果 * *  @param x *  @param y * *  @return 返回 x%y 的结果 */int mod(int x , int y){       return x % y;}</span>


5 递归函数

 

       函数在函数体中调用本身。这种函数称为递归函数。

 

       1)递归函数的构成条件

a自己调用自己

b存在一个条件让递归结束

c问题的规模能够缩小

 

递归举例

//// main.c//  斐波拉契数//// Created by ywxkdz on 15/11/16.// Copyright (c) 2015年 itcast. All rights reserved.// #include <stdio.h> int main(int argc, const char * argv[]) {   int n=12;   printf("第 %d个 斐波拉契数为:%d",n,Fibonacci(n));           return 0;} int Fibonacci(int n){   if( n == 1 || n == 2) // 递归结束的条件,求前两项       return 1;   else       return Fibonacci(n-1)+Fibonacci(n-2); // 如果是求其它项,先要求出它前面两项,然后做和。求其他两时需要调用自身函数。}

 

 

6 Xcode的运行原理

 

1)    编译à.o的目标文件à链接à.out执行文件。

2)Mac采用的是unix的文件系统,没有分区概念。

3)常用命令

       open+文件 类似windows的记事本。

       vi编辑器。

       cc –c 源文件名:编译源文件生成 .o目标文件。

       cc  .o文件 :链接生成.out可执行文件。

       . /.out文件   执行.out可执行文件。

 

7  #include预处理指令

       功能是将文件插入到当前位置,取代该命令。

1)#include “” 包含用户自定义的文件

       查找顺序:当前文件所在目录下查找—编译器include目录—系统include

      

2) #include <>   包含系统头文件

查找顺序:编译器include目录—系统include

 

8 模块化编程

模块化编程就是多文件开发,一个.c和一个.h文件可以成为一个模块。

1) 作用

隐藏源代码。

多文件编译

加强类型的安全检查

2) 实现

a 头文件的实现

 声明方法,但是不实现。需要防止重复包含。

 声明变量

 声明结构体

b  .c文件实现头文件声明的方法

3) 注意

a 头文件可以包含其他头文件。

b 声明函数和变量,但不可以实现和初始化。

c 结构体一般放在头文件中

d 多文件编程时,只有一个main函数。

e .h和.c 需要对应并且文件名相同。

f 防止重复包含。

g 多次包含相同的头文件与只包含一次相同。

 

8 计算中的进制

 

常见进制:2进制、8进制、10进制和16进制。

常见进制转换

10-2:除2取余倒序。

2-10:位权相加。

16-2:一拆四

2-16:四合一

 

9 机器数和真值

 

机器数:数的二进制形式。最高位为符号位。0为正 1为负。

真值:二进制常量转换为十进制的值。

 

10 原码反码补码

 

数据在计算机内部是以补码形式存储。

数据分为有符号数和无符号数(都为整数)

 

整数:反码=补码=原码

负数:反码==除符号位按位取反 补码=反码+1

 

       引入补码使计算机可以做减法。

原码计算减法会产生负0。

反码计算减法会产生负0。

 

11 计算机存储数据

一个字节存储:11111111-01111111

-127-127

规定10000000表示-128

所以一个8为有符号数可以表示 -128-127

 

12 位运算

1)按位与(&):同1为1 有0为0 等同乘法

2)按位或(|):同0为0 有1为1 等同加法

3)按位取反(~):1->0  0->1

4)按位异或:相同为0 不同为1.

       按位异或交换两个数的值。

       a=a^b;

       b=a^b;

       a=a^b;

 

12 位移

左移:向左每移动。可能改变正负。

右移:不会改变数的正负性。高位要补符号位。

 

13  变量地址获取和存储原理

 

       &取变量的地址,%p 打印变量的地址。

       先定义的变量存储在高地址。

       变量之间的地址不一定连续。

       变量存储细节:低字节存在低地址,高字节存在高地址。

      

 

 

 

0 0
原创粉丝点击