C语言笔记 1月21日 函数

一、用户自定义函数

(一)无参函数定义的一般形式

一般形式:

类型标识符 函数名() {
    声明部分;
    语句部分;
}

说明:

  • 函数名必须遵守标识符命名规则。

(二)有参函数定义的一般形式

一般形式:

类型标识符 函数名(形式参数表列) {
    声明部分;
    语句部分;
}

说明:

  • 形式参数必须指定类型。
  • 函数名遵守标识符的规定。

示例:有参函数

int max(int x, int y)
{
    int z;          /* 声明部分 */
    z = x > y ? x : y;
    return z;       /* 语句部分 */
}

结构说明:

  • int:类型标识符(返回值类型)
  • max:函数名
  • int x, int y:形式参数表列
  • int z:局部变量,只能在函数内部使用

二、函数的返回值

(一)return 语句的形式

return 变量名;
return(变量名);
return;        // 用于 void 函数

(二)返回值示例

#include <stdio.h>

int max(int x, int y);

int main()
{
    int a, b, c;
    scanf("%d,%d", &a, &b);
    c = max(a, b);
    printf("%d", c);
    return 0;
}

int max(int x, int y)
{
    int z;
    z = x > y ? x : y;
    return z;
}

说明:

  • main 为主调函数。
  • a、b 是实际参数。
  • x、y 是形式参数。
  • 实参向形参传递的是“值”。

三、形式参数和实际参数

(一)概念

  • 形式参数(形参):定义函数时,函数名后括号中的参数。
  • 实际参数(实参):调用函数时,函数名后括号中的参数。

(二)参数传递规则(考试重点)

  1. 形参必须指定类型,缺省类型为 int。
  2. 实参与形参的类型必须相同。
  3. 实参向形参传递值。

四、函数应用实例

例1:用函数求两个数的和

int sum(int x, int y)
{
    int z;
    z = x + y;
    return z;
}

例2:输入三个数,输出最大值(条件运算符)

#include <stdio.h>

int main()
{
    int a, b, c, temp, max;
    printf("请输入 a,b,c: ");
    scanf("%d,%d,%d", &a, &b, &c);
    temp = (a > b) ? a : b;
    max = (temp > c) ? temp : c;
    printf("a,b,c 中最大数是 %d", max);
    return 0;
}

例3:if 语句实现三个数最大值

#include <stdio.h>

int main()
{
    float a, b, c, max;
    printf("输入三个数,用逗号隔开:");
    scanf("%f,%f,%f", &a, &b, &c);
    if (a > b)
        max = a;
    else
        max = b;
    if (max < c)
        max = c;
    printf("最大的数是:%f\n", max);
    return 0;
}

例4:函数嵌套调用求最大值

#include <stdio.h>

int max(int x, int y)
{
    int z;
    z = x > y ? x : y;
    return z;
}

int main()
{
    int a, b, c, d;
    scanf("%d,%d,%d", &a, &b, &c);
    d = max(max(a, b), c);
    printf("最大值:%d", d);
    return 0;
}

例5:一个函数直接求三个数最大值

#include <stdio.h>

int max(int a, int b, int c)
{
    return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
}

int main()
{
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("最大的是: %d", max(a, b, c));
    return 0;
}

例6:逐步比较法求最大值

#include <stdio.h>

int max(int x, int y)
{
    int z;
    if (x > y)
        z = x;
    else
        z = y;
    return z;
}

int main()
{
    int a, b, c, d;
    printf("please input three numbers (a b c):");
    scanf("%d,%d,%d", &a, &b, &c);
    d = max(a, b);
    d = max(c, d);
    printf("%d,%d,%d,the max is %d\n", a, b, c, d);
    return 0;
}

五、常见简答题汇总

  1. 简述 C 语言程序开发的步骤及各步作用。
  2. 简述关键字与一般标识符的区别。
  3. 简述三种循环结构(for / while / do-while)的区别。
  4. 简述字符数组与字符串的关系及区别。
  5. 列举无参函数、有参函数和主函数的定义形式。

1. C 语言程序开发的步骤及各步作用

  1. 编写源程序(.c 文件)。
  2. 预处理:处理 #include、#define 等预处理指令。
  3. 编译:将 C 源代码翻译成汇编代码,并进行语法检查。
  4. 汇编:将汇编代码转换为目标文件(.obj 或 .o)。
  5. 链接:将目标文件与库文件链接,生成可执行文件(.exe)。
  6. 运行与调试。

流程示意:

.c  →  .obj  →  .exe

2. 关键字和一般标识符的区别

(一)关键字

  • 关键字是 C 语言的保留字。
  • 已被系统使用,不能作为变量名或函数名。
  • C 语言共有 32 个关键字,全部为小写。

e99229534fc0e4cf7c027520f56ec8dc

(二)一般标识符

命名规则(考试考点):

  1. 由字母、数字和下划线组成。
  2. 第一个字符必须是字母或下划线。
  3. 区分大小写。
  4. 只有前 32 个字符有效。

3. 三种循环执行方式的区别

C 语言中常用的三种循环语句是 while、do…while 和 for。

  • while:先判断、后执行。条件不成立时循环体一次也不执行。
  • do…while:先执行、后判断。循环体至少执行一次。
  • for:循环次数已知时常用,把初始化、条件判断、更新集中在一行,结构清晰。

4. C 语言中字符数组与字符串是否相同及原因

字符数组与字符串并不完全相同。

字符数组是一组连续存放的字符数据,其元素可以是任意字符;而字符串是以字符数组为载体,并且以空字符 \0 作为结束标志的一种特殊字符序列。

因此,并非所有字符数组都是字符串,只有包含结束符 \0 的字符数组才能被当作字符串来处理。

5. 无参函数、有参函数和主函数的定义形式

  • 无参函数的一般定义形式:

    返回值类型 函数名(void) 或 返回值类型 函数名()。

  • 有参函数的一般定义形式:

    返回值类型 函数名(参数类型1 参数1, 参数类型2 参数2, …)。

  • 主函数(main 函数)的常见定义形式:

    int main(void) 或 int main(int argc, char *argv[])。

其中 main 是程序的入口函数,程序从该函数开始执行。


六、考试例题(题目 + 代码 + 答案)

说明:以下每道题均保留题目原文保留原代码(含 Program 空缺版),并保留对应答案代码与多种写法/注释,未删减。


1)闰年判断

题目:请编写 fun 函数程序,从键盘输入某一年,判断该年是否为闰年。

闰年的条件是:

(1)能被 4 整除但不能被 100 整除。

(2)能被 400 整除。符合任何一个条件就是闰年。

输入年份为整型。

(1)题目给定代码(待补全)

#include <stdio.h>
int fun(int year )
{
    int leap;
    /**********Program**********/

    /**********  End  **********/
}

void main( )
{
    int year ;
    scanf("%d", &year);
    if(fun(year) == 1)
        printf("yes");
    else
        printf("no");

}

(2)参考答案代码

#include <stdio.h>
int fun(int year )
{
    int leap;
    /**********Program**********/
    if (year%4==0&&year%100!=0||year%400==0) {
        leap=1;
    }else {
        leap=0;
    }
    return leap;
    /**********  End  **********/
}

void main( )
{
    int year ;
    scanf("%d", &year);
    if(fun(year) == 1)
        printf("yes");
    else
        printf("no");

}

2)三角形类型判断

题目:输入三角形的三条边,判断其能否构成三角形,如果可以,则判断出三角形的种类:等腰三角形、等边三角形、直角三角形或一般三角形。

注意:输出分五种情况:

“等边三角形\n”;“等腰三角形\n”;“直角三角形\n”;“一般三角形\n”;“不能构成三角形\n”。严格按照所给文字输出否则不得分。

#include <stdio.h>
void main()
{
    int a,b,c;
    printf("请输入三角形的三条边:");
    scanf("%d%d%d",&a,&b,&c);
    /**********Program**********/
    int x,y,z;
    x=((a>b)?((a>c)?a:c):((b>c)?b:c));//最大
    y=((a>b)?((a<c)?a:c):((b<c)?b:c));//第二大
    z=((a<b)?((a<c)?a:c):((b<c)?b:c));//最小
    if ((y+z)>x) {
        if (y==z) {
            if (y==x) {
                printf("等边三角形");
            }else {
                printf("等腰三角形");
            }
        }else if (x*x==y*y+z*z){
            printf("直角三角形");
        }else {
            printf("一般三角形");
        }
    }else {
        printf("不能构成三角形");
    }
    /**********  End  **********/

}

3)水仙花数判断

题目:在 main 函数中从键盘输入一个三位数,并输出判断结果。请编写 fun 函数(函数是判断一个三位数是否”水仙花数”)。例如:153 是一个水仙花数,因为 153=1+125+27。

(1)题目给定代码(待补全)

#include <stdio.h>
int fun(int m)
{
  /**********Program**********/

  /**********  End  **********/

}

main()
{
  int m,flag;
  printf("enter number:");
  scanf("%d",&m);
  flag=fun(m);
  if(flag)
    printf("%d 是水仙花数\n",m);
  else
    printf("%d 不是水仙花数\n",m);
  }

(2)参考答案代码

#include <stdio.h>
int fun(int m) {
    /**********Program**********/
    int g,s,b;
    g=m%10;
    s=(m/10)%10;
    b=m/100;
    if (m==(g*g*g+s*s*s+b*b*b)) {
        return 1;
    }else{
        return 0;
    }
    /**********  End  **********/

}

void main()
{
    int m,flag;
    printf("enter number:");
    scanf("%d",&m);
    flag=fun(m);
    if(flag)
        printf("%d 是水仙花数\n",m);
    else
        printf("%d 不是水仙花数\n",m);
}

4)打印星号图案

题目:将程序补充完整,打印出如下图案。

*
***
*****
*******
*********
*******
*****
***
*

注意:请勿改动主函数 main 中的任何内容,仅在函数花括号中填入你编写的若干语句。

(1)题目给定代码(待补全)

#include "stdio.h"
void main()
{
    int i,j;
    for(i=0;i<=4;i++)
    {
       for(j=0;j<=2*i;j++)
           printf("*");
       printf("\n");
    }
    /**********Program**********/

    /**********  End  **********/
    }

(2)参考答案代码

#include "stdio.h"
void main() {
    int i,j;
    for(i=0;i<=4;i++)
    {
        for(j=0;j<=2*i;j++)
            printf("*");
        printf("\n");
    }
    /**********Program**********/
    for(i=3;i>=0;i--)
    {
        for(j=0;j<=2*i;j++)
            printf("*");
        printf("\n");
    }
    /**********  End  **********/
}

5)三位数反序

题目:假设 m 是一个三位数,编写程序输出由 m 的个位、十位、百位反序而成的三位数(例如:123 反序为 321)。请编 fun 函数。

(1)题目给定代码(待补全)

#include"stdio.h"

int fun(int a)
{
   int m,k,n,b;
    /**********Program**********/

    /**********  End  **********/
}

void main()
{
    int a,k;
    scanf("%d",&a);
    k=fun(a);
    printf("k=%d",k);

}

(2)参考答案代码(两种写法都保留)

#include"stdio.h"
int fun(int a)
{
    int m,k,n,b;
    /**********Program**********/
    m=a%10;
    n=(a/10)%10;
    b=a/100;
    k=m*100+n*10+b;
    return k;
    /**********  End  **********/
}

int fun1(int a) {
    int m,k,n,b;
    k=0;
    while (a!=0) {
        k=k*10+a%10;
        a/=10;
    }
    return k;
}
void main()
{
    int a,k;
    scanf("%d",&a);
    k=fun1(a);
    printf("k=%d",k);

}

6)四位数各位数字立方和

题目:随机输入一个四位数,求其各位数字的立方和。例如:输入 2345,k=224。

(1)题目给定代码(待补全)

#include <stdio.h>
int fun(int n)
{
   /**********Program**********/

  /**********  End  **********/
 }

main()
{
  int x,k;
  printf("输入一个4位整数:");
  scanf("%d",&x);
  k=fun(x);
  printf("k=%d\n",k);
 }

(2)参考答案代码

#include <stdio.h>
int fun(int n)
{
    /**********Program**********/
    int t=0;
    while (n!=0) {
        t=t+((n%10)*(n%10)*(n%10));
        n/=10;
    }
    return t;
    /**********  End  **********/
}
void main()
{
    int x,k;
    printf("输入一个4位整数:");
    scanf("%d",&x);
    k=fun(x);
    printf("k=%d\n",k);
}

7)4 或 7 整除的倒数之和

题目:函数 fun 的功能是:计算并输出 n(包括 n)以内所有能被 4 或 7 整除的自然数的倒数之和。例如:若主函数中从键盘给 n 输入 50 后,则输出为 S= 1.110497。

编写函数 fun。注意:n 的值要求不大于 100。

(1)题目给定代码(待补全)

#include <stdio.h>
double fun(int n)
{
    /**********Program**********/

    /**********  End  **********/
}

void main()
{
    int n;
    double s;
    printf("\nInput n:");
    scanf("%d",&n);
    s=fun(n);
    printf("\n\ns=%f\n",s);
}

(2)参考答案代码

#include <stdio.h>
double fun(int n)
{
    /**********Program**********/
    double sum=0;
    for (int i=1;i<=n;i++) {
        if (i%4==0||i%7==0) {
            sum+=1.0/i;
        }
    }
    return sum;
    /**********  End  **********/
}
void main()
{
    int n;
    double s;
    printf("\nInput n:");
    scanf("%d",&n);
    s=fun(n);
    printf("\n\ns=%f\n",s);
}

8)统计一行字符串中单词个数

题目:请编写函数 fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。

注意:请勿改动 main 函数和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。

(1)题目给定代码(待补全)

#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
/**********Program**********/

/**********  End  **********/
}
void main()
{
    char line[N];
    int num=0;
    printf("Enter a string:\n ");
    gets(line);
    num=fun(line);
    printf("The number of word is:%d\n\n ",num);
}

(2)参考答案代码(含第二种写法注释,原样保留)

#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
    int count = 0;
    int in_word = 0;
    for(int i = 0; s[i]; i++){
        if(s[i] != ' ' && !in_word){
            count++;
            in_word = 1;
        } else if(s[i] == ' '){
            in_word = 0;
        }
    }
    return count;
//第二种
// int i,j=0;
// for(i=0;s[i]!='\0';i++)
//     if(s[i]!=' '&&(s[i+1]==' '||s[i+1]=='\0'))
//         j++;
// return j;

}
void main()
{
    char line[N];
    int num=0;
    printf("Enter a string:\n ");
    gets(line);
    num=fun(line);
    printf("The number of word is:%d\n\n ",num);
}

9)求最大值第一次出现位置(stack)

题目:依据函数 stack 功能完善函数:随机输入一组数值(n 个),求最大值出现的位置(如果最大值出现多次,求出第一次出现的位置)。

(1)题目给定代码(待补全)

#include<stdio.h>
int stack(int s[],int n)
{
    /**********Program**********/

    /**********  End  **********/
}

main()
{
    int a[100],n,i,t;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    t=stack(a,n);
    printf("the max_value position is:%d\n",t);

(2)参考答案代码(含多种写法注释与指针写法,原样保留)

#include<stdio.h>
int stack(int s[],int n)
{
    /**********Program**********/
    int max=s[0],sign=0;
    for (int i=0;i<n;i++) {
        if (max<s[i]) {
            max=s[i];
            sign=i;
        }
    }
    return sign;
}
// 一个if:
// int stack(int s[], int n)
// {
//     int pos = 0;
//     for (int i = 1; i < n; i++)
//         if (s[i] > s[pos])
//             pos = i;
//     return pos;
// }
// 三目运算:
// int stack(int s[], int n)
// {
//     int pos = 0;
//     for (int i = 1; i < n; i++)
//         pos = (s[i] > s[pos]) ? i : pos;
//     return pos;
// }

// 指针:
// int *p = s;
// for (int i = 1; i < n; i++)
//     if (s[i] > *p)
//         p = &s[i];
// return p - s;
/**********  End  **********/

int main() {
    int a[100],n,i,t;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    t=stack(a,n);
    printf("the max_value position is:%d\n",t);
    return 0;
}
上一篇 FRP 自动安装脚本
下一篇 C语言复习 1月25日
Keason

Keason管理员

flag{fkxqsVIVO50tmgbd}

本月创作热力图