首页 > 其他分享 >2308-函数

2308-函数

时间:2023-08-22 15:13:59浏览次数:15  
标签:2308 return 函数 int str printf include

函数
1.库函数

例如:memset

 1 #include <stdio.h>
 2 #include <string.h>//含memset
 3 int main()
 4 {
 5 
 6     char ch[20] = "abcs321";
 7     int len = strlen(ch);//读取ch长度(不包含\n)
 8     memset(ch, '1', len);//把全部len长度的字符全部替换为1
 9     printf("%s\n", ch);
10     return 0;
11 }

 2. 自定义函数

定义函数要写函数输入和返回类型,如 int get_max(int x, int y) 表示输入的是整型x, y,返回整型;void swap(int a, int b) 表示输入整型 a, b,不返回任何值。

当变量跳转到其他函数时,如void swap(int a, int b), 此处ab进入swap函数后,地址会改变,必须把地址传给函数才不会变地址,如下面

 1 #include <stdio.h>
 2 void swap(int* pa, int* pb)
 3 {
 4     int z = *pa;
 5     *pa = *pb;
 6     *pb = z;
 7 }
 8 int main()
 9 {
10     int a = 10;
11     int b = 20;
12     printf("a = %d b = %d\n", a, b);
13     swap(&a, &b);
14     printf("a = %d b = %d\n", a, b);
15     return 0;
16 }

 

 

形参是指如 ,此处a为变量。

实参指如 get_max = (a, int get_max = (3, 7)),a和(3, 7)

 

 1 //调用的时候,实参传给形参,其实形参是实参的一份临时拷贝,改变形参,不能改变实参。 
 2 void Swap1(int x, int y)//调用的形参,生命周期=局部变量
 3 {
 4     int tmp = 0;
 5     tmp = x;
 6     x = y;
 7     y = tmp;
 8 }
 9 
10 void Swap2(int* px, int* py)//调用的形参
11 {
12     int tmp = 0;
13     tmp = *px;
14     *px = *py;
15     *py = tmp;
16 }
17 
18 int main()
19 {
20     int num1 = 1;
21     int num2 = 2;
22     Swap1(num1, num2);//传值调用,括号里为实参
23     printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
24     Swap2(&num1, &num2);//传址调用
25     printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
26     return 0;
27 }

 

例题:写函数来判断闰年:

 1 int is_leap_year(int y)
 2 {
 3     return((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0));//简洁
 4 }
 5 
 6 int main()
 7 {
 8     int y = 0; 
 9     for (y = 1000; y <= 2000; y++)
10     {
11         if (is_leap_year(y) == 1)
12             printf("%d ",y);
13     }        
14     return 0;
15 }

-----------------------

当需要求数组长度时,需要先计算好长度再输入函数,如 int sz = sizeof(a) / sizeof(a[0]); 在函数内部传入的是数组首地址,sizeof(a)计算的是指针的大小=4

 

函数的嵌套使用:

 函数不能嵌套定义,但能嵌套调用

 

 1 #include <stdio.h>
 2 void new_line()//函数的嵌套调用
 3 {
 4     printf("hehe\n");
 5 }
 6 void three_line()
 7 {
 8     int i = 0;
 9     for (i = 0; i < 3; i++)
10     {
11         new_line();
12     }
13 }
14 int main()
15 {
16     three_line();
17     return 0;
18 }

 

函数的链式访问:

1 #include <stdio.h>
2 int main()
3 {
4 printf("%d", printf("%d", printf("%d", 43)));//注:printf函数的返回值是打印在屏幕上字符的个数
5 return 0;
6 }

 

函数声明:

1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3. 函数的声明一般要放在头文件中的。

 

函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。

test.h的内容:放置函数的声明

1 int Add(int x, int y);//函数的声明

 

test.c的内容:放置函数的实现

1 int Add(int x, int y)
2 {
3 return x+y;
4 }

 

函数的递归

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的

一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小。

递归必要条件:

1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。

如将1234打印为1 2 3 4

 1 #include <stdio.h>
 2 void print(int n)
 3 {
 4     if (n > 9)
 5     {
 6         print(n / 10);
 7     }
 8     printf("%d ", n % 10);
 9 }
10 
11 int main()
12 {
13     int num = 1234;
14     print(num);
15     return 0;
16 }

思路:

 --------------------------------------------------------------------------------

栈溢出(stack flow):内存的栈区被局部变量占满。故:

1.不能死递归,都有跳出条件,每次递归逼近跳出条件
2.递归层次不能太深,否则会栈溢出

------------------------------

练习:

编写函数不允许创建临时变量,求字符串的长度。 

 

 1 #include <stdio.h>
 2 int my_strlen(const char* str)
 3 {
 4     if (*str == '\0')
 5         return 0;
 6     else
 7         return 1 + my_strlen(str + 1);
 8 }
 9 int main()
10 {
11     char* p = "abcdef";
12     int len = my_strlen(p);
13     printf("%d\n", len);
14     return 0;

 

阶乘:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 int fac(int f)
 4 {
 5     if (f > 1)
 6         return f * fac(f - 1);
 7     else
 8         return 1;
 9 }
10 int main()
11 {
12     int n = 0;
13     scanf("%d", &n);
14     printf("%d\n", fac(n));
15     return 0;
16 }

 

 斐波那契数列:1 1 2 3 5 8 13 21 34 55 ...

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 int fi(int n)
 4 {
 5     if (n <=2 )
 6         return 1;
 7     else
 8         return (fi(n-1)+fi(n-2));
 9 }
10 
11 int main()
12 {
13     int n = 0;
14     scanf("%d", &n);
15     printf("%d\n", fi(n));
16     return 0;
17 }

此方法(递归)效率低下。用循环更高效:

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 int fib(int n)
 4 {
 5     int a = 1;
 6     int b = 1;
 7     int c = 1;
 8     while (n>2)
 9     {
10         c = a + b;
11         a = b;
12         b = c;
13         n--;
14     }
15     return c;
16 }
17 
18 int main()
19 {
20     int n = 0;
21     scanf("%d", &n);
22     printf("%d\n", fib(n));
23     return 0;
24 }

课后习题:

打印1~100中含有多少个9

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int n = 0;
 5     int count = 0;
 6     for (n = 1; n <= 100; n++)
 7     {
 8         if (n / 10 == 9)
 9             count++;
10         if (n % 10 == 9)
11             count++;
12     }
13     printf("%d\n", count);
14     return 0;
15 }

 

打印10个数中的最大数字:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
 7     int max = arr[0];
 8     int l = sizeof(arr)/sizeof(arr[0]);
 9     for (int i = 0; i < l; i++)
10     {
11         if (arr[i] > max)
12         {
13             max = arr[i];
14         }
15     }
16     printf("%d\n", max);
17     return 0;
18 }

 

(a,b)是逗号表达式,其值为最右表达式的值

 

将一个字符串倒序:

方法1:

 1 #include <stdio.h>
 2 #include <string.h>
 3 void reverse_string(char* str)
 4 {
 5     char temp = 0;
 6     int left = 0;
 7     int right = strlen(str)-1;
 8     while (left < right)
 9     {
10         temp = str[left];
11         str[left] = str[right];
12         str[right] = temp;
13         left++;
14         right--;
15     }
16 }
17 
18 int main()
19 {
20     char arr[]="abcdef";
21     reverse_string(arr);
22     printf("%s\n",arr);
23     return 0;
24 }

方法2:(递归)

 1 #include <stdio.h>
 2 #include <string.h>
 3 void reverse_string(char* str)
 4 {
 5     char temp = *str;
 6     int len = strlen(str);
 7     *str = (*str + len - 1);
 8     *(str + len - 1) = '\0';
 9     if (strlen(str + 1) >= 2)
10     {
11         reverse_string(str + 1);
12     }
13     *(str + len - 1) = temp;
14 
15 }
16 
17 int main()
18 {
19     char arr[]="abcdef";
20     reverse_string(arr);
21     printf("%s\n",arr);
22     return 0;
23 }

 

标签:2308,return,函数,int,str,printf,include
From: https://www.cnblogs.com/scut4787749233/p/17625323.html

相关文章

  • 逐帧动画steps函数用法
    animation-timing-function:steps(number,[end|start])steps(number,[end|start])是将动画分为number段,共有number+1帧画面。start就是抛弃第一帧画面执行动画,end就是抛弃最后一帧画面执行动画。steps的number参数并不是将整个动画过程切割成number段,而是对于某个c......
  • 无涯教程-PHP - 全局变量函数
    全局变量与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字GLOBAL放置在应被识别为全局变量的前面,可以很方便地实现这一目标。<?php$somevar=15;functionaddit(){GLOBAL$somevar;$somevar++;print"Somevaris$s......
  • C++ 函数模版 不定参数
    实现参数不固定的加法,需要如下实现template<typenameT>TtempSum(constT&t){ staticTsum; sum+=t; returnsum;}//这里保存计算结果template<typenameT>TsaveValue(constT&t){ staticTtemp=t;//这里必须用static的功能 returntemp;}voidt......
  • 无涯教程-PHP - 局部变量函数
    Localvariables-局部变量在函数中声明的变量被认为是局部变量,也就是说,只能在该函数中引用它。该函数以外的任何赋值都将被视为与该函数中包含的赋值完全不同的变量-<?php$x=4;functionassignx(){$x=0;print"\$xinsidefunctionis$x.<br......
  • 无涯教程-PHP Installation on Windows NT/2000/XP with Apache函数
    要在Windows上使用PHP5安装Apache,请执行以下步骤。如果您的PHP和Apache版本不同,请相应注意。从www.apache.org/dist/httpd/binaries/win32下载Apache服务器。您需要具有no_src.msi扩展名的当前稳定发行版。双击安装程序文件进行安装;C:\ProgramFiles是一个常见的位置。安装......
  • 【分享】字符串常见函数学习笔记
    字符串常见函数学习笔记 1:查找函数:find()//返回值string::nposstrings="goodgoodstudy,daydayup";intpos1=s.find("good");//查找子串"good"intpos2=s.find("good",4);//从下标4开始,查找子串"good"cout<<pos1<......
  • 无法将“node.exe”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
    node:无法将“node”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。今天准备新建项目,发现node没了,这怎么行?问题描述:vscode提示 无法将“node.exe”项识别为cmdlet、函数、脚本文件或可运行程序的名称。......
  • 12 JavaScript 关于eval函数
    12eval函数eval本身在js里面正常情况下使用的并不多.但是很多网站会利用eval的特性来完成反爬操作.我们来看看eval是个什么鬼?从功能上讲,eval非常简单.它和python里面的eval是一样的.它可以动态的把字符串当成js代码进行运行.s="console.log('我爱你')";eval(s);也......
  • 窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器
    上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可以由SQL中的语句具体指定,大到整个分区作用域,小到当前行指定的某个偏移行(比如当前行的......
  • 「学习笔记」扩展 KMP(Z 函数)
    对于个长度为\(n\)的字符串\(s\)。定义\(z[i]\)表示\(s\)和\(s[i,n-1]\)(即以\(s[i]\)开头的后缀)的最长公共前缀(LCP)的长度。\(z\)被称为\(s\)的Z函数。这里注意,在Z函数中,\(z[0]=0\),但是根据LCP的定义,\(z[0]=n\),具体应该为何值,根据题目意思来判断。本文更偏......