一、函数的定义与调用
(一)返回值类型 函数名 ([参数1][参数2][...])
{
函数体
return 返回值;
}
(二)(void) 函数名 ([参数1][参数2][...])
void:表示该函数不返回任何值,也不需要返回
TIPS:
(—)定义函数时指定的函数类型一般应该与return语句中的表达式类型一致。但不一致时函数类型决定返回值的类型
如:double min(int x,int y) //函数值为双精度型
int max(double x,double y) //函数值为整型
(二)使用自定义函数时,如果该函数的位置在调用它的函数(主函数)之后(同一个文件中),应该在主函数中对被调函数作声明。如下面的例子:求两数之和
(三)return语句后面可以是一个值也可以是一个表达式:
eg:max(int x,int y){
return (x>y?x:y)
}
*函数的参数
1.实际参数:真实传给函数的参数。可以是:常量、变量、表达式、函数等,无论实参是何种类型的值,在进行函数调用时,必须要有确定的值,以便将这些值传给形式参数。
2.形式参数:函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才分配内存单元,所以叫形式参数。当函数调用完成时就自动销毁了,因而形式参数只在函数中有效。
例一:交换两个整型变量(不需要返回值)
仅仅是x和y在不停交换,并没有影响a和b的值
修改👇👇
完整代码:
Swap1:传值调用:函数的形参和实参占有不同的内存块,对形参的修改不会影响实参。
Swap2:传址调用:把函数外部创建变量的内存地址传递给函数参数。可以让函数内外建立真正的联系,函数内部也可以直接操作函数外部的变量。
例二:求两个数的较大值
//1.求两个数的较大值
int max2(int x,int y)
{
int z;
z=x>y? x:y;
return z;
}
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int max =max2(a,b);
printf("%d",max);
return 0;
}
求三个数:
//2.求三个数的最大值
int max3(int x,int y,int z)
{
int t=x;
if(y>t){
t=y;
}
if(z>t){
t=z;
}
return t;
}
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int max =max3(a,b,c);
printf("%d",max);
return 0;
}
例三:判断一个数是否为素数
int isPrime(int n)
{
if(n<2){
return 0;
}
for(int i=2;i<=n/i;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(isPrime(n)){
printf("Yes\n",n);
}
else{
printf("No\n",n);
}
return 0;
}
例四:输出1000到3000的所有闰年
int is_leap(int n)
{
if((n%4==0&&n%100!=0)||(n%100==0)){
return 1;
}
else{
return 0;
}
}
#include <stdio.h>
int main()
{
int n;
for(int n=1000;n<=3000;n++){
if(is_leap(n)){
printf("%d ",n);
}
}
return 0;
}
例五:求前n个数的阶乘
int product(int n)
{
int result=1;
for(int i=1;i<=n;i++){
result=result*i5;
}
return result;
}
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int k=product(n);
printf("%d",k);
return 0;
}
例六-1:求前n个数阶乘之和
int product(int n)
{
int result=1;
for(int i=1;i<=n;i++){
result=result*i;
}
return result;
}
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
//int k=;
int s=0;
for(int i=1;i<=n;i++){
s=s+product(i);//这里括号里面不要写成n了 如果是n的话就会带入n的值计算 累加n次n的阶乘
}
printf("%d",s);
return 0;
}
例七:十进制转二进制
#include <stdio.h>
//输入一个十进制数转化为二进制并输出
void decToBin(int);
int main()
{
int x;
while(scanf("%d",&x)!=EOF){
decToBin(x);
printf("\n");
}
return 0;
}
void decToBin(int n)
{
char s[35]="";
if(n==0){
printf("0");
return;
}
if(n<0){
printf("-");
n=-n;
}
int m=0;
while(n>0){
int t=n%2;
s[m] = t+'0';
m=m+1;
n=n/2;
}
for(int i=0;i<m/2;i++){
int k=s[i];
s[i]=s[m-1-i];
s[m-1-i]=k;
}
printf("%s",s);
}
void decToBin(int n)
{
int s[35];
if(n==0){
printf("0");
return;
}
if(n<0){
printf("-");
n=-n;
}
int m=0,i;
while(n>0){
s[m]=n%2;
m=m+1;
n=n/2;
}
for(int i=0;i<m/2;i++){
int k=s[i];
s[i]=s[m-1-i];
s[m-1-i]=k;
}
for(int i=0;i<m;i++){
printf("%d",s[i]);
}
}
第一种是用字符数组写的 第二种就是int数组(注意输出格式!!!!)
例七:使用素数测试函数验证哥德巴赫猜想
int isPrime(int a)
{
for(int i=2;i<=a/i;i++){
if(a%i==0){
return 0;
}
}
return 1;
}
#include <stdio.h>
int main()
{
int n;
while(~(scanf("%d",&n))){
if(n==4){
printf("2 2\n");// 4的情况要单独考虑
}
else{
for(int a=2;a<=n/2;a++){
if(isPrime(a)&&isPrime(n-a)){
printf("%d %d\n",a,n-a);
break; //找到了就break 题目要求的是输出差值最大的即可
}
}
}
}
return 0;
}