!!!!!!!函数!!!!!!!
//#include<stdio.h>
//int Add(int x, int y)
//{
// int z = 0;
// z = x + y;
// return z;
//}
//int main()
//{
// int a = 10;
// int b = 20;
// int sum=Add(a, b);//Add为自定义函数
// printf("%d\n", sum);
// return 0;
//}
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include<string.h>
//int main()
//{
// char arr1[] = "bit";
// char arr2[20] = "#######";
// strcpy(arr2, arr1);
// printf("%s\n", arr2);
// //strcpy——stringcopy-字符串拷贝
// //strlen——string length-跟字符串长度有关
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
memset-内存设置
//#include <cstring>
//#include<stdio.h>
//int main()
//{
// char arr[] = "hello world";
// memset(arr, '*', 5);//arr为要被设置的对象,‘’里面为更换成的内容,5为数组前几位{被更换掉的}
// printf("%s\n",arr);
// return 0;
//}
// //写一个函数可以找出两个整数的最大值
//#include<stdio.h>
//int getmax(int x, int y)
//{
// if (x > y)
// return x;
// else
// return y;
//}
//int main()
//{
// int a = 100;
// int b = 20;
// int max = getmax(a, b);
// printf("max=%d\n", max);
// return 0;
//}
// //写一个函数可以交换两个整型变量的内容
// 方法@1(无函数)
//#include<stdio.h>
//int main()
//{
// int a = 10;
// int b = 20;
// int tmp = 0;
// printf("a=%d,b=%d\n", a, b);
// tmp = a;
// a = b;
// b = tmp;
// printf("a=%d,b=%d\n", a, b);
// return 0;
//}
// //方法@2(有函数)
// 使用自定义函数
//#include<stdio.h>
//void swap1(int x, int y)
//{
// 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;
// printf("a=%d,b=%d\n", a, b);
// swap2(&a, &b);
// printf("a=%d,b=%d\n", a, b);
// return 0;
//}
//#include<cmath>
//#include<stdio.h>
//int is_prime(int n)
//{
// int a = 0;
// for(a=2;a<n;a++)//优化后改为for(a=2;a<=sqrt(n);a++)
// {
// if (n % a==0)
// return 0;
// }//8、9、10行不可改为else形式,因为这样会产生代码漏洞,从而结果错误。eg:当i=9,a=2时会导致i为素数,而9并不是!!
// return 1;
//}
//int main()
//{
// int i = 0;
// for(i=100;i<=200;i++)
// if (is_prime(i)==1)
// printf("%d\n",i);
// return 0;
//}
///#define _CRT_SECURE_NO_WARNINGS 1
// //写一个函数判断一年是否为闰年
//#include<stdio.h>
//#include<ctype.h>
//int is_leap_year(int n)
//{
// if (n % 4 == 0 && n% 100 != 0)//或者写成y%400==0
// return 1;
// else
// return 0;
//}
//
//int main()
//{
// int year = 0;
// for (year = 1000; year<=2000; year++)
// {
// 判断是否为闰年
// if (is_leap_year(year) == 1)
// printf("%d\n", year);
// }
// return 0;
//}
写一个函数,实现一个整型有序数组的二分查找
//#include<stdio.h>
//int binary_search(int arr[],int k,int sz)//本质上此处的arr是一个指针而并非数组
//{ //sizeof(arr)作为指针大小的时候为4(win32)或8(x64)
// //算法的正式执行 sizeof(arr[0])是第一个元素并且为整形,则大小也为4
// //int sz = sizeof(arr) / sizeof(arr[0]); //导致ine sz值为1,不能得到元素个数
// int left = 0;
// int right = sz - 1;
// while (left <= right)
// {
// int mid = (left + right)/2;//中间元素的下标//每次循环第一步都是求被查找范围的中间元素的下标
// if (arr[mid] < k) //int mid = (left + right)/2;此句代码不可放在循环外面
// {
// left = mid + 1;
// }
// else if (arr[mid] > k)
// {
// right = mid - 1;
// }
// else
// {
// return mid;
// }
// }
// return -1;
//}
//int main()
//{
// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
// int k = 17;
// int sz = sizeof(arr) / sizeof(arr[0]);
// int ret = binary_search(arr, k,sz);//此处传递过去的是arr首元素的地址
// if (ret == -1)
// {
// printf("找不到指定的数字\n");
// }
// else
// {
// printf("找到了,下标是:%d\n", ret);
// }
// return 0;
//}
//#include<stdio.h>
//void Add(int*p)
//{
// (*p)++;
//}
//int main()
//{
// int num = 0;
// Add(&num);
// printf("num=%d\n", num);
// Add(&num);
// printf("num=%d\n", num);
// Add(&num);
// printf("num=%d\n", num);
// return 0;
//}
//#include<stdio.h>
//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<string.h>
//#include<stdio.h>
//int main()
//{
// int len = 0;
// len = strlen("abc");//@1
// printf("%d\n", len);//@2@1、@2可替换为printf("%d\n",strlen("abc"))
// return 0;
//}
//#include<stdio.h>
//int main()
//{
// printf("%d\n",printf("%d\n",printf("%d\n", 44)));
// return 0;
//}//"printf("%d\n", 44)"返回的值为“打印字符的个数”
//#include<stdio.h>
函数的声明
//int Add(int x, int y);
//int main()
//{
// int a = 10;
// int b = 20;
// int sum = 0;
// //函数的调用
// sum = Add(a, b);
// printf("%d\n", sum);
// return 0;
//}
函数的定义
//int Add(int x, int y)
//{
// int z = x + y;
// return z;
//}
//#include<stdio.h>
//#include"add.h.cpp"//引用自己写的头文件用双引号
//int main()//如果“加法”是一个独立的模块,写一个“add.h.cpp”和“add.c.cpp”
把函数的声明放在add.h.cpp里边去,把函数的定义(实践)放到“add.c.cpp”里边去。
如果要使用,则用双引号引用一下自己创建的头文件
//{
// int a = 10;
// int b = 20;
// int sum = 0;
// //函数的调用
// sum = Add(a, b);
// printf("%d\n", sum);
// return 0;
//}
拆开的理由:拆分复杂功能,将每种功能分开存放,更利于编写。
函数的递归
// //最简单的递归函数
//#include<stdio.h>
//int main()
//{
//
// printf("hehe\n");
// main();
// return 0;
//}
接受一个整型值(无符号),按照顺序打印它的每一位。eg:输入1234,输出1 2 3 4
// //方法1
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int main()
//{
// int num = 0;
// scanf("%d", &num);//1234
// printf("%d ",num/1000);
// printf("%d ",(num%1000)/100);
// printf("%d ",(num%100)/10);
// printf("%d ",num%10);
// return 0;
//}
// //方法2
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//void XXX(int n)//eg:1234
//{
// if (n > 9)//为了判断是否为两位数
// {
// XXX(n / 10);
// }
// printf("%d ", n % 10);
//}
//
//int main()
//{
// unsigned int num = 0;
// scanf("%d", &num);
// XXX(num);//自定义函数XXX
// return 0;
//}
编写函数创建临时变量,求字符串长度
//#include<stdio.h>
//#include<string.h>
//int my_strlen(char* str)//str为指针变量,str存的是arr(bit)的地址
//{
// int count = 0;//计数器count(变量)
// while (*str != '\0')//str不等于\0指的是还没有到字符串的结束位置//if语句不能循环,需要换成while变成循环
// { //到”\0“的时候循环与递归停止
// count++;//统计一个字符
// str++;//地址+1,就是向字符串后走了一步到了“i”(起初在“b”)(分别为“b”“i”“t”“\0”)
// }//当*str=\0时,“/0!=\0”为假,跳出代码块,因此count里放的就是元素个数了
// return count;
//}
//int main()
//{
// char arr[] = "bit";
// //int len = strlen(arr);//strlen求字符串长度
// //printf("%d\n", len);
// int len = my_strlen(arr);//arr是数组,数组传参数,传过去的不是整个数组,而是第一个元素的地址
// //模拟了实现了一个strlen函数
// printf("len=%d\n", len);
// return 0;
//}
编写函数不允许创建临时变量,求字符串长度
用递归的方法(把大事化小)
my_strlen("bit");
1+my_strlen("it");
1+1+my_strlen("t");
1+1+1+my_strlen("\0");
1+1+1+0
3
//#include<stdio.h>
//#include<string.h>
//int my_strlen(char* str)//
//{
// if (*str != '\0')
// return 1 + my_strlen(str + 1);//str+1指向i的地址则my_strlen从i的地方向后找字符串
// else
// return 0;//若发现第一个字符就是\0,则长度为0
//}
//int main()
//{
// char arr[] = "bit";
// //int len = strlen(arr);//strlen求字符串长度
// //printf("%d\n", len);
// int len = my_strlen(arr);//arr是数组,数组传参数,传过去的不是整个数组,而是第一个元素的地址
// //模拟了实现了一个strlen函数
// printf("len=%d\n", len);
// return 0;
//}
求n的阶乘(不考虑溢出)
循环法
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int Ax(int n)
//{
// int i,ret = 1;
// for (i = 1; i <= n; i++)
// {
// ret *= i;
// }
// return ret;
//}
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d", &n);
// ret= Ax(n);//循环方式
// printf("%d\n", ret);
// return 0;
//}
递归法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Ax1(int n)
{
int i,ret,sum = 1;
for (i = 1; i <= n; i++)
{
sum += ret*i;
}
return sum;
}
int Ax2(int n)
{
if (n <= 1)
return 1;
else
return n * Ax2(n - 1);
}
int main()
{
int n = 0;
int sum=1;
int ret = 0;
scanf("%d", &n);
ret= Ax2(n);//循环方式
printf("%d\n", sum);
return 0;
}
求第n个斐波那契数(不考虑溢出)
斐波那契数列:()前两个数之和等于第三个数
1 1 2 3 5 8 13 21 34 55 ........
方法1(递归方法存在效率低的问题)
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int count = 0;//56、59、60、61、62、76为的是测试代码中有多少重复且多余性操作
//int FBNQ(int n)
//{
// if (n == 3)//测试第3个斐波那契数的计算次数
// {
// count++;
// }
// if (n <= 2)
// return 1;
// else
// return FBNQ(n - 1) + FBNQ(n - 2);
//}
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d", &n);
// //TDD:测试驱动开发
// ret = FBNQ(n);
// printf("ret=%d\n", ret);
// printf("count=%d\n", count);
// return 0;
//}
方法2(优化)(循环方法可以有效增加代码效率)
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int FBNQ(int n)
//{
// int a = 1;
// int b = 1;
// int c = 1;//此处的c最好为1,由于当c=0时,会导致斐波那契数的第一位和第二位出错(第1、2位都为1)
// //而当c=1时,while不会执行,return c正好为1
// while (n > 2)
// {
// c = a + b;
// a = b;
// b = c;
// n--;//此行代码的意义;为了保证在n=3时循环一次后,n--;变成2,就不再进行循环;
// }
// return c;
//}
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d", &n);
// //TDD:测试驱动开发
// ret = FBNQ(n);
// printf("ret=%d\n", ret);
// return 0;
//}
/测试题
//1.青蛙跳台阶
//共n个台阶
//1次可以跳一个台阶
// 一次也可以跳2个台阶
//这只青蛙要跳到第n个台阶,求一共几种跳法?
//2.汉诺塔问题
//塔1(a,b,c)、塔2()、塔3()a,b,c为三个铁盘且a<b<c,要求在挪动的过程中,
//始终保持从上到下(由大到小)的顺序,可以借助塔2,最终将a,b,c三个塔放在c上