1.计算数组的最大和,以及最大差
要求:
定义函数实现返回最大差值
定义函数实现返回最小和
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int Max(int arr[],int n);
int Min(int arr[],int n);
int main(int argc, const char *argv[])
{
int arr[]={10,-6,3,4,9,5,11};
int n=sizeof(arr)/sizeof(int);
printf("最大和为:%d\n",Max(arr,n));
printf("最大差为:%d\n",Min(arr,n));
return 0;
}
int Max(int arr[],int n)
{
int i,max1,max2;
max1=max2=arr[0];
for(i=0;i<n;i++)
{
if(max1<arr[i])
max1=arr[i];
if(max2<arr[i]&&max2!=max1)
max2=arr[i];
}
return max1+max2;
}
int Min(int arr[],int n)
{
int i,max,min;
max=min=arr[0];
for(i=0;i<n;i++)
{
if(max<arr[i])
max=arr[i];
if(min>arr[i])
min=arr[i];
}
return max-min;
}
结果为:
一、函数
C语句称为函数语言,函数是实现特定功能的代码块
函数作用:解决重复代码所带来的劳动量,使用函数使程序看起来更加简洁,运行速度快。
1> IO函数:scanf\printf\getchar\putchar\gets\puts
2> 字符串函数:strlen strcat strcpy strcmp
3> 数学函数:pow sqrt
4> 主函数:main函数,一个程序只能由一个main函数,main可以调用任何函数,但是任何函数不可以调用主函数
1.1 函数的定义格式
格式:
数据类型 函数名(参数列表) //函数头
{
函数体;
}
解析:
数据类型:基本类型【int float char ..】,空类型void
指针类型 构造类型
函数名:满足命名规范【驼峰命名、下划线连接】
Max max_fun
(): 函数的标志,不可以省略
参数列表:可以使多个,各个参数之间使用逗号隔开,可有可无
函数头不可以加分号
{}:不可以省略
1.2 函数的分类
1> 库函数:scanf printf strlen...
2> 自定义函数:由程序员封装函数
i)有参函数
ii)有返回值函数
void sum() 无参无返函数
void sum(int a,int b) 有参无返函数
int sum() 无参有返函数
int sum(int a,int b); 有参有返函数
1.3 无参无返函数定义
定义格式: eg:
void 函数名() void sum()
{ {
函数体 printf("1+2=%d",1+2);
} }
调用格式:
函数名(); sum();
i) 自定义函数在主函数的上面
自定义函数在主函数上面,不需要声明,但是可读性差
运行速度慢
ii)自定义函数在主函数的下面
自定义函数在主函数下面,需要声明函数,否则出现警告
可读性好,运行速度快。
iii)函数声明在自定义头文件【常用于多文件编辑】
低行模式 vsp 文件名
如果文件不存在,在同一目录下创建文件,并打开文件。
如果文件存储,则在同一目录下打开文件。
1.4 全局变量和局部变量
i)全局变量
全局变量:在函数外定义的变量
1> 全局变量的作用域:从定义开始到整个文件结束
2> 全局变量位置随意,只要在函数外即可,但是位置不一样吗,作用域也不一样
3> 全局变量不要重名
void Sum();
int a=10,b=100;//定义在函数外:全局变量 存储空间在静态区
//作用域:从定义开始到整个文件结束
int main(int argc, const char *argv[])//主调函数
{
// printf("a-b=%d\n",a-b);
Sum();//被调函数
return 0;
}
//int a=10,b=20;//全局变量不可以重名
void Sum()
{
printf("a+b=%d\n",a+b);
}
ii)局部变量
局部变量:在函数内定义的变量,参数列表
1> 作用域:从定义开始,到本函数结束
2> 局部变量空间在栈区
int main(int argc, const char *argv[])
{
Sum();
// printf("a-b=%d\n",a-b); 错误,a,b是局部变量只能sum函数使用
return 0;
}
void Sum()
{
//a,b在调用函数分配空间,函数调用结束以后空间释放
//a,b:内存空间在栈区,计算机自动分配,自动收回空间
int a=10,b=100;//局部变量:作用域:从定义开始到本函数结束
printf("a+b=%d\n",a+b);
}
iii)全局变量和局部变量
1> 全局变量和局部变量重名----> 就近原则
int a=10,b=1;
void Sum();
void Sum1();
int main(int argc, const char *argv[])
{
int a=20,b=100;//局部: 当全局变量和局部变量重名,优先选用局部
//局部变量屏蔽全局
printf("man a=%p b=%p\n",&a,&b);
printf("a+b=%d\n",a+b);
Sum();
Sum1();
return 0;
}
void Sum()
{
int a=1,b=2;//存在局部变量,就近原则,选用局部
printf("a+b=%d\n",a+b);//3
printf("sum a=%p b=%p\n",&a,&b);
}
void Sum1()
{
printf("全局 a=%p b=%p\n",&a,&b);
printf("a+b=%d\n",a+b);//11,sum函数没有变量a,b,所以使用全局
}
2> 局部变量和局部变量重名
int main(int argc, const char *argv[])
{
int i=1;//6--14
for(int i=0;i<5;i++)//7--11
{
int i=10;//9--10
printf("i=%d\n",i);//10 10 10 10 10
}
printf("i=%d\n",i);//1
return 0;
}
1.5 有参函数
为什么有参:被调函数需要使用主调函数的局部变量
格式: eg
数据类型 函数名(参数列表) void sum(int a,int b)
{ {
函数体; printf("a+b=%d\n",a+b);
} }
调用格式:
函数名(变量名); sum(a,b);
实参和形参的注意事项:
1> 实际参数/实参:变量 常量 表达式 形式参数/形参:变量
2> 实参和形参
1.实参和形参的个数必须一致,否则报错
2.一一对应
3,实参和形参的类型可以不一致,以形参为主,发生自动或强制转换
4,实参和形参变量名可以不一致
1.6 有返回值函数
为什么有返回:主调函数需要使用被调函数的局部变量,返回
格式: eg
数据类型 函数名(参数列表) int Sum(int a,int b)
{ {
函数体; return a+b;
return 表达式;
} }
调用格式:
直接输出:函数名(参数列表) printf("%d\n",Sum(a,b));
变量=函数名(参数列表) int s=Sum(a,b);
1> 有无返回取决于函数数据类型,如果数据类型是void则是无返回值函数,否则是有返回值函数
2> return:返回、结束函数
使用格式1:
return(表达式)
使用格式2:
return 表达式
-
- return 一次只能返回一个值
- return的位置任意的,一般在函数的最后
- 表达式:变量,常量,表达式
3> 返回的类型和函数数据类型建议一致,如果不一致以函数数据类型为主,发生自动或强制转换。