1.函数概念理解
例题一个求和函数
#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);
printf("%d\n",sum);
return 0;
}
拷贝函数
#include <stdio.h>
#include <string.h>//strcpy使用时需要引用
int main()
{
char arr1[]="bit";
char arr2[]="##########";
strcpy(arr2,arr1);//把arr1的内容拷贝到arr2;里去
printf("%s\n",arr2);
return 0;
}
memset函数
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="hellow world";
memset (arr1,'*',5);
printf("%s\n",arr1);
return 0;
}
结果
*****w world
2.自定义函数两个数值取较大值
#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);
printf("%d\n",sum);
return 0;
}
3.写一个函数交换两个整形变量的内容
#include <stdio.h>
#include <string.h>
void Swap2(int* pa,int* pb)//void表示没有返回值
{
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;
}
结果
a=10 b=20
a=20 b=10
4.写一个函数可以判断一个数是不是素数
#include <stdio.h>
int is_prime(int n)
{
int j =0;
for(j=2;j<n;j++)
{
if(n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i =0;
for (i=100; i <+ 200; i++)
{
if(is_prime(i) ==1)
printf("%d ",i);
}
return 0;
}
结果
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
5.写一个函数判断一年是不是闰年
#include <stdio.h>
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;
}
结果
1088 1092 1096 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000
6.写一个函数,实现一个整型有序数组的二分查找
#include <stdio.h>
//本质上arr是个指针
int binary_search(int arr[],int k,int sz)
{//算法的实现
int left = 0;
int right = sz-1;
while(left<= right)
{
int mid = (left+right)/2;/中间元素的下标
if(arr[mid]<k)
{
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 =7;
int sz =sizeof(arr)/sizeof(arr[0]);
//实际上传过去事数组首元素的地址
int ret = binary_search(arr,k,sz);
if(ret == -1)
{
printf("can't find\n ");
}
else
{
printf("finded:%d\n ",ret);
}
return 0;
}
7.写一个函数,每调用一次这个函数,就会将num的值增加1.
#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;
}
结果
num=1
num=2
num=3
7.链式访问含义:把一个函数的返回值作为另一个函数的参数
#include <stdio.h>
int main()
{
printf("%d",printf("%d",printf ("%d",43)));
return 0;
}
结果
4321
8.函数的声明与调用
#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;
}
结果
30
引用自己写的
stdio “add.h” 用双引号写
引用库里面的
stdio<add.h>用大于小于号
调用和声明真正用于文件与文件之间,不是文件的内部
1.告诉编译器有个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在无关紧要
2.函数的声明一般出现在函数的使用之前,要满足先声明后使用
3.函数的声明一般要放在头文件中的
递归******************
必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不在继续
2.每次递归调用之后越来越接近这个限制条件
1.接收一个整形值(无符号),按照顺序打印它的每一位例如输入1234输出1 2 3 4
#include <stdio.h>
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ",n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
2.编写函数不允许创建临时变量,求字符串长度
#include <stdio.h>
#include <string.h>
int my_strlen(char* str)
{
int count = 0;
while(*str!='\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "bit";
int len = my_strlen(arr);
printf("len = %d\n",len);
return 0;
}
结果
len = 3
3.实现n的阶乘
#include <stdio.h>
int Facl(int n)
{
int i = 0;
int ret = 1;
for(i=1;i<=n;i++)
{
ret *=i;
}
return ret;
}
int Fac2(int n)
{
if (n<=1)
return 1;
else
return n*Fac2(n-1);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret=Facl(n);
printf("%d\n",ret);
return 0;
}
4.求第n个斐波那契数(不考虑溢出)兔子数列
#include <stdio.h>
int count = 0;
int Fib(int n)
{
if(n==3)//测试第三个斐波那契数的计算次数
{
count ++;
}
if(n<=2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret=Fib(n);
printf("ret = %d\n",ret);
printf("count = %d\n",count);
return 0;
}
上述第n个计算方法计算量太大不适合用递归,用循环合适
#include <stdio.h>
int Fib(int n)
{
int a =1;
int b =1;
int c =1;//保证输入1,2时,n的值是1
while(n>2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret=Fib(n);
printf("ret = %d\n",ret);
return 0;
}
有空补充
1.汉诺塔问题
2.青蛙跳台阶问题