c语言第八章函数

第八章函数
一.函数定义的一般形式
1.无参函数:
类型标识符 函数名()
{
声明部分
语句部分
}
2.有参函数:
类型标识符 函数名(形式参数表列)
{
声明部分
语句部分
}
二.函数参数和函数返回值
1.形参:在定义函数时函数名后面括号中的变量名
实参:主函数在调用一个函数时,函数名后面括号中的参数
2.参数传递方式:值传递(单),指针传递
3.形参和实参的说明:(1)只有在发生函数调用时,函数max中的形参才被分配内存单元
(2)实参与形参的类型应该相同或兼容
(3)实参向形参传递是“值传递”只能由实参传给形参
三.函数的调用
1.在一个函数中调用另一个函数具备的条件
<1>首先被调用的函数必须是已经存在的函数
<2>对于库函数,需要包含相应的头文件
<3>自定义函数: 将被调函数写在主调函数之前 在主调函数前引入被调函数声明
2.c语言不能嵌套定义函数,但可以嵌套调用函数
四.函数的递归:再调用函数中出现直接或间接的调用函数本身
汉诺塔

#include<stdio.h>
void H(int m, char a, char b, char c)
{
if (m == 1)
{
printf("%c–>%c", a, c);
puts(" “);
}
else
{
H(m - 1, a, c, b);
printf(”%c–>%c", a, c);
puts(" ");
H(m - 1, b, a, c);
}
}

int main()
{
int m;
printf(“请输入所要移动的层数:\n”);
scanf("%d", &m);
printf(“所要移动的步骤如下:\n”);
H(m, ‘A’, ‘B’, ‘C’);
return 0;
}
五.数组作为函数参数
1。数组作为函数参数,此时形参应当用数组名或者指针变量
2.数组名作为函数参数时,一般会附加一个参数表明数组长度
3.通过形参数组名对数组元素的修改,会改变实参数组元素的值
4.通过形参数组名是无法获取数组大小的
5.实参数组与形参数组类型应一致(float)如不一致,结果出错

六.局部变量和全局变量
1.局部变量:在函数内部定义的变量
作用域:从定义开始到其所在程序块结束
2.全局变量:在函数外定义的变量
作用域:从定义开始到本文件结束
3.标识符:(1)声明在前,使用在后
(2)在不同作用域中声明的同名标识符互不影响
(3)在有相互包含关系的作用域中声明的同名标识符在外层标识符在内层中不可见

4.不建议使用全局变量:(1)空间占用 (2)划分模块时要求内聚性强,耦合性弱,而全局变量增加耦合性

七. 变量的存储类别
1.从变量值存在的时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式
2.静态存储方式是指程序运行期间由系统分配固定的存储空间的方式
动态存储方式是在程序运行期间根据需要进行动态的分配存储的方式
3.存储空间的划分:(1)程序区(代码区,代码段) (2)静态存储区(全局变量
数据段) (3)动态存储区 (栈区 堆栈区) (4)自由存储区 (堆区)
4.静态局部变量:不随函数就结束销毁,函数再次执行时依旧保留上一次运行的值
未初始化 ,其值为零。
5.用extern声明外部变量:将a文件中的全局变量的作用域扩展到b文件中,在b文件中写。
6.用static声明外部变量:表明该全局变量的作用域被限制在本文件中,无法通过extern

7.存储类别小结

8.内部函数与外部函数
内部函数又称静态函数,因为它是用static声明的,使用内部函数,可以使函数作用域只局限在所属文件
外部函数在定义函数时,如果在函数首部最左端关键字extern,则表示函数可供其他文件调用,在需要调用此函数文件中,用extern对函数声明,表示该函数是在其他文件中定义的外部函数。
8.9统计字符串中的字母 数字 空格和其他字符
//* #include<stdio.h>*/
//int main()
//{
// char c;
// int letters = 0, spaces = 0, digits = 0, others = 0;
// printf(“请输入一串任意的字符:\n”);
// while ((c = getchar()) != ‘\n’)
// {
// if ((c >= ‘a’&&c <= ‘z’) || (c >= ‘A’&&c <= ‘Z’))
// letters++;
// else if (c >= ‘0’&&c <= ‘9’)
// digits++;
// else if (c == ’ ')
// spaces++;
// else
// others++;
}
printf(“字母有%d个,数字有%d个,空格有%d个,其他有%d个”, letters, digits, spaces, others);
return 0;
}

//函数
//#include<stdio.h>
//#include<string.h>
//void fn1(char c)
//{
// int letters = 0, spaces = 0, digits = 0, others = 0;
// while ((c = getchar()) != ‘\n’)
// {
// if ((c >= ‘a’&&c <= ‘z’) || (c >= ‘A’&&c <= ‘Z’))
// letters++;
// else if (c >= ‘0’&&c <= ‘9’)
// digits++;
// else if (c == ’ ')
// spaces++;
// else
// others++;
//
// }printf(“字母有%d个,数字有%d个,空格有%d个,其他有%d个”, letters, digits, spaces, others);
//}
//int main()
//{
// char c = { 0 };
// int letters = 0, spaces = 0, digits = 0, others = 0;
// printf(“请输入一串任意的字符:\n”);
// fn1©;
//}

例二
//18.给出年月日计算该日是该年的第n天
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<stdlib.h>
//int leap_year(int year)
//{//判断是否为闰年
// if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
// {
// return 1;//是闰年返回1
// }
// return 0;//不是返回0
//}
//int fun(int year, int month, int day)
//{
// int count = 0;
// int Month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//12月各月天数
// Month[1] += leap_year(year);//如果这一年是闰年则二月+1为29天,不是闰年则+0还是28天
// for (int i = 0; i < month - 1; ++i) {//循环相加该天所在月份之前的所有月份天数之和
// count += Month[i];
// }
// count += day;//加上还不到整一月的天数
// return count;
//}
//void main()
//{
// int year, month, day;
// printf(“请输入年份\n”);
// while (1)
// {
// scanf("%d", &year);
// if (year >= 0)
// {
// break;
// }
// printf(“年份必须非负,请重新输入年份\n”);
// }
// printf(“请输入月份\n”);
// while (1)
// {
// scanf("%d", &month);
// if (month < 1)
// {
// printf(“月份必须大于0\n”);
// continue;
// }
// if (month>12)
// {
// printf(“月份必须小于等于12\n”);
// continue;
// }
// break;
// }
// printf(“请输入日\n”);
// while (1)
// {
// scanf("%d", &day);
// if (day < 1)
// {
// printf(“请输入大于0的天数\n”);
// continue;
// }
// if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
// if (day > 31)
// {
// printf(“您输入的天数大于%d月天数,请重新输入\n”, month);
// continue;
// }
// break;
// }
// else if (month == 2)
// {
// if (leap_year(year) == 1 && day > 29)
// {
// printf(“您输入的天数大于%d月天数,请重新输入\n”, month);
// continue;
// }
// if (leap_year(year) == 0 && day > 28)
// {
// printf(“您输入的天数大于%d月天数,请重新输入\n”, month);
// continue;
// }
// break;
// }
// else
// {
// if (day > 30)
// {
// printf(“您输入的天数大于%d月天数,请重新输入\n”, month);
// continue;
// }
// break;
// }
// }
// printf("%d年%d月%d日是该年的第%d天\n", year, month, day, fun(year, month, day));
// system(“pause”);
//}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值