函数常用题- -c语言基础知识点4

两数交换

传值调用- -会出现错误

void Swap(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}
int main()
{
	int a = 10;
	int b = 20;
	//写一个哈函数 - 交换2个整型变量的值

	printf("交换前:a=%d b=%d\n", a, b);
	Swap(a, b);
	printf("交换后:a=%d b=%d\n", a, b);

	return 0;
}
  • 看下面的输出就可以看到出现错误了,所以继续看传址调用

在这里插入图片描述
实参:
真实传给函数的参数,叫实参。在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形参:
形式参数是指函数名后括号中的变量形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效。

传址调用

  • 传值调用方法中在被调用的时候,实参传给形参,其实形参是实参的一份临时拷贝,且改变形参,不能改变实参
  • 当函数中需要改变a和b的值时,需要建立函数与主函数的联系,需要用到地址和指针
void Swap2(int* pa, int* pb)//形参
{
	int z = 0;
	z = *pa;
	*pa = *pb;
	*pb = z;
}
int main()
{
	int a = 10;
	int b = 20;
	printf("交换前:a=%d b=%d\n", a, b);
	Swap2(&a, &b);//实参
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

在这里插入图片描述
传址调用

void ADD(int *p)
{
	(*p)++;
}
int main()
{
	int num = 0;
	ADD(&num);
	printf("%d\n", num);

	ADD(&num);
	printf("%d\n", num);

	ADD(&num);
	printf("%d\n", num);
	return 0;
}

在这里插入图片描述

两数组交换

#include<stdio.h>
#define n 5
int main()
{
	int a[n],b[n];
	int i;
	int t;
	printf("交换前的数组a:");
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	printf("交换前的数组b:");
	for (i = 0; i < n; i++)
	{
		scanf("%d", &b[i]);
	}
	for (i = 0; i < n; i++)
	{
		t = a[i];
		a[i] = b[i];
		b[i] = t;
	}
	printf("交换后的数组a:");
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	
	}
	printf("\n");
	printf("交换后的数组b:");
	for (i = 0; i < n; i++)
	{
		printf("%d ", b[i]);
	}
	return 0;
}

在这里插入图片描述

求素数

#include"math.h"
int is_prime(int n)
{
	int j = 0;
	for (j = 2; j < sqrt(n); j++)
	{
		if (n%j == 0)
			return 0;
	}
	return 1;
}
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是不是素数
		if (is_prime(i) == 1)
		{
			count++;
			printf("%d ", i);
		}
	}
	printf("\n");
	printf("一共几个素数:%d", count);
}

在这里插入图片描述

判断1000-2000闰年

int is_leap_year(y)
{
		if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
		{
			return 1;
		}
		else 
			return 0;
    //或者全体直接写return(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
}
int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y++)
	{
		if (is_leap_year(y) == 1)
		{
			printf("%d ", y);
		}
	}
	return 0;
}

在这里插入图片描述

二分法找到对应下标

int binary_search(int a[], int k, int s)
{
	int left = 0;
	int right = s - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (a[mid] > k)
		{
			right = mid - 1;
		}
		else if (a[mid] < k)
			left = mid + 1;
		else
			return mid;
	}
	return -1;
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//sz不能在函数中写,因为在函数中数组在传参的时候传的时候是首元素的地址
	//在函数中a[]其实是指针,sizeof(a)其实是指针的大小为4,4/4就会为1,实所以不正确
	//所以以后传数组的个数时候先在主函数求好
	int ret=binary_search(arr,key,sz);//找下标
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%d", ret);
	}
	return 0;
}

在这里插入图片描述
运用:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
**
要求:时间复杂度小于O(N)**

#include<stdio.h>
int main()
{
	int a[3][3]={1,2,3,4,5,6,7,8,9};
	int k=0;
	printf("请输入一个数字:");
	scanf("%d", &k);
	int left = 0;
	int right = 2;
	while (left >= 0 && left <= 2 && right >= 0 && right <= 2){


		if (a[left][right] < k)
			left++;
		else if (a[left][right] > k)
			right--;
		else if (a[left][right] == k)
		{
			printf("找到数字了!\n");
			printf("它在第%d行第%d列\n", left, right);
			break;
		}
		else if (k>a[2][2])
		{
			printf("该数字不存在");
		}
	}
	
	return 0;
}```

在这里插入图片描述

  • printf反应的是打印在屏幕上打印的字符的个数,首先打印43返回的字符为2,2使得返回的字符为1,所以打印出来的为4321

int main()
{
printf("%d", printf("%d", printf("%d", 43)));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值