函数的学习
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
//www.cplusplus.com文档网址
//zh.cppreference.com-中文版
//en.cppreference.com-英文版
//1.函数是什么?
//C语言中的函数分类
// 1.库函数
// 2.自定义函数
//1.常用的库函数有
//IO函数
//字符串操作函数--strlen
//字符操作函数-把大写的字母变小写或者小写变大写
//内存操作函数
//时间/日期函数
//数学函数
//其他库函数
//int main()
//{
// //strlen-string length -字符串长度有关
// //strcpy-string copy -字符串拷贝
// char arr1[] = "bit";
// char arr2[] = "########";
// //我像将arr1的字符串拷贝到arr2中--用strcpy
// strcpy(arr2, arr1);
// printf("%s\n", arr2);
// return 0;
//}
//memset
//memory-内存 set-设置
//int main()
//{
// char arr[] = "hello world";
// //我现在想把arr[]里的hello world全都改成*
// memset(arr, '*', 5);
// printf("%s\n", arr);
// //***** world
//
// return 0;
//}
//自定义函数--自己定义函数
//举个栗子
//写一个函数可以找出两个整数中的最大值。
//int get_max(int x, int y) //(int x,int y)这是形参
//{
// if (x > y)
// return x;
// else
// return y;
//}
//int main()
//{
// int a = 10;
// int b = 20;
// //函数的使用
// int max = get_max(a, b);
// printf("max = %d\n", max);
// return 0;
//}
//写一个函数可以交换两个整形变量的内容。
// //Swap1没法实现!!!
/*void Swap1(int x, int y) //void表示没有返回值
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}*/
// void Swap2(int* pa,int* pb)
//{
// int tmp = 0;
// tmp =*pa;
// *pa = *pb;
// *pb = tmp;
//}
//int main()
//{
// int a = 10;
// int b = 20;
// int tmp = 0;
// printf("a=%d b=%d\n", a, b);
// //调用Swap1函数
// //Swap1(a, b);//Swap1没法实现--传值调用
// //调用Swap2函数
// Swap2(&a, &b);--传址调用
// /*tmp = a;
// a = b;
// b = tmp;*/
// printf("a=%d b=%d\n", a, b);
// return 0;
//}
//int main()
//{
// int a = 10;
// int* pa = &a;//pa指针变量
// *pa = 20;//解引用操作
// printf("%d\n", a);
// return 0;
//}
//形参-形式参数-形式上参数
// 当实参传给形参的时候
// 形参其实是实参的一份临时拷贝
// 对形参的修改是不会改变实参的
//传值调用和传址调用
//#传值调用--函数的形参和实参分别占有不同内存块,
// 对形参的修改不会影响实参。
//#传址调用--传址调用是把函数外部创建变量的内存地址床底给函数参数的一种调用函数的方式。
//#这种传参方式可以让函数和函数外边的变量建立起正真的联想,
// 也就是函数内部可以直接操作函数外部的变量。
//什么时候用传址调用?什么时候用传值调用呢?
//当我们设置一个函数的时候,如果这个函数要改变函数外部的某些变量的话
// 要考虑传址调用。 如果只是仅仅的想要获取值,这时就只需要用传值调用就行
// 练习
//1.写一个函数可以判断一个数是不是素数。
//2.写一个函数判断一年是不是闰年。
//3.写一个函数,实现一个整形有序数组的二分查找。
//4.写一个函数,每调用一次这个函数,就会将num的值增加1。
//1.写一个函数可以判断一个数是不是素数。
//是素数返回1,不是素数返回0
#include
//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()
//{
// //打印100~200之间的素数
// int i = 0;
// for (i = 100; i <= 200; i++)
// {
// //判断i是否为素数
// if (is_prime(i) == 1)
// printf("%d ", i);
// }
// return 0;
//}
//2.写一个函数判断一年是不是闰年。
//int is_leap_year(int y)
//{
// if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
// return 1;
// else
// return 0;
//
//}
//int main()
//{
// int year = 0;
// for (year = 1000; year <= 2000; year++)
// {
// if (1 == is_leap_year(year))
// {
// printf("%d ", year);
// }
// }
// return 0;
//}
//3.写一个函数,实现一个整形有序数组的二分查找。
//int bianry_search(int arr[], int k,int sz) //本质上arr是一个指针
//{
// //算法的实现
// //int sz = sizeof(arr) / sizeof(arr[0]);这个要放在外面求好
// int left = 0;
// int right = sz - 1;
// while (left <= right)
// {
// int mid = (left + right) / 2;//这个必须放在while循环里面
// if (arr[mid] < k)
// {
// left = mid + 1;
// }
// else if (arr[mid] > k)
// {
// right = mid - 1;
// }
// else
// return mid;
// }
// return -1;
//}
//int main()
//{
// //二分查找
// //在一个有序数组中查找具体的某个数
// //如果找到了返回,这个数的下标,找不到的返回-1
// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
// int k = 7;
// int sz = sizeof(arr) / sizeof(arr[0]);//所以要把这段代码放在外面先求好元素个数
// int ret = bianry_search(arr, k, sz);//实际上传过去的是数组arr首元素的地址
// if (ret == -1)
// {
// printf("找不到指定的数字\n");
// }
// else
// {
// printf("找到了,下标是:%d\n", ret);
// }
// return 0;
//}
//4.写一个函数,每调用一次这个函数,就会将num的值增加1。
//void Add(int*p)
//{
// (*p)++;
//}
//int main()
//{
// int num = 0;
// Add(&num);
// printf("num = %d\n", num);//1
// Add(&num);
// printf("num = %d\n", num);//2
// Add(&num);
// printf("num = %d\n", num);//3
// return 0;
//}
//函数的嵌套调用和链式访问
// 函数和函数之间可以有机的组合的
//嵌套调用
//举个栗子
//void new_line()
//{
// printf("hehe\n");
//}
//void three_line()
//{
// int i = 0;
// for (i = 0; i < 3; i++)
// {
// new_line();
// }
//}
//int main()
//{
// three_line();
// return 0;
//}
//链式访问
// 把一个函数的返回值作为另外一个函数的参数
#include
//int main()
//{
// int len = 0;
// //1.
// len = strlen("abc");
// printf("%d\n", len);
// //2.
// printf("%d\n", strlen("abc"));//链式访问
// return 0;
//}
//再举个栗子
//int main()
//{
// printf("%d", printf("%d", printf("%d", 43)));//4321
// return 0;
//}
//why?
// pirntf的字符类型是int
// //printf的返回值是什么?
//每一个这样的函数打印的字符的个数--就是打印屏幕上的字符个数。
// printf("%d", printf("%d", printf("%d", 43)));//43
//printf("%d", printf("%d", 2));//2
//printf("%d", 1);//1
// 函数的声明和定义
// 函数的声明:
//1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。
// 但是具体是不是存在,无关紧要。
//2.函数的声明一般出现再函数的使用之前。要满足先声明后使用。
//3.函数的声明一般要放在头文件中的。
// 函数的定义:
// 函数的定义是指函数的具体实现,交代函数的功能实现。
//int Add(int x, int y);//要先声明有这个函数
#include"add.h"//当需要的时候可以引用自己写的头文件
int main()
{
int a = 10;
int b = 20;
int sum = 0;
//函数调用
sum = Add(a, b);
printf("%d\n", sum);
return 0;
}
//.c是你写的代码,.h是你的函数声明。