评论

收藏

[C++] c语言_Day14_07_13

编程语言 编程语言 发布于:2021-07-13 23:29 | 阅读数:445 | 评论:0

c语言_Day14_07_13
1、函数的理解
函数:即子程序,是一个大型程序中的某部分代码,由一个或多个语句块构成,负责完成某项特定的功能,具有独立性。
​           另外,函数提供了对过程的封装细节的隐藏
分类:

  • 库函数
  • 自定义函数
int add(int num1, int num2)
{
return num1 + num2;
}
int main()
{
printf("%d\n", add(1, 2));
return 0;
}
2、库函数和自定义函数

  • 库函数
对于频繁适应到的一些功能,c语言定义了库函数,以便于开发者开发,减少代码的大量重复
库函数位置: c lib(c库) --->  头文件  --->  库函数
库函数分类:

  • IO函数(如<stdio.h>文件内的函数)
  • 字符串操作函数(如<string.h>文件内的函数)
  • 字符操作函数
  • 内存操作函数
  • 时间\日期函数(如<time.h>文件内的函数)
  • 数学函数(如<math.h>文件内的函数)
  • 其他库函数
库函数学习的具体方法:

  • 名字联想(如strlen == string length),猜测函数功能
  • 查阅文档(cplusplus.com - The C++ Resources Network 或 MSDN 或 cppreference)
例:strcpy学习使用
int main()
{
char source[] = "Hello";
char target[] = "#######";
printf("%s\n", strcpy(target, source));
return 0;
}
通过阅读文档与调试可知:strcpy可拷贝源字符串于目标字符串(包括'\0'),并且返回目标字符串
例:memset学习使用
int main()
{
char arr[] = "Hello, World!";
memset(arr, '', 5);
printf("%s\n", arr);
return 0;
}
通过阅读文档与调试可知:memset用于内存设置,可将一个指针指向的内存空间的前num个字节更改为value

  • 自定义函数
函数组成:
返回值类型 函数名(函数参数)
{
语句...
return 返回值;
}
常见错误代码(不规范)
void swap(int a, int b)
{
int tmp = 0;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int num1 = 10;
int num2 = 20;
swap(num1, num2);
printf("%d %d\n", num1, num2);
return 0;
}
程序执行后未交换两数字,原因为num1、num2所占的内存空间与函数形参a、b所占的内存空间并不一致。故可得出结论:
c语言中函数形参的另行生成,仅赋值为与实参相同值,但其与实参的内存地址并不相同
解决方案:使用指针,直接操纵指针所对应的内存数据(使形参与实参之间可以相互联接)
void swap(int a, int* b)
{
int tmp = 0;
tmp = a;
 a = *b;
 b = tmp;
}
int main()
{
int num1 = 10;
int num2 = 20;
swap(&num1, &num2);
printf("%d %d\n", num1, num2);
return 0;
}
DSC0000.png

3、函数的参数
函数参数分为两类:实参形参

  • 实参:真实传递给函数的参数,可以是变量、常量、表达式、函数等。必须有确定的值以传递给形参
  • 形参:函数名后括号中的变量,仅在函数被调用后实例化,并接收实参的数据,函数调用结束后销毁
形参本质是实参的临时拷贝
4、函数的调用
函数调用分为两类:值传递引用传递

  • 值传递:实参传入数据值,实参与形参占据不同内存块,形参不会影响实参
  • 引用传递:实参传入数据的地址值,使得形参与实参相互关联,函数内部可操纵函数外部
例:
/// <summary>
/// 判断是否为素数
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
int isPrime(int num)
{
if (num <= 1)
 {
    return 0;
  }
  else
  {
    for (int i = 2; i &lt;= sqrt(num) + 1; i++)
    {
      if (num % i == 0)
      {
        return 0;
      }
    }
    return 1;
  }
}
/// <summary>
/// 判断是否为闰年
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
int isLeapYear(int year)
{
if ((year % 4 == 0) && (year % 100 != 0))
 {
    return 1;
  }
  else if (year % 400 == 0)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
/// <summary>
/// 二分查找有序数组
/// </summary>
/// <param name="arr">被查找的有序数组</param>
/// <param name="target">目标值</param>
/// <param name="length">数组长度</param>
/// <returns>若查找到元素则返回对应的索引,若未找到则返回-1</returns>
int binarySearch(int arr[], int target, int length)
{
int left = 0;
int right = length - 1;
int mid;
while (left <= right)
 {
    mid = (left + right) / 2;
    if (arr[mid] &lt; target)
    {
      left = mid + 1;
    }
    else if (arr[mid] &gt; target)
    {
      right = mid - 1;
    }
    else
    {
      return mid;
    }
  }
  return -1;
}注:由于形参arr仅接收数组的第一个值的指针,故无法在函数内部求数组的大小
/// <summary>
/// 每调用函数后num加1
/// </summary>
/// <param name="np">num的指针</param>
void plusOne(int np)
{
*np = np + 1;
}
注:不可使用np++来实现自增,因为++的优先级要高于解引用操作
</div>

关注下面的标签,发现更多相似文章