一、用户自定义函数
(一)无参函数定义的一般形式
一般形式:
类型标识符 函数名() {
声明部分;
语句部分;
}
说明:
- 函数名必须遵守标识符命名规则。
(二)有参函数定义的一般形式
一般形式:
类型标识符 函数名(形式参数表列) {
声明部分;
语句部分;
}
说明:
- 形式参数必须指定类型。
- 函数名遵守标识符的规定。
示例:有参函数
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 是形式参数。
- 实参向形参传递的是“值”。
三、形式参数和实际参数
(一)概念
- 形式参数(形参):定义函数时,函数名后括号中的参数。
- 实际参数(实参):调用函数时,函数名后括号中的参数。
(二)参数传递规则(考试重点)
- 形参必须指定类型,缺省类型为 int。
- 实参与形参的类型必须相同。
- 实参向形参传递值。
四、函数应用实例
例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;
}
五、常见简答题汇总
- 简述 C 语言程序开发的步骤及各步作用。
- 简述关键字与一般标识符的区别。
- 简述三种循环结构(for / while / do-while)的区别。
- 简述字符数组与字符串的关系及区别。
- 列举无参函数、有参函数和主函数的定义形式。
1. C 语言程序开发的步骤及各步作用
- 编写源程序(.c 文件)。
- 预处理:处理 #include、#define 等预处理指令。
- 编译:将 C 源代码翻译成汇编代码,并进行语法检查。
- 汇编:将汇编代码转换为目标文件(.obj 或 .o)。
- 链接:将目标文件与库文件链接,生成可执行文件(.exe)。
- 运行与调试。
流程示意:
.c → .obj → .exe
2. 关键字和一般标识符的区别
(一)关键字
- 关键字是 C 语言的保留字。
- 已被系统使用,不能作为变量名或函数名。
- C 语言共有 32 个关键字,全部为小写。

(二)一般标识符
命名规则(考试考点):
- 由字母、数字和下划线组成。
- 第一个字符必须是字母或下划线。
- 区分大小写。
- 只有前 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;
}