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.青蛙跳台阶问题