提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
`
提示:以下是本篇文章正文内容,下面案例可供参考
一、【那些函数】
函数定义
格式:返回类型 函数名 形参声明
比如:int max (int a,int b)
返回类型指,函数总的来说是个公式吧,那他总得有个得数,这时就需要返回类型指定返回值(得数)的类型了
函数名指,函数之间相互调用时,就用到函数名引导了
形参声明指,用于接收起辅助提示作用的变量–形式参数,就是桥梁作用
🔰像该参数接收多个形式参数的情况下,使用逗号把它们分割开
🔰在这个函数体声明变量时,不能有声明和形式参数同名的变量,否则会发生变量名冲突
函数调用-形参、
如果把他当成是信号的传递就好理解了,子函数max2()函数,备有2个int形式的参数,一个是a,另一个是b,函数运算将使a和b最大的一个数,以int形式备好等待传出去;
直到mian()主函数,执行到调用的地方,执行子函数,把返回值拿到main()主函数用,这个是个实参。
形参指,形式上虚的一个参数,作用是起跨接桥梁作用,连接主函数的实参和子函数函数体中运算的参数a,b,子函数名后面,形式参数做引导作用
🔰函数调用运算符-“()”
函数调用的格式就是函数名后面加小括号()
比如:max2(n1, n2)
🔰函数调用 运算符(),括起来的都是实参,多个实参要用逗号分割
🔰进行函数调用后,程序的流程将一下子跳转到该函数处,因此,main()函数的执行将暂时中断,开始执行max2函数
🔰在被调用函数的地方,会生成用于形参的变量,形参会被赋上实参的值,这种情况下,形参a和b会被赋上实参n1和n2的值,即45和83,以便子函数使用这个45和83运算比大小去,同时这种函数间值传递的方式也叫做“值传递”,这时形参会充当是实参的一个副本
🔰程序执行到return或最后一个大括号时,就会跳回主函数中,同时把返回值带到主函数,如上面图所示
🔰函数调用时max2(n1, n2),使用的实参,既可以是实参也可以是变量,所以max2(n1, 5)这种写法也是可以的,函数将输出变量n1和5当中较大的哪一个
🔰实参和形参,是完全不同的两种东西,使用时候因此不必担心实参和形参名字相同的问题
🔰返回值时,返回值有且只能有一个,不会返回多个数
🔰函数的调用,函数2要调用函数1,函数1就得写在函数2的前面,若函数1写在函数2后面,函数2前面也要对其声明–也称为函数原型声明
🔰一般情况推荐把主函数写在最后,被调用函数写在他前面
void()函数-没有返回值的函数
/*
显示出一个直角在左下方的等腰直角三角形(函数版)
*/
#include <stdio.h>
/*--- 连续显示出n个'*' ---*/
void put_stars(int n)
{
while (n-- > 0)
putchar('*');
}
int main(void)
{
int i, len;
printf("生成一个直角在左下方的等腰直角三角形。\n");
printf("短边:");
scanf("%d", &len);
for (i = 1; i <= len; i++) {
put_stars(i);
putchar('\n');
}
return 0;
}
*🔰比如本函数是用来显示的,没有需要返回的结果,必须从子函数put_stars(int n)这拿吗?不是的,这种没有返回值类型的函数,要声明为void,意思是没有返回值
🔰void就是“空”的意思,在c语言中无论有没有返回值都被称为是函数,而在其他编程语言中,每有返回值会定义成非函数
形参为空的函数
/*
逆向显示输入的正整数
*/
#include <stdio.h>
/*--- 返回输入的正整数 ---*/
int scan_pint(void)
{
int tmp;
do {
printf("请输入一个正整数:);
scanf("%d", &tmp);
if (tmp <= 0)
puts("\a请不要输入非正整数。");
} while (tmp <= 0);
return tmp;
}
/*--- 返回正整数倒转后的值 ---*/
int rev_int(int num)
{
int tmp = 0;
if (num > 0) {
do {
tmp = tmp * 10 + num % 10;
num /= 10;
} while (num > 0);
}
return tmp;
}
int main(void)
{
int nx = scan_pint();
printf("该整数倒转后的值是%d。\n", rev_int(nx));
return 0;
}
🔰int scan_pint(void)这里,函数scan_pint是用来读取键盘输入的正整数并返回,该函数无接收形参,为了加以说明,在小括号()中写入了void,当然主函数调用方也没有必要赋实值了,所以函数调用运算符()中是空,例程:int main(void),表示主函数不包含形参,另外也存在包含形参的主函数
🔰int nx = scan_pint();这里,主函数的声明nx的部分,该变量的初始值是函数scan_pint()的调用表达式。变量nx使用函数的返回值(程序执行时从键盘输入的非负的整数值)进行初始化,但是这种初始化方法只适用于拥有自动存储期的对象,不适用于静态存储器的对象
🔰作用域,在int rev_int(int num)和int scan_pint(void)都出现了相同标识符的变量标识符tmp,但是作用域也只在各自的代码块里作用
/*
计算最高分
*/
#include <stdio.h>
#define NUMBER 5 /* 学生人数 */
int tensu[NUMBER]; /* 数组定义 */
int top(void); /* 函数top的函数原型声明 */
int main(void)
{
extern int tensu[]; /* 数组的声明(可以省略) */
int i;
printf("请输入%d名学生的分数。\n", NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("%d:", i + 1);
scanf("%d", &tensu[i]);
}
printf("最高分=%d\n", top());
return 0;
}
/*--- 返回数组tensu 的最大值(函数top的函数定义)---*/
int top(void)
{
extern int tensu[]; /* 数组的声明(可以省略)*/
int i;
int max = tensu[0];
for (i = 1; i < NUMBER; i++)
if (tensu[i] > max)
max = tensu[i];
return max;
}
🔰int tensu[NUMBER]; / 数组定义 /,这里,程序块中的声明是程序块的一部分,而相数组 tensu这样在函数外声明的变量标识符,其名称从声明位置开始,到该程序的结尾都能使用
🔰函数原型声明,主函数要调用函数int top(void),int top(void)就得写在主函数的前面,若int top(void)写在函数2后面,主函数前面也要对其声明–也称为函数原型声明int top(void); / 函数top的函数原型声明 /,一切的原因就是程序也是和人一样顺序读取的
🔰函数原型声明的特点是,会明确记述函数的返回类型和形参类型和个数等的声明,但是没有其他信息了
对象式-宏
函数式-宏
#define sqr(x) ((x) * (x)) /* 计算x的平方的函数式宏 */
在程序中出现sqr(x)的地方,就把他替代展开成 ((x) * (x)) 的形式
如果在宏名称sqr和紧邻其后的“(”之间插入空格,进行如下宏定义
#define sqr (x) ((x)*(x))
则sqr就会被编译器当做对象式宏,即程序中的sqr都会被替换为(x)((x)*(x))。
我们在定义函数式宏时,必须注意不要误将空格写入宏名称和“(”之间。
#define sum_of(x,y) x+y /*两值之和的函数式宏*/
```c
#define max(x,y) (((x)>(y))?(x):(y)) /*返回x,y中较大值的宏*/
**不带参数的函数式-宏**
函数式-宏也可以像函数那样进行不带参数的定义,例如下面这个响铃的宏alert().
```c
#define alert() (putchar('\a')) /*响铃的宏*/
库函数 library function
1.printf() 输出函数
printf(“%d”,15+37);
%d和15+37,都是实参,多个实参要用,隔开;
printf()函数的第一个参数是格式化字符串,格式化字符串可以包含转换说明,就是那个%d就是转换说明,格式化字符串中除转换说明以外的都会原样输出;
要在printf函数%号,就打%%;
2.scanf 格式化输入函数
scanf()可以从键盘读取到输入的信息;
使用scanf()时,变量前要加&,如:scanf(“%d”, &no);
3.puts() 输出函数
puts是,s指string英文是字符串的意思;
4.printf()输出函数和puts()输出函数异同
printf(“ABCDE\n”) | 支持格式设定,换行需打上\n,可多个参数 |
---|---|
puts(“ABCDE”) | 不支持格式设定,换行不需要打上\n,参数只能1个 |
格式设定指的就是%d、%f那些; | |
5.printf()输出函数和scanf格式化输入函数 | |
printf() | 格式化字符串部分可以包含多个%号 |
– | – |
scanf() | |
如:printf(“a除以b商%d余%d\n”, a / b, a % b); | |
如:scanf(“%d%d”,&a,&b); | |
4.putchar()字符显示函数
是专门用来显示字符的,像那些响铃符号
二、【那些语句】
1.【选择语句】
【选择语句】-if语句和switch语句
1.if//判定1个量
✅if语句,非0即真
2.if-else //判定2个量
3. if-else if-else//判定3个量
4.嵌套if-if-else-else
int main()
{
int no;
printf("请输入一个整数:"); scanf("%d", &no);
if(no>0)//如果是正数
{
if(no%2==0)
puts("偶数");
else
puts("奇数");
}
else
{
puts("不是正数");
}
}
switch (表达式){case0;break;case1;break;case2;break;}
int main()
{
int no;
printf("请输入一个整数");
scanf("%d", &no);
switch (no % 3)
{
case