两数交换
传值调用- -会出现错误
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)));
}