1.函数的定义和声明
函数定义的语法:
函数类型 函数名(形式参数表){
函数体
}
函数的声明
函数返回值类型 函数名(变量1数据类型, 变量2数据类型,
变量n数据类型)
函数的调用
函数名(变量1, 变量2,
变量n)
函数调用时注意事项:
- 函数调用的实参个数必须与形参个数相同。
- 实参与形参按照在参数表中的位置一一对应传值,实参与形参的名称是否相同对调用传值无任何影响。
- 实参与形参对应位置上的数据类型应该一致。
- 对于无参数函数,即形参表为void的函数,函数调用时实参表必须为空,不能有任何内容。
当调用函数的位置在被调用函数之后,则可以不进行声明;反之则需要先声明,再调用。
以下案例可以不进行声明:
#include<stdio.h>
double max(double a, double b) {
return a > b ? a:b;
}
void main(){
double a = 1.3;
double b = -5.6;
printf("%.1lf和%.1lf的较大值为%.1lf\n", a, b, max(a, b));
}
以下案例,则需要进行先声明,再调用:
#include<stdio.h>
double max(double, double);
void main(){
double a = 1.3;
double b = -5.6;
printf("%.1lf和%.1lf的较大值为%.1lf\n", a, b, max(a, b));
}
double max(double a, double b) {
return a > b ? a:b;
}
2.递归函数
递归函数:在定义一个函数的过程中直接或间接地调用了被定义的函数本身。
递归函数一般分为两类:公式递归和非公式递归。
//公式递归
#include<stdio.h>
long l_sum(int n) {
//求1至n的和
if (n == 1) return 1;
else{
return l_sum(n - 1) + n;
}
}
//非公式递归
#include<stdio.h>
void hanoi(int n, char a, char b, char c) {
// 汉塔诺问题
if (n == 1) {
printf("%c--->%c\n", a, b);
}else{
hanoi(n - 1, a, c, b);
printf("%c--->%c\n", a, b);
hanoi(n - 1, c, b, a);
}
}
void main(){
hanoi(3, 'A','B' ,'C');
}
3.指针函数
函数返回值是指针类型的函数称为指针函数。语法如下:
数据类型 *函数名称(形参表) {
函数体
}文章来源:https://www.toymoban.com/news/detail-481723.html
3.1 指针函数例子1——求字符串数组中最长字符串
#include<stdio.h>
#include<string.h>
char *max_string_len(char *string[], int n){
// 求给定的字符的指针数组中,字符长度最长的字符串。n为指针数组个数
int i, posion, max_l;
posion=0;
max_l=strlen(string[0]);
for (i = 0; i < n; i++){
if (strlen(string[i]) > max_l){
max_l = strlen(string[i]);
posion = i;
}
}
return string[posion];
}
void main(){
char *pstring[4]={"abc", "peculiar", "accent", "rural"};
printf("%s\n", max_string_len(pstring, 4));
}
3.2 指针函数例子1——求学生等级人数
#include<stdio.h>
#define N 6
void main(){
int flag(int, int);
void output(int *, int);
int s1, s2, i;
static int r[5];
for (i = 0; i < N; i++){
scanf("%d%d", &s1, &s2);
r[flag(s1, s2)]++;
}
output(r,5);
}
int flag( int s1, int s2){
// 根据传入的两门课的成绩,求平均值,并返回对应的等级。
int ave;
ave = (s1 + s2) / 2;
if (ave >= 90) return 0;
else if (ave >= 80) return 1;
else if (ave >= 70) return 2;
else if (ave >= 60) return 3;
else return 4;
}
void output(int * p, int n){
// 给定一个指针和整数n,从而实现逐个打印数组中元素的值
int i;
for (i = 0; i < n; i++){
printf("%d ", *(p + i));
}
}
3.3 指针数组和数组指针
- 数组指针:指向数组的指针,指针指向数组首元素地址的指针。例子: int (*p)[5]
- 指针数组: 存放指针的数组,一般用来存放字符串。例子: char *p[5]。
4.函数案例分享
4.1 求1+2+…+n的和
int sum(int n){
//求1+2+...+n的和
int i, s = 0;
for (i = 1; i <= n; i++){
s = s + i;
}
return s;
}
4.2 绘制指定数量的*
void pstar(int n){
// 绘制指定数量的*
for (int i = 1; i <= n; i++){
printf("*");
}
}
4.3 求n的阶乘
long f(int n){
//求n的阶乘
long s = 1l;
for (int i = 1; i <= n; i++){
s = s * i;
}
return s;
}
4.4 绘制n个字符c
void pchar(char c, int n) {
// 绘制n个字符c
for (int i = 1; i <= n; i++){
printf("%c",c);
}
}
4.5 交换两个变量的值
void swap(int *p1, int *p2){ //传的是指针,实际的地址参数,与实参共享空间,实际值会发生改变
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
4.6 哥巴赫猜想
任一大于2的偶数都可写成两个质数之和。文章来源地址https://www.toymoban.com/news/detail-481723.html
#include<stdio.h>
#include<math.h>
int is_prime(int n){ //判断是否为素数,如果是素数返回1,否则0
int i;
for (i = 2; i <= sqrt(n); i++){
if (n % i == 0) return 0;
}
return 1;
}
void main(void){
int i, n;
scanf("%d", &n);
for(i = 3; i < n / 2 ; i += 2){
if (is_prime(i) && is_prime(n - i)){
printf("%d + %d = %d\n", i, n - i, n);
break;
}
}
}
到了这里,关于C语言中自定义函数的使用和案例分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!