1.函数概述
1.函数是C语言的基本单元,包含可执行代码
2.主函数可以调用其他函数,其他函数可以相互调用
3.函数可以有参数和返回值
2.函数定义
函数定义:让编译器知道函数功能,包括定义函数头和函数体
函数头分为返回值类型、函数名、参数表
函数体包括局部变量的声明和函数的可执行代码
无参函数:没有参数的函数
空函数:没有任何内容的函数(占位)
int AddTwoNumber(int Num1,int Num2)
{
int result;
result = num1+num2;
return result;
}函数要先声明,再定义
如果函数定义放在调用之前,就不需要声明
3.返回语句
返回语句:从所在函数中退出,回到调用程序中去,或者将函数值赋给调用的表达式
//从函数返回
#include<stdio.h>
int Function();
int main()
{
printf("这是输出前\n");
Function();
printf("这是输出后\n");
return 0;
}
int Function()
{
printf("这是输出中\n");
}
//返回函数值
#include<stdio.h>
int Minus(int Number1,int Number2)
{
int result;
result = Number1-Number2;
return result;
}
int main()
{
int result;
result=Minus(9,5);
printf("%d",result);
return 0;
}
#include<stdio.h>
char ShowChar();
int main()
{
char Result;
Result = ShowChar();
printf("%c\n",Result);
return 0;
}
char ShowChar()
{
int Number;
printf("请输入一个数:\n");
scanf("%d",&Number);
return Number;
}
4.函数参数
4.1 形参与实参
形式参数:形式上存在的参数,放在括号里面,在拿书调用之前,传递给函数的值将被复制到形式参数中
实际参数:实际存在的参数,函数调用者提供给函数的参数
#include<stdio.h>
void DrinkMilk(char *Bottle);
int main()
{
char Poke[]="";
printf("给宝宝喝:");
scanf("%s",&Poke);
DrinkMilk(Poke);
return 0;
}
void DrinkMilk(char *Bottle)
{
printf("宝宝喝%s\n",Bottle);
}
4.2 数组参数
数组作为实参时,只传递数组的地址,而不是传递整个数组
数组名作实参时,传递数组第一个元素的指针
#include<stdio.h>
void ShowMember(int Member);
int main()
{
int Count[10];
int i;
printf("请输入一个数组:\n");
for(i=0;i<10;i++)
{
scanf("%d",&Count[i]);
}
for(i=0;i<10;i++)
{
ShowMember(Count[i]);
}
return 0;
}
void ShowMember(int Member)
{
printf("数组元素为:%d\n",Member);
}
#include<stdio.h>
void Evalute(int b[10]);
void Display(int b[10]);
int main()
{
int a[10];
Evalute(a);
Display(a);
return 0;
}
void Display(int b[10])
{
int i;
for(i=0;i<10;i++)
{
printf("数组元素是:%d\n",b[i]);
}
}
void Evalute(int b[10])
{
int i;
for(i=0;i<10;i++)
{
b[i]=i;
}
}
4.3 指针作参数
#include<stdio.h>
void Evalute(int *Point);
void Display(int *Point);
int main()
{
int a[10];
Evalute(a);
Display(a);
return 0;
}
void Display(int *Point)
{
int i;
for(i=0;i<10;i++)
{
printf("数组元素为:%d\n",Point[i]);
}
}
void Evalute(int *Point)
{
int i;
for(i=0;i<10;i++)
{
Point[i]=i;
}
}
4.4 main函数参数
argc:保存命令行的参数个数,整型
argv:指向字符指针数组的指针
#include<stdio.h>
int main(int argc,char *argv[])
{
printf("%s\n",argv[0]);
return 0;
}
5.函数调用
调用方式分为函数语句调用,函数表达式调用,函数参数调用
5.1 函数语句调用
函数语句调用:把函数的调用作为一个语句
#include<stdio.h>
void Display()
{
printf("仅实现输出一条语句");
}
int main()
{
Display();
return 0;
}
5.2 函数表达式调用
函数表达式调用:函数出现一个表达式中
#include<stdio.h>
int AddTwoNum(int Num1,int Num2);
int main()
{
int Result;
int Num3 = 10;
Result = Num3*AddTwoNum(3,5);
printf("结果为:%d\n",Result);
return 0;
}
int AddTwoNum(int Num1,int Num2)
{
int tempResult;
tempResult = Num1 + Num2;
return tempResult;
}
5.3 函数参数调用
函数参数调用:将函数返回值作为实参,传递到函数中使用
#include<stdio.h>
int AddTwoNum(int Num1,int Num2);
int main()
{
int Result;
Result = AddTwoNum(10,AddTwoNum(3,5));
printf("结果是:%d\n",Result);
return 0;
}
int AddTwoNum(int Num1,int Num2)
{
int TempResult;
TempResult = Num1 + Num2;
return TempResult;
}
5.4 嵌套调用
函数定义相互平行,一个函数体内不能定义另一个函数
#include<stdio.h>
void First();
void Second();
void Third();
void Final();
int main()
{
First();
return 0;
}
void First()
{
printf("这是第一步\n");
Second();
}
void Second()
{
printf("这是第二步\n");
Third();
}
void Third()
{
printf("这是第三步\n");
Final();
}
void Final()
{
printf("这是最后一步");
}
5.5 递归调用
#include<stdio.h>
void Display(char **a);
char* b[]=
{
"ABC","DEF","GHI","JKL","end"
};
int main()
{
Display(b);
return 0;
}
void Display(char **a)
{
if(*a=="end")
{
return ;
}
else
{
Display(a+1);
printf("%s\n",*a);
}
}
6.内部函数和外部函数
函数是c语言中最小的单位
6.1 内部函数
内部函数:函数只被所在源文件使用static 返回值类型 函数名(参数列表)
不同源文件中的相同函数名不会冲突
#include<stdio.h>
static char* Get(char* p)
{
return p;
}
static void Show(char* p)
{
printf("%s\n",p);
}
int main()
{
char *pString;
pString = Get("Hello!");
Show(pString);
return 0;
}
6.2 外部函数
外部函数:可以被其他源文件调用的函数
//文件1
#include<stdio.h>
extern char* GetString(char* p);
extern void Show(char* p);
int main()
{
char* p;
p = GetString("Hello!");
Show(p);
return 0;
}
//文件2
extern char* GetString(char* p)
{
return p;
}
//文件3
extern void Show(char* p)
{
printf("%s\n",p);
}
7.局部变量和全局变量
7.1 局部变量
局部变量:在函数内部定义的变量,无法被其他函数所引用
#include<stdio.h>
int main()
{
int Num = 1;
printf("%d\n",Num);
if(Num>0)
{
int Num = 2;
printf("%d\n",Num);
if(Num>0)
{
int Num = 3;
printf("%d\n",Num);
}
printf("%d\n",Num);
}
printf("%d\n",Num);
return 0;
}
位于不同作用域的变量,可以使用相同的标识符
7.2 全局变量
全局变量:在函数外声明的变量,属于源文件
#include<stdio.h>
int GlobalPrice = 100;
void Price1();
void Price2();
void Price3();
void ChangePrice();
int main()
{
printf("原始的价格是%d\n",GlobalPrice);
Price1();
Price2();
Price3();
ChangePrice();
printf("当前的价格是%d\n",GlobalPrice);
Price1();
Price2();
Price3();
}
void Price1()
{
printf("一号价格是:%d\n",GlobalPrice);
}
void Price2()
{
printf("二号价格是:%d\n",GlobalPrice);
}
void Price3()
{
printf("三号价格是:%d\n",GlobalPrice);
}
void ChangePrice()
{
printf("你想要更改的价格是什么?请输入:");
scanf("%d",&GlobalPrice);
}
8.数学公式
8.1 绝对值
abs函数:求整数绝对值
labs函数:求长整数绝对值
fabs函数:求浮点数绝对值
#include<stdio.h>
#include<math.h>
int main()
{
int Result1;
int Num1 = -12;
long Result2;
long Num2 = -1234567890L;
double Result3;
double Num3 = -123.0;
Result1 = abs(Num1);
Result2 = labs(Num2);
Result3 = fabs(Num3);
printf("数字1为:%d,绝对值为:%d\n",Num1,Result1);
printf("数字2为:%ld,绝对值为:%ld\n",Num2,Result2);
printf("数字3为:%lf,绝对值为:%lf\n",Num3,Result3);
return 0;
}
8.2 三角函数
sin函数:求正弦函数double sin(double x);
cos函数:求余弦函数double cos(double x);
tan函数:求正切函数double tan(double x);
#include<stdio.h>
#include<math.h>
int main()
{
double ResultSin;
double ResultCos;
double ResultTan;
double fXsin = 0.5;
double fXcos = 0.5;
double fXtan = 0.5;
ResultSin = sin(fXsin);
ResultCos = cos(fXcos);
ResultTan = tan(fXtan);
printf("sin%2.1lf的值为:%3.2lf\n",fXsin,ResultSin);
printf("cos%2.1lf的值为:%3.2lf\n",fXcos,ResultCos);
printf("cos%2.1lf的值为:%3.2lf\n",fXtan,ResultTan);
return 0;
}
8.3 字符检测
isalpha函数:检测字母,是字母返回非零int isalpha(int ch)
isdigit函数:检测数字,是数字返回非零int isdigit(int ch)
isalnum函数:检测数字或字母,是二者之一返回非零int isalnum(int ch)
#include<stdio.h>
#include<ctype.h>
void Switch(char c);
int main()
{
char CharPut;
char CharTemp;
printf("第一次输入字符:");
scanf("%c",&CharPut);
Switch(CharPut);
CharTemp = getchar();
printf("第二次输入字符:");
scanf("%c",&CharPut);
Switch(CharPut);
CharTemp = getchar();
printf("第三次输入字符:");
scanf("%c",&CharPut);
Switch(CharPut);
return 0;
}
void Switch(char c)
{
if(isalpha(c))
{
printf("你输入的是字母%c\n",c);
}
if(isdigit(c))
{
printf("你输入的是数字%c\n",c);
}
if(isalnum(c))
{
printf("你输入的是数字或字母!\n");
}
else{
printf("你输入的既不是数字,也不是字母!\n");
}
}
